commands: when moving container, restore focus properly

This commit is contained in:
Ian Fan 2018-09-11 16:03:05 +01:00
parent 822b45f483
commit c770949a9f

View File

@ -554,7 +554,10 @@ static struct cmd_results *cmd_move_container(int argc, char **argv) {
struct sway_workspace *new_output_last_ws = old_output == new_output ? struct sway_workspace *new_output_last_ws = old_output == new_output ?
NULL : output_get_active_workspace(new_output); NULL : output_get_active_workspace(new_output);
// move container, arrange windows and return focus // save focus, in case it needs to be restored
struct sway_node *focus = seat_get_focus(seat);
// move container
if (container->scratchpad) { if (container->scratchpad) {
root_scratchpad_remove_container(container); root_scratchpad_remove_container(container);
} }
@ -574,30 +577,37 @@ static struct cmd_results *cmd_move_container(int argc, char **argv) {
case N_ROOT: case N_ROOT:
break; break;
} }
// restore focus on destination output back to its last active workspace
struct sway_workspace *new_workspace = struct sway_workspace *new_workspace =
output_get_active_workspace(new_output); output_get_active_workspace(new_output);
if (new_output_last_ws && new_output_last_ws != new_workspace) { if (new_output_last_ws && new_output_last_ws != new_workspace) {
// change focus on destination output back to its last active workspace
struct sway_node *new_output_last_focus = struct sway_node *new_output_last_focus =
seat_get_focus_inactive(seat, &new_output_last_ws->node); seat_get_focus_inactive(seat, &new_output_last_ws->node);
seat_set_focus_warp(seat, new_output_last_focus, false, false); seat_set_focus_warp(seat, new_output_last_focus, false, false);
} }
struct sway_node *focus = NULL; // restore focus
if (old_parent) { if (focus == &container->node) {
focus = seat_get_focus_inactive(seat, &old_parent->node); focus = NULL;
} else if (old_ws) { if (old_parent) {
focus = seat_get_focus_inactive(seat, &old_ws->node); focus = seat_get_focus_inactive(seat, &old_parent->node);
}
if (!focus && old_ws) {
focus = seat_get_focus_inactive(seat, &old_ws->node);
}
} }
seat_set_focus_warp(seat, focus, true, false); seat_set_focus_warp(seat, focus, true, false);
// clean-up, destroying parents if the container was the last child
if (old_parent) { if (old_parent) {
container_reap_empty(old_parent); container_reap_empty(old_parent);
} else if (old_ws) { } else if (old_ws) {
workspace_consider_destroy(old_ws); workspace_consider_destroy(old_ws);
} }
if (old_ws) { // arrange windows
if (old_ws && !old_ws->node.destroying) {
arrange_workspace(old_ws); arrange_workspace(old_ws);
} }
arrange_node(node_get_parent(destination)); arrange_node(node_get_parent(destination));