mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 09:30:45 -05:00
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:
parent
86b5247770
commit
00b4556051
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user