diff --git a/CHANGELOG.md b/CHANGELOG.md index 026e2bec..a30f35e2 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 8d12b8f4..ed2540cb 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,