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 | static gint | ||||||
| gdk_window_wayland_get_root_coords (GdkWindow *window, | gdk_window_wayland_get_root_coords (GdkWindow *window, | ||||||
| 				gint       x, | 				gint       x, | ||||||
| @ -881,11 +907,12 @@ gdk_window_wayland_get_root_coords (GdkWindow *window, | |||||||
| 				gint      *root_x, | 				gint      *root_x, | ||||||
| 				gint      *root_y) | 				gint      *root_y) | ||||||
| { | { | ||||||
|   /* We can't do this. */ |   gint x_offset, y_offset; | ||||||
|   if (root_x) |  | ||||||
|     *root_x = 0; |   _gdk_wayland_window_offset (window, &x_offset, &y_offset); | ||||||
|   if (root_y) |  | ||||||
|     *root_y = 0; |   *root_x = x_offset + x; | ||||||
|  |   *root_y = y_offset + y; | ||||||
|  |  | ||||||
|   return 1; |   return 1; | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Rob Bradford
					Rob Bradford