update rdev, fix grab system utf8, fallback on linux

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou 2023-09-15 15:34:02 +08:00
parent bb8438c770
commit 7b37e5183c
9 changed files with 19 additions and 7 deletions

2
Cargo.lock generated
View File

@ -4881,7 +4881,7 @@ dependencies = [
[[package]] [[package]]
name = "rdev" name = "rdev"
version = "0.5.0-2" version = "0.5.0-2"
source = "git+https://github.com/fufesou/rdev#ee3057bd97c91529e8b9daf2ca133a5c49f0c0eb" source = "git+https://github.com/fufesou/rdev#bec664ee8743ade8d2fdd099b114c9eeacd9cfba"
dependencies = [ dependencies = [
"cocoa", "cocoa",
"core-foundation", "core-foundation",

View File

@ -70,6 +70,8 @@ pub use win::ENIGO_INPUT_EXTRA_VALUE;
mod macos; mod macos;
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
pub use macos::Enigo; pub use macos::Enigo;
#[cfg(target_os = "macos")]
pub use macos::ENIGO_INPUT_EXTRA_VALUE;
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
mod linux; mod linux;

View File

@ -37,6 +37,9 @@ const kUCKeyActionDisplay: u16 = 3;
const kUCKeyTranslateDeadKeysBit: OptionBits = 1 << 31; const kUCKeyTranslateDeadKeysBit: OptionBits = 1 << 31;
const BUF_LEN: usize = 4; const BUF_LEN: usize = 4;
/// The event source user data value of cgevent.
pub const ENIGO_INPUT_EXTRA_VALUE: i64 = 100;
#[allow(improper_ctypes)] #[allow(improper_ctypes)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
#[link(name = "ApplicationServices", kind = "framework")] #[link(name = "ApplicationServices", kind = "framework")]
@ -131,6 +134,7 @@ impl Enigo {
fn post(&self, event: CGEvent) { fn post(&self, event: CGEvent) {
event.set_flags(self.flags); event.set_flags(self.flags);
event.set_integer_value_field(EventField::EVENT_SOURCE_USER_DATA, ENIGO_INPUT_EXTRA_VALUE);
event.post(CGEventTapLocation::HID); event.post(CGEventTapLocation::HID);
} }
} }

View File

@ -1,4 +1,4 @@
mod macos_impl; mod macos_impl;
pub mod keycodes; pub mod keycodes;
pub use self::macos_impl::Enigo; pub use self::macos_impl::{Enigo, ENIGO_INPUT_EXTRA_VALUE};

View File

@ -1,5 +1,4 @@
mod win_impl; mod win_impl;
pub mod keycodes; pub mod keycodes;
pub use self::win_impl::Enigo; pub use self::win_impl::{Enigo, ENIGO_INPUT_EXTRA_VALUE};
pub use self::win_impl::ENIGO_INPUT_EXTRA_VALUE;

View File

@ -583,6 +583,8 @@ pub fn event_type_to_event(event_type: EventType) -> Event {
unicode: None, unicode: None,
platform_code: 0, platform_code: 0,
position_code: 0, position_code: 0,
#[cfg(any(target_os = "windows", target_os = "macos"))]
extra_data: 0,
} }
} }

View File

@ -676,10 +676,10 @@ impl Connection {
#[cfg(not(any(target_os = "android", target_os = "ios")))] #[cfg(not(any(target_os = "android", target_os = "ios")))]
fn handle_input(receiver: std_mpsc::Receiver<MessageInput>, tx: Sender) { fn handle_input(receiver: std_mpsc::Receiver<MessageInput>, tx: Sender) {
let mut block_input_mode = false; let mut block_input_mode = false;
#[cfg(target_os = "windows")] #[cfg(any(target_os = "windows", target_os = "macos"))]
{ {
rdev::set_dw_mouse_extra_info(enigo::ENIGO_INPUT_EXTRA_VALUE); rdev::set_mouse_extra_info(enigo::ENIGO_INPUT_EXTRA_VALUE);
rdev::set_dw_keyboard_extra_info(enigo::ENIGO_INPUT_EXTRA_VALUE); rdev::set_keyboard_extra_info(enigo::ENIGO_INPUT_EXTRA_VALUE);
} }
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
reset_input_ondisconn(); reset_input_ondisconn();

View File

@ -380,6 +380,9 @@ pub fn try_stop_record_cursor_pos() {
return; return;
} }
RECORD_CURSOR_POS_RUNNING.store(false, Ordering::SeqCst); RECORD_CURSOR_POS_RUNNING.store(false, Ordering::SeqCst);
#[cfg(any(target_os = "windows", target_os = "macos"))]
let _r = rdev::exit_grab();
} }
// mac key input must be run in main thread, otherwise crash on >= osx 10.15 // mac key input must be run in main thread, otherwise crash on >= osx 10.15

View File

@ -660,6 +660,8 @@ impl<T: InvokeUiSession> Session<T> {
platform_code, platform_code,
position_code: position_code as _, position_code: position_code as _,
event_type, event_type,
#[cfg(any(target_os = "windows", target_os = "macos"))]
extra_data: 0,
}; };
keyboard::client::process_event(&event, Some(lock_modes)); keyboard::client::process_event(&event, Some(lock_modes));
} }