summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2018-10-19 13:57:10 +0200
committerFlorian Müllner <florian.muellner@gmail.com>2019-03-17 14:12:40 +0000
commit23f31e518ecde2def83bee78a1897932c75610b2 (patch)
tree79d2f5c113ce43a19cb0eda22fa3690e1a628715
parentf580b28a27dce071577d718b49e76e864cbaf969 (diff)
downloadmutter-23f31e518ecde2def83bee78a1897932c75610b2.tar.gz
constraints: Only readjust placement constraint when not checking
When check_only is TRUE, the constraint should not be applied, just checked. We failed to comply here when a placed transient window was to be moved together with its parent, updating the window position directly even if check_only was TRUE. https://gitlab.gnome.org/GNOME/mutter/merge_requests/496
-rw-r--r--src/core/constraints.c73
1 files changed, 45 insertions, 28 deletions
diff --git a/src/core/constraints.c b/src/core/constraints.c
index 445d8539e..cf039a580 100644
--- a/src/core/constraints.c
+++ b/src/core/constraints.c
@@ -779,7 +779,7 @@ try_flip_window_position (MetaWindow *window,
}
static gboolean
-is_custom_rule_satisfied (ConstraintInfo *info,
+is_custom_rule_satisfied (MetaRectangle *rect,
MetaPlacementRule *placement_rule,
MetaRectangle *intersection)
{
@@ -790,9 +790,9 @@ is_custom_rule_satisfied (ConstraintInfo *info,
y_constrain_actions = (META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_Y |
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_Y);
if ((placement_rule->constraint_adjustment & x_constrain_actions &&
- info->current.width != intersection->width) ||
+ rect->width != intersection->width) ||
(placement_rule->constraint_adjustment & y_constrain_actions &&
- info->current.height != intersection->height))
+ rect->height != intersection->height))
return FALSE;
else
return TRUE;
@@ -807,6 +807,7 @@ constrain_custom_rule (MetaWindow *window,
MetaPlacementRule *placement_rule;
MetaRectangle intersection;
gboolean constraint_satisfied;
+ MetaRectangle adjusted_unconstrained;
MetaPlacementRule current_rule;
MetaWindow *parent;
MetaRectangle parent_rect;
@@ -818,24 +819,46 @@ constrain_custom_rule (MetaWindow *window,
if (!placement_rule)
return TRUE;
+ adjusted_unconstrained = info->current;
+
switch (window->placement_state)
{
case META_PLACEMENT_STATE_UNCONSTRAINED:
break;
case META_PLACEMENT_STATE_CONSTRAINED:
+ parent = meta_window_get_transient_for (window);
+ meta_window_get_frame_rect (parent, &parent_rect);
+ adjusted_unconstrained.x =
+ parent_rect.x + window->constrained_placement_rule_offset_x;
+ adjusted_unconstrained.y =
+ parent_rect.y + window->constrained_placement_rule_offset_y;
+ break;
+ }
+
+ meta_rectangle_intersect (&adjusted_unconstrained, &info->work_area_monitor,
+ &intersection);
+
+ constraint_satisfied = (meta_rectangle_equal (&info->current,
+ &adjusted_unconstrained) &&
+ is_custom_rule_satisfied (&adjusted_unconstrained,
+ placement_rule,
+ &intersection));
+
+ if (check_only)
+ return constraint_satisfied;
+
+ current_rule = *placement_rule;
+
+ switch (window->placement_state)
+ {
+ case META_PLACEMENT_STATE_CONSTRAINED:
{
MetaRectangle parent_buffer_rect;
- parent = meta_window_get_transient_for (window);
- meta_window_get_frame_rect (parent, &parent_rect);
- info->current.x =
- parent_rect.x + window->constrained_placement_rule_offset_x;
- info->current.y =
- parent_rect.y + window->constrained_placement_rule_offset_y;
-
meta_window_get_buffer_rect (parent, &parent_buffer_rect);
- if (!meta_rectangle_overlap (&info->current, &parent_buffer_rect) &&
- !meta_rectangle_is_adjacent_to (&info->current,
+ if (!meta_rectangle_overlap (&adjusted_unconstrained,
+ &parent_buffer_rect) &&
+ !meta_rectangle_is_adjacent_to (&adjusted_unconstrained,
&parent_buffer_rect))
{
g_warning ("Buggy client caused popup to be placed outside of "
@@ -843,23 +866,17 @@ constrain_custom_rule (MetaWindow *window,
info->should_unmanage = TRUE;
return TRUE;
}
-
- return TRUE;
+ else
+ {
+ info->current = adjusted_unconstrained;
+ goto done;
+ }
+ break;
}
+ case META_PLACEMENT_STATE_UNCONSTRAINED:
+ break;
}
- meta_rectangle_intersect (&info->current, &info->work_area_monitor,
- &intersection);
-
- constraint_satisfied = is_custom_rule_satisfied (info,
- placement_rule,
- &intersection);
-
- if (check_only)
- return constraint_satisfied;
-
- current_rule = *placement_rule;
-
if (constraint_satisfied)
goto done;
@@ -882,7 +899,7 @@ constrain_custom_rule (MetaWindow *window,
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
&intersection);
- constraint_satisfied = is_custom_rule_satisfied (info,
+ constraint_satisfied = is_custom_rule_satisfied (&info->current,
placement_rule,
&intersection);
@@ -908,7 +925,7 @@ constrain_custom_rule (MetaWindow *window,
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
&intersection);
- constraint_satisfied = is_custom_rule_satisfied (info,
+ constraint_satisfied = is_custom_rule_satisfied (&info->current,
placement_rule,
&intersection);