diff --git a/crates/egui/src/id.rs b/crates/egui/src/id.rs index c5047c266137..c26ff736bea2 100644 --- a/crates/egui/src/id.rs +++ b/crates/egui/src/id.rs @@ -33,6 +33,12 @@ use std::num::NonZeroU64; #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub struct Id(NonZeroU64); +impl Default for Id { + fn default() -> Self { + Self::NULL + } +} + impl Id { /// A special [`Id`], in particular as a key to [`crate::Memory::data`] /// for when there is no particular widget to attach the data. diff --git a/crates/egui/src/widgets/text_edit/builder.rs b/crates/egui/src/widgets/text_edit/builder.rs index 86d281256b7c..f6cf06283166 100644 --- a/crates/egui/src/widgets/text_edit/builder.rs +++ b/crates/egui/src/widgets/text_edit/builder.rs @@ -994,6 +994,7 @@ fn events( Event::Ime(ime_event) => match ime_event { ImeEvent::Enabled => { state.ime_enabled = true; + state.ime_target_id = id; state.ime_cursor_range = cursor_range; None } @@ -1019,6 +1020,7 @@ fn events( state.ime_enabled = false; if !prediction.is_empty() + && state.ime_target_id == id && cursor_range.secondary.ccursor.index == state.ime_cursor_range.secondary.ccursor.index { diff --git a/crates/egui/src/widgets/text_edit/state.rs b/crates/egui/src/widgets/text_edit/state.rs index c95d676910a9..cd40b6beccfe 100644 --- a/crates/egui/src/widgets/text_edit/state.rs +++ b/crates/egui/src/widgets/text_edit/state.rs @@ -44,6 +44,10 @@ pub struct TextEditState { #[cfg_attr(feature = "serde", serde(skip))] pub(crate) ime_enabled: bool, + // target TextEdit ID for IME candidate. + #[cfg_attr(feature = "serde", serde(skip))] + pub(crate) ime_target_id: Id, + // cursor range for IME candidate. #[cfg_attr(feature = "serde", serde(skip))] pub(crate) ime_cursor_range: CursorRange,