diff --git a/sway/input/seat.c b/sway/input/seat.c index 0434d637c..a2f1f5474 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -1360,10 +1360,19 @@ struct sway_node *seat_get_focus_inactive(struct sway_seat *seat, return node; } struct sway_seat_node *current; + struct sway_node *fallback = NULL; wl_list_for_each(current, &seat->focus_stack, link) { + // prioritize a focused descendant if (node_has_ancestor(current->node, node)) { return current->node; } + // if the node itself is in the focus stack, save it as a fallback + if (!fallback && current->node == node) { + fallback = current->node; + } + } + if (fallback) { + return fallback; } if (node->type == N_WORKSPACE) { return node; diff --git a/sway/input/seatop_default.c b/sway/input/seatop_default.c index df8232afc..64ef00922 100644 --- a/sway/input/seatop_default.c +++ b/sway/input/seatop_default.c @@ -565,7 +565,7 @@ static void check_focus_follows_mouse(struct sway_seat *seat, struct sway_output *hovered_output = wlr_output->data; if (focus && hovered_output != node_get_output(focus)) { struct sway_workspace *ws = output_get_active_workspace(hovered_output); - seat_set_focus(seat, &ws->node); + seat_set_focus(seat, seat_get_focus_inactive(seat, &ws->node)); transaction_commit_dirty(); } return;