From 1a68a7cf0b6155417c3123593fccf78202106474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 22 Nov 2019 22:28:41 +0100 Subject: [PATCH] input: improve behavior when sway bugs out When we receive a keyboard_key or pointer_motion event without first having received a keyboard_enter or pointer_enter event (that being the "sway bugs" part), we generally don't know _which_ terminal window the event was intended for. However, if we only have *one* window open (always the case for a regular 'foot' process, or when there's a single footclient connected to a foot server process), then obviously we can "guess" which window the event was intended for... so do that. Now, the only time the event is ignored is when we're a server process with more than one window open (= more than one footclient connected). --- input.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/input.c b/input.c index 4350c550..319b9f1c 100644 --- a/input.c +++ b/input.c @@ -161,8 +161,15 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, have_warned = true; LOG_WARN("compositor sent keyboard_key event without first sending keyboard_enter"); } - stop_repeater(wayl, -1); - return; + + if (tll_length(wayl->terms) == 1) { + /* With only one terminal we *know* which one has focus */ + term = tll_front(wayl->terms); + } else { + /* But with multiple windows we can't guess - ignore the event */ + stop_repeater(wayl, -1); + return; + } } assert(term != NULL); @@ -441,7 +448,14 @@ wl_pointer_motion(void *data, struct wl_pointer *wl_pointer, have_warned = true; LOG_WARN("compositor sent pointer_motion event without first sending pointer_enter"); } - return; + + if (tll_length(wayl->terms) == 1) { + /* With only one terminal we *know* which one has focus */ + term = tll_front(wayl->terms); + } else { + /* But with multiple windows we can't guess - ignore the event */ + return; + } } assert(term != NULL);