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.
This commit is contained in:
Kirill Chibisov 2022-10-18 17:13:31 +03:00 committed by GitHub
parent 462bb4d324
commit 4f06cfcf5b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 2 deletions

View file

@ -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

View file

@ -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,