allow x-button to close plot windows
This commit is contained in:
parent
0227974ced
commit
ed1c4cb09c
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
2009-02-12 Holger Vogt
|
2009-02-12 Holger Vogt
|
||||||
* device.c:908 remove bug: reset i to 0
|
* device.c:908 remove bug: reset i to 0
|
||||||
|
x11.c: allow closing of plot windows with WM x-button
|
||||||
|
|
||||||
2009-02-10 Holger Vogt
|
2009-02-10 Holger Vogt
|
||||||
* windisp.c, X11.c, postcom.c
|
* windisp.c, X11.c, postcom.c
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,10 @@ static char *xlinestyles[NUMLINESTYLES] = { /* test patterns XXX */
|
||||||
"\003\003\007\003", /* short/longdash */
|
"\003\003\007\003", /* short/longdash */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* atoms for catching window delet by WM x-button */
|
||||||
|
static Atom atom_wm_delete_window;
|
||||||
|
static Atom atom_wm_protocols;
|
||||||
|
|
||||||
static Widget toplevel;
|
static Widget toplevel;
|
||||||
static Bool noclear = False;
|
static Bool noclear = False;
|
||||||
static GRAPH *lasthardcopy; /* graph user selected */
|
static GRAPH *lasthardcopy; /* graph user selected */
|
||||||
|
|
@ -299,6 +303,22 @@ handlebuttonev(Widget w, caddr_t clientdata, caddr_t calldata)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* callback function for catching window deletion by WM x-button */
|
||||||
|
static void handle_wm_messages(Widget w, XtPointer client_data, XEvent *event, Boolean *cont) {
|
||||||
|
GRAPH *graph = (GRAPH *) client_data;
|
||||||
|
|
||||||
|
if (event->type == ClientMessage
|
||||||
|
&& event->xclient.message_type == atom_wm_protocols
|
||||||
|
&& event->xclient.data.l[0] == atom_wm_delete_window) {
|
||||||
|
|
||||||
|
/* Iplots are done asynchronously */
|
||||||
|
DEVDEP(graph).isopen = 0;
|
||||||
|
/* MW. Not sure but DestroyGraph might free() to much - try Xt...() first */
|
||||||
|
XtDestroyWidget(DEVDEP(graph).shell);
|
||||||
|
DestroyGraph(graph->graphid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Recover from bad NewViewPort call. */
|
/* Recover from bad NewViewPort call. */
|
||||||
#define RECOVERNEWVIEWPORT() tfree(graph);\
|
#define RECOVERNEWVIEWPORT() tfree(graph);\
|
||||||
|
|
@ -315,6 +335,8 @@ X11_NewViewport(GRAPH *graph)
|
||||||
Cursor cursor;
|
Cursor cursor;
|
||||||
XSetWindowAttributes w_attrs;
|
XSetWindowAttributes w_attrs;
|
||||||
XGCValues gcvalues;
|
XGCValues gcvalues;
|
||||||
|
|
||||||
|
|
||||||
static Arg formargs[ ] = {
|
static Arg formargs[ ] = {
|
||||||
{ XtNleft, (XtArgVal) XtChainLeft },
|
{ XtNleft, (XtArgVal) XtChainLeft },
|
||||||
{ XtNresizable, (XtArgVal) TRUE }
|
{ XtNresizable, (XtArgVal) TRUE }
|
||||||
|
|
@ -445,9 +467,18 @@ X11_NewViewport(GRAPH *graph)
|
||||||
cursor = XCreateFontCursor(display, XC_left_ptr);
|
cursor = XCreateFontCursor(display, XC_left_ptr);
|
||||||
XDefineCursor(display, DEVDEP(graph).window, cursor);
|
XDefineCursor(display, DEVDEP(graph).window, cursor);
|
||||||
|
|
||||||
|
/* WM_DELETE_WINDOW protocol */
|
||||||
|
atom_wm_protocols = XInternAtom(display, "WM_PROTOCOLS", False);
|
||||||
|
atom_wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", False);
|
||||||
|
XtAddEventHandler(DEVDEP(graph).shell, NoEventMask, True, handle_wm_messages,graph);
|
||||||
|
XSetWMProtocols(display, XtWindow(DEVDEP(graph).shell), &atom_wm_delete_window, 1);
|
||||||
|
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* This routine closes the X connection.
|
/* This routine closes the X connection.
|
||||||
It is not to be called for finishing a graph. */
|
It is not to be called for finishing a graph. */
|
||||||
int
|
int
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue