root: Set inactive focus when scratchpad is moved to new workspace

Fixes an issue where an already visible scratchpad window being moved due to
'scratchpad show' leaves the entire workspace at the top of the focus stack in
the old workspace. Moving by 'focus output' back to the old workspace would
focus the entire workspace instead of just the last active container.
This commit is contained in:
Ankit Pandey 2023-03-18 04:58:53 -07:00 committed by Ronan Pigott
parent 90c2d631e2
commit f21090f978

View File

@ -145,7 +145,10 @@ void root_scratchpad_show(struct sway_container *con) {
// Show the container // Show the container
if (old_ws) { if (old_ws) {
container_detach(con); container_detach(con);
workspace_consider_destroy(old_ws); // Make sure the last inactive container on the old workspace is above
// the workspace itself in the focus stack.
struct sway_node *node = seat_get_focus_inactive(seat, &old_ws->node);
seat_set_raw_focus(seat, node);
} else { } else {
// Act on the ancestor of scratchpad hidden split containers // Act on the ancestor of scratchpad hidden split containers
while (con->pending.parent) { while (con->pending.parent) {
@ -163,6 +166,9 @@ void root_scratchpad_show(struct sway_container *con) {
arrange_workspace(new_ws); arrange_workspace(new_ws);
seat_set_focus(seat, seat_get_focus_inactive(seat, &con->node)); seat_set_focus(seat, seat_get_focus_inactive(seat, &con->node));
if (old_ws) {
workspace_consider_destroy(old_ws);
}
} }
static void disable_fullscreen(struct sway_container *con, void *data) { static void disable_fullscreen(struct sway_container *con, void *data) {