diff --git a/CHANGELOG.md b/CHANGELOG.md index 11b85b6cf..8b9d85d89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ And please only add new entries to the top of this list, right below the `# Unre - On Windows, added `WindowExtWindows::set_undecorated_shadow` and `WindowBuilderExtWindows::with_undecorated_shadow` to draw the drop shadow behind a borderless window. - On Windows, fixed default window features (ie snap, animations, shake, etc.) when decorations are disabled. - 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 8f05bb60d..f4f131d09 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); } _ => (), }