constraints: Don't use intersection when sliding with custom rule

If an intersection is empty, the (x, y) coordinates are undefined, so
just use the work area and in-progress constrained window rect when
sliding according to the SLIDE_X or SLIDE_Y custom placement rule.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/496
This commit is contained in:
Jonas Ådahl 2019-03-15 18:01:50 +01:00 committed by Florian Müllner
parent 86b5247770
commit 00b4556051

View File

@ -910,18 +910,42 @@ constrain_custom_rule (MetaWindow *window,
if (current_rule.constraint_adjustment & if (current_rule.constraint_adjustment &
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_X) META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_X)
{ {
if (info->current.x != intersection.x) int current_x2;
info->current.x = intersection.x; int work_area_monitor_x2;
else if (info->current.width != intersection.width)
info->current.x -= info->current.width - intersection.width; current_x2 = info->current.x + info->current.width;
work_area_monitor_x2 = (info->work_area_monitor.x +
info->work_area_monitor.width);
if (current_x2 > work_area_monitor_x2)
{
info->current.x = MAX (info->work_area_monitor.x,
work_area_monitor_x2 - info->current.width);
}
else if (info->current.x < info->work_area_monitor.x)
{
info->current.x = info->work_area_monitor.x;
}
} }
if (current_rule.constraint_adjustment & if (current_rule.constraint_adjustment &
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_Y) META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_Y)
{ {
if (info->current.y != intersection.y) int current_y2;
info->current.y = intersection.y; int work_area_monitor_y2;
else if (info->current.height != intersection.height)
info->current.y -= info->current.height - intersection.height; current_y2 = info->current.y + info->current.height;
work_area_monitor_y2 = (info->work_area_monitor.y +
info->work_area_monitor.height);
if (current_y2 > work_area_monitor_y2)
{
info->current.y = MAX (info->work_area_monitor.y,
work_area_monitor_y2 - info->current.height);
}
else if (info->current.y < info->work_area_monitor.y)
{
info->current.y = info->work_area_monitor.y;
}
} }
meta_rectangle_intersect (&info->current, &info->work_area_monitor, meta_rectangle_intersect (&info->current, &info->work_area_monitor,