implement resize command for absolute dimensions

This commit is contained in:
Zandr Martin 2016-06-11 17:02:16 -05:00
parent 6388e1e288
commit 889618d3ee
No known key found for this signature in database
GPG key ID: AA2BB8EF77F7BBDC
4 changed files with 40 additions and 16 deletions

View file

@ -2,6 +2,7 @@
#define _SWAY_RESIZE_H #define _SWAY_RESIZE_H
#include <stdbool.h> #include <stdbool.h>
bool set_size_tiled(int amount, bool use_width);
bool resize_tiled(int amount, bool use_width); bool resize_tiled(int amount, bool use_width);
#endif #endif

View file

@ -2000,21 +2000,17 @@ static struct cmd_results *cmd_resize(int argc, char **argv) {
struct cmd_results *error = NULL; struct cmd_results *error = NULL;
if (config->reading) return cmd_results_new(CMD_FAILURE, "resize", "Can't be used in config file."); if (config->reading) return cmd_results_new(CMD_FAILURE, "resize", "Can't be used in config file.");
if (!config->active) return cmd_results_new(CMD_FAILURE, "resize", "Can only be used when sway is running."); if (!config->active) return cmd_results_new(CMD_FAILURE, "resize", "Can only be used when sway is running.");
if ((error = checkarg(argc, "resize", EXPECTED_AT_LEAST, 3))) { if ((error = checkarg(argc, "resize", EXPECTED_AT_LEAST, 2))) {
return error; return error;
} }
char *end;
int amount = (int)strtol(argv[2], &end, 10); int amount = (int)strtol(argv[argc - 1], NULL, 10);
if (errno == ERANGE || amount == 0) { if (errno == ERANGE || amount == 0) {
errno = 0; errno = 0;
return cmd_results_new(CMD_INVALID, "resize", "Number is out of range."); return cmd_results_new(CMD_INVALID, "resize", "Number is out of range.");
} }
if (strcmp(argv[0], "shrink") != 0 && strcmp(argv[0], "grow") != 0) { if (strcmp(argv[0], "shrink") == 0 || strcmp(argv[0], "grow") == 0) {
return cmd_results_new(CMD_INVALID, "resize",
"Expected 'resize <shrink|grow> <width|height> <amount>'");
}
if (strcmp(argv[0], "shrink") == 0) { if (strcmp(argv[0], "shrink") == 0) {
amount *= -1; amount *= -1;
} }
@ -2025,8 +2021,17 @@ static struct cmd_results *cmd_resize(int argc, char **argv) {
resize_tiled(amount, false); resize_tiled(amount, false);
} else { } else {
return cmd_results_new(CMD_INVALID, "resize", return cmd_results_new(CMD_INVALID, "resize",
"Expected 'resize <shrink|grow> <width|height> <amount>'"); "Expected 'resize <shrink|grow> <width|height> <amount>' or 'resize <width|height> <amount>'");
} }
} else if (strcmp(argv[0], "width") == 0) {
set_size_tiled(amount, true);
} else if (strcmp(argv[0], "height") == 0) {
set_size_tiled(amount, false);
} else {
return cmd_results_new(CMD_INVALID, "resize",
"Expected 'resize <shrink|grow> <width|height> <amount>' or 'resize <width|height> <amount>'");
}
return cmd_results_new(CMD_SUCCESS, NULL, NULL); return cmd_results_new(CMD_SUCCESS, NULL, NULL);
} }

View file

@ -5,6 +5,20 @@
#include "log.h" #include "log.h"
#include "input_state.h" #include "input_state.h"
#include "handlers.h" #include "handlers.h"
#include "resize.h"
bool set_size_tiled(int amount, bool use_width) {
int desired;
swayc_t *focused = get_focused_view(swayc_active_workspace());
if (use_width) {
desired = amount - focused->width;
} else {
desired = amount - focused->height;
}
return resize_tiled(desired, use_width);
}
bool resize_tiled(int amount, bool use_width) { bool resize_tiled(int amount, bool use_width) {
swayc_t *parent = get_focused_view(swayc_active_workspace()); swayc_t *parent = get_focused_view(swayc_active_workspace());

View file

@ -98,6 +98,10 @@ They are expected to be used with **bindsym** or at runtime through **swaymsg**(
Resizes the currently focused container or view by _amount_. _amount_ can be Resizes the currently focused container or view by _amount_. _amount_ can be
specified as "n px" or "n ppt" or "n px or n ppt". specified as "n px" or "n ppt" or "n px or n ppt".
**resize** <width|height> <amount>::
Sets the _width_ or _height_ of the currently focused container to _amount_.
_amount_ can be specified as "n px" or "n ppt" or "n px or n ppt".
**split** <vertical|v|horizontal|h|toggle|t>:: **split** <vertical|v|horizontal|h|toggle|t>::
Splits the current container, vertically or horizontally. If toggled then the Splits the current container, vertically or horizontally. If toggled then the
current container is split opposite to the parent container. current container is split opposite to the parent container.