wayland: Transform moved_to_rect result properly
The result of move_to_rect, received from the xdg_popup.configure event, needs to be translated to the correct coordinate space; that is from real parent window geometry to coordinates relative to the gdk window set as transient-for. https://bugzilla.gnome.org/show_bug.cgi?id=771117
This commit is contained in:
@ -1639,6 +1639,21 @@ translate_to_real_parent_window_geometry (GdkWindow *window,
|
|||||||
*y -= parent->shadow_top;
|
*y -= parent->shadow_top;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
translate_from_real_parent_window_geometry (GdkWindow *window,
|
||||||
|
gint *x,
|
||||||
|
gint *y)
|
||||||
|
{
|
||||||
|
GdkWindow *parent;
|
||||||
|
gint dx = 0;
|
||||||
|
gint dy = 0;
|
||||||
|
|
||||||
|
parent = get_real_parent_and_translate (window, &dx, &dy);
|
||||||
|
|
||||||
|
*x -= dx - parent->shadow_left;
|
||||||
|
*y -= dy - parent->shadow_top;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
calculate_popup_rect (GdkWindow *window,
|
calculate_popup_rect (GdkWindow *window,
|
||||||
GdkGravity rect_anchor,
|
GdkGravity rect_anchor,
|
||||||
@ -1822,24 +1837,20 @@ calculate_moved_to_rect_result (GdkWindow *window,
|
|||||||
{
|
{
|
||||||
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
|
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
|
||||||
GdkRectangle best_rect;
|
GdkRectangle best_rect;
|
||||||
GdkRectangle geometry;
|
|
||||||
|
|
||||||
x += impl->transient_for->shadow_left;
|
translate_from_real_parent_window_geometry (window, &x, &y);
|
||||||
y += impl->transient_for->shadow_top;
|
*final_rect = (GdkRectangle) {
|
||||||
|
.x = x,
|
||||||
|
.y = y,
|
||||||
|
.width = width,
|
||||||
|
.height = height,
|
||||||
|
};
|
||||||
|
|
||||||
calculate_popup_rect (window,
|
calculate_popup_rect (window,
|
||||||
impl->pending_move_to_rect.rect_anchor,
|
impl->pending_move_to_rect.rect_anchor,
|
||||||
impl->pending_move_to_rect.window_anchor,
|
impl->pending_move_to_rect.window_anchor,
|
||||||
&best_rect);
|
&best_rect);
|
||||||
|
|
||||||
gdk_wayland_window_get_window_geometry (window, &geometry);
|
|
||||||
*final_rect = (GdkRectangle) {
|
|
||||||
.x = x,
|
|
||||||
.y = y,
|
|
||||||
.width = geometry.width,
|
|
||||||
.height = geometry.height
|
|
||||||
};
|
|
||||||
|
|
||||||
*flipped_rect = best_rect;
|
*flipped_rect = best_rect;
|
||||||
|
|
||||||
if (x != best_rect.x &&
|
if (x != best_rect.x &&
|
||||||
|
|||||||
Reference in New Issue
Block a user