From 44c2fafa4f561969c5987293863e9dfd63fc2ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20C=C3=B4rte-Real?= Date: Sat, 6 Jul 2019 12:13:05 +0100 Subject: [PATCH] Sanity check gaps between tiled containers When the gaps become too large for the space available gracefully reduced them all the way to 0 if needed. Fixes #4294 --- include/sway/tree/node.h | 3 +++ sway/commands/resize.c | 2 -- sway/tree/arrange.c | 10 ++++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/sway/tree/node.h b/include/sway/tree/node.h index 5b8c19093..470ee3b5e 100644 --- a/include/sway/tree/node.h +++ b/include/sway/tree/node.h @@ -3,6 +3,9 @@ #include #include "list.h" +#define MIN_SANE_W 100 +#define MIN_SANE_H 60 + struct sway_root; struct sway_output; struct sway_workspace; diff --git a/sway/commands/resize.c b/sway/commands/resize.c index 28f2552e6..4cefe60b6 100644 --- a/sway/commands/resize.c +++ b/sway/commands/resize.c @@ -15,8 +15,6 @@ #define AXIS_HORIZONTAL (WLR_EDGE_LEFT | WLR_EDGE_RIGHT) #define AXIS_VERTICAL (WLR_EDGE_TOP | WLR_EDGE_BOTTOM) -static const int MIN_SANE_W = 100, MIN_SANE_H = 60; - enum resize_unit { RESIZE_UNIT_PX, RESIZE_UNIT_PPT, diff --git a/sway/tree/arrange.c b/sway/tree/arrange.c index caafb1af9..696d0e1fb 100644 --- a/sway/tree/arrange.c +++ b/sway/tree/arrange.c @@ -68,7 +68,10 @@ static void apply_horiz_layout(list_t *children, struct wlr_box *parent) { } temp = temp->parent; } - double child_total_width = parent->width - inner_gap * (children->length - 1); + double total_gap = fmin(inner_gap * (children->length - 1), + fmax(0, parent->width - MIN_SANE_W * children->length)); + double child_total_width = parent->width - total_gap; + inner_gap = total_gap / (children->length - 1); // Resize windows sway_log(SWAY_DEBUG, "Arranging %p horizontally", parent); @@ -143,7 +146,10 @@ static void apply_vert_layout(list_t *children, struct wlr_box *parent) { } temp = temp->parent; } - double child_total_height = parent->height - inner_gap * (children->length - 1); + double total_gap = fmin(inner_gap * (children->length - 1), + fmax(0, parent->height - MIN_SANE_H * children->length)); + double child_total_height = parent->height - total_gap; + inner_gap = total_gap / (children->length - 1); // Resize windows sway_log(SWAY_DEBUG, "Arranging %p vertically", parent);