From 5e552d54b35143da411c080bcf7650d6ae64a06b Mon Sep 17 00:00:00 2001 From: besendorf Date: Mon, 20 Jul 2026 11:07:05 +0200 Subject: [PATCH] Fix XEmbed tray docking initialization Correct the embedded-notify event, decode the mapped flag using the Xlib property representation, and publish the initial embedder geometry before docking. Developed and tested with assistance from OpenAI Codex. --- gui-agent/vmside.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/gui-agent/vmside.c b/gui-agent/vmside.c index 5b8b5c5f..2d19d709 100644 --- a/gui-agent/vmside.c +++ b/gui-agent/vmside.c @@ -1410,6 +1410,7 @@ static void process_xevent_message(Ghandles * g, XClientMessageEvent * ev) Window w; int ret; struct msg_hdr hdr; + struct msg_configure conf; Atom act_type; int act_fmt; int mapwindow = 0; @@ -1442,7 +1443,7 @@ static void process_xevent_message(Ghandles * g, XClientMessageEvent * ev) fprintf(stderr, "window 0x%lx havn't proper _XEMBED_INFO property, assuming defaults (workaround for buggy applications)\n", w); } if (act_type == g->xembed_info && nitems == 2) { - mapwindow = ((int*)data)[1] & XEMBED_MAPPED; + mapwindow = ((unsigned long*)data)[1] & XEMBED_MAPPED; /* TODO: handle version */ } if (ret == Success && nitems > 0) @@ -1486,18 +1487,27 @@ static void process_xevent_message(Ghandles * g, XClientMessageEvent * ev) resp.data.l[4] = 0; /* TODO: handle version; GTK+ uses version 1, but spec says the latest is 0 */ resp.display = g->display; XSendEvent(resp.display, resp.window, False, - NoEventMask, (XEvent *) & ev); + NoEventMask, (XEvent *) &resp); XRaiseWindow(g->display, w); if (mapwindow) XMapRaised(g->display, resp.window); XMapWindow(g->display, wd->embeder); XLowerWindow(g->display, wd->embeder); - XMoveWindow(g->display, w, 0, 0); + XMoveResizeWindow(g->display, w, 0, 0, 32, 32); /* force refresh of window content */ XClearWindow(g->display, wd->embeder); XClearArea(g->display, w, 0, 0, 32, 32, True); /* XXX defult size once again */ XSync(g->display, False); + hdr.type = MSG_CONFIGURE; + hdr.window = w; + conf.x = 0; + conf.y = 0; + conf.width = 32; + conf.height = 32; + conf.override_redirect = 0; + write_message(g->vchan, hdr, conf); + hdr.type = MSG_DOCK; hdr.window = w; hdr.untrusted_len = 0;