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.
This commit is contained in:
Rob Bradford 2012-04-23 17:26:49 +01:00
parent 568b310eb3
commit af8e4ee8e7

View File

@ -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;
}