Refactor simulate to support switching keyboard modes

This commit is contained in:
Asura
2022-07-17 20:34:08 -07:00
parent 7c24f6bb12
commit 5dab7bd9a2
5 changed files with 84 additions and 122 deletions

View File

@@ -3,7 +3,6 @@ use libc;
use crate::{Key, KeyboardControllable, MouseButton, MouseControllable};
use self::libc::{c_char, c_int, c_void, useconds_t};
use rdev::{simulate, EventType, EventType::*, Key as RdevKey, SimulateError};
use std::{borrow::Cow, ffi::CString, io::prelude::*, ptr, sync::mpsc, thread, time};
const CURRENT_WINDOW: c_int = 0;
const DEFAULT_DELAY: u64 = 12000;
@@ -104,27 +103,7 @@ impl Enigo {
self.tx.send((PyMsg::Char('\0'), true)).ok();
}
fn send_rdev(&mut self, key: &Key, is_press: bool) -> bool {
if let Key::Raw(keycode) = key {
let event_type = match is_press {
// todo: Acccodding to client type
true => Box::leak(Box::new(EventType::KeyPress(RdevKey::Unknown(
(*keycode).into(),
)))),
false => Box::leak(Box::new(EventType::KeyRelease(RdevKey::Unknown(
(*keycode).into(),
)))),
};
match simulate(event_type) {
Ok(()) => true,
Err(SimulateError) => false,
}
} else {
false
}
}
#[inline]
fn send_pynput(&mut self, key: &Key, is_press: bool) -> bool {
if unsafe { PYNPUT_EXIT || !PYNPUT_REDAY } {
@@ -459,12 +438,9 @@ impl KeyboardControllable for Enigo {
if self.xdo.is_null() {
return Ok(());
}
if self.send_rdev(&key, true) {
return Ok(());
}
if self.send_pynput(&key, true) {
return Ok(());
}
// if self.send_pynput(&key, true) {
// return Ok(());
// }
let string = CString::new(&*keysequence(key))?;
unsafe {
xdo_send_keysequence_window_down(
@@ -480,14 +456,9 @@ impl KeyboardControllable for Enigo {
if self.xdo.is_null() {
return;
}
// todo
let keyboard_mode = 1;
if keyboard_mode == 1 && self.send_rdev(&key, false) {
return;
}
if self.send_pynput(&key, false) {
return;
}
// if self.send_pynput(&key, false) {
// return;
// }
if let Ok(string) = CString::new(&*keysequence(key)) {
unsafe {
xdo_send_keysequence_window_up(

View File

@@ -1,5 +1,4 @@
use core_graphics;
use rdev::{simulate, EventType, EventType::*, Key as RdevKey, SimulateError};
// TODO(dustin): use only the things i need
use self::core_graphics::display::*;
@@ -354,11 +353,6 @@ impl KeyboardControllable for Enigo {
}
fn key_down(&mut self, key: Key) -> crate::ResultType {
let keyboard_mode = 1;
if keyboard_mode == 1 {
self.send_rdev(&key, true);
return Ok(());
};
let code = self.key_to_keycode(key);
if code == u16::MAX {
return Err("".into());
@@ -374,11 +368,6 @@ impl KeyboardControllable for Enigo {
}
fn key_up(&mut self, key: Key) {
let keyboard_mode = 1;
if keyboard_mode == 1 {
self.send_rdev(&key, true);
return Ok(());
};
if let Some(src) = self.event_source.as_ref() {
if let Ok(event) =
CGEvent::new_keyboard_event(src.clone(), self.key_to_keycode(key), false)
@@ -431,27 +420,6 @@ impl Enigo {
(x, (display_height as i32) - y_inv)
}
fn send_rdev(&mut self, key: &Key, is_press: bool) -> bool {
if let Key::Raw(keycode) = key {
let event_type = match is_press {
// todo: Acccodding to client type
true => Box::leak(Box::new(EventType::KeyPress(RdevKey::Unknown(
(*keycode).into(),
)))),
false => Box::leak(Box::new(EventType::KeyRelease(RdevKey::Unknown(
(*keycode).into(),
)))),
};
match simulate(event_type) {
Ok(()) => true,
Err(SimulateError) => false,
}
} else {
false
}
}
fn key_to_keycode(&mut self, key: Key) -> CGKeyCode {
#[allow(deprecated)]
// I mean duh, we still need to support deprecated keys until they're removed

View File

@@ -2,7 +2,6 @@ use self::winapi::ctypes::c_int;
use self::winapi::shared::{basetsd::ULONG_PTR, minwindef::*, windef::*};
use self::winapi::um::winbase::*;
use self::winapi::um::winuser::*;
use rdev::{simulate, EventType, Key as RdevKey, SimulateError};
use winapi;
use crate::win::keycodes::*;
@@ -198,11 +197,6 @@ impl KeyboardControllable for Enigo {
}
fn key_down(&mut self, key: Key) -> crate::ResultType {
let keyboard_mode = 1;
if keyboard_mode == 1 {
self.send_rdev(&key, true);
return Ok(());
};
let code = self.key_to_keycode(key);
if code == 0 || code == 65535 {
return Err("".into());
@@ -218,11 +212,6 @@ impl KeyboardControllable for Enigo {
}
fn key_up(&mut self, key: Key) {
let keyboard_mode = 1;
if keyboard_mode == 1 {
self.send_rdev(&key, false);
return;
};
keybd_event(KEYEVENTF_KEYUP, self.key_to_keycode(key), 0);
}
@@ -283,27 +272,6 @@ impl Enigo {
keybd_event(KEYEVENTF_UNICODE | KEYEVENTF_KEYUP, 0, unicode_char);
}
fn send_rdev(&mut self, key: &Key, is_press: bool) -> bool {
if let Key::Raw(keycode) = key {
let event_type = match is_press {
// todo: Acccodding to client type
true => Box::leak(Box::new(EventType::KeyPress(RdevKey::Unknown(
(*keycode).into(),
)))),
false => Box::leak(Box::new(EventType::KeyRelease(RdevKey::Unknown(
(*keycode).into(),
)))),
};
match simulate(event_type) {
Ok(()) => true,
Err(SimulateError) => false,
}
} else {
false
}
}
fn key_to_keycode(&self, key: Key) -> u16 {
unsafe {
LAYOUT = std::ptr::null_mut();