diff options
-rw-r--r-- | sway/input/seat.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c index 69b04843..6482a47c 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c | |||
@@ -146,6 +146,19 @@ static void handle_seat_node_destroy(struct wl_listener *listener, void *data) { | |||
146 | struct sway_node *focus = seat_get_focus(seat); | 146 | struct sway_node *focus = seat_get_focus(seat); |
147 | 147 | ||
148 | if (node->type == N_WORKSPACE) { | 148 | if (node->type == N_WORKSPACE) { |
149 | // If an unmanaged or layer surface is focused when an output gets | ||
150 | // disabled and an empty workspace on the output was focused by the | ||
151 | // seat, the seat needs to refocus it's focus inactive to update the | ||
152 | // value of seat->workspace. | ||
153 | if (seat->workspace == node->sway_workspace) { | ||
154 | struct sway_node *node = seat_get_focus_inactive(seat, &root->node); | ||
155 | seat_set_focus(seat, NULL); | ||
156 | if (node) { | ||
157 | seat_set_focus(seat, node); | ||
158 | } else { | ||
159 | seat->workspace = NULL; | ||
160 | } | ||
161 | } | ||
149 | seat_node_destroy(seat_node); | 162 | seat_node_destroy(seat_node); |
150 | return; | 163 | return; |
151 | } | 164 | } |