Feat: Support map keyboard mode in wayland
This commit is contained in:
parent
925a9e43cb
commit
071720fe8b
@ -8,7 +8,7 @@ use rdev::{simulate, EventType, Key as RdevKey};
|
|||||||
use std::{
|
use std::{
|
||||||
convert::TryFrom,
|
convert::TryFrom,
|
||||||
sync::atomic::{AtomicBool, Ordering},
|
sync::atomic::{AtomicBool, Ordering},
|
||||||
time::Instant
|
time::Instant,
|
||||||
};
|
};
|
||||||
use tfc::{traits::*, Context as TFC_Context, Key as TFC_Key};
|
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.
|
// map mode(1): Send keycode according to the peer platform.
|
||||||
let (click_capslock, click_numlock) = sync_status(evt);
|
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"))]
|
#[cfg(not(target_os = "macos"))]
|
||||||
if click_capslock {
|
if click_capslock {
|
||||||
rdev_key_click(RdevKey::CapsLock);
|
rdev_key_click(RdevKey::CapsLock);
|
||||||
@ -660,11 +684,6 @@ fn map_keyboard_mode(evt: &KeyEvent) {
|
|||||||
if evt.down && click_capslock {
|
if evt.down && click_capslock {
|
||||||
rdev_key_down_or_up(RdevKey::CapsLock, evt.down);
|
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);
|
rdev_key_down_or_up(RdevKey::Unknown(evt.chr()), evt.down);
|
||||||
return;
|
return;
|
||||||
|
@ -314,7 +314,7 @@ pub mod service {
|
|||||||
|
|
||||||
fn map_key(key: &enigo::Key) -> ResultType<evdev::Key> {
|
fn map_key(key: &enigo::Key) -> ResultType<evdev::Key> {
|
||||||
if let Some(k) = KEY_MAP.get(&key) {
|
if let Some(k) = KEY_MAP.get(&key) {
|
||||||
log::trace!("mapkey {:?}, get {:?}", &key, &k);
|
log::info!("mapkey {:?}, get {:?}", &key, &k);
|
||||||
return Ok(k.clone());
|
return Ok(k.clone());
|
||||||
} else {
|
} else {
|
||||||
match key {
|
match key {
|
||||||
@ -350,6 +350,16 @@ pub mod service {
|
|||||||
DataKeyboard::Sequence(_seq) => {
|
DataKeyboard::Sequence(_seq) => {
|
||||||
// ignore
|
// 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) => {
|
DataKeyboard::KeyDown(key) => {
|
||||||
if let Ok(k) = map_key(key) {
|
if let Ok(k) = map_key(key) {
|
||||||
let down_event = InputEvent::new(EventType::KEY, k.code(), 1);
|
let down_event = InputEvent::new(EventType::KEY, k.code(), 1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user