summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Bradford <rob@linux.intel.com>2012-04-23 17:26:49 +0100
committerRob Bradford <rob@linux.intel.com>2012-04-25 14:36:08 +0100
commitaf8e4ee8e7765c20f3c3e251111ff6ca9b2e1acd (patch)
treeccd478bcb9a960eb3682fa76239542dde4458e07
parent568b310eb355fb1edeaa16f924b32e6077db6995 (diff)
downloadgtk+-af8e4ee8e7765c20f3c3e251111ff6ca9b2e1acd.tar.gz
wayland: Calculate window position offset to give emulated root coordinates
This allows combo box popup windows to appear in the correct place. This is a workaround emulating root coordinates by calculating the offset for a chain of windows that that are relative to each other.
-rw-r--r--gdk/wayland/gdkwindow-wayland.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index 48859cd30f..ff3b92b550 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -874,6 +874,32 @@ gdk_window_wayland_get_geometry (GdkWindow *window,
}
}
+void
+_gdk_wayland_window_offset (GdkWindow *window,
+ gint *x_out,
+ gint *y_out)
+{
+ GdkWindowImplWayland *impl, *parent_impl;
+ GdkWindow *parent_window;
+ gint x_offset = 0, y_offset = 0;
+
+ impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+
+ parent_window = impl->transient_for;
+ while (parent_window)
+ {
+ parent_impl = GDK_WINDOW_IMPL_WAYLAND (parent_window->impl);
+
+ x_offset += window->x;
+ y_offset += window->y;
+
+ parent_window = parent_impl->transient_for;
+ }
+
+ *x_out = x_offset;
+ *y_out = y_offset;
+}
+
static gint
gdk_window_wayland_get_root_coords (GdkWindow *window,
gint x,
@@ -881,11 +907,12 @@ gdk_window_wayland_get_root_coords (GdkWindow *window,
gint *root_x,
gint *root_y)
{
- /* We can't do this. */
- if (root_x)
- *root_x = 0;
- if (root_y)
- *root_y = 0;
+ gint x_offset, y_offset;
+
+ _gdk_wayland_window_offset (window, &x_offset, &y_offset);
+
+ *root_x = x_offset + x;
+ *root_y = y_offset + y;
return 1;
}