From 89d6ff10fa816f11c1fa20368e4cc3464549955e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 6 Apr 2026 10:45:43 +0200 Subject: [PATCH] input: no extra key processing in alternate input modes In 3a2eb80d83d59d194a3d07da227431c634892ff5, we fixed an issue where key *releases* triggered a selection reset, and viewport reset. The same issue still exists in other input modes (unicode, search and url mode); if the kitty keyboard protocol has been enabled, with release events, any key press directed to e.g. search input handling, will was not remembered, and the corresponding release event generated a kitty keyboard event to the terminal application, and reset the viewport and selection. This means, for example, that scrollback search was unusable. Fix by *never* doing any further (generic) key processing if an alternate input mode is active. Closes #2316 --- CHANGELOG.md | 4 ++++ input.c | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f554124b..78803ea3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,8 +78,12 @@ * Other output (key presses, query replies etc) being mixed with paste data, both interactive pastes and OSC-52 ([#2307][2307]). +* Scrollback search not working correctly when the terminal + application has enabled the kitty keyboard protocol with release + event reporting ([#2316][2316]). [2307]: https://codeberg.org/dnkl/foot/issues/2307 +[2316]: https://codeberg.org/dnkl/foot/issues/2316 ### Security diff --git a/input.c b/input.c index aa6b7f1d..6a829a70 100644 --- a/input.c +++ b/input.c @@ -1643,31 +1643,34 @@ key_press_release(struct seat *seat, struct terminal *term, uint32_t serial, seat->wayl->key_binding_manager, term->conf, seat); xassert(bindings != NULL); - if (pressed) { - if (term->unicode_mode.active) { + if (term->unicode_mode.active) { + if (pressed) unicode_mode_input(seat, term, sym); - return; - } + return; + } - else if (term->is_searching) { + else if (term->is_searching) { + if (pressed) { if (should_repeat) start_repeater(seat, key); search_input( seat, term, bindings, key, sym, mods, consumed, raw_syms, raw_count, serial); - return; } + return; + } - else if (urls_mode_is_active(term)) { + else if (urls_mode_is_active(term)) { + if (pressed) { if (should_repeat) start_repeater(seat, key); urls_input( seat, term, bindings, key, sym, mods, consumed, raw_syms, raw_count, serial); - return; } + return; } #if defined(_DEBUG) && defined(LOG_ENABLE_DBG) && LOG_ENABLE_DBG