forked from AuroraMiddleware/gtk
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:
parent
74d237df41
commit
d792400d7c
@ -1639,6 +1639,21 @@ translate_to_real_parent_window_geometry (GdkWindow *window,
|
||||
*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
|
||||
calculate_popup_rect (GdkWindow *window,
|
||||
GdkGravity rect_anchor,
|
||||
@ -1822,24 +1837,20 @@ calculate_moved_to_rect_result (GdkWindow *window,
|
||||
{
|
||||
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
|
||||
GdkRectangle best_rect;
|
||||
GdkRectangle geometry;
|
||||
|
||||
x += impl->transient_for->shadow_left;
|
||||
y += impl->transient_for->shadow_top;
|
||||
translate_from_real_parent_window_geometry (window, &x, &y);
|
||||
*final_rect = (GdkRectangle) {
|
||||
.x = x,
|
||||
.y = y,
|
||||
.width = width,
|
||||
.height = height,
|
||||
};
|
||||
|
||||
calculate_popup_rect (window,
|
||||
impl->pending_move_to_rect.rect_anchor,
|
||||
impl->pending_move_to_rect.window_anchor,
|
||||
&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;
|
||||
|
||||
if (x != best_rect.x &&
|
||||
|
Loading…
Reference in New Issue
Block a user