refacotor: simplify mod of keyboard

This commit is contained in:
Asura 2022-12-07 19:31:32 -08:00 committed by Chieh Wang
parent dff5d55f50
commit 176ed43807
6 changed files with 495 additions and 590 deletions

View File

@ -6,8 +6,6 @@ use cpal::{
}; };
use magnum_opus::{Channels::*, Decoder as AudioDecoder}; use magnum_opus::{Channels::*, Decoder as AudioDecoder};
use sha2::{Digest, Sha256}; use sha2::{Digest, Sha256};
#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))]
use std::sync::atomic::Ordering;
use std::{ use std::{
collections::HashMap, collections::HashMap,
net::SocketAddr, net::SocketAddr,

View File

@ -2,14 +2,20 @@ use crate::client::get_key_state;
use crate::common::GrabState; use crate::common::GrabState;
#[cfg(feature = "flutter")] #[cfg(feature = "flutter")]
use crate::flutter::FlutterHandler; use crate::flutter::FlutterHandler;
use crate::platform;
use crate::ui_session_interface::Session; use crate::ui_session_interface::Session;
use hbb_common::{allow_err, log, message_proto::*}; use hbb_common::{log, message_proto::*};
use rdev::{Event, EventType, Key}; use rdev::{Event, EventType, Key};
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::sync::{mpsc, Arc, Mutex, RwLock}; use std::sync::atomic::AtomicBool;
#[cfg(any(target_os = "windows", target_os = "macos"))]
use std::sync::atomic::Ordering;
use std::sync::{mpsc, Arc, Mutex};
use std::thread;
use std::time::SystemTime; use std::time::SystemTime;
static mut IS_ALT_GR: bool = false;
pub static KEYBOARD_HOOKED: AtomicBool = AtomicBool::new(false);
#[cfg(feature = "flutter")] #[cfg(feature = "flutter")]
lazy_static::lazy_static! { lazy_static::lazy_static! {
pub static ref CUR_SESSION: Arc<Mutex<Option<Session<FlutterHandler>>>> = Default::default(); pub static ref CUR_SESSION: Arc<Mutex<Option<Session<FlutterHandler>>>> = Default::default();
@ -34,20 +40,27 @@ lazy_static::lazy_static! {
} }
pub mod client { pub mod client {
use super::{client_keyboard_mode, components, *}; use super::*;
pub fn get_keyboard_mode() -> String { pub fn get_keyboard_mode() -> String {
return components::get_keyboard_mode(); if let Some(handler) = CUR_SESSION.lock().unwrap().as_ref() {
handler.get_keyboard_mode()
} else {
"legacy".to_string()
}
} }
pub fn save_keyboard_mode(value: String) { pub fn save_keyboard_mode(value: String) {
components::save_keyboard_mode(value); release_remote_keys();
if let Some(handler) = CUR_SESSION.lock().unwrap().as_mut() {
handler.save_keyboard_mode(value);
}
} }
pub fn start_grab_loop() { pub fn start_grab_loop() {
let (sender, receiver) = mpsc::channel::<GrabState>(); let (sender, receiver) = mpsc::channel::<GrabState>();
unsafe { unsafe {
components::grab_loop(receiver); grab_loop(receiver);
*GRAB_SENDER.lock().unwrap() = Some(sender); *GRAB_SENDER.lock().unwrap() = Some(sender);
} }
change_grab_status(GrabState::Ready); change_grab_status(GrabState::Ready);
@ -55,7 +68,7 @@ pub mod client {
pub fn change_grab_status(state: GrabState) { pub fn change_grab_status(state: GrabState) {
if GrabState::Wait == state { if GrabState::Wait == state {
components::release_remote_keys(); release_remote_keys();
} }
unsafe { unsafe {
if let Some(sender) = &*GRAB_SENDER.lock().unwrap() { if let Some(sender) = &*GRAB_SENDER.lock().unwrap() {
@ -66,12 +79,12 @@ pub mod client {
} }
pub fn process_event(event: Event) { pub fn process_event(event: Event) {
if components::is_long_press(&event) { if is_long_press(&event) {
return; return;
} }
let key_event = components::event_to_key_event(&event); let key_event = event_to_key_event(&event);
log::info!("key event: {:?}", key_event); log::info!("key event: {:?}", key_event);
components::send_key_event(&key_event); send_key_event(&key_event);
} }
pub fn get_modifiers_state( pub fn get_modifiers_state(
@ -80,7 +93,7 @@ pub mod client {
shift: bool, shift: bool,
command: bool, command: bool,
) -> (bool, bool, bool, bool) { ) -> (bool, bool, bool, bool) {
components::get_modifiers_state(alt, ctrl, shift, command) get_modifiers_state(alt, ctrl, shift, command)
} }
pub fn legacy_modifiers( pub fn legacy_modifiers(
@ -90,29 +103,55 @@ pub mod client {
shift: bool, shift: bool,
command: bool, command: bool,
) { ) {
components::legacy_modifiers(key_event, alt, ctrl, shift, command); if alt
&& !crate::is_control_key(&key_event, &ControlKey::Alt)
&& !crate::is_control_key(&key_event, &ControlKey::RAlt)
{
key_event.modifiers.push(ControlKey::Alt.into());
}
if shift
&& !crate::is_control_key(&key_event, &ControlKey::Shift)
&& !crate::is_control_key(&key_event, &ControlKey::RShift)
{
key_event.modifiers.push(ControlKey::Shift.into());
}
if ctrl
&& !crate::is_control_key(&key_event, &ControlKey::Control)
&& !crate::is_control_key(&key_event, &ControlKey::RControl)
{
key_event.modifiers.push(ControlKey::Control.into());
}
if command
&& !crate::is_control_key(&key_event, &ControlKey::Meta)
&& !crate::is_control_key(&key_event, &ControlKey::RWin)
{
key_event.modifiers.push(ControlKey::Meta.into());
}
} }
pub fn lock_screen() { pub fn lock_screen() {
components::lock_screen(); let mut key_event = KeyEvent::new();
key_event.set_control_key(ControlKey::LockScreen);
key_event.down = true;
key_event.mode = KeyboardMode::Legacy.into();
send_key_event(&key_event);
} }
pub fn ctrl_alt_del() { pub fn ctrl_alt_del() {
components::ctrl_alt_del(); let mut key_event = KeyEvent::new();
if get_peer_platform() == "Windows" {
key_event.set_control_key(ControlKey::CtrlAltDel);
key_event.down = true;
} else {
key_event.set_control_key(ControlKey::Delete);
legacy_modifiers(&mut key_event, true, true, false, false);
key_event.press = true;
}
key_event.mode = KeyboardMode::Legacy.into();
send_key_event(&key_event);
} }
} }
pub mod server {
pub fn simulate() {}
}
mod components {
use super::*;
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::thread;
pub static KEYBOARD_HOOKED: AtomicBool = AtomicBool::new(false);
pub fn grab_loop(recv: mpsc::Receiver<GrabState>) { pub fn grab_loop(recv: mpsc::Receiver<GrabState>) {
thread::spawn(move || loop { thread::spawn(move || loop {
if let Some(state) = recv.recv().ok() { if let Some(state) = recv.recv().ok() {
@ -204,23 +243,8 @@ mod components {
} }
} }
pub fn get_keyboard_mode() -> String {
if let Some(handler) = CUR_SESSION.lock().unwrap().as_ref() {
handler.get_keyboard_mode()
} else {
"legacy".to_string()
}
}
pub fn save_keyboard_mode(value: String) {
release_remote_keys();
if let Some(handler) = CUR_SESSION.lock().unwrap().as_mut() {
handler.save_keyboard_mode(value);
}
}
pub fn get_keyboard_mode_enum() -> KeyboardMode { pub fn get_keyboard_mode_enum() -> KeyboardMode {
match get_keyboard_mode().as_str() { match client::get_keyboard_mode().as_str() {
"map" => KeyboardMode::Map, "map" => KeyboardMode::Map,
"translate" => KeyboardMode::Translate, "translate" => KeyboardMode::Translate,
_ => KeyboardMode::Legacy, _ => KeyboardMode::Legacy,
@ -272,9 +296,8 @@ mod components {
let command = *modifiers_lock.get(&Key::MetaLeft).unwrap() let command = *modifiers_lock.get(&Key::MetaLeft).unwrap()
|| *modifiers_lock.get(&Key::MetaRight).unwrap() || *modifiers_lock.get(&Key::MetaRight).unwrap()
|| command; || command;
let alt = *modifiers_lock.get(&Key::Alt).unwrap() let alt =
|| *modifiers_lock.get(&Key::AltGr).unwrap() *modifiers_lock.get(&Key::Alt).unwrap() || *modifiers_lock.get(&Key::AltGr).unwrap() || alt;
|| alt;
(alt, ctrl, shift, command) (alt, ctrl, shift, command)
} }
@ -297,39 +320,6 @@ mod components {
}; };
} }
pub fn legacy_modifiers(
key_event: &mut KeyEvent,
alt: bool,
ctrl: bool,
shift: bool,
command: bool,
) {
if alt
&& !crate::is_control_key(&key_event, &ControlKey::Alt)
&& !crate::is_control_key(&key_event, &ControlKey::RAlt)
{
key_event.modifiers.push(ControlKey::Alt.into());
}
if shift
&& !crate::is_control_key(&key_event, &ControlKey::Shift)
&& !crate::is_control_key(&key_event, &ControlKey::RShift)
{
key_event.modifiers.push(ControlKey::Shift.into());
}
if ctrl
&& !crate::is_control_key(&key_event, &ControlKey::Control)
&& !crate::is_control_key(&key_event, &ControlKey::RControl)
{
key_event.modifiers.push(ControlKey::Control.into());
}
if command
&& !crate::is_control_key(&key_event, &ControlKey::Meta)
&& !crate::is_control_key(&key_event, &ControlKey::RWin)
{
key_event.modifiers.push(ControlKey::Meta.into());
}
}
pub fn event_to_key_event(event: &Event) -> KeyEvent { pub fn event_to_key_event(event: &Event) -> KeyEvent {
let mut key_event = KeyEvent::new(); let mut key_event = KeyEvent::new();
update_modifiers_state(event); update_modifiers_state(event);
@ -350,13 +340,13 @@ mod components {
key_event.mode = keyboard_mode.into(); key_event.mode = keyboard_mode.into();
match keyboard_mode { match keyboard_mode {
KeyboardMode::Map => { KeyboardMode::Map => {
client_keyboard_mode::map_keyboard_mode(event, &mut key_event); map_keyboard_mode(event, &mut key_event);
} }
KeyboardMode::Translate => { KeyboardMode::Translate => {
client_keyboard_mode::translate_keyboard_mode(event, &mut key_event); translate_keyboard_mode(event, &mut key_event);
} }
_ => { _ => {
client_keyboard_mode::legacy_keyboard_mode(event, &mut key_event); legacy_keyboard_mode(event, &mut key_event);
} }
}; };
#[cfg(not(any(target_os = "android", target_os = "ios")))] #[cfg(not(any(target_os = "android", target_os = "ios")))]
@ -375,28 +365,6 @@ mod components {
} }
} }
pub fn ctrl_alt_del() {
let mut key_event = KeyEvent::new();
if get_peer_platform() == "Windows" {
key_event.set_control_key(ControlKey::CtrlAltDel);
key_event.down = true;
} else {
key_event.set_control_key(ControlKey::Delete);
legacy_modifiers(&mut key_event, true, true, false, false);
key_event.press = true;
}
key_event.mode = KeyboardMode::Legacy.into();
send_key_event(&key_event);
}
pub fn lock_screen() {
let mut key_event = KeyEvent::new();
key_event.set_control_key(ControlKey::LockScreen);
key_event.down = true;
key_event.mode = KeyboardMode::Legacy.into();
send_key_event(&key_event);
}
#[cfg(feature = "flutter")] #[cfg(feature = "flutter")]
pub fn send_key_event(key_event: &KeyEvent) { pub fn send_key_event(key_event: &KeyEvent) {
if let Some(handler) = CUR_SESSION.lock().unwrap().as_ref() { if let Some(handler) = CUR_SESSION.lock().unwrap().as_ref() {
@ -413,14 +381,6 @@ mod components {
"Windows".to_string() "Windows".to_string()
} }
} }
}
mod client_keyboard_mode {
use super::*;
use components;
use rdev::EventType;
static mut IS_ALT_GR: bool = false;
pub fn legacy_keyboard_mode(event: &Event, key_event: &mut KeyEvent) { pub fn legacy_keyboard_mode(event: &Event, key_event: &mut KeyEvent) {
// legacy mode(0): Generate characters locally, look for keycode on other side. // legacy mode(0): Generate characters locally, look for keycode on other side.
@ -432,17 +392,16 @@ mod client_keyboard_mode {
} }
}; };
let peer = components::get_peer_platform(); let peer = get_peer_platform();
let is_win = peer == "Windows"; let is_win = peer == "Windows";
if is_win { if is_win {
key = components::convert_numpad_keys(key); key = convert_numpad_keys(key);
} }
let alt = get_key_state(enigo::Key::Alt); let alt = get_key_state(enigo::Key::Alt);
#[cfg(windows)] #[cfg(windows)]
let ctrl = { let ctrl = {
let mut tmp = let mut tmp = get_key_state(enigo::Key::Control) || get_key_state(enigo::Key::RightControl);
get_key_state(enigo::Key::Control) || get_key_state(enigo::Key::RightControl);
unsafe { unsafe {
if IS_ALT_GR { if IS_ALT_GR {
if alt || key == Key::AltGr { if alt || key == Key::AltGr {
@ -506,7 +465,7 @@ mod client_keyboard_mode {
Key::UpArrow => Some(ControlKey::UpArrow), Key::UpArrow => Some(ControlKey::UpArrow),
Key::Delete => { Key::Delete => {
if is_win && ctrl && alt { if is_win && ctrl && alt {
components::ctrl_alt_del(); client::ctrl_alt_del();
return; return;
} }
Some(ControlKey::Delete) Some(ControlKey::Delete)
@ -627,7 +586,7 @@ mod client_keyboard_mode {
} }
if chr != '\0' { if chr != '\0' {
if chr == 'l' && is_win && command { if chr == 'l' && is_win && command {
components::lock_screen(); client::lock_screen();
return; return;
} }
key_event.set_chr(chr as _); key_event.set_chr(chr as _);
@ -636,9 +595,8 @@ mod client_keyboard_mode {
return; return;
} }
} }
let (alt, ctrl, shift, command) = let (alt, ctrl, shift, command) = get_modifiers_state(alt, ctrl, shift, command);
components::get_modifiers_state(alt, ctrl, shift, command); client::legacy_modifiers(key_event, alt, ctrl, shift, command);
components::legacy_modifiers(key_event, alt, ctrl, shift, command);
if down_or_up == true { if down_or_up == true {
key_event.down = true; key_event.down = true;
@ -646,7 +604,7 @@ mod client_keyboard_mode {
} }
pub fn map_keyboard_mode(event: &Event, key_event: &mut KeyEvent) { pub fn map_keyboard_mode(event: &Event, key_event: &mut KeyEvent) {
let peer = components::get_peer_platform(); let peer = get_peer_platform();
let key = match event.event_type { let key = match event.event_type {
EventType::KeyPress(key) => { EventType::KeyPress(key) => {
@ -668,14 +626,3 @@ mod client_keyboard_mode {
} }
pub fn translate_keyboard_mode(event: &Event, key_event: &mut KeyEvent) {} pub fn translate_keyboard_mode(event: &Event, key_event: &mut KeyEvent) {}
}
pub mod server_keyboard_mode {
use super::*;
pub fn legacy_keyboard_mode(key_event: &KeyEvent) {}
pub fn map_keyboard_mode(key_event: &KeyEvent) {}
pub fn translate_keyboard_mode(key_event: &KeyEvent) {}
}

View File

@ -716,22 +716,3 @@ pub fn get_double_click_time() -> u32 {
} }
} }
pub mod keyboard {
use crate::common::GrabState;
use hbb_common::{allow_err, log, message_proto::*};
use rdev::{Event, EventType, Key};
use std::sync::mpsc;
use std::thread;
pub fn _legacy_keyboard_mode(event: &Event, key_event: &KeyEvent) {
log::info!("{:?}", event);
}
pub fn _client_map_keyboard_mode(event: &Event, key_event: &KeyEvent) {
}
pub fn _translate_keyboard_mode(event: &Event, key_event: &KeyEvent) {}
}

View File

@ -542,7 +542,3 @@ pub fn get_double_click_time() -> u32 {
// to-do: https://github.com/servo/core-foundation-rs/blob/786895643140fa0ee4f913d7b4aeb0c4626b2085/cocoa/src/appkit.rs#L2823 // to-do: https://github.com/servo/core-foundation-rs/blob/786895643140fa0ee4f913d7b4aeb0c4626b2085/cocoa/src/appkit.rs#L2823
500 as _ 500 as _
} }
pub mod keyboard{
}

View File

@ -1712,17 +1712,3 @@ pub fn send_message_to_hnwd(
} }
return true; return true;
} }
pub mod keyboard {
use crate::common::GrabState;
use hbb_common::{allow_err, log, message_proto::*};
use rdev::{Event, EventType, Key};
use std::sync::mpsc;
use crate::keyboard;
}

View File

@ -1002,9 +1002,6 @@ pub fn handle_key_(evt: &KeyEvent) {
} }
match evt.mode.unwrap() { match evt.mode.unwrap() {
KeyboardMode::Legacy => {
legacy_keyboard_mode(evt);
}
KeyboardMode::Map => { KeyboardMode::Map => {
map_keyboard_mode(evt); map_keyboard_mode(evt);
} }