commit cefc608cb942ce260dcbfc13079e29e684893bfa
parent f984f21b6a71bf8794de61f58b00d99ed3537c50
Author: Pedro Côrte-Real <pedro@pedrocr.net>
Date: Sun, 28 Jul 2019 02:44:32 +0100
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
Diffstat:
1 file changed, 15 insertions(+), 11 deletions(-)
diff --git 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;
}
}