diff options
author | Ian Fan <ianfan0@gmail.com> | 2018-08-01 16:03:37 +0100 |
---|---|---|
committer | Ian Fan <ianfan0@gmail.com> | 2018-08-06 14:17:58 +0100 |
commit | 356063b6c084a7c2d4e3e654fe48ec79a102294b (patch) | |
tree | 7e780aa0fb2feb1156e96ce61744122fad32c4d4 /sway/commands/layout.c | |
parent | commands: better type for con_id string length (diff) | |
download | sway-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.c | 43 |
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 | } |