[mutter/wayland] constraints: account for decorations when positioning modal dialogs
- From: Owen Taylor <otaylor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wayland] constraints: account for decorations when positioning modal dialogs
- Date: Tue, 19 Nov 2013 19:04:26 +0000 (UTC)
commit a1087c3f3058efb99191211260b67f7e9b1e9819
Author: Giovanni Campagna <gcampagn redhat com>
Date: Mon Sep 2 11:22:11 2013 +0200
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 files changed, 17 insertions(+), 7 deletions(-)
---
diff --git a/src/core/constraints.c b/src/core/constraints.c
index 20a918b..bc23a72 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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]