summaryrefslogtreecommitdiff
path: root/gdk/gdkwindowimpl.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdk/gdkwindowimpl.c')
-rw-r--r--gdk/gdkwindowimpl.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/gdk/gdkwindowimpl.c b/gdk/gdkwindowimpl.c
index 11e49d5bc7..c42c5aa218 100644
--- a/gdk/gdkwindowimpl.c
+++ b/gdk/gdkwindowimpl.c
@@ -173,6 +173,29 @@ maybe_flip_position (gint bounds_pos,
return primary;
}
+static GdkWindow *
+traverse_to_toplevel (GdkWindow *window,
+ gint x,
+ gint y,
+ gint *toplevel_x,
+ gint *toplevel_y)
+{
+ GdkWindow *parent;
+ gdouble xf = x;
+ gdouble yf = y;
+
+ while ((parent = gdk_window_get_effective_parent (window)) != NULL &&
+ (gdk_window_get_window_type (parent) != GDK_WINDOW_ROOT))
+ {
+ gdk_window_coords_to_parent (window, xf, yf, &xf, &yf);
+ window = parent;
+ }
+
+ *toplevel_x = (gint) xf;
+ *toplevel_y = (gint) yf;
+ return window;
+}
+
static void
gdk_window_impl_move_to_rect (GdkWindow *window,
const GdkRectangle *rect,
@@ -182,6 +205,7 @@ gdk_window_impl_move_to_rect (GdkWindow *window,
gint rect_anchor_dx,
gint rect_anchor_dy)
{
+ GdkWindow *transient_for_toplevel;
GdkDisplay *display;
GdkMonitor *monitor;
GdkRectangle bounds;
@@ -191,7 +215,18 @@ gdk_window_impl_move_to_rect (GdkWindow *window,
gboolean flipped_x;
gboolean flipped_y;
- gdk_window_get_root_coords (window->transient_for,
+ /*
+ * First translate the anchor rect to toplevel coordinates. This is needed
+ * because not all backends will be able to get root coordinates for
+ * non-toplevel windows.
+ */
+ transient_for_toplevel = traverse_to_toplevel (window->transient_for,
+ root_rect.x,
+ root_rect.y,
+ &root_rect.x,
+ &root_rect.y);
+
+ gdk_window_get_root_coords (transient_for_toplevel,
root_rect.x,
root_rect.y,
&root_rect.x,