summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagn@redhat.com>2013-09-02 11:22:11 +0200
committerOwen W. Taylor <otaylor@fishsoup.net>2013-11-19 14:04:16 -0500
commita1087c3f3058efb99191211260b67f7e9b1e9819 (patch)
treea44a343c51a268ef0090e1f836a7b6379e750b76
parentaad275b9a2fe52bf887af4a8fb37855d777dd91b (diff)
downloadmutter-a1087c3f3058efb99191211260b67f7e9b1e9819.tar.gz
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
-rw-r--r--src/core/constraints.c24
1 files 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);