mirror of
https://github.com/swaywm/sway.git
synced 2024-12-29 00:16:22 +01:00
Merge pull request #2620 from ianyfan/commands
commands: when moving a container, restore focus properly
This commit is contained in:
commit
af9e8f94cc
1 changed files with 19 additions and 8 deletions
|
@ -231,6 +231,7 @@ static void container_move_to_container(struct sway_container *container,
|
||||||
struct sway_workspace *old_workspace = container->workspace;
|
struct sway_workspace *old_workspace = container->workspace;
|
||||||
|
|
||||||
container_detach(container);
|
container_detach(container);
|
||||||
|
container_remove_gaps(container);
|
||||||
container->width = container->height = 0;
|
container->width = container->height = 0;
|
||||||
container->saved_width = container->saved_height = 0;
|
container->saved_width = container->saved_height = 0;
|
||||||
|
|
||||||
|
@ -554,7 +555,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 +578,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));
|
||||||
|
|
Loading…
Reference in a new issue