aboutsummaryrefslogtreecommitdiff
path: root/sway/commands/layout.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands/layout.c')
-rw-r--r--sway/commands/layout.c79
1 files changed, 78 insertions, 1 deletions
diff --git a/sway/commands/layout.c b/sway/commands/layout.c
index 08336150..0cdac1b4 100644
--- a/sway/commands/layout.c
+++ b/sway/commands/layout.c
@@ -49,11 +49,88 @@ struct cmd_results *cmd_layout(int argc, char **argv) {
} else if (strcasecmp(argv[0], "splitv") == 0) {
swayc_change_layout(parent, L_VERT);
} else if (strcasecmp(argv[0], "toggle") == 0 && argc == 2 && strcasecmp(argv[1], "split") == 0) {
- if (parent->layout == L_HORIZ && (parent->workspace_layout == L_NONE || parent->workspace_layout == L_HORIZ)) {
+ if (parent->layout == L_HORIZ && (parent->workspace_layout == L_NONE ||
+ parent->workspace_layout == L_HORIZ)) {
swayc_change_layout(parent, L_VERT);
} else {
swayc_change_layout(parent, L_HORIZ);
}
+ } else if (strcasecmp(argv[0], "auto_left") == 0) {
+ swayc_change_layout(parent, L_AUTO_LEFT);
+ } else if (strcasecmp(argv[0], "auto_right") == 0) {
+ swayc_change_layout(parent, L_AUTO_RIGHT);
+ } else if (strcasecmp(argv[0], "auto_top") == 0) {
+ swayc_change_layout(parent, L_AUTO_TOP);
+ } else if (strcasecmp(argv[0], "auto_bot") == 0) {
+ swayc_change_layout(parent, L_AUTO_BOTTOM);
+ } else if (strcasecmp(argv[0], "incnmaster") == 0) {
+ const char *name = "layout incnmaster";
+ if ((error = checkarg(argc, name,
+ EXPECTED_EQUAL_TO, 2))) {
+ return error;
+ }
+ char *end;
+ int inc = (int) strtol(argv[1], &end, 10);
+ if (*end) {
+ return cmd_results_new(CMD_INVALID, name, "Invalid %s command "
+ "(argument must be an integer)", name);
+
+ }
+ swayc_t *container = get_focused_view(swayc_active_workspace());
+ if (container && inc &&
+ is_auto_layout(container->parent->layout) &&
+ ((int)container->parent->nb_master + inc >= 0)) {
+ for (int i = container->parent->nb_master;
+ i >= 0 && i < container->parent->children->length &&
+ i != (int) container->parent->nb_master + inc;) {
+ ((swayc_t *) container->parent->children->items[i])->height = -1;
+ ((swayc_t *) container->parent->children->items[i])->width = -1;
+ i += inc > 0 ? 1 : -1;
+ }
+ container->parent->nb_master += inc;
+ }
+ } else if ((strcasecmp(argv[0], "incncol") == 0) && argc ==2) {
+ const char *name = "layout incncol";
+ if ((error = checkarg(argc, name,
+ EXPECTED_EQUAL_TO, 2))) {
+ return error;
+ }
+ char *end;
+ int inc = (int) strtol(argv[1], &end, 10);
+ if (*end) {
+ return cmd_results_new(CMD_INVALID, name, "Invalid %s command "
+ "(argument must be an integer)", name);
+
+ }
+ swayc_t *container = get_focused_view(swayc_active_workspace());
+ if (container && inc && is_auto_layout(container->parent->layout) &&
+ ((int)container->parent->nb_slave_groups + inc >= 1)) {
+ container->parent->nb_slave_groups += inc;
+ }
+ } else if (strcasecmp(argv[0], "auto") == 0) {
+ if ((error = checkarg(argc, "auto", EXPECTED_EQUAL_TO, 2))) {
+ return error;
+ }
+ swayc_t *container = get_focused_view(swayc_active_workspace());
+ swayc_t *parent = container->parent;
+ enum swayc_layouts layout;
+ if (strcasecmp(argv[1], "next") == 0) {
+ if (is_auto_layout(parent->layout) && parent->layout < L_AUTO_LAST) {
+ layout = parent->layout + 1;
+ } else {
+ layout = L_AUTO_FIRST;
+ }
+ } else if (strcasecmp(argv[1], "prev") == 0) {
+ if (is_auto_layout(parent->layout) && parent->layout > L_AUTO_FIRST) {
+ layout = parent->layout - 1;
+ } else {
+ layout = L_AUTO_LAST;
+ }
+ } else {
+ return cmd_results_new(CMD_FAILURE, "layout auto",
+ "Must be one of <prev|next>.");
+ }
+ swayc_change_layout(parent, layout);
}
}