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