From b672827aa33ba958411abe23d093a5bb2c296cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20C=C3=B4rte-Real?= Date: Sun, 28 Jul 2019 02:44:32 +0100 Subject: [PATCH] Fix resize sibling amount calculations Sibling amounts were being calculated after the original fraction had been altered. This led to broken resize amounts. Fix that by calculating things upfront before adjusting values which also makes the code cleaner. For sanity checks also calculate the sibling amount with the ceiling so we never go below the sanity check even by one pixel. Fixes #4386 --- sway/commands/resize.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/sway/commands/resize.c b/sway/commands/resize.c index 4cefe60b6..0c9af12d1 100644 --- a/sway/commands/resize.c +++ b/sway/commands/resize.c @@ -160,7 +160,7 @@ void container_resize_tiled(struct sway_container *con, } // Apply new dimensions - int sibling_amount = prev ? amount / 2 : amount; + int sibling_amount = prev ? ceil((double)amount / 2.0) : amount; if (is_horizontal(axis)) { if (con->width + amount < MIN_SANE_W) { @@ -173,13 +173,15 @@ void container_resize_tiled(struct sway_container *con, return; } - con->width_fraction += + double amount_fraction = ((double)amount / con->width) * con->width_fraction; - next->width_fraction -= - ((double)sibling_amount / con->width) * con->width_fraction; + double sibling_amount_fraction = + prev ? amount_fraction / 2.0 : amount_fraction; + + con->width_fraction += amount_fraction; + next->width_fraction -= sibling_amount_fraction; if (prev) { - prev->width_fraction -= - ((double)sibling_amount / con->width) * con->width_fraction; + prev->width_fraction -= sibling_amount_fraction; } } else { if (con->height + amount < MIN_SANE_H) { @@ -192,13 +194,15 @@ void container_resize_tiled(struct sway_container *con, return; } - con->height_fraction += + double amount_fraction = ((double)amount / con->height) * con->height_fraction; - next->height_fraction -= - ((double)sibling_amount / con->height) * con->height_fraction; + double sibling_amount_fraction = + prev ? amount_fraction / 2.0 : amount_fraction; + + con->height_fraction += amount_fraction; + next->height_fraction -= sibling_amount_fraction; if (prev) { - prev->height_fraction -= - ((double)sibling_amount / con->height) * con->height_fraction; + prev->height_fraction -= sibling_amount_fraction; } }