From 78112e97541b0264fac747f18e6bd9719ab8276b Mon Sep 17 00:00:00 2001 From: Asura Date: Wed, 31 Aug 2022 03:54:31 -0700 Subject: [PATCH] Replace pynput with tfc --- src/server/input_service.rs | 152 ++++++++++++++++++++++++++++++++++-- 1 file changed, 145 insertions(+), 7 deletions(-) diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 684ada483..eddfa3c73 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -9,7 +9,7 @@ use std::{ sync::atomic::{AtomicBool, Ordering}, time::Instant, }; -use tfc::{traits::*, Context}; +use tfc::{traits::*, Context as TFC_Context, Key as TFC_Key}; #[derive(Default)] struct StateCursor { @@ -180,7 +180,7 @@ lazy_static::lazy_static! { }; static ref KEYS_DOWN: Arc>> = Default::default(); static ref LATEST_INPUT: Arc> = Default::default(); - static ref KBD_CONTEXT: Mutex = Mutex::new(Context::new().expect("kbd context error")); + static ref TFC_CONTEXT: Mutex = Mutex::new(TFC_Context::new().expect("kbd context error")); } static EXITING: AtomicBool = AtomicBool::new(false); @@ -668,12 +668,113 @@ fn map_keyboard_mode(evt: &KeyEvent) { if evt.down && click_capslock { rdev_key_down_or_up(RdevKey::CapsLock, evt.down); } - log::info!("click capslog {:?} click_numlock {:?}", click_capslock, click_numlock); + log::info!( + "click capslog {:?} click_numlock {:?}", + click_capslock, + click_numlock + ); rdev_key_down_or_up(RdevKey::Unknown(evt.chr()), evt.down); return; } +fn tfc_key_down_or_up(key: Key, down: bool, up: bool) { + if let Key::Layout(chr) = key { + log::info!("tfc_key_down_or_up: {:?}", chr); + if down { + TFC_CONTEXT.lock().unwrap().unicode_char_down(chr); + } + if up { + TFC_CONTEXT.lock().unwrap().unicode_char_up(chr); + } + return; + } + + let key = match key { + Key::Alt => TFC_Key::Alt, + Key::Backspace => TFC_Key::DeleteOrBackspace, + Key::CapsLock => TFC_Key::CapsLock, + Key::Control => TFC_Key::Control, + Key::Delete => TFC_Key::ForwardDelete, + Key::DownArrow => TFC_Key::DownArrow, + Key::End => TFC_Key::End, + Key::Escape => TFC_Key::Escape, + Key::F1 => TFC_Key::F1, + Key::F10 => TFC_Key::F10, + Key::F11 => TFC_Key::F11, + Key::F12 => TFC_Key::F12, + Key::F2 => TFC_Key::F2, + Key::F3 => TFC_Key::F3, + Key::F4 => TFC_Key::F4, + Key::F5 => TFC_Key::F5, + Key::F6 => TFC_Key::F6, + Key::F7 => TFC_Key::F7, + Key::F8 => TFC_Key::F8, + Key::F9 => TFC_Key::F9, + Key::Home => TFC_Key::Home, + Key::LeftArrow => TFC_Key::LeftArrow, + Key::Option => TFC_Key::Alt, + Key::PageDown => TFC_Key::PageDown, + Key::PageUp => TFC_Key::PageUp, + Key::Return => TFC_Key::ReturnOrEnter, + Key::RightArrow => TFC_Key::RightArrow, + Key::Shift => TFC_Key::Shift, + Key::Space => TFC_Key::Space, + Key::Tab => TFC_Key::Tab, + Key::UpArrow => TFC_Key::UpArrow, + Key::Numpad0 => TFC_Key::N0, + Key::Numpad1 => TFC_Key::N1, + Key::Numpad2 => TFC_Key::N2, + Key::Numpad3 => TFC_Key::N3, + Key::Numpad4 => TFC_Key::N4, + Key::Numpad5 => TFC_Key::N5, + Key::Numpad6 => TFC_Key::N6, + Key::Numpad7 => TFC_Key::N7, + Key::Numpad8 => TFC_Key::N8, + Key::Numpad9 => TFC_Key::N9, + Key::Decimal => TFC_Key::NumpadDecimal, + // Key::Cancel => TFC_Key::Cancel, + Key::Clear => TFC_Key::NumpadClear, + Key::Pause => TFC_Key::PlayPause, + // Key::Kana => TFC_Key::, + // Key::Hangul => "Hangul", + // Key::Hanja => "Hanja", + // Key::Kanji => "Kanji", + // Key::Select => TFC_Key::Sel, + // Key::Print => TFC_Key::P, + // Key::Execute => "Execute", + // Key::Snapshot => "3270_PrintScreen", + // Key::Insert => TFC_Key:, + // Key::Help => "Help", + // Key::Separator => "KP_Separator", + // Key::Scroll => "Scroll_Lock", + // Key::NumLock => "Num_Lock", + Key::RWin => TFC_Key::Meta, + // Key::Apps => "Menu", + Key::Multiply => TFC_Key::NumpadMultiply, + Key::Add => TFC_Key::NumpadPlus, + Key::Subtract => TFC_Key::NumpadMinus, + Key::Divide => TFC_Key::NumpadDivide, + Key::Equals => TFC_Key::NumpadEquals, + Key::NumpadEnter => TFC_Key::NumpadEnter, + Key::RightShift => TFC_Key::RightShift, + Key::RightControl => TFC_Key::RightControl, + Key::RightAlt => TFC_Key::RightAlt, + Key::Command | Key::Super | Key::Windows | Key::Meta => TFC_Key::Meta, + _ => { + return; + } + }; + + log::info!("tfc_key_down_or_up: {:?}", key); + if down { + TFC_CONTEXT.lock().unwrap().key_down(key); + } + if up { + TFC_CONTEXT.lock().unwrap().key_up(key); + } +} + fn legacy_keyboard_mode(evt: &KeyEvent) { let (click_capslock, click_numlock) = sync_status(evt); @@ -681,9 +782,15 @@ fn legacy_keyboard_mode(evt: &KeyEvent) { crate::platform::windows::try_change_desktop(); let mut en = ENIGO.lock().unwrap(); if click_capslock { + #[cfg(target_os = "linux")] + tfc_key_down_or_up(Key::CapsLock, true, true); + #[cfg(not(target_os = "linux"))] en.key_click(Key::CapsLock); } if click_numlock { + #[cfg(target_os = "linux")] + tfc_key_down_or_up(Key::NumLock, true, true); + #[cfg(not(target_os = "linux"))] en.key_click(Key::NumLock); } // disable numlock if press home etc when numlock is on, @@ -692,11 +799,11 @@ fn legacy_keyboard_mode(evt: &KeyEvent) { let mut disable_numlock = false; #[cfg(target_os = "macos")] en.reset_flag(); - // When long-pressed the command key, then press and release + // When long-pressed the command key, then press and release // the Tab key, there should be CGEventFlagCommand in the flag. #[cfg(target_os = "macos")] - for ck in evt.modifiers.iter(){ - if let Some(key) = KEY_MAP.get(&ck.value()){ + for ck in evt.modifiers.iter() { + if let Some(key) = KEY_MAP.get(&ck.value()) { en.add_flag(key); } } @@ -738,6 +845,9 @@ fn legacy_keyboard_mode(evt: &KeyEvent) { } } else { if !get_modifier_state(key.clone(), &mut en) { + #[cfg(target_os = "linux")] + tfc_key_down_or_up(key.clone(), true, false); + #[cfg(not(target_os = "linux"))] en.key_down(key.clone()).ok(); modifier_sleep(); to_release.push(key); @@ -749,7 +859,11 @@ fn legacy_keyboard_mode(evt: &KeyEvent) { } #[cfg(not(target_os = "macos"))] if has_cap != en.get_key_state(Key::CapsLock) { + #[cfg(target_os = "linux")] + tfc_key_down_or_up(Key::CapsLock, true, true); + #[cfg(not(target_os = "linux"))] en.key_down(Key::CapsLock).ok(); + #[cfg(not(target_os = "linux"))] en.key_up(Key::CapsLock); } #[cfg(windows)] @@ -771,12 +885,18 @@ fn legacy_keyboard_mode(evt: &KeyEvent) { } } if evt.down { + #[cfg(target_os = "linux")] + tfc_key_down_or_up(key.clone(), true, false); + #[cfg(not(target_os = "linux"))] allow_err!(en.key_down(key.clone())); KEYS_DOWN .lock() .unwrap() .insert(ck.value() as _, Instant::now()); } else { + #[cfg(target_os = "linux")] + tfc_key_down_or_up(key.clone(), false, true); + #[cfg(not(target_os = "linux"))] en.key_up(key.clone()); KEYS_DOWN.lock().unwrap().remove(&(ck.value() as _)); } @@ -791,6 +911,14 @@ fn legacy_keyboard_mode(evt: &KeyEvent) { } Some(key_event::Union::Chr(chr)) => { if evt.down { + #[cfg(target_os = "linux")] + tfc_key_down_or_up(get_layout(chr), true, false); + #[cfg(target_os = "linux")] + KEYS_DOWN + .lock() + .unwrap() + .insert(chr as u64 + KEY_CHAR_START, Instant::now()); + #[cfg(not(target_os = "linux"))] if en.key_down(get_layout(chr)).is_ok() { KEYS_DOWN .lock() @@ -808,6 +936,9 @@ fn legacy_keyboard_mode(evt: &KeyEvent) { } } } else { + #[cfg(target_os = "linux")] + tfc_key_down_or_up(get_layout(chr), false, true); + #[cfg(not(target_os = "linux"))] en.key_up(get_layout(chr)); KEYS_DOWN .lock() @@ -827,6 +958,9 @@ fn legacy_keyboard_mode(evt: &KeyEvent) { } #[cfg(not(target_os = "macos"))] for key in to_release { + #[cfg(target_os = "linux")] + tfc_key_down_or_up(key.clone(), false, true); + #[cfg(not(target_os = "linux"))] en.key_up(key.clone()); } #[cfg(windows)] @@ -840,7 +974,11 @@ fn translate_keyboard_mode(evt: &KeyEvent) { let chr = char::from_u32(evt.chr()).unwrap_or_default(); // down(true)->press && press(false)-> release if evt.down && !evt.press { - KBD_CONTEXT.lock().unwrap().unicode_char(chr).expect("unicode_char_down error"); + TFC_CONTEXT + .lock() + .unwrap() + .unicode_char(chr) + .expect("unicode_char_down error"); } }