/*'manual_ctrl.c': SEXY用の手動によるtest drive program。 | header file 'sexy.h' を用いており、また、便宜のため | 'makefile' を用意した。 | |※正しいppsの値を入れても何故かもう1度訊かれるというbugが残っています。 | ごめんなさい。 | 7/29/04 Nishino Takashi */ #include "sexy.h" #define Rept(n) for(i=0;iPMIN && pps<=PMAX && state!=Quit){ if(i!=Quit) Rept(9) XStoreNamedColor(dis,cm,"Red",pix[i],flags); XNextEvent(dis,&evt); switch(evt.type){ case Expose: XCopyArea(dis,pxm,win,gc,evt.xexpose.x,evt.xexpose.y,evt.xexpose.width,evt.xexpose.height,evt.xexpose.x,evt.xexpose.y); XFlush(dis); continue; case ButtonPress: Rept(8) if(evt.xbutton.window==but[i]) break; //これでボタン番号が得られる(ただしdefaultはquitとみなす) /*ここで、ボタンの番号を示す。 ------------------------ | 0(\) | 1(↑) | 2(♂) | 0 1 |-------+-------+-------|1┌→x | 7(←) |8(quit)| 3(→) | ↓ |-------+-------+-------|0 y | 6(〆) | 5(↓) | 4(ゝ) | ------------------------ */ XStoreNamedColor(dis,cm,"Coral",pix[i],flags); XFlush(dis); if(i!=Quit){ v1=(i>1&&i<5)<<2|(i<3); //x,yの回転方向(#2,#0)を設定 v2=(i%4!=1)<<3|(i%4!=3)<<1; //x,yの回転の有無 meas=time(NULL); //計測始め for(i=0;XCheckMaskEvent(dis,ButtonReleaseMask,&evt)==False;i++){ //XNextEventはeventを待つが、XCheckMaskEventは待たずにFalseを出す pulse(fd,&v1); v1^=v2; //XOR演算 } sec=difftime(time(NULL),meas); //計測終り i/=2; fprintf(stdout,"\n%dcounts/%.0lfsec = %.1lfpps ( ideal: %d)\n" "error=(1/real - 1/ideal)=%lf seconds\n" ,i,sec,i/sec,pps,sec/(double)i-1/(double)pps); i=0; //Quit(=8)以外の値に初期化 } continue; case ButtonRelease: if(i==Quit){ state=i; Rept(9) XStoreNamedColor(dis,cm,"grey",pix[i],flags); XFlush(dis); XWarpPointer(dis,win,root, 0,0/*範囲始点*/, 0,0/*終点(0を書くと「最大まで」の意になる)*/,10,100); //win内にいたら飛ばす } } //switch終り break; //Releaseのときだけ(それ以外はcontinue;なので)ループから出る } //roop1 } while(pps); //roop2 endctl(fd); XFreePixmap(dis,pxm); XDestroyWindow(dis,win); XCloseDisplay(dis); }