=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/plot/ox_plot_xevent.c,v retrieving revision 1.18 retrieving revision 1.27 diff -u -p -r1.18 -r1.27 --- OpenXM_contrib2/asir2000/plot/ox_plot_xevent.c 2002/07/20 02:28:08 1.18 +++ OpenXM_contrib2/asir2000/plot/ox_plot_xevent.c 2006/11/09 15:54:35 1.27 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/plot/ox_plot_xevent.c,v 1.17 2002/07/12 00:14:40 takayama Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/plot/ox_plot_xevent.c,v 1.26 2005/07/03 13:11:28 ohara Exp $ */ #include "ca.h" #include "parse.h" @@ -55,6 +55,26 @@ #include #include +static void Quit(); +static void print_canvas(Widget w, struct canvas *can, XtPointer calldata); +static void output_to_printer(Widget w, struct canvas *can, XtPointer calldata); +static void print_canvas_to_file(Widget w, struct canvas *can, XtPointer calldata); +static void printing_method(Widget w, struct canvas *can, XtPointer calldata); + +static Atom wm_delete_window; + +void SetWM_Proto(Widget w) +{ + XtOverrideTranslations(w, + XtParseTranslationTable("WM_PROTOCOLS: quit()")); + XSetWMProtocols(display,XtWindow(w),&wm_delete_window,1); +} + +static void quit(Widget w, XEvent *ev, String *params,Cardinal *nparams) +{ + XBell(display,0); +} + /* XXX : these lines are in plotg.c, but ld says they are not defined */ #if __DARWIN__ int stream; @@ -72,6 +92,7 @@ XFontStruct *sffs; #endif struct canvas *canvas[MAXCANVAS]; +struct canvas *closed_canvas[MAXCANVAS]; struct canvas *current_can; #endif /* __DARWIN__ */ @@ -81,7 +102,6 @@ struct canvas *current_can; #endif static char *dname; -static int remotes; static int depth,scrn; extern JMP_BUF ox_env; @@ -171,7 +191,9 @@ XButtonEvent *ev; case Button1: e.x = ev->x; e.y = ev->y; draw_frame0(can->window,spos,e); - if ( !busy && can->mode != MODE_INTERACTIVE ) { + if ( !busy + && can->mode != MODE_INTERACTIVE + && can->mode != MODE_POLARPLOT) { if ( can->mode == MODE_PLOT ) plot_resize(can,spos,e); else @@ -359,7 +381,12 @@ search_active_canvas() return -1; } - +void popup_canvas(index) +{ + clear_pixmap(canvas[index]); + XtPopup(canvas[index]->shell,XtGrabNone); + copy_to_canvas(canvas[index]); +} void destroy_canvas(w,can,calldata) Widget w; @@ -367,11 +394,14 @@ struct canvas *can; XtPointer calldata; { XtPopdown(can->shell); - XtDestroyWidget(can->shell); +/* XtDestroyWidget(can->shell); */ XFlush(display); if ( can == current_can ) { reset_busy(can); current_can = 0; } + if ( closed_canvas[can->index] ) + XtDestroyWidget(closed_canvas[can->index]->shell); + closed_canvas[can->index] = can; canvas[can->index] = 0; } @@ -480,6 +510,7 @@ char *s; create_popup(can->shell,"warning",s,&warnshell,&warndialog); XawDialogAddButton(warndialog,"dismiss",popdown_warning,warnshell); XtPopup(warnshell,XtGrabNone); + SetWM_Proto(warnshell); } void popdown_warning(w,client,call) @@ -502,6 +533,7 @@ XtPointer calldata; create_popup(can->shell,"formula",buf,&fshell,&fdialog); XawDialogAddButton(fdialog,"dismiss",popdown_formula,w); XtSetSensitive(w,False); XtPopup(fshell,XtGrabNone); + SetWM_Proto(fshell); } void popdown_formula(w,fbutton,call) @@ -526,12 +558,10 @@ struct canvas *can; int i,width,height; Arg arg[6]; char buf[BUFSIZ]; - static void print_canvas(); width = can->width; height = can->height; - sprintf(buf,"%s : %d/%d", can->wname?can->wname:"Plot", - remotes,can->index); + sprintf(buf,"%s : %d", can->wname?can->wname:"Plot",can->index); XtSetArg(arg[0],XtNiconName,buf); can->shell = XtCreatePopupShell("shell",topLevelShellWidgetClass,toplevel,arg,1); @@ -623,7 +653,7 @@ struct canvas *can; if ( can->mode != MODE_IFPLOT || !qpcheck((Obj)can->formula) ) XtSetSensitive(precise,False); XtPopup(can->shell,XtGrabNone); - + SetWM_Proto(can->shell); window = can->window = XtWindow(canvas); pix = can->pix = XCreatePixmap(display,window,width,height,depth); XFillRectangle(display,pix,clearGC,0,0,width,height); @@ -668,6 +698,15 @@ static XtResource resources[] = { offset(DashPixel),XtRPixel,(XtPointer)&dashPixel}, }; +static XtActionsRec actions_table[] = { + {"quit",Quit}, +}; + +static void Quit(Widget w, XEvent *ev, String *params,Cardinal *nparams) +{ + XBell(XtDisplay(w),0); +} + int init_plot_display(argc,argv) int argc; char **argv; @@ -683,6 +722,7 @@ char **argv; dname = *av; XtToolkitInitialize(); app_con = XtCreateApplicationContext(); + XtAppAddActions(app_con,actions_table, XtNumber(actions_table)); display = XtOpenDisplay(app_con,dname,"plot","Plot", options,XtNumber(options),&argc,argv); if ( !display ) { @@ -701,6 +741,11 @@ char **argv; depth = DefaultDepth(display,scrn); rootwin = RootWindow(display,scrn); + /* for handling DELETE message */ + wm_delete_window = XInternAtom(display,"WM_DELETE_WINDOW",False); + XtOverrideTranslations(toplevel, + XtParseTranslationTable("WM_PROTOCOLS: quit()")); + if ( reverse ) { tmp = forePixel; forePixel = backPixel; backPixel = tmp; } @@ -798,8 +843,13 @@ copy_to_canvas(can) struct canvas *can; { if ( display ) { - XCopyArea(display,can->pix,can->window, - drawGC,0,0,can->width,can->height,0,0); + if ( can->color ) { + set_drawcolor(can->color); + XCopyArea(display,can->pix,can->window, + cdrawGC,0,0,can->width,can->height,0,0); + } else + XCopyArea(display,can->pix,can->window, + drawGC,0,0,can->width,can->height,0,0); pline(display,can,can->window); XFlush(display); } @@ -914,9 +964,6 @@ static void print_canvas(w,can,calldata) Widget entry; int i; Arg arg[1]; - static void output_to_printer(); - static void print_canvas_to_file(); - static void printing_method(); W = w; Can = can; @@ -926,6 +973,7 @@ static void print_canvas(w,can,calldata) XawDialogAddButton(fdialog,"method",printing_method,w); XawDialogAddButton(fdialog,"dismiss",cancel_output_to_file,w); XtSetSensitive(w,False); XtPopup(fshell,XtGrabNone); + SetWM_Proto(fshell); } static void set_printing_method(Widget w,XtPointer number,XtPointer call_data) { @@ -960,6 +1008,7 @@ static void printing_method(w,can,calldata) XawDialogAddButton(fdialog,Printing_methods[i],set_printing_method,(XtPointer) i); } XtSetSensitive(w,False); XtPopup(fshell,XtGrabNone); + SetWM_Proto(fshell); } static void print_canvas_to_file(w,can,calldata) Widget w; @@ -988,6 +1037,7 @@ static void print_canvas_to_file(w,can,calldata) XawDialogAddButton(fdialog,"cancel",cancel_output_to_file,w); PrintDialog = fdialog; XtSetSensitive(w,False); XtPopup(fshell,XtGrabNone); + SetWM_Proto(fshell); } static void output_to_printer(w,can,calldata) Widget w; @@ -1016,6 +1066,7 @@ static void output_to_printer(w,can,calldata) XawDialogAddButton(fdialog,"cancel",cancel_output_to_file,w); PrintDialog_lp = fdialog; XtSetSensitive(w,False); XtPopup(fshell,XtGrabNone); + SetWM_Proto(fshell); } static void cancel_output_to_file(w,fbutton,call) @@ -1124,7 +1175,7 @@ static void output_to_ps_printer(w,fbutton,call) /* test sequence ox_launch(0,"ox_plot"); ifplot(x^2-y^3); - drawcircle(0,0,100,0,0); + drawcircle(0,0,100,0xff000,0); */ static int getColorSizeOfImageForPS(int xsize,int ysize,XImage *image, struct xcolorForPS **tableOfxcolorForPS);