fix #243 ime input support

macos-click-through
sunxiaomeng 3 years ago committed by Keith Simmons
parent 26169f84c0
commit ccb28dda00

@ -8,13 +8,17 @@ use crate::event_aggregator::EVENT_AGGREGATOR;
use crate::settings::SETTINGS; use crate::settings::SETTINGS;
use crate::window::KeyboardSettings; use crate::window::KeyboardSettings;
enum KeyOrIme {
Key(KeyEvent),
Ime(String),
}
pub struct KeyboardManager { pub struct KeyboardManager {
shift: bool, shift: bool,
ctrl: bool, ctrl: bool,
alt: bool, alt: bool,
logo: bool, logo: bool,
ignore_input_this_frame: bool, ignore_input_this_frame: bool,
queued_key_events: Vec<KeyEvent>, queued_key_or_ime_events: Vec<KeyOrIme>,
} }
impl KeyboardManager { impl KeyboardManager {
@ -25,7 +29,7 @@ impl KeyboardManager {
alt: false, alt: false,
logo: false, logo: false,
ignore_input_this_frame: false, ignore_input_this_frame: false,
queued_key_events: Vec::new(), queued_key_or_ime_events: Vec::new(),
} }
} }
@ -48,7 +52,15 @@ impl KeyboardManager {
} => { } => {
// Store the event so that we can ignore it properly if the window was just // Store the event so that we can ignore it properly if the window was just
// focused. // focused.
self.queued_key_events.push(key_event.clone()); self.queued_key_or_ime_events
.push(KeyOrIme::Key(key_event.clone()));
}
Event::WindowEvent {
event: WindowEvent::ReceivedImeText(string),
..
} => {
self.queued_key_or_ime_events
.push(KeyOrIme::Ime(string.to_string()));
} }
Event::WindowEvent { Event::WindowEvent {
event: WindowEvent::ModifiersChanged(modifiers), event: WindowEvent::ModifiersChanged(modifiers),
@ -67,12 +79,20 @@ impl KeyboardManager {
if !self.should_ignore_input(&settings) { if !self.should_ignore_input(&settings) {
// If we have a keyboard event this frame // If we have a keyboard event this frame
for key_event in self.queued_key_events.iter() { for key_or_ime_event in self.queued_key_or_ime_events.iter() {
// And a key was pressed match key_or_ime_event {
if key_event.state == ElementState::Pressed { KeyOrIme::Key(key_event) => {
if let Some(keybinding) = self.maybe_get_keybinding(key_event) { // And a key was pressed
if key_event.state == ElementState::Pressed {
if let Some(keybinding) = self.maybe_get_keybinding(key_event) {
EVENT_AGGREGATOR
.send(UiCommand::Serial(SerialCommand::Keyboard(keybinding)));
}
}
}
KeyOrIme::Ime(raw_input) => {
EVENT_AGGREGATOR EVENT_AGGREGATOR
.send(UiCommand::Serial(SerialCommand::Keyboard(keybinding))); .send(UiCommand::Serial(SerialCommand::Keyboard(raw_input.to_string())));
} }
} }
} }
@ -81,7 +101,7 @@ impl KeyboardManager {
// Regardless of whether this was a valid keyboard input or not, rest ignoring and // Regardless of whether this was a valid keyboard input or not, rest ignoring and
// whatever event was queued. // whatever event was queued.
self.ignore_input_this_frame = false; self.ignore_input_this_frame = false;
self.queued_key_events.clear(); self.queued_key_or_ime_events.clear();
} }
_ => {} _ => {}
} }

Loading…
Cancel
Save