#include < X11/Xlib.h >
#include < stdio.h >

#define FORE "light goldenrod"
#define BACK "midnight blue"

main(argc,argv)
int argc;
char **argv;
{
    Display *display;
    Window root, window;
    long fgcolor, bgcolor;
    int screen, pointx, pointy, eventmask = ExposureMask|ButtonPressMask;
    int curx, cury;
    XEvent event;
    XColor exact, apparant;
    XGCValues gcval;
    GC draw, erase;

    if (!(display = XOpenDisplay(NULL))) {
	perror("XOpenDisplay");
	exit(1);
    }

    root = RootWindow(display,screen = DefaultScreen(display));


    XAllocNamedColor(display,DefaultColormap(display,screen),
		     FORE,&apparant,&exact);
    fgcolor = apparant.pixel;
    XAllocNamedColor(display,DefaultColormap(display,screen),
		     BACK,&apparant,&exact);
    bgcolor = apparant.pixel;


    window = XCreateSimpleWindow(display,root,0,0,400,400,2,fgcolor,bgcolor);

    gcval.foreground = fgcolor;
    gcval.background = bgcolor;
    draw = XCreateGC(display,window,GCForeground|GCBackground,&gcval);

    gcval.foreground = bgcolor;
    erase= XCreateGC(display,window,GCForeground|GCBackground,&gcval);

    XSelectInput(display,window,eventmask);
    XMapWindow(display,window);


    for (;;) {
	XNextEvent(display,&event);
	switch (event.type) {
	  case Expose:
	    XClearWindow(display,window);
	    XDrawLine(display,window,draw,25,25,375,375);    
	    break;
	  case ButtonPress:
	    fprintf(stderr,"point set (%d,%d)\n",event.xbutton.x,
		    event.xbutton.y);
	    if (eventmask & PointerMotionMask) {
		XDrawLine(display,window,erase,pointx,pointy,curx,cury);
		XDrawLine(display,window,draw,pointx,pointy,event.xbutton.x,
			  event.xbutton.y);
		XSelectInput(display,window,eventmask &= ~PointerMotionMask);
	    } else {
		curx = pointx = event.xbutton.x;
		cury = pointy = event.xbutton.y;
		XSelectInput(display,window,eventmask |= PointerMotionMask);
	    }
	    break;
	  case MotionNotify:
	    XDrawLine(display,window,erase,pointx,pointy,curx,cury);
	    XDrawLine(display,window,draw,pointx,pointy,curx = event.xmotion.x,
		      cury = event.xmotion.y);
	    break;
	  default:
	    fprintf(stderr,"Unexpected event: %d\n",event.type);
	}
    }
}