diff --git a/src/keyboard.rs b/src/keyboard.rs index 740afaf8f..d4a51c0f3 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -46,6 +46,12 @@ lazy_static::lazy_static! { }; } +#[cfg(feature = "flutter")] +pub fn set_cur_session(session: Session) { + *CUR_SESSION.lock().unwrap() = Some(session); +} + +#[cfg(not(feature = "flutter"))] pub fn set_cur_session(session: Session) { *CUR_SESSION.lock().unwrap() = Some(session); } @@ -91,7 +97,7 @@ pub mod client { } } - pub fn process_event(event: Event) { + pub fn process_event(event: &Event) { if is_long_press(&event) { return; } @@ -181,19 +187,25 @@ pub mod client { pub fn start_grab_loop() { #[cfg(any(target_os = "windows", target_os = "macos"))] std::thread::spawn(move || { - let func = move |event: Event| match event.event_type { - EventType::KeyPress(key) | EventType::KeyRelease(key) => { - // fix #2211:CAPS LOCK don't work - if key == Key::CapsLock || key == Key::NumLock { - return Some(event); - } - if KEYBOARD_HOOKED.load(Ordering::SeqCst) { - client::process_event(event); + let try_handle_keyboard = move |event: Event, key: Key, is_press: bool| -> Option { + // fix #2211:CAPS LOCK don't work + if key == Key::CapsLock || key == Key::NumLock { + return Some(event); + } + if KEYBOARD_HOOKED.load(Ordering::SeqCst) { + client::process_event(&event); + if is_press { return None; } else { return Some(event); } + } else { + return Some(event); } + }; + let func = move |event: Event| match event.event_type { + EventType::KeyPress(key) => try_handle_keyboard(event, key, true), + EventType::KeyRelease(key) => try_handle_keyboard(event, key, false), _ => Some(event), }; if let Err(error) = rdev::grab(func) { @@ -207,7 +219,7 @@ pub fn start_grab_loop() { if let Key::Unknown(keycode) = key { log::error!("rdev get unknown key, keycode is : {:?}", keycode); } else { - client::process_event(event); + client::process_event(&event); } None } @@ -237,7 +249,7 @@ pub fn release_remote_keys() { for key in to_release { let event_type = EventType::KeyRelease(key); let event = event_type_to_event(event_type); - client::process_event(event); + client::process_event(&event); } } diff --git a/src/ui.rs b/src/ui.rs index 921c137ec..e13f11d87 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -130,8 +130,9 @@ pub fn start(args: &mut [String]) { pass.clone(), args.clone(), ); - let inner = handler.inner(); - crate::keyboard::set_cur_session(inner); + #[cfg(not(feature = "flutter"))] + crate::keyboard::set_cur_session(handler.inner()); + Box::new(handler) }); page = "remote.html"; diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index e594ac94b..0cf2f2e2d 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -393,7 +393,7 @@ impl Session { scan_code: scancode as _, event_type: event_type, }; - keyboard::client::process_event(event); + keyboard::client::process_event(&event); } // flutter only TODO new input