From 5bae71f896eb5516c04b1b2374aaff05cfb8b3c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 5 Jan 2017 16:01:49 +0800 Subject: wayland: Handle subsurface as popup parent When a subsurface is used as a parent of a popup, GDK needs to traverse up to the transient-for as the next parent, to properly find the parent used by the popup positioner. This is because the parent of a popup must always either be an xdg_popup or an xdg_surface, but traversing the "parent" (in GDK terms) upwards from a subsurface will end up on the fake root window before we hit the actual parent (in Wayland terms). https://bugzilla.gnome.org/show_bug.cgi?id=776225 --- gdk/wayland/gdkwindow-wayland.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c index 0314117..8fce48b 100644 --- a/gdk/wayland/gdkwindow-wayland.c +++ b/gdk/wayland/gdkwindow-wayland.c @@ -1656,13 +1656,25 @@ get_real_parent_and_translate (GdkWindow *window, GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); GdkWindow *parent = impl->transient_for; - while (parent && - !gdk_window_has_native (parent) && - gdk_window_get_effective_parent (parent)) + while (parent) { + GdkWindowImplWayland *parent_impl = + GDK_WINDOW_IMPL_WAYLAND (parent->impl); + GdkWindow *effective_parent = gdk_window_get_effective_parent (parent); + + if ((gdk_window_has_native (parent) && + !parent_impl->display_server.wl_subsurface) || + !effective_parent) + break; + *x += parent->x; *y += parent->y; - parent = gdk_window_get_effective_parent (parent); + + if (gdk_window_has_native (parent) && + parent_impl->display_server.wl_subsurface) + parent = parent->transient_for; + else + parent = effective_parent; } return parent; -- cgit v0.12