aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sway/commands/resize.c42
1 files changed, 33 insertions, 9 deletions
diff --git a/sway/commands/resize.c b/sway/commands/resize.c
index a82bec20..94ffbbe1 100644
--- a/sway/commands/resize.c
+++ b/sway/commands/resize.c
@@ -511,16 +511,40 @@ static struct cmd_results *resize_set_tiled(struct sway_container *con,
*/
static struct cmd_results *resize_set_floating(struct sway_container *con,
struct resize_amount *width, struct resize_amount *height) {
- int min_width, max_width, min_height, max_height;
+ int min_width, max_width, min_height, max_height, grow_width, grow_height;
calculate_constraints(&min_width, &max_width, &min_height, &max_height);
- width->amount = fmax(min_width, fmin(width->amount, max_width));
- height->amount = fmax(min_height, fmin(height->amount, max_height));
- int grow_width = width->amount - con->width;
- int grow_height = height->amount - con->height;
- con->x -= grow_width / 2;
- con->y -= grow_height / 2;
- con->width = width->amount;
- con->height = height->amount;
+
+ if (width->amount) {
+ if (width->unit == RESIZE_UNIT_PPT ||
+ width->unit == RESIZE_UNIT_DEFAULT) {
+ // Convert to px
+ width->amount = con->workspace->width * width->amount / 100;
+ width->unit = RESIZE_UNIT_PX;
+ }
+ if (width->unit == RESIZE_UNIT_PX) {
+ width->amount = fmax(min_width, fmin(width->amount, max_width));
+ grow_width = width->amount - con->width;
+
+ con->x -= grow_width / 2;
+ con->width = width->amount;
+ }
+ }
+
+ if (height->amount) {
+ if (height->unit == RESIZE_UNIT_PPT ||
+ height->unit == RESIZE_UNIT_DEFAULT) {
+ // Convert to px
+ height->amount = con->workspace->height * height->amount / 100;
+ height->unit = RESIZE_UNIT_PX;
+ }
+ if (height->unit == RESIZE_UNIT_PX) {
+ height->amount = fmax(min_height, fmin(height->amount, max_height));
+ grow_height = height->amount - con->height;
+
+ con->y -= grow_height / 2;
+ con->height = height->amount;
+ }
+ }
if (con->view) {
struct sway_view *view = con->view;