gtk3/gtk3-wayland-handle-subsurface-popup-parent.patch

55 lines
1.9 KiB
Diff

From 5bae71f896eb5516c04b1b2374aaff05cfb8b3c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
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