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
This commit is contained in:
Emil Ernerfeldt 2024-09-30 13:23:02 +02:00 committed by GitHub
parent 448e12d6b6
commit 15d3d43aa3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 37 additions and 33 deletions

View File

@ -329,39 +329,43 @@ impl State {
} }
WindowEvent::Ime(ime) => { WindowEvent::Ime(ime) => {
// on Mac even Cmd-C is pressed during ime, a `c` is pushed to Preedit. if cfg!(target_os = "linux") {
// So no need to check is_mac_cmd. // We ignore IME events on linux, because of https://github.com/emilk/egui/issues/5008
// } else {
// How winit produce `Ime::Enabled` and `Ime::Disabled` differs in MacOS // on Mac even Cmd-C is pressed during ime, a `c` is pushed to Preedit.
// and Windows. // So no need to check is_mac_cmd.
// //
// - On Windows, before and after each Commit will produce an Enable/Disabled // How winit produce `Ime::Enabled` and `Ime::Disabled` differs in MacOS
// event. // and Windows.
// - On MacOS, only when user explicit enable/disable ime. No Disabled //
// after Commit. // - On Windows, before and after each Commit will produce an Enable/Disabled
// // event.
// We use input_method_editor_started to manually insert CompositionStart // - On MacOS, only when user explicit enable/disable ime. No Disabled
// between Commits. // after Commit.
match ime { //
winit::event::Ime::Enabled => { // We use input_method_editor_started to manually insert CompositionStart
self.ime_event_enable(); // between Commits.
} match ime {
winit::event::Ime::Preedit(text, Some(_cursor)) => { winit::event::Ime::Enabled => {
self.ime_event_enable(); self.ime_event_enable();
self.egui_input }
.events winit::event::Ime::Preedit(text, Some(_cursor)) => {
.push(egui::Event::Ime(egui::ImeEvent::Preedit(text.clone()))); self.ime_event_enable();
} self.egui_input
winit::event::Ime::Commit(text) => { .events
self.egui_input .push(egui::Event::Ime(egui::ImeEvent::Preedit(text.clone())));
.events }
.push(egui::Event::Ime(egui::ImeEvent::Commit(text.clone()))); winit::event::Ime::Commit(text) => {
self.ime_event_disable(); self.egui_input
} .events
winit::event::Ime::Disabled | winit::event::Ime::Preedit(_, None) => { .push(egui::Event::Ime(egui::ImeEvent::Commit(text.clone())));
self.ime_event_disable(); self.ime_event_disable();
} }
}; winit::event::Ime::Disabled | winit::event::Ime::Preedit(_, None) => {
self.ime_event_disable();
}
};
}
EventResponse { EventResponse {
repaint: true, repaint: true,