diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2019-03-15 18:01:50 +0100 |
---|---|---|
committer | Florian Müllner <florian.muellner@gmail.com> | 2019-03-17 14:12:40 +0000 |
commit | 00b4556051345f0e7cbf714f24100b3ee8cc5ddb (patch) | |
tree | 97c85eb2bc7a3bfa649ea1c400c44080d4d28d0b | |
parent | 86b52477702ae03bb8096d8329eac8f1c841fc68 (diff) | |
download | mutter-00b4556051345f0e7cbf714f24100b3ee8cc5ddb.tar.gz |
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
-rw-r--r-- | src/core/constraints.c | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/src/core/constraints.c b/src/core/constraints.c index d468c2d92..117131b15 100644 --- a/src/core/constraints.c +++ b/src/core/constraints.c @@ -910,18 +910,42 @@ constrain_custom_rule (MetaWindow *window, if (current_rule.constraint_adjustment & META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_X) { - if (info->current.x != intersection.x) - info->current.x = intersection.x; - else if (info->current.width != intersection.width) - info->current.x -= info->current.width - intersection.width; + int current_x2; + int work_area_monitor_x2; + + 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 & META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_Y) { - if (info->current.y != intersection.y) - info->current.y = intersection.y; - else if (info->current.height != intersection.height) - info->current.y -= info->current.height - intersection.height; + int current_y2; + int work_area_monitor_y2; + + 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, |