From 298221bfba9b784cddaf5d6ac121e9bb3f25c0db Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Wed, 29 Jun 2016 15:08:06 +0200 Subject: [PATCH] wayland: return child only in device_query_state() On X11, device_query_state() uses XIQueryPointer() which will return a child window only if the pointer is within an actual child of the given window. Wayland backend would return the pointer->focus window independently of the given window, but that breaks the logic in get_device_state() and later in gdk_window_get_device_position_double() because the window is searched based on coordinates from another window without sibling relationship, breaking gtkmenu sub-menus further down the line. Fix the Wayland backend to mimic X11's XIQueryPointer() to return a child only if really a child of the given window. That's the most sensible thing to do to fix the issue, but the API here seems to be modeled after the X11 implementation and the description of gdk_window_get_device_position_double() is not entirely accurate. https://bugzilla.gnome.org/show_bug.cgi?id=768016 --- gdk/wayland/gdkdevice-wayland.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c index 72d9baf5a6..32f57a2ca5 100644 --- a/gdk/wayland/gdkdevice-wayland.c +++ b/gdk/wayland/gdkdevice-wayland.c @@ -517,7 +517,8 @@ gdk_wayland_device_query_state (GdkDevice *device, if (root_window) *root_window = gdk_screen_get_root_window (default_screen); if (child_window) - *child_window = pointer->focus; + /* Set child only if actually a child of the given window, as XIQueryPointer() does */ + *child_window = g_list_find (window->children, pointer->focus) ? pointer->focus : NULL; if (mask) *mask = device_get_modifiers (device);