Annotation of OpenXM_contrib2/asir2000/plot/ox_plot_xevent.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/plot/ox_plot_xevent.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
2: #include "ca.h"
3: #include "parse.h"
4: #include "ox.h"
5: #include "ifplot.h"
6: #include "cursor.h"
7:
8: #ifdef ABS
9: #undef ABS
10: #define ABS(a) ((a)>0?(a):-(a))
11: #endif
12:
13: static char *dname;
14: static int remotes;
15: static int depth,scrn;
16:
17: extern jmp_buf ox_env;
18: static Widget toplevel;
19: static XtAppContext app_con;
20:
21: static int busy;
22:
23: static struct PlotResources {
24: Pixel ForePixel,BackPixel,DashPixel;
25: char *ForeName,*BackName,*DashName;
26: Boolean Reverse;
27: } PlotResources;
28:
29: #define forePixel PlotResources.ForePixel
30: #define backPixel PlotResources.BackPixel
31: #define dashPixel PlotResources.DashPixel
32: #define foreName PlotResources.ForeName
33: #define backName PlotResources.BackName
34: #define dashName PlotResources.DashName
35: #define reverse PlotResources.Reverse
36:
37: Cursor create_cursor();
38:
39: #define blackPixel BlackPixel(display,scrn)
40: #define whitePixel WhitePixel(display,scrn)
41:
42: #define LABELWIDTH 150
43:
44: process_xevent() {
45: XEvent ev;
46:
47: while ( XPending(display) ) {
48: XtAppNextEvent(app_con,&ev);
49: XtDispatchEvent(&ev);
50: }
51: }
52:
53: /* event handlers */
54:
55: static POINT spos,cpos;
56:
57: void press(w,can,ev)
58: Widget w;
59: struct canvas *can;
60: XButtonEvent *ev;
61: {
62: POINT p;
63:
64: switch ( ev->button ) {
65: case Button1:
66: XC(spos) = ev->x; YC(spos) = ev->y; cpos = spos; break;
67: case Button3:
68: XC(p) = ev->x; YC(p) = ev->y; draw_coord(can,&p); break;
69: default:
70: break;
71: }
72: }
73:
74: void motion(w,can,ev)
75: Widget w;
76: struct canvas *can;
77: XMotionEvent *ev;
78: {
79:
80: POINT o,p;
81:
82: if ( ev->state & Button1Mask ) {
83: o = cpos; XC(cpos) = ev->x; YC(cpos) = ev->y;
84: draw_frame(can->window,spos,o,cpos);
85: } else if ( ev->state & Button3Mask ) {
86: XC(p) = ev->x; YC(p) = ev->y;
87: draw_coord(can,p);
88: }
89: }
90:
91: void release(w,can,ev)
92: Widget w;
93: struct canvas *can;
94: XButtonEvent *ev;
95: {
96: POINT e;
97:
98: switch ( ev->button ) {
99: case Button1:
100: e.x = ev->x; e.y = ev->y;
101: draw_frame0(can->window,spos,e);
102: if ( !busy ) {
103: if ( can->mode == MODE_PLOT )
104: plot_resize(can,spos,e);
105: else
106: ifplot_resize(can,spos,e);
107: }
108: break;
109: default:
110: break;
111: }
112: }
113:
114: void structure(w,can,ev)
115: Widget w;
116: struct canvas *can;
117: XEvent *ev;
118: {
119: switch ( ev->xany.type ) {
120: case Expose:
121: if ( !ev->xexpose.count )
122: redraw_canvas(can);
123: break;
124: case ConfigureNotify:
125: redraw_canvas(can); break;
126: default:
127: break;
128: }
129: }
130:
131: static int lindex;
132:
133: void lpress(w,can,ev)
134: Widget w;
135: struct canvas *can;
136: XButtonEvent *ev;
137: {
138: lindex = (can->height-ev->y)/(can->height/can->nzstep);
139: draw_level(can,lindex,hlGC);
140: }
141:
142: void jumpproc(w,can,percent)
143: Widget w;
144: struct canvas *can;
145: float *percent;
146: {
147: int index;
148:
149: index = can->nzstep * (1.0-*percent);
150: if ( index == lindex )
151: return;
152: if ( lindex >= 0 )
153: draw_level(can,lindex,drawGC);
154: lindex = index;
155: draw_level(can,lindex,hlGC);
156: }
157:
158: void jumpproc_m(w,can,percent)
159: Widget w;
160: struct canvas *can;
161: float *percent;
162: {
163: int index;
164:
165: index = can->nzstep * (1.0-*percent);
166: if ( index != lindex ) {
167: draw_level(can,lindex,drawGC);
168: draw_level(can,lindex,hlGC);
169: }
170: }
171:
172: void lrelease(w,can,ev)
173: Widget w;
174: struct canvas *can;
175: XButtonEvent *ev;
176: {
177: draw_level(can,lindex,drawGC); lindex = -1;
178: }
179:
180: void lrelease_m(w,can,ev)
181: Widget w;
182: struct canvas *can;
183: XButtonEvent *ev;
184: {
185: lindex = -1;
186: }
187:
188: draw_level(can,index,gc)
189: struct canvas *can;
190: int index;
191: GC gc;
192: {
193: Pixmap pix;
194: struct pa *pa;
195: int i,len;
196: POINT *p;
197: Arg arg[2];
198: char buf[BUFSIZ];
199:
200: if ( busy || can->wide || index < 0 || index > can->nzstep )
201: return;
202: pix = can->pix; pa = &can->pa[index]; len = pa->length; p = pa->pos;
203: for ( i = 0; i < len; i++ )
204: XDrawPoint(display,pix,gc,p[i].x,p[i].y);
205: sprintf(buf,"level:%g",can->zmin+(can->zmax-can->zmin)*index/can->nzstep);
206: XtSetArg(arg[0],XtNlabel,buf); XtSetArg(arg[1],XtNwidth,LABELWIDTH);
207: XtSetValues(can->level,arg,2);
208: copy_to_canvas(can);
209: }
210:
211: draw_frame(window,spos,opos,epos)
212: Window window;
213: POINT spos,opos,epos;
214: {
215: if ( XC(opos) != XC(epos) || YC(opos) != YC(epos) )
216: draw_frame0(window,spos,opos);
217: draw_frame0(window,spos,epos);
218: }
219:
220: draw_frame0(window,spos,epos)
221: Window window;
222: POINT spos,epos;
223: {
224: int ulx,uly,w,h;
225:
226: ulx = MIN(XC(spos),XC(epos)); uly = MIN(YC(spos),YC(epos));
227: w = ABS(XC(spos)-XC(epos)); h = ABS(YC(spos)-YC(epos));
228: if ( !w || !h )
229: return;
230: XDrawRectangle(display,window,xorGC,ulx,uly,w,h);
231: XFlush(display);
232: }
233:
234: draw_coord(can,pos)
235: struct canvas *can;
236: POINT pos;
237: {
238: char buf[BUFSIZ];
239: Arg arg[2];
240: double x,y,xmin,ymax,dx,dy;
241:
242: if ( can->wide ) {
243: dx = 10*(can->xmax-can->xmin); dy = 10*(can->ymax-can->ymin);
244: xmin = (can->xmax+can->xmin-dx)/2;
245: ymax = (can->ymax+can->ymin+dy)/2;
246: } else {
247: dx = can->xmax-can->xmin; dy = can->ymax-can->ymin;
248: xmin = can->xmin; ymax = can->ymax;
249: }
250: x = xmin+XC(pos)*dx/can->width;
251: y = ymax-YC(pos)*dy/can->height;
252: sprintf(buf,"%s:%g",can->vx?can->vx->name:"horiz",x);
253: XtSetArg(arg[0],XtNlabel,buf); XtSetArg(arg[1],XtNwidth,LABELWIDTH);
254: XtSetValues(can->xcoord,arg,2);
255: sprintf(buf,"%s:%g",can->vy?can->vy->name:"vert",y);
256: XtSetArg(arg[0],XtNlabel,buf); XtSetArg(arg[1],XtNwidth,LABELWIDTH);
257: XtSetValues(can->ycoord,arg,2);
258: }
259:
260: redraw_canvas(can)
261: struct canvas *can;
262: {
263: if ( can->wide )
264: draw_wideframe(can);
265: else
266: copy_to_canvas(can);
267: }
268:
269: search_canvas()
270: {
271: int i;
272:
273: for ( i = 0; i < MAXCANVAS; i++ )
274: if ( !canvas[i] ) {
275: canvas[i] = (struct canvas *)MALLOC(sizeof(struct canvas));
276: canvas[i]->index = i; return i;
277: }
278: }
279:
280: search_active_canvas()
281: {
282: int i;
283:
284: for ( i = 0; i < MAXCANVAS; i++ )
285: if ( canvas[i] )
286: return i;
287: return -1;
288: }
289:
290: void destroy_canvas(w,can,calldata)
291: Widget w;
292: struct canvas *can;
293: XtPointer calldata;
294: {
295: XtPopdown(can->shell);
296: XtDestroyWidget(can->shell);
297: XFlush(display);
298: if ( can == current_can ) {
299: reset_busy(can); current_can = 0;
300: }
301: canvas[can->index] = 0;
302: }
303:
304: void precise_canvas(w,can,calldata)
305: Widget w;
306: struct canvas *can;
307: XtPointer calldata;
308: {
309: if ( can->precise )
310: can->precise = 0;
311: else
312: can->precise = 1;
313: }
314:
315: void wide_canvas(w,can,calldata)
316: Widget w;
317: struct canvas *can;
318: XtPointer calldata;
319: {
320: if ( can->wide ) {
321: can->wide = 0; copy_to_canvas(can);
322: } else {
323: can->wide = 1; draw_wideframe(can);
324: }
325: }
326:
327: void noaxis_canvas(w,can,calldata)
328: Widget w;
329: struct canvas *can;
330: XtPointer calldata;
331: {
332: if ( can->noaxis )
333: can->noaxis = 0;
334: else
335: can->noaxis = 1;
336: if ( can->wide )
337: draw_wideframe(can);
338: else
339: copy_to_canvas(can);
340: }
341:
342: toggle_button(w,flag)
343: Widget w;
344: int flag;
345: {
346: Arg arg[2];
347:
348: if ( flag ) {
349: XtSetArg(arg[0],XtNforeground,backPixel);
350: XtSetArg(arg[1],XtNbackground,forePixel);
351: } else {
352: XtSetArg(arg[0],XtNforeground,forePixel);
353: XtSetArg(arg[1],XtNbackground,backPixel);
354: }
355: XtSetValues(w,arg,2); XFlush(display);
356: }
357:
358: draw_wideframe(can)
359: struct canvas *can;
360: {
361: struct canvas fakecan;
362: double xmin,xmax,ymin,ymax,xmid,ymid,dx,dy;
363: POINT s,e;
364:
365: fakecan = *can;
366: dx = 10*(can->xmax-can->xmin); dy = 10*(can->ymax-can->ymin);
367: xmid = (can->xmax+can->xmin)/2; ymid = (can->ymax+can->ymin)/2;
368:
369: fakecan.xmin = xmid-dx/2; fakecan.xmax = xmid+dx/2;
370: fakecan.ymin = ymid-dy/2; fakecan.ymax = ymid+dy/2;
371:
372: XFillRectangle(display,can->window,clearGC,
373: 0,0,can->width,can->height);
374: pline(display,&fakecan,can->window);
375: XC(s) = can->width*9/20; YC(s) = can->height*9/20;
376: XC(e) = can->width*11/20; YC(e) = can->height*11/20;
377: draw_frame0(can->window,s,e);
378: }
379:
380: create_popup(parent,name,str,shell,dialog)
381: Widget parent;
382: char *name,*str;
383: Widget *shell,*dialog;
384: {
385: Arg arg[3];
386: Position x,y;
387:
388: XtTranslateCoords(parent,0,0,&x,&y);
389: XtSetArg(arg[0],XtNx,x); XtSetArg(arg[1],XtNy,y);
390: *shell = XtCreatePopupShell(name,transientShellWidgetClass,parent,arg,2);
391: XtSetArg(arg[0],XtNlabel,str);
392: *dialog = XtCreateManagedWidget("dialog",dialogWidgetClass,*shell,arg,1);
393: }
394:
395: warning(can,s)
396: struct canvas *can;
397: char *s;
398: {
399: void popdown_warning();
400: Widget warnshell,warndialog;
401: Position x,y;
402: Arg arg[3];
403:
404: if ( !can->shell )
405: return;
406: create_popup(can->shell,"warning",s,&warnshell,&warndialog);
407: XawDialogAddButton(warndialog,"dismiss",popdown_warning,warnshell);
408: XtPopup(warnshell,XtGrabNone);
409: }
410:
411: void popdown_warning(w,client,call)
412: Widget w;
413: XtPointer client,call;
414: {
415: XtPopdown(client); XtDestroyWidget(client);
416: }
417:
418: void show_formula(w,can,calldata)
419: Widget w;
420: struct canvas *can;
421: XtPointer calldata;
422: {
423: void popdown_formula();
424: Widget fshell,fdialog;
425: char buf[BUFSIZ];
426:
427: soutput_init(buf); sprintexpr(CO,(Obj)can->formula);
428: create_popup(can->shell,"formula",buf,&fshell,&fdialog);
429: XawDialogAddButton(fdialog,"dismiss",popdown_formula,w);
430: XtSetSensitive(w,False); XtPopup(fshell,XtGrabNone);
431: }
432:
433: void popdown_formula(w,fbutton,call)
434: Widget w,fbutton;
435: XtPointer call;
436: {
437: Widget shell = XtParent(XtParent(w));
438: XtPopdown(shell); XtDestroyWidget(shell);
439: XtSetSensitive(fbutton,True);
440: }
441:
442: #define NormalSelection ButtonPressMask|ButtonReleaseMask|Button1MotionMask|Button3MotionMask|StructureNotifyMask| ExposureMask
443:
444: create_canvas(can)
445: struct canvas *can;
446: {
447: XEvent event;
448: Widget box,frame,commands,
449: coords,quit,wide,precise,canvas,formula;
450: Window window;
451: Pixmap pix;
452: int i,width,height;
453: Arg arg[6];
454: char buf[BUFSIZ];
455:
456: width = can->width; height = can->height;
457:
458: sprintf(buf,"%s : %d/%d", can->wname?can->wname:"Plot",
459: remotes,can->index);
460: XtSetArg(arg[0],XtNiconName,buf);
461: can->shell =
462: XtCreatePopupShell("shell",topLevelShellWidgetClass,toplevel,arg,1);
463:
464: XtSetArg(arg[0],XtNhSpace,0);
465: XtSetArg(arg[1],XtNvSpace,0);
466: XtSetArg(arg[2],XtNborderWidth,0);
467: box = XtCreateManagedWidget("box",boxWidgetClass,can->shell,arg,3);
468:
469: frame = XtCreateManagedWidget("form",formWidgetClass,box,NULL,0);
470:
471: XtSetArg(arg[0],XtNorientation,XtorientHorizontal);
472: XtSetArg(arg[1],XtNborderWidth,0);
473: commands = XtCreateManagedWidget("commands",boxWidgetClass,frame,arg,2);
474:
475: quit = XtCreateManagedWidget("quit",commandWidgetClass,commands,NULL,0);
476: XtAddCallback(quit,XtNcallback,destroy_canvas,can);
477: can->wideb = wide =
478: XtCreateManagedWidget("wide",toggleWidgetClass,commands,NULL,0);
479: XtAddCallback(wide,XtNcallback,wide_canvas,can);
480: can->preciseb = precise =
481: XtCreateManagedWidget("precise",toggleWidgetClass,commands,NULL,0);
482: XtAddCallback(precise,XtNcallback,precise_canvas,can);
483: formula =
484: XtCreateManagedWidget("formula",commandWidgetClass,commands,NULL,0);
485: XtAddCallback(formula,XtNcallback,show_formula,can);
486: can->noaxisb =
487: XtCreateManagedWidget("noaxis",toggleWidgetClass,commands,NULL,0);
488: XtAddCallback(can->noaxisb,XtNcallback,noaxis_canvas,can);
489:
490: XtSetArg(arg[0],XtNfromVert,commands);
491: XtSetArg(arg[1],XtNwidth,width);
492: XtSetArg(arg[2],XtNheight,height);
493: canvas = XtCreateManagedWidget("canvas",simpleWidgetClass,frame,arg,3);
494:
495: XtSetArg(arg[0],XtNfromVert,canvas);
496: XtSetArg(arg[1],XtNheight,5);
497: XtSetArg(arg[2],XtNwidth,width);
498: XtSetArg(arg[3],XtNorientation,XtorientHorizontal);
499: XtSetArg(arg[4],XtNsensitive,False);
500: can->xdone =
501: XtCreateManagedWidget("xdone",scrollbarWidgetClass,frame,arg,5);
502:
503: XtSetArg(arg[0],XtNfromHoriz,canvas);
504: XtSetArg(arg[1],XtNfromVert,commands);
505: XtSetArg(arg[2],XtNwidth,5);
506: XtSetArg(arg[3],XtNheight,height);
507: XtSetArg(arg[4],XtNorientation,XtorientVertical);
508: XtSetArg(arg[5],XtNsensitive,False);
509: can->ydone =
510: XtCreateManagedWidget("ydone",scrollbarWidgetClass,frame,arg,6);
511:
512: XtSetArg(arg[0],XtNfromVert,can->xdone);
513: XtSetArg(arg[1],XtNorientation,XtorientHorizontal);
514: XtSetArg(arg[2],XtNborderWidth,0);
515: coords = XtCreateManagedWidget("coords",boxWidgetClass,frame,arg,3);
516:
517: XtSetArg(arg[0],XtNwidth,LABELWIDTH);
518: can->xcoord = XtCreateManagedWidget("xcoord",labelWidgetClass,coords,arg,1);
519: XtSetArg(arg[0],XtNwidth,LABELWIDTH);
520: can->ycoord = XtCreateManagedWidget("ycoord",labelWidgetClass,coords,arg,1);
521:
522: XtAddEventHandler(canvas,ButtonPressMask,False,press,can);
523: XtAddEventHandler(canvas,ButtonReleaseMask,False,release,can);
524: XtAddEventHandler(canvas,Button1MotionMask,False,motion,can);
525: XtAddEventHandler(canvas,Button3MotionMask,False,motion,can);
526: XtAddEventHandler(canvas,StructureNotifyMask,False,structure,can);
527: XtAddEventHandler(canvas,ExposureMask,False,structure,can);
528:
529: if ( can->mode == MODE_CONPLOT ) {
530: Widget scale;
531:
532: XtSetArg(arg[0],XtNwidth,LABELWIDTH);
533: can->level = XtCreateManagedWidget("level",labelWidgetClass,
534: commands,arg,1);
535:
536: XtSetArg(arg[0],XtNsensitive,True);
537: XtSetValues(can->ydone,arg,1);
538: if ( depth >= 2 ) {
539: XtAddCallback(can->ydone,XtNjumpProc,jumpproc,can);
540: XtAddEventHandler(can->ydone,ButtonReleaseMask,False,lrelease,can);
541: } else {
542: XtAddCallback(can->ydone,XtNjumpProc,jumpproc_m,can);
543: XtAddEventHandler(can->ydone,ButtonReleaseMask,False,lrelease_m,can);
544: }
545: }
546: if ( can->mode != MODE_IFPLOT || !qpcheck((Obj)can->formula) )
547: XtSetSensitive(precise,False);
548: XtPopup(can->shell,XtGrabNone);
549:
550: window = can->window = XtWindow(canvas);
551: pix = can->pix = XCreatePixmap(display,window,width,height,depth);
552: XFillRectangle(display,pix,clearGC,0,0,width,height);
553: XDefineCursor(display,window,normalcur);
554: XFlush(display);
555: current_can = can;
556: }
557:
558: alloc_pixmap(can)
559: struct canvas *can;
560: {
561: can->pix = XCreatePixmap(display,can->window,
562: can->width,can->height,depth);
563: XFillRectangle(display,can->pix,clearGC,0,0,can->width,can->height);
564: }
565:
566: static XrmOptionDescRec options[] = {
567: {"-reverse","*reverse",XrmoptionNoArg,"on"},
568: {"-fg","*foreground",XrmoptionSepArg,NULL},
569: {"-bg","*background",XrmoptionSepArg,NULL},
570: };
571:
572: #define offset(name) XtOffset(struct PlotResources *,name)
573:
574: static XtResource resources[] = {
575: {"reverse","Reverse",XtRBoolean,sizeof(Boolean),
576: offset(Reverse),XtRBoolean,&reverse},
577: {"foreground","Foreground",XtRString,sizeof(char *),
578: offset(ForeName),XtRString,NULL},
579: {"foreground","Foreground",XtRPixel,sizeof(Pixel),
580: offset(ForePixel),XtRPixel,(XtPointer)&forePixel},
581: {"background","Background",XtRString,sizeof(char *),
582: offset(BackName),XtRString,NULL},
583: {"background","Background",XtRPixel,sizeof(Pixel),
584: offset(BackPixel),XtRPixel,(XtPointer)&backPixel},
585: {"dash","Dash",XtRString,sizeof(char *),
586: offset(DashName),XtRString,NULL},
587: {"dash","Dash",XtRPixel,sizeof(Pixel),
588: offset(DashPixel),XtRPixel,(XtPointer)&dashPixel},
589: };
590:
591: init_plot_display(argc,argv)
592: int argc;
593: char **argv;
594: {
595: int ac;
596: char **av;
597: unsigned int tmp;
598:
599: for ( ac = argc, av = argv; ac; ac--, av++ )
600: if ( index(*av,':') )
601: dname = *av;
602: XtToolkitInitialize();
603: app_con = XtCreateApplicationContext();
604: display = XtOpenDisplay(app_con,dname,"plot","Plot",
605: options,XtNumber(options),&argc,argv);
606: if ( !display ) {
607: fprintf(stderr,"Can't open display\n");
608: exit(1);
609: }
610: toplevel = XtAppCreateShell(0,"Plot",applicationShellWidgetClass,
611: display,0,0);
612:
613: forePixel = blackPixel; backPixel = whitePixel;
614: dashPixel = blackPixel;
615: XtGetApplicationResources(toplevel,&PlotResources,
616: resources,XtNumber(resources),NULL,0);
617: display = XtDisplay(toplevel);
618: scrn = DefaultScreen(display);
619: depth = DefaultDepth(display,scrn);
620: rootwin = RootWindow(display,scrn);
621:
622: if ( reverse ) {
623: tmp = forePixel; forePixel = backPixel; backPixel = tmp;
624: }
625:
626: create_gc();
627: create_font();
628: create_cursors();
629: }
630:
631: static char *scalefont = "*-8-80-*";
632:
633: create_font() {
634: Font sfid;
635:
636: sfid = XLoadFont(display,scalefont);
637: sffs = XQueryFont(display,sfid);
638: XSetFont(display,scaleGC,sfid);
639: }
640:
641: create_gc() {
642: static XColor color = {0,0x0,0x0,0x0,DoRed|DoGreen|DoBlue,0};
643: int i,b,step;
644:
645: drawGC = XCreateGC(display,rootwin,0,NULL);
646: dashGC = XCreateGC(display,rootwin,0,NULL);
647: hlGC = XCreateGC(display,rootwin,0,NULL);
648: clearGC = XCreateGC(display,rootwin,0,NULL);
649: scaleGC = XCreateGC(display,rootwin,0,NULL);
650: xorGC = XCreateGC(display,rootwin,0,NULL);
651: colorGC = XCreateGC(display,rootwin,0,NULL);
652: XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,drawGC);
653: XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,dashGC);
654: XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,clearGC);
655: XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,scaleGC);
656: XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,xorGC);
657: XCopyGC(display,DefaultGC(display,scrn),(1L<<(GCLastBit+1))-1,colorGC);
658: XSetForeground(display,drawGC,forePixel);
659: XSetForeground(display,scaleGC,forePixel);
660: XSetForeground(display,clearGC,backPixel);
661: XSetForeground(display,xorGC,forePixel^backPixel);
662: XSetFunction(display,xorGC,GXxor);
663: XSetForeground(display,dashGC,dashPixel);
664: XSetLineAttributes(display,dashGC,1,LineOnOffDash,CapButt,JoinRound);
665:
666: color.red = color.green = color.blue = 0xffff/2;
667: XAllocColor(display,DefaultColormap(display,scrn),&color);
668: XSetForeground(display,hlGC,color.pixel);
669: color.red = 0xffff; color.green = color.blue = 0;
670: XAllocColor(display,DefaultColormap(display,scrn),&color);
671: XSetForeground(display,colorGC,color.pixel);
672: }
673:
674: create_cursors() {
675: static XColor fg = {0, 0x0, 0x0, 0x0,DoRed|DoGreen|DoBlue,0};
676: static XColor bg = {0, 0xffff, 0xffff, 0xffff,DoRed|DoGreen|DoBlue,0};
677:
678: XAllocColor(display,DefaultColormap(display,scrn),&fg);
679: XAllocColor(display,DefaultColormap(display,scrn),&bg);
680: normalcur = create_cursor(h_bits,h_m_bits,h_width,h_height,
681: h_x_hot,h_y_hot,&fg,&bg);
682: runningcur = create_cursor(ht_bits,ht_m_bits,ht_width,ht_height,
683: ht_width/2,ht_height/2,&fg,&bg);
684: errorcur = create_cursor(m_bits,m_m_bits,m_width,m_height,
685: m_width/2,m_height/2,&fg,&bg);
686: }
687:
688: Cursor create_cursor(image,mask,width,height,xhot,yhot,fg,bg)
689: char *image,*mask;
690: int width,height,xhot,yhot;
691: XColor *fg,*bg;
692: {
693: Pixmap ipix,mpix;
694:
695: ipix = XCreateBitmapFromData(display,rootwin,image,width,height);
696: mpix = XCreateBitmapFromData(display,rootwin,mask,width,height);
697: return XCreatePixmapCursor(display,ipix,mpix,fg,bg,xhot,yhot);
698: }
699:
700: copy_to_canvas(can)
701: struct canvas *can;
702: {
703: if ( display ) {
704: XCopyArea(display,can->pix,can->window,
705: drawGC,0,0,can->width,can->height,0,0);
706: pline(display,can,can->window);
707: XFlush(display);
708: }
709: }
710:
711: copy_subimage(subcan,can,pos)
712: struct canvas *subcan,*can;
713: XPoint pos;
714: {
715: if ( display ) {
716: XCopyArea(display,subcan->pix,can->pix,
717: drawGC,0,0,subcan->width,subcan->height,pos.x,pos.y);
718: XFlush(display);
719: }
720: }
721:
722: #include <signal.h>
723: #include <fcntl.h>
724:
725: set_selection() {
726: if ( current_can ) {
727: XSelectInput(display,current_can->window,0);
728: XFlush(display);
729: }
730: }
731:
732: reset_selection() {
733: if ( current_can ) {
734: XSelectInput(display,current_can->window,NormalSelection);
735: XFlush(display);
736: }
737: }
738:
739: set_busy(can)
740: struct canvas *can;
741: {
742: busy = 1;
743: XtSetSensitive(can->wideb,False);
744: XtSetSensitive(can->preciseb,False);
745: XtSetSensitive(can->noaxisb,False);
746: XFlush(display);
747: }
748:
749: reset_busy(can)
750: struct canvas *can;
751: {
752: busy = 0;
753: if ( can->window ) {
754: XtSetSensitive(can->wideb,True);
755: XtSetSensitive(can->noaxisb,True);
756: if ( can->mode == MODE_IFPLOT && qpcheck((Obj)can->formula) )
757: XtSetSensitive(can->preciseb,True);
758: XFlush(display);
759: }
760: }
761:
762: reset_current_computation()
763: {
764: if ( current_can ) {
765: reset_selection(); reset_busy(current_can);
766: define_cursor(current_can->window,normalcur);
767: }
768: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>