From 071720fe8b7761684c977375e1da27b748c68d24 Mon Sep 17 00:00:00 2001 From: asur4s Date: Sat, 3 Sep 2022 23:30:41 -0400 Subject: [PATCH] Feat: Support map keyboard mode in wayland --- src/server/input_service.rs | 31 +++++++++++++++++++++++++------ src/server/uinput.rs | 12 +++++++++++- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/server/input_service.rs b/src/server/input_service.rs index f8edef399..26806a7a5 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -8,7 +8,7 @@ use rdev::{simulate, EventType, Key as RdevKey}; use std::{ convert::TryFrom, sync::atomic::{AtomicBool, Ordering}, - time::Instant + time::Instant, }; use tfc::{traits::*, Context as TFC_Context, Key as TFC_Key}; @@ -648,6 +648,30 @@ fn map_keyboard_mode(evt: &KeyEvent) { // map mode(1): Send keycode according to the peer platform. let (click_capslock, click_numlock) = sync_status(evt); + // Wayland + if !*IS_X11.lock().unwrap() { + let mut en = ENIGO.lock().unwrap(); + let code = evt.chr() as u16; + + #[cfg(not(target_os = "macos"))] + if click_capslock { + en.key_click(enigo::Key::CapsLock); + } + #[cfg(not(target_os = "macos"))] + if click_numlock { + en.key_click(enigo::Key::NumLock); + } + #[cfg(target_os = "macos")] + en.key_down(enigo::Key::CapsLock); + + if evt.down { + en.key_down(enigo::Key::Raw(code)); + } else { + en.key_up(enigo::Key::Raw(code)); + } + return; + } + #[cfg(not(target_os = "macos"))] if click_capslock { rdev_key_click(RdevKey::CapsLock); @@ -660,11 +684,6 @@ 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 - ); rdev_key_down_or_up(RdevKey::Unknown(evt.chr()), evt.down); return; diff --git a/src/server/uinput.rs b/src/server/uinput.rs index 7a6d47cff..85b79ddb0 100644 --- a/src/server/uinput.rs +++ b/src/server/uinput.rs @@ -314,7 +314,7 @@ pub mod service { fn map_key(key: &enigo::Key) -> ResultType { if let Some(k) = KEY_MAP.get(&key) { - log::trace!("mapkey {:?}, get {:?}", &key, &k); + log::info!("mapkey {:?}, get {:?}", &key, &k); return Ok(k.clone()); } else { match key { @@ -350,6 +350,16 @@ pub mod service { DataKeyboard::Sequence(_seq) => { // ignore } + DataKeyboard::KeyDown(enigo::Key::Raw(code)) => { + log::info!("keycode {:?}", *code - 8); + let down_event = InputEvent::new(EventType::KEY, *code - 8, 1); + allow_err!(keyboard.emit(&[down_event])); + } + DataKeyboard::KeyUp(enigo::Key::Raw(code)) => { + log::info!("keycode {:?}", *code - 8); + let down_event = InputEvent::new(EventType::KEY, *code - 8, 0); + allow_err!(keyboard.emit(&[down_event])); + } DataKeyboard::KeyDown(key) => { if let Ok(k) = map_key(key) { let down_event = InputEvent::new(EventType::KEY, k.code(), 1);