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);