qubes-core-agent-linux/misc/close-window.c
Marek Marczykowski-Górecki c304933fb7 dispvm: close only visible windows during DispVM preparation
Closing some invisible window can cause e.g. Firefox crash. Send the
message to visible windows and others should be cleaned up by the
application.

(cherry picked from commit 5c4e88a765)
2015-03-05 00:55:00 +01:00

43 lines
939 B
C

#include <X11/Xutil.h>
#include <X11/Xlib.h>
#include <string.h>
#include <stdlib.h>
int close_window(Display *d, XID window) {
XClientMessageEvent ev;
memset(&ev, 0, sizeof(ev));
ev.type = ClientMessage;
ev.display = d;
ev.window = window;
ev.format = 32;
ev.message_type = XInternAtom(d, "WM_PROTOCOLS", False);
ev.data.l[0] = XInternAtom(d, "WM_DELETE_WINDOW", False);;
return XSendEvent(ev.display, ev.window, True, 0, (XEvent *) & ev);
}
int is_window_visible(Display *d, XID window) {
XWindowAttributes xwa;
if (!XGetWindowAttributes(d, window, &xwa))
return 0;
return xwa.map_state == IsViewable;
}
int main(int argc, char **argv) {
int i;
Display *d;
XID w;
d = XOpenDisplay(NULL);
if (!d)
exit(1);
for (i=1; i<argc; i++) {
w = strtoul(argv[i], NULL, 0);
if (is_window_visible(d, w))
close_window(d, w);
}
XSync(d, False);
XCloseDisplay(d);
return 0;
}