In my X11 Intercept Window Close
Event post I left out one very
important piece of information. How to actually close the embedded window after
intercepting the WM_DELETE_WINDOW
message. The best thing to do is send our own
WM_DELETE_WINDOW
message to the embedded window. This will keep the embedded
window embedded until it actually closes. Meaning any question dialogs that
might stop the window from closing (Gedit asking to save for instance) can be
answered and it keeps the window embedded if the user decides not to close.
In the previous post we overrode the WM_DELETE_WINDOW
message. All we need to
do is send it on to the embedded window. This will keep it embedded until it
actually closes. Sending a this message entails setting the type to
ClientMessage
, message type to the WM_PROTOCOLS
Atom, the first l
data value to
the WM_DELETE_WINDOW
Atom, and the second l
data value to CurrentTime
. The
format of course if 32. Send the message to the embedded window and it will try
to close.
#include <QX11Info>
#include <X11/XLib.h>
Display *display = QX11Info::display();
XEvent ev;
memset(&ev, 0, sizeof (ev));
ev.xclient.type = ClientMessage;
ev.xclient.window = window;
ev.xclient.message_type = XInternAtom(display, "WM_PROTOCOLS", true);
ev.xclient.format = 32;
ev.xclient.data.l[0] = XInternAtom(display, "WM_DELETE_WINDOW", false);
ev.xclient.data.l[1] = CurrentTime;
XSendEvent(display, window, False, NoEventMask, &ev);