aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-10-06 14:53:09 +0200
committerGitHub <noreply@github.com>2018-10-06 14:53:09 +0200
commit0f45aa4ea9115f3f6a586efe7ff748e26d70bf7e (patch)
treee574ca18b226531da7fc67dbcc4720cbfa2eedbb /sway
parent5d21c33f13f34ed592388512cc092986324c8f35 (diff)
parentc620f76bea08bdab6cfa17a5b3128a4924c6df4d (diff)
Merge pull request #2693 from RyanDwyer/move-sticky-in-seat
Move sticky containers when switching workspace via criteria
Diffstat (limited to 'sway')
-rw-r--r--sway/input/seat.c30
-rw-r--r--sway/tree/workspace.c22
2 files changed, 20 insertions, 32 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;
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index e9e5dfa2..b357d83d 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -369,7 +369,6 @@ struct sway_workspace *workspace_prev(struct sway_workspace *current) {
bool workspace_switch(struct sway_workspace *workspace,
bool no_auto_back_and_forth) {
struct sway_seat *seat = input_manager_current_seat(input_manager);
- struct sway_node *focus = seat_get_focus_inactive(seat, &root->node);
struct sway_workspace *active_ws = seat_get_focused_workspace(seat);
if (!no_auto_back_and_forth && config->auto_back_and_forth
@@ -392,27 +391,6 @@ bool workspace_switch(struct sway_workspace *workspace,
strcpy(prev_workspace_name, active_ws->name);
}
- // Move sticky containers to new workspace
- struct sway_output *next_output = workspace->output;
- struct sway_workspace *next_output_prev_ws =
- output_get_active_workspace(next_output);
- if (workspace != next_output_prev_ws) {
- for (int i = 0; i < next_output_prev_ws->floating->length; ++i) {
- struct sway_container *floater =
- next_output_prev_ws->floating->items[i];
- if (floater->is_sticky) {
- container_detach(floater);
- workspace_add_floating(workspace, floater);
- if (&floater->node == focus) {
- seat_set_focus(seat, NULL);
- seat_set_focus_container(seat, floater);
- cursor_send_pointer_motion(seat->cursor, 0, true);
- }
- --i;
- }
- }
- }
-
wlr_log(WLR_DEBUG, "Switching to workspace %p:%s",
workspace, workspace->name);
struct sway_node *next = seat_get_focus_inactive(seat, &workspace->node);