summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Forbes <ian.forbes@broadcom.com>2025-08-05 10:20:00 -0500
committerMarge Bot <marge-bot@fdo.invalid>2025-09-12 07:47:39 +0000
commitafc8b781d87a490da7d56a76e5a30877face1fc0 (patch)
treea24c36a7be26cb5d474780d376609a03c15e080e
parentb644922366d55b80b7cf0112900e17f695eed9a9 (diff)
xwayland: Try harder to find a top-level for root grabsHEADmaster
The commit referenced below partially resolved an issue with grabs being made on the root window. Unfortunately it assumes that the application uses the same client for all windows. VMware Workstation uses nested windows for each VM, each of which runs its own process with this own client. Theses windows are managed by the GUI which is the top level for the application and maps the windows based on which tab is selected. Because the VM windows issue a grab on the root window and don't share the same client as the GUI, grabs don't work properly with global shortcut inhibition being completely broken. Getting the parent top-level of the nested windows fixes this issue. Fixes: c7730cfe5577 ("xwayland: Translate keyboard grabs on the root window") Signed-off-by: Ian Forbes <ian.forbes@broadcom.com> Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2016>
-rw-r--r--hw/xwayland/xwayland-input.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index de41c7c78..cd2046e1d 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -1605,9 +1605,13 @@ find_toplevel_callback(void *resource, XID id, void *user_data)
WindowPtr window = resource;
WindowPtr *toplevel = user_data;
- /* Pick the first realized toplevel we find */
- if (*toplevel == NullWindow && window->realized && xwl_window_is_toplevel(window))
- *toplevel = window;
+ while (*toplevel == NullWindow && window) {
+ /* Pick the first realized toplevel we find */
+ if (window->realized && xwl_window_is_toplevel(window))
+ *toplevel = window;
+ else
+ window = window->parent;
+ }
}
static WindowPtr