diff options
author | emersion <contact@emersion.fr> | 2018-10-06 14:53:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-06 14:53:09 +0200 |
commit | 0f45aa4ea9115f3f6a586efe7ff748e26d70bf7e (patch) | |
tree | e574ca18b226531da7fc67dbcc4720cbfa2eedbb /sway/input | |
parent | 5d21c33f13f34ed592388512cc092986324c8f35 (diff) | |
parent | c620f76bea08bdab6cfa17a5b3128a4924c6df4d (diff) |
Merge pull request #2693 from RyanDwyer/move-sticky-in-seat
Move sticky containers when switching workspace via criteria
Diffstat (limited to 'sway/input')
-rw-r--r-- | sway/input/seat.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c index 675edb2d..f5cb2f9e 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -667,10 +667,8 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node, } // find new output's old workspace, which might have to be removed if empty - struct sway_workspace *new_output_last_ws = NULL; - if (new_output && last_output != new_output) { - new_output_last_ws = output_get_active_workspace(new_output); - } + struct sway_workspace *new_output_last_ws = + new_output ? output_get_active_workspace(new_output) : NULL; // Unfocus the previous focus if (last_focus) { @@ -719,8 +717,17 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node, ipc_event_window(container, "focus"); } - if (new_output_last_ws) { - workspace_consider_destroy(new_output_last_ws); + // Move sticky containers to new workspace + if (new_output_last_ws && new_workspace != new_output_last_ws) { + for (int i = 0; i < new_output_last_ws->floating->length; ++i) { + struct sway_container *floater = + new_output_last_ws->floating->items[i]; + if (floater->is_sticky) { + container_detach(floater); + workspace_add_floating(new_workspace, floater); + --i; + } + } } // Close any popups on the old focus @@ -754,11 +761,14 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node, container_raise_floating(container); } - if (last_focus) { - if (last_workspace) { - workspace_consider_destroy(last_workspace); - } + if (new_output_last_ws) { + workspace_consider_destroy(new_output_last_ws); + } + if (last_workspace && last_workspace != new_output_last_ws) { + workspace_consider_destroy(last_workspace); + } + if (last_focus) { if (config->mouse_warping && warp && new_output != last_output) { double x = 0; double y = 0; |