Skip to content

Commit a8e6343

Browse files
committed
vm: pretend that GUI agent is a window manager (#409)
Used to disable broken GTK+ move/resize fallback, which grabs pointer permanently (so other application in the same VM didn't receve mouse events). When GTK+ finds that WM supports move/resize - it send a message to WM (which is ignored) and _do not call_ fallback. This happens when user clicks on right bottom window corner.
1 parent 8d4d403 commit a8e6343

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

gui-agent/vmside.c

+20
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,9 @@ extern void wait_for_unix_socket(int *fd);
622622
void mkghandles(Ghandles * g)
623623
{
624624
char tray_sel_atom_name[64];
625+
Atom net_wm_name, net_supporting_wm_check, net_supported;
626+
Atom supported[3];
627+
625628
wait_for_unix_socket(&g->xserver_fd); // wait for Xorg qubes_drv to connect to us
626629
g->display = XOpenDisplay(NULL);
627630
if (!g->display) {
@@ -644,6 +647,23 @@ void mkghandles(Ghandles * g)
644647
g->screen),
645648
WhitePixel(g->display,
646649
g->screen));
650+
/* pretend that GUI agent is window manager */
651+
net_wm_name = XInternAtom(g->display, "_NET_WM_NAME", False);
652+
net_supporting_wm_check = XInternAtom(g->display, "_NET_SUPPORTING_WM_CHECK", False);
653+
net_supported = XInternAtom(g->display, "_NET_SUPPORTED", False);
654+
supported[0] = net_supported;
655+
supported[1] = net_supporting_wm_check;
656+
/* _NET_WM_MOVERESIZE required to disable broken GTK+ move/resize fallback */
657+
supported[2] = XInternAtom(g->display, "_NET_WM_MOVERESIZE", False);
658+
XChangeProperty(g->display, g->stub_win, net_wm_name, g->utf8_string_atom,
659+
8, PropModeReplace, (unsigned char*)"Qubes", 5);
660+
XChangeProperty(g->display, g->stub_win, net_supporting_wm_check, XA_WINDOW,
661+
32, PropModeReplace, (unsigned char*)&g->stub_win, 1);
662+
XChangeProperty(g->display, g->root_win, net_supporting_wm_check, XA_WINDOW,
663+
32, PropModeReplace, (unsigned char*)&g->stub_win, 1);
664+
XChangeProperty(g->display, g->root_win, net_supported, XA_ATOM,
665+
32, PropModeReplace, (unsigned char*)supported, 3);
666+
647667
g->clipboard_data = NULL;
648668
g->clipboard_data_len = 0;
649669
snprintf(tray_sel_atom_name, sizeof(tray_sel_atom_name),

0 commit comments

Comments
 (0)