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.#4896emilk merged 9 commits intoemilk:masterfrom
Conversation
| } | ||
| } | ||
|
|
||
| if state.ime_enabled && response.lost_focus() { |
There was a problem hiding this comment.
Couldnt you just leave the state.ime_enabled` ? Because if its true its getting set to false and else it is already false, so to me it seems like an unnecessary condition
There was a problem hiding this comment.
Couldn
t you just leave thestate.ime_enabled` ? Because if its true its getting set to false and else it is already false, so to me it seems like an unnecessary condition
When focus is moved elsewhere, you must set ime_enabled to 'false`, otherwise the IME will have problems when focus returns.
There was a problem hiding this comment.
sure the idea was the following
if response.lost_focus() {
state.ime_enabled = false;
}There was a problem hiding this comment.
sure the idea was the following
if response.lost_focus() { state.ime_enabled = false; }
Yes, I thought about this too. If ime_enabled is not true, there is no need to check lost_focus() , so there is a difference in speed and readability. Let's wait for emilk's opinion on which one is better.
thank you.
There was a problem hiding this comment.
Ok but if so it would be good to add a comment there anyway
state.ime_enabled in multiple TextEdit.Fix: Changed the handling method of `Ime::Preedit(_, None)` Fix: backspace fail after ime input * Related #4358 * Related #4430 * Related #4436 * Related #4794 * Related #4896 * Closes #4908 Issues: backspace fail after ime input * #4908 (Chinese) Changed the handling method of `Ime::Preedit(_, None)`
Fix: Changed the handling method of `Ime::Preedit(_, None)` Fix: backspace fail after ime input * Related emilk#4358 * Related emilk#4430 * Related emilk#4436 * Related emilk#4794 * Related emilk#4896 * Closes emilk#4908 Issues: backspace fail after ime input * emilk#4908 (Chinese) Changed the handling method of `Ime::Preedit(_, None)`
Fix: Changed the handling method of `Ime::Preedit(_, None)` Fix: backspace fail after ime input * Related emilk#4358 * Related emilk#4430 * Related emilk#4436 * Related emilk#4794 * Related emilk#4896 * Closes emilk#4908 Issues: backspace fail after ime input * emilk#4908 (Chinese) Changed the handling method of `Ime::Preedit(_, None)`
…oses focus. (emilk#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 emilk#4137 * Related emilk#4358 * Closes emilk#4374 * Related emilk#4436 * Related emilk#4794 * Related emilk#4908 * Related emilk#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`. )
Fix: Changed the handling method of `Ime::Preedit(_, None)` Fix: backspace fail after ime input * Related emilk#4358 * Related emilk#4430 * Related emilk#4436 * Related emilk#4794 * Related emilk#4896 * Closes emilk#4908 Issues: backspace fail after ime input * emilk#4908 (Chinese) Changed the handling method of `Ime::Preedit(_, None)`
…oses focus. (emilk#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 emilk#4137 * Related emilk#4358 * Closes emilk#4374 * Related emilk#4436 * Related emilk#4794 * Related emilk#4908 * Related emilk#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`. )
…#7983) <!-- Please read the "Making a PR" section of [`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/main/CONTRIBUTING.md) before opening a Pull Request! * Keep your PR:s small and focused. * The PR title is what ends up in the changelog, so make it descriptive! * If applicable, add a screenshot or gif. * If it is a non-trivial addition, consider adding a demo for it to `egui_demo_lib`, or a new example. * Do NOT open PR:s from your `master` branch, as that makes it hard for maintainers to test and add commits to your PR. * Remember to run `cargo fmt` and `cargo clippy`. * Open the PR as a draft until you have self-reviewed it and run `./scripts/check.sh`. * When you have addressed a PR comment, mark it as resolved. Please be patient! I will review your PR, but my time is limited! --> * Depends on #7967 * Closes #7485 * Should fix #7906 (This issue doesn't seem to have been resolved, but the author closed it; I personally don't have the environment to verify whether it is fixed.) * Replaces #4137, #4896, and partially #7810 * [x] I have followed the instructions in the PR template This PR started as a fix for #7485, but has since evolved into a broader rewrite of IME-related logic. ## Overview This PR primarily introduces a new public method, `owns_ime_events`, on [`Memory`], and refactors parts of [`TextEdit`] to integrate with it. Previously, each [`TextEdit`] widget independently determined whether to handle IME events and stored its own IME-related state. This approach made ownership-handling fragmented and was therefore error-prone. With this PR: - IME event ownership is centralized, ensuring that at most a single widget owns IME events per frame. - [`PlatformOutput`]'s `ime` field can be set to `None` for at least one frame when IME composition is interrupted, allowing the IME to be properly dismissed. ## Details Two new public methods are introduced on [`Memory`]: - `fn owns_ime_events(&self, id: Id) -> bool`: check IME event ownership for the current frame for the widget with the given `id`. - `fn interrupt_ime(&mut self)`: interrupt the current IME composition, if any. Since the newly added methods on [`Memory`] are public, other widgets can also participate in IME handling without risking ownership conflicts of IME events. I also added an internal (`pub(crate)`) field on [`TextEditState`], called `cursor_purpose`, to distinguish the role of the [`TextEdit`] cursor. Additionally, `egui::ImeEvent::Enabled` and `egui::ImeEvent::Disabled` have been removed, as they are no longer used anywhere. ## Demonstrations ### Windows: The Korean IME text duplication bug fixed in #4137 does not reappear. <table> <thead> <tr> <th></th> <th>With this PR</th> <th>Without this PR</th> </tr> </thead> <tbody> <tr> <th>Behavior</th> <td>Correct (no regression)</td> <td>Correct</td> </tr> <tr> <th>Screencast</th> <td>  </td> <td>  </td> </tr> </tbody> </table> ### Windows: Chinese and Japanese IMEs now behave more consistently with the Korean IME in similar scenarios. This change does not matter much, as composition is rarely interrupted mid-process with these IMEs in typical usage. <table> <thead> <tr> <th></th> <th>With this PR</th> <th>Without this PR</th> </tr> </thead> <tbody> <tr> <th>Behavior</th> <td>Composition can be interrupted by clicking (like Korean IMEs)</td> <td>Composition can not interrupted by clicking</td> </tr> <tr> <th>Screencast (Builtin Chinese IME)</th> <td>  </td> <td>  </td> </tr> <tr> <th>Screencast (Builtin Japanese IME)</th> <td>  </td> <td>  </td> </tr> </tbody> </table> ### macOS: was buggy, still buggy Likely due to this upstream bug in `winit`: rust-windowing/winit#4432 Once `winit` is updated to a version that includes the fix, the behavior should become correct with this PR. <table> <thead> <tr> <th></th> <th>With this PR</th> <th>Without this PR</th> </tr> </thead> <tbody> <tr> <th>Behavior</th> <td>Buggy as before</td> <td>Buggy: Characters are duplicated</td> </tr> <tr> <th>Screencast</th> <td>  </td> <td>  </td> </tr> </tbody> </table> ### Wayland + iBus: Korean IME duplication bug fixed <table> <thead> <tr> <th></th> <th>With this PR</th> <th>Without this PR</th> </tr> </thead> <tbody> <tr> <th>Behavior</th> <td>Correct</td> <td>Buggy: Characters are duplicated</td> </tr> <tr> <th>Screencast</th> <td>  </td> <td>  </td> </tr> </tbody> </table> ### Wayland + iBus: #7485 is fixed <table> <thead> <tr> <th></th> <th>With this PR</th> <th>Without this PR</th> </tr> </thead> <tbody> <tr> <th>Behavior</th> <td>Correct</td> <td>Buggy: Only a single ASCII character can be typed after <code>TextEdit</code> is focused</td> </tr> <tr> <th>Screencast</th> <td>  </td> <td>  </td> </tr> </tbody> </table> ### Wayland + iBus: selection is also not broken This PR does not reintroduce the selection bug fixed in #7973. <table> <thead> <tr> <th></th> <th>With this PR</th> </tr> </thead> <tbody> <tr> <th>Behavior</th> <td>Correct</td> </tr> <tr> <th>Screencast</th> <td>  </td> </tr> </tbody> </table> ### X11 + Fcitx5: IME composition can be interrupted But due to #7975, the experience is still subpar. (Uncommitted text is lost after interruption.) <table> <thead> <tr> <th></th> <th>With this PR</th> <th>Without this PR</th> </tr> </thead> <tbody> <tr> <th>Screencast</th> <td>  </td> <td>  </td> </tr> </tbody> </table> [`Memory`]: https://docs.rs/egui/latest/egui/struct.Memory.html [`TextEdit`]: https://docs.rs/egui/latest/egui/widgets/text_edit/struct.TextEdit.html [`PlatformOutput`]: https://docs.rs/egui/latest/egui/struct.PlatformOutput.html [`TextEditState`]: https://docs.rs/egui/latest/egui/widgets/text_edit/struct.TextEditState.html
Fix: Ensures correct IME behavior when the text input area gains or loses focus.
Fix: Handling
state.ime_enabledin multipleTextEdit.Fix: A symptom of characters being copied when there are multiple TextEdits.
Related Fix IME bug where currently typed characters got copied #4137
Related Improve IME support with new
Event::Ime#4358Closes Fix: A symptom of characters being copied when there are multiple TextEdits. #4374
Related IME for chinese #4436
Related Handle the IME event first in
TextEditto fix some bugs #4794Related backspace fail after ime input #4908
Related eframe Linux: Backspace & arrow keys are completely broken #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 toother TextEdits, without saving theTextEdit ID,( Related Issues: Some
LINUXseem to trigger an IME enable event on startup. So, when we gained focus, we dostate.ime_enabled = false. )