From 92ddb3483e676ec15a134b2d36dcda7e34c5299b Mon Sep 17 00:00:00 2001 From: Weng Xuetian Date: Fri, 9 Sep 2022 00:53:58 -0700 Subject: [PATCH] Clear preedit if there is no pending preedit on Wayland Fixes #2478. --- CHANGELOG.md | 1 + .../linux/wayland/seat/text_input/handlers.rs | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e648fd5..9c39fcf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ And please only add new entries to the top of this list, right below the `# Unre - On Wayland, a new `wayland-csd-adwaita-crossfont` feature was added to use `crossfont` instead of `ab_glyph` for decorations. - On Wayland, if not otherwise specified use upstream automatic CSD theme selection. - On Windows, fixed ALT+Space shortcut to open window menu. +- On Wayland, fixed `Ime::Preedit` not being sent on IME reset. # 0.27.2 (2022-8-12) diff --git a/src/platform_impl/linux/wayland/seat/text_input/handlers.rs b/src/platform_impl/linux/wayland/seat/text_input/handlers.rs index 8f05bb60..f4f131d0 100644 --- a/src/platform_impl/linux/wayland/seat/text_input/handlers.rs +++ b/src/platform_impl/linux/wayland/seat/text_input/handlers.rs @@ -92,15 +92,21 @@ pub(super) fn handle_text_input( event_sink.push_window_event(WindowEvent::Ime(Ime::Commit(text)), window_id); } - // Push preedit string we've got after latest commit. - if let Some(preedit) = inner.pending_preedit.take() { - let cursor_range = preedit - .cursor_begin - .map(|b| (b, preedit.cursor_end.unwrap_or(b))); + // Always send preedit on `Done` events. + let (text, range) = inner + .pending_preedit + .take() + .map(|preedit| { + let cursor_range = preedit + .cursor_begin + .map(|b| (b, preedit.cursor_end.unwrap_or(b))); - let event = Ime::Preedit(preedit.text, cursor_range); - event_sink.push_window_event(WindowEvent::Ime(event), window_id); - } + (preedit.text, cursor_range) + }) + .unwrap_or_default(); + + let event = Ime::Preedit(text, range); + event_sink.push_window_event(WindowEvent::Ime(event), window_id); } _ => (), }