From 4f06cfcf5baec45117452044b1cd783fb9799dee Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Tue, 18 Oct 2022 17:13:31 +0300 Subject: [PATCH] On Wayland, fix invalid offsets being sent in Preedit Even when the protocol explicitly tells to send proper UTF-8 boundaries for cursor, some IMEs don't do that, so sanity check them before sending downstream. --- CHANGELOG.md | 1 + .../linux/wayland/seat/text_input/handlers.rs | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 026e2bec42..a30f35e215 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ And please only add new entries to the top of this list, right below the `# Unre - On Windows, emit `ReceivedCharacter` events on system keybindings. - On Windows, fixed focus event emission on minimize. - On X11, fixed IME crashing during reload. +- On Wayland, fix byte offset in `Ime::Preedit` pointing to invalid bytes. # 0.27.3 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 8d12b8f4e7..ed2540cb54 100644 --- a/src/platform_impl/linux/wayland/seat/text_input/handlers.rs +++ b/src/platform_impl/linux/wayland/seat/text_input/handlers.rs @@ -68,9 +68,14 @@ pub(super) fn handle_text_input( cursor_begin, cursor_end, } => { - let cursor_begin = usize::try_from(cursor_begin).ok(); - let cursor_end = usize::try_from(cursor_end).ok(); let text = text.unwrap_or_default(); + let cursor_begin = usize::try_from(cursor_begin) + .ok() + .and_then(|idx| text.is_char_boundary(idx).then(|| idx)); + let cursor_end = usize::try_from(cursor_end) + .ok() + .and_then(|idx| text.is_char_boundary(idx).then(|| idx)); + inner.pending_preedit = Some(Preedit { text, cursor_begin,