#include #include #define TRUE 1 #define FALSE 0 main(argc,argv) int argc; char **argv; { Display *display; Window root, window; long fgcolor, bgcolor; int screen, pointx, pointy; int eventmask = KeyPressMask|ExposureMask|ButtonPressMask; int curx, cury; XEvent event; XGCValues gcval; GC draw, erase; int FirstPt = TRUE; if (!(display = XOpenDisplay(argv[1]))) { perror("XOpenDisplay"); exit(1); } root = RootWindow(display,screen = DefaultScreen(display)); fgcolor = BlackPixel(display,screen); bgcolor = WhitePixel(display,screen); window = XCreateSimpleWindow(display,root,0,0,200,200,2,fgcolor,bgcolor); gcval.foreground = fgcolor; gcval.background = bgcolor; /* use XOR instead of erase */ gcval.function = GXxor; draw = XCreateGC(display,window,GCForeground|GCBackground|GCFunction,&gcval); /* gcval.foreground = bgcolor; gcval.background = fgcolor; erase= XCreateGC(display,window,GCForeground|GCBackground,&gcval); */ XSelectInput(display,window,eventmask); XMapWindow(display,window); for (;;) { XWindowEvent(display,window,eventmask,&event); switch (event.type) { case Expose: XClearWindow(display,window); break; case ButtonPress: if (FirstPt) { FirstPt=FALSE; curx = pointx = event.xbutton.x; cury = pointy = event.xbutton.y; XDrawPoint(display,window,draw,pointx,pointy); XSelectInput(display,window,eventmask |= PointerMotionMask); } else { FirstPt=TRUE; XDrawLine(display,window,draw,pointx,pointy,curx,cury); XDrawLine(display,window,draw,pointx,pointy,event.xbutton.x, event.xbutton.y); XSelectInput(display,window,eventmask &= ~PointerMotionMask); } break; case MotionNotify: XDrawLine(display,window,draw,pointx,pointy,curx,cury); XDrawLine(display,window,draw,pointx,pointy,curx = event.xmotion.x, cury = event.xmotion.y); break; case KeyPress: exit(0); default: fprintf(stderr,"Unexpected event: %d\n",event.type); } } }