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:
		| @ -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; | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Rob Bradford
					Rob Bradford