From a105aff2aaecbf1214ef9b9c45ab310054627bce Mon Sep 17 00:00:00 2001 From: asur4s Date: Mon, 5 Sep 2022 07:52:38 -0400 Subject: [PATCH] Get key state by read file --- src/client.rs | 12 ------------ src/server/input_service.rs | 4 ++-- src/ui_session_interface.rs | 39 +++++++++++++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/client.rs b/src/client.rs index 6cda7f9ad..37cea6b60 100644 --- a/src/client.rs +++ b/src/client.rs @@ -155,18 +155,6 @@ impl Client { } } Ok(x) => { - #[cfg(target_os = "linux")] - if !*crate::common::IS_X11.lock().unwrap() { - let keyboard = super::uinput::client::UInputKeyboard::new().await?; - log::info!("UInput keyboard created"); - let mouse = super::uinput::client::UInputMouse::new().await?; - log::info!("UInput mouse created"); - - let mut en = ENIGO.lock().unwrap(); - en.set_uinput_keyboard(Some(Box::new(keyboard))); - en.set_uinput_mouse(Some(Box::new(mouse))); - } - Ok(x)}, } } diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 19be48b8e..c2efb9947 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -665,7 +665,7 @@ fn map_keyboard_mode(evt: &KeyEvent) { en.key_down(enigo::Key::CapsLock); if evt.down { - en.key_down(enigo::Key::Raw(code)); + en.key_down(enigo::Key::Raw(code)).ok(); } else { en.key_up(enigo::Key::Raw(code)); } @@ -871,7 +871,7 @@ fn legacy_keyboard_mode(evt: &KeyEvent) { if *IS_X11.lock().unwrap() { tfc_key_down_or_up(key.clone(), true, false); } else { - allow_err!(en.key_down(key.clone())); + en.key_down(key.clone()).ok(); } KEYS_DOWN .lock() diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index 676933ccc..254db238a 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -8,7 +8,7 @@ use crate::client::{ }; use crate::{client::Data, client::Interface}; use async_trait::async_trait; - +use std::io::Read; use hbb_common::config::{Config, LocalConfig, PeerConfig}; use hbb_common::rendezvous_proto::ConnType; use hbb_common::tokio::{self, sync::mpsc}; @@ -416,10 +416,20 @@ impl Session { { key_event.modifiers.push(ControlKey::Meta.into()); } - if get_key_state(enigo::Key::CapsLock) { + #[cfg(target_os = "linux")] + if get_led_state(enigo::Key::CapsLock){ key_event.modifiers.push(ControlKey::CapsLock.into()); } + #[cfg(not(target_os = "linux"))] + if get_key_state(enigo::Key::CapsLock) { + key_event.modifiers.push(ControlKey::CapsLock.into()); + } if self.peer_platform() != "Mac OS" { + #[cfg(target_os = "linux")] + if get_led_state(enigo::Key::NumLock){ + key_event.modifiers.push(ControlKey::NumLock.into()); + } + #[cfg(not(target_os = "linux"))] if get_key_state(enigo::Key::NumLock) { key_event.modifiers.push(ControlKey::NumLock.into()); } @@ -1362,3 +1372,28 @@ async fn send_note(url: String, id: String, conn_id: i32, note: String) { let body = serde_json::json!({ "id": id, "Id": conn_id, "note": note }); allow_err!(crate::post_request(url, body.to_string(), "").await); } + +fn get_led_state(key: enigo::Key) -> bool{ + let led_file = match key{ + enigo::Key::CapsLock => { + "/sys/class/leds/input1::capslock/brightness" + } + enigo::Key::NumLock => { + "/sys/class/leds/input1::numlock/brightness" + } + _ => { + return false; + } + }; + + let status = if let Ok(mut file) = std::fs::File::open(&led_file) { + let mut content = String::new(); + file.read_to_string(&mut content).ok(); + let status = content.trim_end().to_string().parse::().unwrap_or(0); + status + }else{ + 0 + }; + log::info!("get led state: {}", status); + status == 1 +} \ No newline at end of file