From a558866f42de74f7dc0500c3fe29bb506cf03cf6 Mon Sep 17 00:00:00 2001 From: Ronan Pigott Date: Sun, 11 Apr 2021 17:02:55 -0700 Subject: [PATCH] container: retain focus position on floating enable When a tiling container is floated, the focus stack needs to be appropraitely modified to return the container to its original position in the tree upon floating disable, like i3. --- sway/tree/container.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/sway/tree/container.c b/sway/tree/container.c index 68fbec2fd..67e69d9dc 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -821,6 +821,8 @@ void container_set_floating(struct sway_container *container, bool enable) { struct sway_seat *seat = input_manager_current_seat(); struct sway_workspace *workspace = container->pending.workspace; + struct sway_container *focus = seat_get_focused_container(seat); + bool set_focus = focus == container; if (enable) { struct sway_container *old_parent = container->pending.parent; @@ -835,6 +837,10 @@ void container_set_floating(struct sway_container *container, bool enable) { container_floating_set_default_size(container); container_floating_resize_and_center(container); if (old_parent) { + if (set_focus) { + seat_set_raw_focus(seat, &old_parent->node); + seat_set_raw_focus(seat, &container->node); + } container_reap_empty(old_parent); } } else { @@ -846,7 +852,11 @@ void container_set_floating(struct sway_container *container, bool enable) { struct sway_container *reference = seat_get_focus_inactive_tiling(seat, workspace); if (reference) { - container_add_sibling(reference, container, 1); + if (reference->view) { + container_add_sibling(reference, container, 1); + } else { + container_add_child(reference, container); + } container->pending.width = reference->pending.width; container->pending.height = reference->pending.height; } else {