diff options
author | Rob Bradford <rob@linux.intel.com> | 2012-04-23 17:26:49 +0100 |
---|---|---|
committer | Rob Bradford <rob@linux.intel.com> | 2012-04-25 14:36:08 +0100 |
commit | af8e4ee8e7765c20f3c3e251111ff6ca9b2e1acd (patch) | |
tree | ccd478bcb9a960eb3682fa76239542dde4458e07 | |
parent | 568b310eb355fb1edeaa16f924b32e6077db6995 (diff) | |
download | gtk+-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.c | 37 |
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; } |