aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree
diff options
context:
space:
mode:
authorLibravatar mwenzkowski <29407878+mwenzkowski@users.noreply.github.com>2020-10-28 00:02:08 +0100
committerLibravatar Tudor Brindus <me@tbrindus.ca>2020-10-27 19:26:26 -0400
commit32788a93f23eaa683f7a88694c778cd084607754 (patch)
treedf3ecb3274ccc953c28445e483b24ca22cec9c10 /sway/tree
parentSmart borders fix: always show borders for floating containers (diff)
downloadsway-32788a93f23eaa683f7a88694c778cd084607754.tar.gz
sway-32788a93f23eaa683f7a88694c778cd084607754.tar.zst
sway-32788a93f23eaa683f7a88694c778cd084607754.zip
output: evacuate sticky containers only if new output has a workspace
Sticky floating containers on an otherwise empty workspace can only be evacuated if the new output has an active workspace. The noop output may not have one and in that case we have to move the whole workspace to the new output.
Diffstat (limited to 'sway/tree')
-rw-r--r--sway/tree/output.c47
-rw-r--r--sway/tree/workspace.c13
2 files changed, 38 insertions, 22 deletions
diff --git a/sway/tree/output.c b/sway/tree/output.c
index d600c5c3..4dc22755 100644
--- a/sway/tree/output.c
+++ b/sway/tree/output.c
@@ -152,21 +152,18 @@ void output_enable(struct sway_output *output) {
152 arrange_root(); 152 arrange_root();
153} 153}
154 154
155static void evacuate_sticky(struct sway_workspace *old_ws, 155static void evacuate_sticky(struct sway_container *con, void *data) {
156 struct sway_output *new_output) { 156 if (container_is_floating(con) && con->is_sticky) {
157 struct sway_workspace *new_ws = output_get_active_workspace(new_output); 157 struct sway_workspace *new_ws = data;
158 if (!sway_assert(new_ws, "New output does not have a workspace")) { 158 if (!sway_assert(new_ws, "Expected workspace to not be null")) {
159 return; 159 return;
160 } 160 }
161 while (old_ws->floating->length) { 161 container_detach(con);
162 struct sway_container *sticky = old_ws->floating->items[0]; 162 workspace_add_floating(new_ws, con);
163 container_detach(sticky); 163 container_handle_fullscreen_reparent(con);
164 workspace_add_floating(new_ws, sticky); 164 container_floating_move_to_center(con);
165 container_handle_fullscreen_reparent(sticky); 165 ipc_event_window(con, "move");
166 container_floating_move_to_center(sticky);
167 ipc_event_window(sticky, "move");
168 } 166 }
169 workspace_detect_urgent(new_ws);
170} 167}
171 168
172static void output_evacuate(struct sway_output *output) { 169static void output_evacuate(struct sway_output *output) {
@@ -195,17 +192,23 @@ static void output_evacuate(struct sway_output *output) {
195 new_output = root->noop_output; 192 new_output = root->noop_output;
196 } 193 }
197 194
195 struct sway_workspace *new_output_ws =
196 output_get_active_workspace(new_output);
197
198 if (workspace_is_empty(workspace)) { 198 if (workspace_is_empty(workspace)) {
199 // If floating is not empty, there are sticky containers to move 199 // If the new output has an active workspace (the noop output may
200 if (workspace->floating->length) { 200 // not have one), move all sticky containers to it
201 evacuate_sticky(workspace, new_output); 201 if (new_output_ws) {
202 workspace_for_each_container(workspace, evacuate_sticky,
203 new_output_ws);
204 workspace_detect_urgent(new_output_ws);
202 } 205 }
203 workspace_begin_destroy(workspace);
204 continue;
205 }
206 206
207 struct sway_workspace *new_output_ws = 207 if (workspace_num_sticky_containers(workspace) == 0) {
208 output_get_active_workspace(new_output); 208 workspace_begin_destroy(workspace);
209 continue;
210 }
211 }
209 212
210 workspace_output_add_priority(workspace, new_output); 213 workspace_output_add_priority(workspace, new_output);
211 output_add_workspace(new_output, workspace); 214 output_add_workspace(new_output, workspace);
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index 3bcba8e5..476c2568 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -817,3 +817,16 @@ size_t workspace_num_tiling_views(struct sway_workspace *ws) {
817 workspace_for_each_container(ws, count_tiling_views, &count); 817 workspace_for_each_container(ws, count_tiling_views, &count);
818 return count; 818 return count;
819} 819}
820
821static void count_sticky_containers(struct sway_container *con, void *data) {
822 if (container_is_floating(con) && con->is_sticky) {
823 size_t *count = data;
824 *count += 1;
825 }
826}
827
828size_t workspace_num_sticky_containers(struct sway_workspace *ws) {
829 size_t count = 0;
830 workspace_for_each_container(ws, count_sticky_containers, &count);
831 return count;
832}