From d792400d7c258b349c1dbaed0a12eee796a4b958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 12 Sep 2016 18:41:36 +0800 Subject: [PATCH] wayland: Transform moved_to_rect result properly The result of move_to_rect, received from the xdg_popup.configure event, needs to be translated to the correct coordinate space; that is from real parent window geometry to coordinates relative to the gdk window set as transient-for. https://bugzilla.gnome.org/show_bug.cgi?id=771117 --- gdk/wayland/gdkwindow-wayland.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c index 17cfed5d5d..4c6f38d1c8 100644 --- a/gdk/wayland/gdkwindow-wayland.c +++ b/gdk/wayland/gdkwindow-wayland.c @@ -1639,6 +1639,21 @@ translate_to_real_parent_window_geometry (GdkWindow *window, *y -= parent->shadow_top; } +static void +translate_from_real_parent_window_geometry (GdkWindow *window, + gint *x, + gint *y) +{ + GdkWindow *parent; + gint dx = 0; + gint dy = 0; + + parent = get_real_parent_and_translate (window, &dx, &dy); + + *x -= dx - parent->shadow_left; + *y -= dy - parent->shadow_top; +} + static void calculate_popup_rect (GdkWindow *window, GdkGravity rect_anchor, @@ -1822,24 +1837,20 @@ calculate_moved_to_rect_result (GdkWindow *window, { GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); GdkRectangle best_rect; - GdkRectangle geometry; - x += impl->transient_for->shadow_left; - y += impl->transient_for->shadow_top; + translate_from_real_parent_window_geometry (window, &x, &y); + *final_rect = (GdkRectangle) { + .x = x, + .y = y, + .width = width, + .height = height, + }; calculate_popup_rect (window, impl->pending_move_to_rect.rect_anchor, impl->pending_move_to_rect.window_anchor, &best_rect); - gdk_wayland_window_get_window_geometry (window, &geometry); - *final_rect = (GdkRectangle) { - .x = x, - .y = y, - .width = geometry.width, - .height = geometry.height - }; - *flipped_rect = best_rect; if (x != best_rect.x &&