aboutsummaryrefslogtreecommitdiffstats
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
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)
-rw-r--r--include/sway/tree/container.h2
-rw-r--r--sway/commands/layout.c43
-rw-r--r--sway/tree/layout.c4
-rw-r--r--sway/tree/workspace.c2
4 files changed, 30 insertions, 21 deletions
diff --git a/include/sway/tree/container.h b/include/sway/tree/container.h
index 44ff9f7d..16a180f8 100644
--- a/include/sway/tree/container.h
+++ b/include/sway/tree/container.h
@@ -113,7 +113,7 @@ struct sway_container {
113 113
114 enum sway_container_type type; 114 enum sway_container_type type;
115 enum sway_container_layout layout; 115 enum sway_container_layout layout;
116 enum sway_container_layout prev_layout; 116 enum sway_container_layout prev_split_layout;
117 117
118 bool is_sticky; 118 bool is_sticky;
119 119
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}
diff --git a/sway/tree/layout.c b/sway/tree/layout.c
index 07de9664..28cdc71e 100644
--- a/sway/tree/layout.c
+++ b/sway/tree/layout.c
@@ -859,7 +859,7 @@ struct sway_container *container_split(struct sway_container *child,
859 } 859 }
860 if (child->type == C_WORKSPACE && child->children->length == 0) { 860 if (child->type == C_WORKSPACE && child->children->length == 0) {
861 // Special case: this just behaves like splitt 861 // Special case: this just behaves like splitt
862 child->prev_layout = child->layout; 862 child->prev_split_layout = child->layout;
863 child->layout = layout; 863 child->layout = layout;
864 return child; 864 return child;
865 } 865 }
@@ -870,7 +870,7 @@ struct sway_container *container_split(struct sway_container *child,
870 870
871 remove_gaps(child); 871 remove_gaps(child);
872 872
873 cont->prev_layout = L_NONE; 873 cont->prev_split_layout = L_NONE;
874 cont->width = child->width; 874 cont->width = child->width;
875 cont->height = child->height; 875 cont->height = child->height;
876 cont->x = child->x; 876 cont->x = child->x;
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index cc225e79..250d5ba7 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -59,7 +59,7 @@ struct sway_container *workspace_create(struct sway_container *output,
59 workspace->width = output->width; 59 workspace->width = output->width;
60 workspace->height = output->height; 60 workspace->height = output->height;
61 workspace->name = !name ? NULL : strdup(name); 61 workspace->name = !name ? NULL : strdup(name);
62 workspace->prev_layout = L_NONE; 62 workspace->prev_split_layout = L_NONE;
63 workspace->layout = container_get_default_layout(output); 63 workspace->layout = container_get_default_layout(output);
64 64
65 struct sway_workspace *swayws = calloc(1, sizeof(struct sway_workspace)); 65 struct sway_workspace *swayws = calloc(1, sizeof(struct sway_workspace));