diff options
-rw-r--r-- | sway/commands/layout.c | 29 |
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 | ||
28 | static enum sway_container_layout get_layout_toggle(int argc, char **argv, | 29 | static 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 | ||
77 | static enum sway_container_layout get_layout(int argc, char **argv, | 89 | static 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); |