aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Ashworth <bosrsf04@gmail.com>2019-02-22 23:09:39 -0500
committeremersion <contact@emersion.fr>2019-02-23 09:21:19 +0100
commit9350a52c0e8b502f9dc7f876da0527607a44bfec (patch)
treef9679e748d8e25b63b031c555c5dbe60cf954f65
parentcdf30033afdb4c1ead47ed208cee0c63a82b7ea4 (diff)
downloadsway-9350a52c0e8b502f9dc7f876da0527607a44bfec.tar.xz
handle_seat_node_destroy: update seat->workspace
If an unmanaged or layer surface is focused when an output gets disabled and an empty workspace on the output was focused by the seat, the seat needs to refocus it's focus inactive to update the value of `seat->workspace`.
-rw-r--r--sway/input/seat.c13
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) {
struct sway_node *focus = seat_get_focus(seat);
if (node->type == N_WORKSPACE) {
+ // If an unmanaged or layer surface is focused when an output gets
+ // disabled and an empty workspace on the output was focused by the
+ // seat, the seat needs to refocus it's focus inactive to update the
+ // value of seat->workspace.
+ if (seat->workspace == node->sway_workspace) {
+ struct sway_node *node = seat_get_focus_inactive(seat, &root->node);
+ seat_set_focus(seat, NULL);
+ if (node) {
+ seat_set_focus(seat, node);
+ } else {
+ seat->workspace = NULL;
+ }
+ }
seat_node_destroy(seat_node);
return;
}