Merge pull request #2693 from RyanDwyer/move-sticky-in-seat

Move sticky containers when switching workspace via criteria
This commit is contained in:
emersion 2018-10-06 14:53:09 +02:00 committed by GitHub
commit 0f45aa4ea9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 32 deletions

View file

@ -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 // find new output's old workspace, which might have to be removed if empty
struct sway_workspace *new_output_last_ws = NULL; struct sway_workspace *new_output_last_ws =
if (new_output && last_output != new_output) { new_output ? output_get_active_workspace(new_output) : NULL;
new_output_last_ws = output_get_active_workspace(new_output);
}
// Unfocus the previous focus // Unfocus the previous focus
if (last_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"); ipc_event_window(container, "focus");
} }
if (new_output_last_ws) { // Move sticky containers to new workspace
workspace_consider_destroy(new_output_last_ws); 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 // 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); container_raise_floating(container);
} }
if (last_focus) { if (new_output_last_ws) {
if (last_workspace) { workspace_consider_destroy(new_output_last_ws);
workspace_consider_destroy(last_workspace); }
} 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) { if (config->mouse_warping && warp && new_output != last_output) {
double x = 0; double x = 0;
double y = 0; double y = 0;

View file

@ -369,7 +369,6 @@ struct sway_workspace *workspace_prev(struct sway_workspace *current) {
bool workspace_switch(struct sway_workspace *workspace, bool workspace_switch(struct sway_workspace *workspace,
bool no_auto_back_and_forth) { bool no_auto_back_and_forth) {
struct sway_seat *seat = input_manager_current_seat(input_manager); 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); struct sway_workspace *active_ws = seat_get_focused_workspace(seat);
if (!no_auto_back_and_forth && config->auto_back_and_forth 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); 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", wlr_log(WLR_DEBUG, "Switching to workspace %p:%s",
workspace, workspace->name); workspace, workspace->name);
struct sway_node *next = seat_get_focus_inactive(seat, &workspace->node); struct sway_node *next = seat_get_focus_inactive(seat, &workspace->node);