From 15d3d43aa30317ec7c0611d4faae890166d7a22b Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 30 Sep 2024 13:23:02 +0200 Subject: [PATCH] Fix backspace/arrow keys in TextEdit on Linux (#5188) * Closes https://github.com/emilk/egui/issues/5008 * Closes https://github.com/emilk/egui/pull/5182 * Bug introduced in https://github.com/emilk/egui/pull/4912 I suspect this will make IME no longer work on Linux, though I don't know if it ever worked. I rather have backspace/arrows working though. Please help test this (I don't have Linux!) # Tested on * [x] Mac * [ ] Linux Wayland * [x] Linux X11 --- crates/egui-winit/src/lib.rs | 70 +++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/crates/egui-winit/src/lib.rs b/crates/egui-winit/src/lib.rs index 7110ef3fe21..1980376b97a 100644 --- a/crates/egui-winit/src/lib.rs +++ b/crates/egui-winit/src/lib.rs @@ -329,39 +329,43 @@ impl State { } WindowEvent::Ime(ime) => { - // on Mac even Cmd-C is pressed during ime, a `c` is pushed to Preedit. - // So no need to check is_mac_cmd. - // - // How winit produce `Ime::Enabled` and `Ime::Disabled` differs in MacOS - // and Windows. - // - // - On Windows, before and after each Commit will produce an Enable/Disabled - // event. - // - On MacOS, only when user explicit enable/disable ime. No Disabled - // after Commit. - // - // We use input_method_editor_started to manually insert CompositionStart - // between Commits. - match ime { - winit::event::Ime::Enabled => { - self.ime_event_enable(); - } - winit::event::Ime::Preedit(text, Some(_cursor)) => { - self.ime_event_enable(); - self.egui_input - .events - .push(egui::Event::Ime(egui::ImeEvent::Preedit(text.clone()))); - } - winit::event::Ime::Commit(text) => { - self.egui_input - .events - .push(egui::Event::Ime(egui::ImeEvent::Commit(text.clone()))); - self.ime_event_disable(); - } - winit::event::Ime::Disabled | winit::event::Ime::Preedit(_, None) => { - self.ime_event_disable(); - } - }; + if cfg!(target_os = "linux") { + // We ignore IME events on linux, because of https://github.com/emilk/egui/issues/5008 + } else { + // on Mac even Cmd-C is pressed during ime, a `c` is pushed to Preedit. + // So no need to check is_mac_cmd. + // + // How winit produce `Ime::Enabled` and `Ime::Disabled` differs in MacOS + // and Windows. + // + // - On Windows, before and after each Commit will produce an Enable/Disabled + // event. + // - On MacOS, only when user explicit enable/disable ime. No Disabled + // after Commit. + // + // We use input_method_editor_started to manually insert CompositionStart + // between Commits. + match ime { + winit::event::Ime::Enabled => { + self.ime_event_enable(); + } + winit::event::Ime::Preedit(text, Some(_cursor)) => { + self.ime_event_enable(); + self.egui_input + .events + .push(egui::Event::Ime(egui::ImeEvent::Preedit(text.clone()))); + } + winit::event::Ime::Commit(text) => { + self.egui_input + .events + .push(egui::Event::Ime(egui::ImeEvent::Commit(text.clone()))); + self.ime_event_disable(); + } + winit::event::Ime::Disabled | winit::event::Ime::Preedit(_, None) => { + self.ime_event_disable(); + } + }; + } EventResponse { repaint: true,