From c652a54f5989ab7391df050f09b4dd9780f9cdbc Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Mon, 2 Sep 2013 11:22:11 +0200 Subject: [PATCH] constraints: account for decorations when positioning modal dialogs What we want to achieve is that the dialog is visually centered on the parent, including the decorations for both, and making sure that CSD/frame_extents are respected. https://bugzilla.gnome.org/show_bug.cgi?id=707194 --- src/core/constraints.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/core/constraints.c b/src/core/constraints.c index 20a918b69..bc23a7220 100644 --- a/src/core/constraints.c +++ b/src/core/constraints.c @@ -765,18 +765,28 @@ constrain_modal_dialog (MetaWindow *window, { int x, y; MetaWindow *parent = meta_window_get_transient_for (window); + MetaRectangle child_rect, parent_rect; gboolean constraint_already_satisfied; if (!meta_window_is_attached_dialog (window)) return TRUE; - x = parent->rect.x + (parent->rect.width / 2 - info->current.width / 2); - y = parent->rect.y + (parent->rect.height / 2 - info->current.height / 2); - if (parent->frame) - { - x += parent->frame->rect.x; - y += parent->frame->rect.y; - } + /* We want to center the dialog on the parent, including the decorations + for both of them. info->current is in client X window coordinates, so we need + to convert them to frame coordinates, apply the centering and then + convert back to client. + */ + + child_rect = info->current; + extend_by_frame (&child_rect, info->borders); + + meta_window_get_outer_rect (parent, &parent_rect); + + child_rect.x = parent_rect.x + (parent_rect.width / 2 - child_rect.width / 2); + child_rect.y = parent_rect.y + (parent_rect.height / 2 - child_rect.height / 2); + unextend_by_frame (&child_rect, info->borders); + x = child_rect.x; + y = child_rect.y; constraint_already_satisfied = (x == info->current.x) && (y == info->current.y);