#include #include #include #include #include void eraseCallback (); void quitCallback (); void plusCallback (); void minusCallback (); void HandleBoardEvents ( Widget w, XtPointer clientData, XEvent *event, Boolean *flag ); Widget quit; Widget draw; Widget erase; Widget plus; Widget minus; Widget canvas; Display *display; int screen; long fgcolor, bgcolor; XGCValues gcval; GC drawgc; Colormap cmap; XColor color, ignore; char *colorname = "red"; int L = 300; int pointx, pointy; int FirstPt = TRUE; int DrawLength = 20; void main ( int argc, char **argv ) { Widget shell, panel, commands; XtAppContext app; shell = XtAppInitialize ( &app, "Q2", NULL, 0, &argc, argv, NULL, NULL, 0 ); panel = XtCreateManagedWidget ( "panel", xmFormWidgetClass, shell, NULL, 0 ); display= XtDisplay(shell); screen = DefaultScreen(display); canvas = XtVaCreateManagedWidget ( "canvas", xmDrawingAreaWidgetClass, panel, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment,XmATTACH_NONE, XmNwidth,L, XmNheight,L, XmNbackground,WhitePixel(display,screen), NULL ); commands = XtVaCreateManagedWidget ( "commands", xmRowColumnWidgetClass, panel, XmNnumColumns, 3, XmNorientation, XmHORIZONTAL, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, canvas, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL ); erase = XtCreateManagedWidget ( "Erase", xmPushButtonWidgetClass, commands, NULL, 0 ); quit = XtCreateManagedWidget ( "Quit", xmPushButtonWidgetClass, commands, NULL, 0 ); plus = XtCreateManagedWidget ( "+", xmPushButtonWidgetClass, commands, NULL, 0 ); minus = XtCreateManagedWidget ( "-", xmPushButtonWidgetClass, commands, NULL, 0 ); XtAddCallback ( quit, XmNactivateCallback, quitCallback, NULL ); XtAddCallback ( erase, XmNactivateCallback, eraseCallback, NULL ); XtAddCallback ( plus, XmNactivateCallback, plusCallback, NULL ); XtAddCallback ( minus, XmNactivateCallback, minusCallback, NULL ); cmap = DefaultColormap (display, screen); XAllocNamedColor(display, cmap, colorname, &color, &ignore); gcval.foreground = color.pixel; drawgc = XtGetGC ( canvas, GCForeground | GCBackground , &gcval ); gcval.foreground = BlackPixel(display,screen); XtAddEventHandler(canvas,ButtonPressMask, FALSE,HandleBoardEvents, NULL); XtRealizeWidget ( shell ); XtAppMainLoop ( app ); } void HandleBoardEvents ( Widget w, XtPointer clientData, XEvent *event, Boolean *flag ) { if (FirstPt) { FirstPt=FALSE; pointx = event->xbutton.x; pointy = event->xbutton.y; XDrawLine(XtDisplay(w),XtWindow(w),drawgc,pointx-DrawLength,pointy, pointx+DrawLength, pointy); XDrawLine(XtDisplay(w),XtWindow(w),drawgc,pointx,pointy-DrawLength, pointx, pointy+DrawLength); } else { FirstPt=TRUE; XDrawArc (XtDisplay(w),XtWindow(w),drawgc, event->xbutton.x-DrawLength, event->xbutton.y-DrawLength, 2*DrawLength, 2*DrawLength,0,360*64); } } void eraseCallback () { XClearArea( XtDisplay(canvas),XtWindow(canvas), 0,0, L, L, 0); } void quitCallback ( ) { exit (0); } void plusCallback ( ) { DrawLength=DrawLength*2; } void minusCallback ( ) { DrawLength=DrawLength/2; }