/****** w9.C ******/ #include #include #include #include #include #include #include #include int I=0; Display *disp; Window win; void Invalidate(Display *disp, Window win, int SetClear); void OnSignal(int v){v=v;Invalidate(disp, win, 1);} int main() { int ScrNum; GC prGC; XEvent Evnt; int ix,iy; if ( (disp = XOpenDisplay (NULL)) == NULL) { printf("\n====1"); exit(1); } ScrNum = DefaultScreen( disp ); win = XCreateSimpleWindow( disp, RootWindow( disp, ScrNum), 0, 0, 500, 500, 2, BlackPixel( disp, ScrNum), WhitePixel( disp, ScrNum) ); XSelectInput( disp, win, ExposureMask | KeyPressMask | ButtonPressMask); XMapWindow (disp,win); //---------------------------------------------------------- // set reaction on timer signal: signal(SIGALRM, OnSignal); // timer signal should be sent one time per 0.003 sec : itimerval tval,ovalue; tval.it_value.tv_sec=0; tval.it_value.tv_usec=3000; tval.it_interval.tv_sec=0; tval.it_interval.tv_usec=3000; setitimer(ITIMER_REAL, &tval, &ovalue); //---------------------------------------------------------- while( 1 ) { XNextEvent( disp, &Evnt); switch (Evnt.type) { case ButtonPress: break; case Expose: if ( Evnt.xexpose.count!=0 ) break; prGC = XCreateGC( disp, win, 0, NULL ); XSetForeground( disp, prGC, BlackPixel(disp, 0) ); if(I>400){ix=800-I; iy=400-(I-800)*(400-I)/400;} else {ix=I; iy=400-I*(400-I)/400;} XDrawArc(disp, win, prGC, ix+5, iy+5, 10, 10, 0, 360*64); XDrawLine(disp, win, prGC, 0+5,400+10+5,400+10+5,400+10+5); XDrawLine(disp, win, prGC, 0+5,400+10+5,0+5,0+5); XDrawLine(disp, win, prGC, 400+10+5,5+10,400+10+5,400+10+5); XDrawString(disp, win, prGC, 5,450,"Press Q to exit",strlen("Press Q to exit")); XFreeGC( disp, prGC ); I++;if(I>800)I=0; break; case KeyPress: KeyCode code=Evnt.xkey.keycode; KeySym sym=XKeycodeToKeysym(disp,code,0); if(sym==XK_q||sym==XK_Q) goto fin; } } fin: XCloseDisplay( disp ); return 0; } void Invalidate(Display *disp, Window win, int SetClear) {int left=0,right=1000,top=0,bottom=1000; //printf("Invalidate:width=%d height=%d\n",right-left,bottom-top); if(!SetClear) { static XEvent ev; int width=right-left,height=bottom-top; ev.xexpose.type=Expose; ev.xexpose.send_event=1; ev.xexpose.display=disp; ev.xexpose.window=win; ev.xexpose.x=ev.xexpose.y=0;ev.xexpose.width=width;ev.xexpose.height=height;ev.xexpose.count=0; XSendEvent(disp,win,1,ExposureMask,&ev); } else { XClearWindow(disp,win); int width=right-left,height=bottom-top; static XEvent ev; ev.xexpose.type=Expose; ev.xexpose.send_event=1; ev.xexpose.display=disp; ev.xexpose.window=win; ev.xexpose.x=ev.xexpose.y=0;ev.xexpose.width=width;ev.xexpose.height=height;ev.xexpose.count=0; XSendEvent(disp,win,1,ExposureMask,&ev); } XFlush(disp); }