From 9e697cc06ffb302744d8ba3075cbe7e2337fc0b7 Mon Sep 17 00:00:00 2001 From: Daniel McNab <36049421+DJMcNab@users.noreply.github.com> Date: Sat, 11 May 2024 16:01:06 +0200 Subject: [PATCH] Handle IME in a way which winit expects (#298) Doing some investigation, the issues I'm seeing is that ibus is a bit/a lot broken around compose keys But this has correct behaviour for me. This matches the documentation of the `winit` [`Ime`](https://docs.rs/winit/latest/winit/event/enum.Ime.html) event. --- crates/masonry/src/text2/edit.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/crates/masonry/src/text2/edit.rs b/crates/masonry/src/text2/edit.rs index c1a8e362..a7b82c4e 100644 --- a/crates/masonry/src/text2/edit.rs +++ b/crates/masonry/src/text2/edit.rs @@ -256,18 +256,13 @@ impl TextEditor { TextEvent::KeyboardKey(_, _) => Handled::No, TextEvent::Ime(ime) => match ime { Ime::Commit(text) => { - if let Some(preedit) = self - .preedit_range - .clone() - .or_else(|| self.selection.map(|x| x.range())) - { - self.text_mut().edit(preedit.clone(), text); + if let Some(selection_range) = self.selection.map(|x| x.range()) { + self.text_mut().edit(selection_range.clone(), text); self.selection = Some(Selection::caret( - preedit.start + text.len(), + selection_range.start + text.len(), Affinity::Upstream, )); } - self.preedit_range = None; let contents = self.text().as_str().to_string(); ctx.submit_action(Action::TextChanged(contents)); Handled::Yes @@ -276,7 +271,11 @@ impl TextEditor { if let Some(preedit) = self.preedit_range.clone() { self.text_mut().edit(preedit.clone(), preedit_string); let np = preedit.start..(preedit.start + preedit_string.len()); - self.preedit_range = Some(np.clone()); + self.preedit_range = if preedit_string.is_empty() { + None + } else { + Some(np.clone()) + }; self.selection = if let Some(pec) = preedit_sel { Some(Selection::new( np.start + pec.0, @@ -290,7 +289,11 @@ impl TextEditor { let sr = self.selection.map(|x| x.range()).unwrap_or(0..0); self.text_mut().edit(sr.clone(), preedit_string); let np = sr.start..(sr.start + preedit_string.len()); - self.preedit_range = Some(np.clone()); + self.preedit_range = if preedit_string.is_empty() { + None + } else { + Some(np.clone()) + }; self.selection = if let Some(pec) = preedit_sel { Some(Selection::new( np.start + pec.0,