aboutsummaryrefslogtreecommitdiffstats
path: root/sway/commands/layout.c
diff options
context:
space:
mode:
authorLibravatar Ian Fan <ianfan0@gmail.com>2018-08-01 16:03:37 +0100
committerLibravatar Ian Fan <ianfan0@gmail.com>2018-08-06 14:17:58 +0100
commit356063b6c084a7c2d4e3e654fe48ec79a102294b (patch)
tree7e780aa0fb2feb1156e96ce61744122fad32c4d4 /sway/commands/layout.c
parentcommands: better type for con_id string length (diff)
downloadsway-356063b6c084a7c2d4e3e654fe48ec79a102294b.tar.gz
sway-356063b6c084a7c2d4e3e654fe48ec79a102294b.tar.zst
sway-356063b6c084a7c2d4e3e654fe48ec79a102294b.zip
commands: fix layout implementation (also better name for previous split layout)
Diffstat (limited to 'sway/commands/layout.c')
-rw-r--r--sway/commands/layout.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/sway/commands/layout.c b/sway/commands/layout.c
index ec170591..f4e4dda9 100644
--- a/sway/commands/layout.c
+++ b/sway/commands/layout.c
@@ -42,19 +42,16 @@ struct cmd_results *cmd_layout(int argc, char **argv) {
42 parent = parent->parent; 42 parent = parent->parent;
43 } 43 }
44 44
45 if (strcasecmp(argv[0], "default") == 0) { 45 enum sway_container_layout prev = parent->layout;
46 parent->layout = parent->prev_layout; 46 bool assigned_directly = parse_layout_string(argv[0], &parent->layout);
47 } else { 47 if (!assigned_directly) {
48 if (parent->layout != L_TABBED && parent->layout != L_STACKED) { 48 if (strcasecmp(argv[0], "default") == 0) {
49 parent->prev_layout = parent->layout; 49 parent->layout = parent->prev_split_layout;
50 } 50 } else if (strcasecmp(argv[0], "toggle") == 0) {
51
52 bool assigned_directly = parse_layout_string(argv[0], &parent->layout);
53 if (!assigned_directly && strcasecmp(argv[0], "toggle") == 0) {
54 if (argc == 1) { 51 if (argc == 1) {
55 parent->layout = 52 parent->layout =
56 parent->layout == L_STACKED ? L_TABBED : 53 parent->layout == L_STACKED ? L_TABBED :
57 parent->layout == L_TABBED ? parent->prev_layout : L_STACKED; 54 parent->layout == L_TABBED ? parent->prev_split_layout : L_STACKED;
58 } else if (argc == 2) { 55 } else if (argc == 2) {
59 if (strcasecmp(argv[1], "all") == 0) { 56 if (strcasecmp(argv[1], "all") == 0) {
60 parent->layout = 57 parent->layout =
@@ -62,17 +59,20 @@ struct cmd_results *cmd_layout(int argc, char **argv) {
62 parent->layout == L_VERT ? L_STACKED : 59 parent->layout == L_VERT ? L_STACKED :
63 parent->layout == L_STACKED ? L_TABBED : L_HORIZ; 60 parent->layout == L_STACKED ? L_TABBED : L_HORIZ;
64 } else if (strcasecmp(argv[1], "split") == 0) { 61 } else if (strcasecmp(argv[1], "split") == 0) {
65 parent->layout = parent->layout == L_VERT ? L_HORIZ : L_VERT; 62 parent->layout =
63 parent->layout == L_HORIZ ? L_VERT :
64 parent->layout == L_VERT ? L_HORIZ : parent->prev_split_layout;
66 } else { 65 } else {
67 return cmd_results_new(CMD_INVALID, "layout", expected_syntax); 66 return cmd_results_new(CMD_INVALID, "layout", expected_syntax);
68 } 67 }
69 } else { 68 } else {
70 bool valid;
71 enum sway_container_layout parsed_layout; 69 enum sway_container_layout parsed_layout;
72 int curr = 1; 70 int curr = 1;
73 for (; curr < argc; curr++) { 71 for (; curr < argc; curr++) {
74 valid = parse_layout_string(argv[curr], &parsed_layout); 72 bool valid = parse_layout_string(argv[curr], &parsed_layout);
75 if (valid && parsed_layout == parent->layout) { 73 if ((valid && parsed_layout == parent->layout) ||
74 (strcmp(argv[curr], "split") == 0 &&
75 (parent->layout == L_VERT || parent->layout == L_HORIZ))) {
76 break; 76 break;
77 } 77 }
78 } 78 }
@@ -83,6 +83,11 @@ struct cmd_results *cmd_layout(int argc, char **argv) {
83 } 83 }
84 if (parse_layout_string(argv[i], &parent->layout)) { 84 if (parse_layout_string(argv[i], &parent->layout)) {
85 break; 85 break;
86 } else if (strcmp(argv[i], "split") == 0) {
87 parent->layout =
88 parent->layout == L_HORIZ ? L_VERT :
89 parent->layout == L_VERT ? L_HORIZ : parent->prev_split_layout;
90 break;
86 } // invalid layout strings are silently ignored 91 } // invalid layout strings are silently ignored
87 } 92 }
88 } 93 }
@@ -93,9 +98,13 @@ struct cmd_results *cmd_layout(int argc, char **argv) {
93 if (parent->layout == L_NONE) { 98 if (parent->layout == L_NONE) {
94 parent->layout = container_get_default_layout(parent); 99 parent->layout = container_get_default_layout(parent);
95 } 100 }
96 101 if (prev != parent->layout) {
97 container_notify_subtree_changed(parent); 102 if (prev != L_TABBED && prev != L_STACKED) {
98 arrange_windows(parent); 103 parent->prev_split_layout = prev;
104 }
105 container_notify_subtree_changed(parent);
106 arrange_windows(parent);
107 }
99 108
100 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 109 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
101} 110}