From 8716ca578495d93ff6fcfa1001ca86413ecf7ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 21 May 2024 06:18:00 +0200 Subject: [PATCH] url-mode: disable IME mode while URL-mode is active This prevents the IME from stealing "our" key-presses, and thus preventing the user from opening URLs. Closes #1718, hopefully. --- CHANGELOG.md | 2 ++ csi.c | 4 +++- terminal.h | 1 + url-mode.c | 12 ++++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0472c8a8..12fe1963 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,9 +87,11 @@ * No error response for empty `XTGETTCAP` request ([#1694][1694]). * Unicode-mode in one foot client affecting other clients, in foot server mode ([#1717][1717]). +* IME interfering in URL-mode ([#1718][1718]). [1694]: https://codeberg.org/dnkl/foot/issues/1694 [1717]: https://codeberg.org/dnkl/foot/issues/1717 +[1718]: https://codeberg.org/dnkl/foot/issues/1718 ### Security diff --git a/csi.c b/csi.c index 3e044908..be470e70 100644 --- a/csi.c +++ b/csi.c @@ -507,8 +507,10 @@ decset_decrst(struct terminal *term, unsigned param, bool enable) case 737769: if (enable) term_ime_enable(term); - else + else { term_ime_disable(term); + term->ime_reenable_after_url_mode = false; + } break; default: diff --git a/terminal.h b/terminal.h index ba634185..5033c550 100644 --- a/terminal.h +++ b/terminal.h @@ -714,6 +714,7 @@ struct terminal { char32_t url_keys[5]; bool urls_show_uri_on_jump_label; struct grid *url_grid_snapshot; + bool ime_reenable_after_url_mode; #if defined(FOOT_IME_ENABLED) && FOOT_IME_ENABLED bool ime_enabled; diff --git a/url-mode.c b/url-mode.c index 0dc594f5..9356a362 100644 --- a/url-mode.c +++ b/url-mode.c @@ -778,6 +778,12 @@ urls_render(struct terminal *term) if (tll_length(win->term->urls) == 0) return; + /* Disable IME while in URL-mode */ + if (term_ime_is_enabled(term)) { + term->ime_reenable_after_url_mode = true; + term_ime_disable(term); + } + /* Dirty the last cursor, to ensure it is erased */ { struct row *cursor_row = term->render.last_cursor.row; @@ -861,5 +867,11 @@ urls_reset(struct terminal *term) term->urls_show_uri_on_jump_label = false; memset(term->url_keys, 0, sizeof(term->url_keys)); + /* Re-enable IME, if it was enabled before we entered URL-mode */ + if (term->ime_reenable_after_url_mode) { + term->ime_reenable_after_url_mode = false; + term_ime_enable(term); + } + render_refresh(term); }