From 8e5492b6e88f2dc7a69b5534541b42d669640dcf Mon Sep 17 00:00:00 2001 From: rustbasic <127506429+rustbasic@users.noreply.github.com> Date: Wed, 28 Aug 2024 16:40:04 +0900 Subject: [PATCH] Fix: Ensures correct IME behavior when the text input area gains or loses focus. (#4896) Fix: Ensures correct IME behavior when the text input area gains or loses focus. Fix: Handling `state.ime_enabled` in multiple `TextEdit`. Fix: A symptom of characters being copied when there are multiple TextEdits. * Related #4137 * Related #4358 * Closes #4374 * Related #4436 * Related #4794 * Related #4908 * Related #5008 Fix Issues: When focus is moved elsewhere, you must set `state.ime_enabled = false`, otherwise the IME will have problems when focus returns. Fix Issues: A symptom of characters being copied when there are multiple TextEdits. Deletes all current `IME events`, preventing them from being copied to `other TextEdits`, without saving the `TextEdit ID`, ( Related Issues: Some `LINUX` seem to trigger an IME enable event on startup. So, when we gained focus, we do `state.ime_enabled = false`. ) --- crates/egui/src/widgets/text_edit/builder.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/crates/egui/src/widgets/text_edit/builder.rs b/crates/egui/src/widgets/text_edit/builder.rs index 8763bd1a3ae..00d7d6e3eff 100644 --- a/crates/egui/src/widgets/text_edit/builder.rs +++ b/crates/egui/src/widgets/text_edit/builder.rs @@ -745,6 +745,16 @@ impl<'t> TextEdit<'t> { } } + // Ensures correct IME behavior when the text input area gains or loses focus. + if state.ime_enabled && (response.gained_focus() || response.lost_focus()) { + state.ime_enabled = false; + if let Some(mut ccursor_range) = state.cursor.char_range() { + ccursor_range.secondary.index = ccursor_range.primary.index; + state.cursor.set_char_range(Some(ccursor_range)); + } + ui.input_mut(|i| i.events.retain(|e| !matches!(e, Event::Ime(_)))); + } + state.clone().store(ui.ctx(), id); if response.changed {