[comp.windows.x] WM_SAVEYOURSELF message

scott@graft.Berkeley.EDU (Scott Silvey) (01/15/91)

How does one respond to the WM_SAVEYOURSELF protocol message?

From ICCM, it seems to me that all I have to do is update the WM_COMMAND
  property on my window (to nothing) within the window manager timeout
  limit.  However, this doesn't seem to work.  My application window get's
  unmapped immediately and then after the WM_SAVEYOURSELF reply routine
  returns, the X connection gets closed.

I am using Motif1.1 with mwm.  I force the message by selecting the "Close" item
  from the mwm client menu on the titlebar.

Here is the callback for the WM_WAVEYOURSELF protocol.  It does in fact get
  called, so I assume I am installing it properly:


---------------------------------------------------------------------------------

#define SAVE_YOURSELF_ATOM(shell)       XInternAtom(XtDisplay(shell),        \
					      	    "WM_SAVE_YOURSELF",      \
						    FALSE);

#define COMMAND_ATOM(shell)             XInternAtom(XtDisplay(shell),        \
                                              	    "WM_COMMAND",            \
						    FALSE);

main()
{
...
    /* Remove DELETE protocol from shell so SAVE_YOURSELF won't be ignored. */
    XmDeactivateWMProtocol(toplevel, delete_atom);

    /* Mark shell as responding to WM_SAVE_YOURSELF protocol message. */
    XmActivateWMProtocol(toplevel, 
			 save_yourself_atom);

    /* Install the callback to respond to the WM_SAVE_YOURSELF message. */
    XmAddWMProtocolCallback(toplevel, 
 			    save_yourself_atom,
                            save_yourself_callback, 
  			    toplevel);
...
}


/* ACTUAL CALLBACK. */
save_yourself_callback(w, shell)
Widget w, shell;
{
    int i;
    char foo[64];
    Atom command_atom = COMMAND_ATOM(shell);

    strcpy(foo, "");

    /*
     * OR:
     * strcpy(foo, "bar");
     */

    fputs("Before XChangeProperty()\n", stderr);

    XChangeProperty(XtDisplay(shell),
                    XtWindow(shell),
                    command_atom,
                    XA_STRING,
                    8,
                    PropModeReplace,
                    (unsigned char *) foo,
                    strlen(foo));

    XSync(XtDisplay(shell), 0);
    fputs("After XChangeProperty()\n", stderr);

    /* Do some work beyond window manager timeout limit. */
    for (i=5; i>0; i--) {
        fprintf(stderr, "%d!\n", i);
        sleep(1);
    }

    fprintf(stderr, "save_yourself_callback(): SAVE_YOURSELF!\n");
}

---------------------------------------------------------------------------------
END OF CODE



Here is the output from the save_yourself_callback:

<APPLICATION WINDOW GETS UNMAPPED AT THIS POINT>
Before XChangeProperty()
After XChangeProperty()
5!
4!
3!
2!
1!
save_yourself_callback(): SAVE_YOURSELF!
XIO:  fatal IO error 54 (Connection reset by peer) on X server "graft:0.0"
      after 176 requests (175 known processed) with 0 events remaining.



/-----------------------------------------------------------------------------\
| Scott Silvey           | Ronald Reagan on Pac Man:                          |
| scott@xcf.berkeley.edu | "Someone told me it was a round thing that gobbles |
| Flames to /dev/null.   |  up money, but I thought that was Tip O'Neill."    |
\-----------------------------------------------------------------------------/