aboutsummaryrefslogtreecommitdiff
path: root/sway/commands
diff options
context:
space:
mode:
authorwil <william.barsse@gmail.com>2016-12-29 20:26:35 +0100
committerwil <william.barsse@gmail.com>2016-12-29 20:31:30 +0100
commita0aa8d9780c6c8b0138800e3b2c2c0053174a2c5 (patch)
treec82dec85d4f5c9dbe0b93131f56614bccaa3a227 /sway/commands
parent2b0e3c212a6c269b68879ba6c2d84ebedd5938e1 (diff)
downloadsway-a0aa8d9780c6c8b0138800e3b2c2c0053174a2c5.tar.xz
cleanup in auto layouts
- added L_AUTO_FIRST/LAST instead of using explicit layouts. - when switching between auto layout that don't share the same major axis, invert the width/height of their child views to preserve their relative proportions.
Diffstat (limited to 'sway/commands')
-rw-r--r--sway/commands/layout.c48
-rw-r--r--sway/commands/workspace_layout.c10
2 files changed, 45 insertions, 13 deletions
diff --git a/sway/commands/layout.c b/sway/commands/layout.c
index 9e468c21..5426186e 100644
--- a/sway/commands/layout.c
+++ b/sway/commands/layout.c
@@ -56,24 +56,12 @@ struct cmd_results *cmd_layout(int argc, char **argv) {
swayc_change_layout(parent, L_HORIZ);
}
} else if (strcasecmp(argv[0], "auto_left") == 0) {
- if (parent->type != C_CONTAINER && !swayc_is_empty_workspace(parent)){
- parent = new_container(parent, L_AUTO_LEFT);
- }
swayc_change_layout(parent, L_AUTO_LEFT);
} else if (strcasecmp(argv[0], "auto_right") == 0) {
- if (parent->type != C_CONTAINER && !swayc_is_empty_workspace(parent)){
- parent = new_container(parent, L_AUTO_RIGHT);
- }
swayc_change_layout(parent, L_AUTO_RIGHT);
} else if (strcasecmp(argv[0], "auto_top") == 0) {
- if (parent->type != C_CONTAINER && !swayc_is_empty_workspace(parent)){
- parent = new_container(parent, L_AUTO_TOP);
- }
swayc_change_layout(parent, L_AUTO_TOP);
} else if (strcasecmp(argv[0], "auto_bot") == 0) {
- if (parent->type != C_CONTAINER && !swayc_is_empty_workspace(parent)){
- parent = new_container(parent, L_AUTO_BOTTOM);
- }
swayc_change_layout(parent, L_AUTO_BOTTOM);
} else if (strcasecmp(argv[0], "incnmaster") == 0) {
if ((error = checkarg(argc, "layout incnmaster",
@@ -105,6 +93,42 @@ struct cmd_results *cmd_layout(int argc, char **argv) {
((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_FIRST;
+ }
+ } else {
+ return cmd_results_new(CMD_FAILURE, "layout auto",
+ "Must be one of <prev|next>.");
+ }
+ swayc_change_layout(parent, layout);
+ } else if (strcasecmp(argv[0], "promote") == 0) {
+ // swap first child in auto layout with currently focused child
+ swayc_t *container = get_focused_view(swayc_active_workspace());
+ swayc_t *parent = container->parent;
+ if (is_auto_layout(parent->layout)) {
+ int focused_idx = index_child(container);
+ swayc_t *first = parent->children->items[0];
+ if (focused_idx > 0) {
+ list_swap(parent->children, 0, focused_idx);
+ swap_geometry(first, container);
+ }
+ }
}
}
diff --git a/sway/commands/workspace_layout.c b/sway/commands/workspace_layout.c
index b7b4b033..3e0a12ce 100644
--- a/sway/commands/workspace_layout.c
+++ b/sway/commands/workspace_layout.c
@@ -13,8 +13,16 @@ struct cmd_results *cmd_workspace_layout(int argc, char **argv) {
config->default_layout = L_STACKED;
} else if (strcasecmp(argv[0], "tabbed") == 0) {
config->default_layout = L_TABBED;
+ } else if (strcasecmp(argv[0], "auto_left") == 0) {
+ config->default_layout = L_AUTO_LEFT;
+ } else if (strcasecmp(argv[0], "auto_right") == 0) {
+ config->default_layout = L_AUTO_RIGHT;
+ } else if (strcasecmp(argv[0], "auto_top") == 0) {
+ config->default_layout = L_AUTO_TOP;
+ } else if (strcasecmp(argv[0], "auto_bottom") == 0) {
+ config->default_layout = L_AUTO_BOTTOM;
} else {
- return cmd_results_new(CMD_INVALID, "workspace_layout", "Expected 'workspace_layout <default|stacking|tabbed>'");
+ return cmd_results_new(CMD_INVALID, "workspace_layout", "Expected 'workspace_layout <default|stacking|tabbed|auto_left|auto_right|auto_top|auto_bottom>'");
}
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
}