From c248e96b849a125d88d0fffc744d0f98b8c558d9 Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Thu, 8 Nov 2018 14:17:49 -0500 Subject: resize set: implement width and height keywords This implements the following syntaxes from `i3 4.16`: * `resize set [width] [px|ppt]` * `resize set height [px|ppt]` * `resize set [width] [px|ppt] [height] [px|ppt]` Additionally, a bug was fixed that caused setting the height of a tiled container to change the width instead due to a typo. --- sway/commands/resize.c | 47 +++++++++++++++++++++++++++++------------------ sway/sway.5.scd | 22 +++++++++++++++++----- 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/sway/commands/resize.c b/sway/commands/resize.c index 8635b309..a82bec20 100644 --- a/sway/commands/resize.c +++ b/sway/commands/resize.c @@ -499,7 +499,7 @@ static struct cmd_results *resize_set_tiled(struct sway_container *con, } if (height->unit == RESIZE_UNIT_PX) { resize_tiled(con, height->amount - con->height, - RESIZE_AXIS_HORIZONTAL); + RESIZE_AXIS_VERTICAL); } } @@ -538,34 +538,45 @@ static struct cmd_results *resize_set_floating(struct sway_container *con, /** * resize set * - * args: [px|ppt] [px|ppt] + * args: [width] [px|ppt] + * : height [px|ppt] + * : [width] [px|ppt] [height] [px|ppt] */ static struct cmd_results *cmd_resize_set(int argc, char **argv) { struct cmd_results *error; - if ((error = checkarg(argc, "resize", EXPECTED_AT_LEAST, 2))) { + if ((error = checkarg(argc, "resize", EXPECTED_AT_LEAST, 1))) { return error; } - const char *usage = "Expected 'resize set '"; + const char *usage = "Expected 'resize set [width] [px|ppt]' or " + "'resize set height [px|ppt]' or " + "'resize set [width] [px|ppt] [height] [px|ppt]'"; // Width - struct resize_amount width; - int num_consumed_args = parse_resize_amount(argc, argv, &width); - argc -= num_consumed_args; - argv += num_consumed_args; - if (width.unit == RESIZE_UNIT_INVALID) { - return cmd_results_new(CMD_INVALID, "resize", usage); + struct resize_amount width = {0}; + if (argc >= 2 && !strcmp(argv[0], "width") && strcmp(argv[1], "height")) { + argc--; argv++; } - if (!argc) { - return cmd_results_new(CMD_INVALID, "resize", usage); + if (strcmp(argv[0], "height")) { + int num_consumed_args = parse_resize_amount(argc, argv, &width); + argc -= num_consumed_args; + argv += num_consumed_args; + if (width.unit == RESIZE_UNIT_INVALID) { + return cmd_results_new(CMD_INVALID, "resize set", usage); + } } // Height - struct resize_amount height; - num_consumed_args = parse_resize_amount(argc, argv, &height); - argc -= num_consumed_args; - argv += num_consumed_args; - if (height.unit == RESIZE_UNIT_INVALID) { - return cmd_results_new(CMD_INVALID, "resize", usage); + struct resize_amount height = {0}; + if (argc) { + if (argc >= 2 && !strcmp(argv[0], "height")) { + argc--; argv++; + } + int num_consumed_args = parse_resize_amount(argc, argv, &height); + argc -= num_consumed_args; + argv += num_consumed_args; + if (width.unit == RESIZE_UNIT_INVALID) { + return cmd_results_new(CMD_INVALID, "resize set", usage); + } } // If 0, don't resize that dimension diff --git a/sway/sway.5.scd b/sway/sway.5.scd index 3bf6233d..8df59fc0 100644 --- a/sway/sway.5.scd +++ b/sway/sway.5.scd @@ -210,11 +210,23 @@ set|plus|minus percentage points. If the units are omitted, floating containers are resized in px and tiled containers by ppt. _amount_ will default to 10 if omitted. -*resize set* [px|ppt] [px|ppt] - Sets the width and height of the currently focused container to _width_ and - _height_, specified in pixels or percentage points. If the units are - omitted, floating containers are resized in px and tiled containers by ppt. - If _width_ or _height_ is 0, no resize is done on that axis. +*resize set* height [px|ppt] + Sets the height of the container to _height_, specified in pixels or + percentage points. If the units are omitted, floating containers are + resized in px and tiled containers by ppt. If _height_ is 0, the container + will not be resized. + +*resize set* [width] [px|ppt] + Sets the width of the container to _width_, specified in pixels or + percentage points. If the units are omitted, floating containers are + resized in px and tiled containers by ppt. If _width_ is 0, the container + will not be resized. + +*resize set* [width] [px|ppt] [height] [px|ppt] + Sets the width and height of the container to _width_ and _height_, + specified in pixels or percentage points. If the units are omitted, + floating containers are resized in px and tiled containers by ppt. If + _width_ or _height_ is 0, the container will not be resized on that axis. *scratchpad show* Shows a window from the scratchpad. Repeatedly using this command will -- cgit v1.2.3-54-g00ecf