aboutsummaryrefslogtreecommitdiffstats
path: root/sway/commands/layout.c
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-07-10 15:16:17 -0400
committerLibravatar Drew DeVault <sir@cmpwn.com>2019-07-10 15:29:38 -0400
commit5ffcea4c28103ecac3d4970412e8b44dbccfcb22 (patch)
treed7266d830b25e67c337f21768a92a868872a3851 /sway/commands/layout.c
parentconfig/output: correctly set width/height in apply (diff)
downloadsway-5ffcea4c28103ecac3d4970412e8b44dbccfcb22.tar.gz
sway-5ffcea4c28103ecac3d4970412e8b44dbccfcb22.tar.zst
sway-5ffcea4c28103ecac3d4970412e8b44dbccfcb22.zip
cmd_layout: toggle split for tabbed/stack default
This fixes the logic of split for layout toggle when the default layout is L_TABBED or L_STACKED. When the default layout is L_TABBED or L_STACKED, the container/workspace may not have a prev_split_layout. This was causing L_NONE to be returned by get_layout_toggle, which was being handled as a syntax error. This adds logic to try config->default_orientation when prev_split_layout is L_NONE. If that is also L_NONE, then L_VERT is used when the output is taller than wide, otherwise, L_HORIZ is used.
Diffstat (limited to 'sway/commands/layout.c')
-rw-r--r--sway/commands/layout.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/sway/commands/layout.c b/sway/commands/layout.c
index 32f8fb52..c1828263 100644
--- a/sway/commands/layout.c
+++ b/sway/commands/layout.c
@@ -2,6 +2,7 @@
2#include <string.h> 2#include <string.h>
3#include <strings.h> 3#include <strings.h>
4#include "sway/commands.h" 4#include "sway/commands.h"
5#include "sway/output.h"
5#include "sway/tree/arrange.h" 6#include "sway/tree/arrange.h"
6#include "sway/tree/container.h" 7#include "sway/tree/container.h"
7#include "sway/tree/workspace.h" 8#include "sway/tree/workspace.h"
@@ -27,7 +28,8 @@ static const char expected_syntax[] =
27 28
28static enum sway_container_layout get_layout_toggle(int argc, char **argv, 29static enum sway_container_layout get_layout_toggle(int argc, char **argv,
29 enum sway_container_layout layout, 30 enum sway_container_layout layout,
30 enum sway_container_layout prev_split_layout) { 31 enum sway_container_layout prev_split_layout,
32 struct sway_output *output) {
31 // "layout toggle" 33 // "layout toggle"
32 if (argc == 1) { 34 if (argc == 1) {
33 return layout == L_HORIZ ? L_VERT : L_HORIZ; 35 return layout == L_HORIZ ? L_VERT : L_HORIZ;
@@ -66,8 +68,18 @@ static enum sway_container_layout get_layout_toggle(int argc, char **argv,
66 return parsed; 68 return parsed;
67 } 69 }
68 if (strcmp(argv[i], "split") == 0) { 70 if (strcmp(argv[i], "split") == 0) {
69 return layout == L_HORIZ ? L_VERT : 71 if (layout == L_HORIZ) {
70 layout == L_VERT ? L_HORIZ : prev_split_layout; 72 return L_VERT;
73 } else if (layout == L_VERT) {
74 return L_HORIZ;
75 } else if (prev_split_layout != L_NONE) {
76 return prev_split_layout;
77 } else if (config->default_orientation != L_NONE) {
78 return config->default_orientation;
79 } else if (output->height > output->width) {
80 return L_VERT;
81 }
82 return L_HORIZ;
71 } 83 }
72 // invalid layout strings are silently ignored 84 // invalid layout strings are silently ignored
73 } 85 }
@@ -76,7 +88,8 @@ static enum sway_container_layout get_layout_toggle(int argc, char **argv,
76 88
77static enum sway_container_layout get_layout(int argc, char **argv, 89static enum sway_container_layout get_layout(int argc, char **argv,
78 enum sway_container_layout layout, 90 enum sway_container_layout layout,
79 enum sway_container_layout prev_split_layout) { 91 enum sway_container_layout prev_split_layout,
92 struct sway_output *output) {
80 // Check if assigned directly 93 // Check if assigned directly
81 enum sway_container_layout parsed = parse_layout_string(argv[0]); 94 enum sway_container_layout parsed = parse_layout_string(argv[0]);
82 if (parsed != L_NONE) { 95 if (parsed != L_NONE) {
@@ -88,7 +101,7 @@ static enum sway_container_layout get_layout(int argc, char **argv,
88 } 101 }
89 102
90 if (strcasecmp(argv[0], "toggle") == 0) { 103 if (strcasecmp(argv[0], "toggle") == 0) {
91 return get_layout_toggle(argc, argv, layout, prev_split_layout); 104 return get_layout_toggle(argc, argv, layout, prev_split_layout, output);
92 } 105 }
93 106
94 return L_NONE; 107 return L_NONE;
@@ -124,11 +137,13 @@ struct cmd_results *cmd_layout(int argc, char **argv) {
124 if (container) { 137 if (container) {
125 old_layout = container->layout; 138 old_layout = container->layout;
126 new_layout = get_layout(argc, argv, 139 new_layout = get_layout(argc, argv,
127 container->layout, container->prev_split_layout); 140 container->layout, container->prev_split_layout,
141 container->workspace->output);
128 } else { 142 } else {
129 old_layout = workspace->layout; 143 old_layout = workspace->layout;
130 new_layout = get_layout(argc, argv, 144 new_layout = get_layout(argc, argv,
131 workspace->layout, workspace->prev_split_layout); 145 workspace->layout, workspace->prev_split_layout,
146 workspace->output);
132 } 147 }
133 if (new_layout == L_NONE) { 148 if (new_layout == L_NONE) {
134 return cmd_results_new(CMD_INVALID, expected_syntax); 149 return cmd_results_new(CMD_INVALID, expected_syntax);