Skip to content

Commit 97cdc4d

Browse files
committed
Whatever??
1 parent 37ded56 commit 97cdc4d

File tree

1 file changed

+25
-15
lines changed

1 file changed

+25
-15
lines changed

src/linux/wayland/simulate.rs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ use input_linux::{
55
EventKind, EventTime, InputEvent, InputId, Key as UKey, KeyEvent, KeyState, RelativeAxis,
66
RelativeEvent, SynchronizeEvent, SynchronizeKind, UInputHandle,
77
};
8-
use libc::input_event;
8+
use libc::{input_event, O_NONBLOCK};
99
use std::fs::{File, OpenOptions};
10+
use std::os::unix::fs::OpenOptionsExt;
1011
use std::sync::{LazyLock, Mutex};
1112

1213
static HANDLE: LazyLock<Mutex<Option<UInputHandle<File>>>> = LazyLock::new(|| Mutex::new(None));
@@ -17,8 +18,11 @@ impl Handle {
1718
pub fn new() -> Self {
1819
let mut handle = HANDLE.lock().unwrap();
1920
if handle.is_none() {
20-
let file = OpenOptions::new().write(true).open("/dev/uinput").unwrap();
21-
// let file = File::open("/dev/uinput").unwrap();
21+
let file = OpenOptions::new()
22+
.write(true)
23+
.custom_flags(O_NONBLOCK)
24+
.open("/dev/uinput")
25+
.unwrap();
2226
let uinput = UInputHandle::new(file);
2327
uinput.set_evbit(EventKind::Key).unwrap();
2428
uinput.set_evbit(EventKind::Relative).unwrap();
@@ -44,29 +48,35 @@ impl Handle {
4448
Handle
4549
}
4650

51+
fn send_key_event(
52+
&self,
53+
handle: &UInputHandle<File>,
54+
ukey: UKey,
55+
state: KeyState,
56+
) -> Result<(), SimulateError> {
57+
const ZERO: EventTime = EventTime::new(0, 0);
58+
let event = KeyEvent::new(ZERO, ukey, state);
59+
let event: input_event = InputEvent::from(event).into();
60+
let sync = SynchronizeEvent::new(ZERO, SynchronizeKind::Report, 0);
61+
let sync: input_event = InputEvent::from(sync).into();
62+
63+
handle.write(&[event, sync]).map_err(|_| SimulateError)?;
64+
Ok(())
65+
}
66+
4767
pub fn send(&self, event: &EventType) -> Result<(), SimulateError> {
4868
let handle = HANDLE.lock().unwrap();
4969
if let Some(handle) = handle.as_ref() {
5070
const ZERO: EventTime = EventTime::new(0, 0);
5171
match event {
5272
EventType::KeyPress(key) => {
5373
if let Some(ukey) = ukey_from_key(*key) {
54-
let event = KeyEvent::new(ZERO, ukey, KeyState::PRESSED);
55-
let event: input_event = InputEvent::from(event).into();
56-
let sync = SynchronizeEvent::new(ZERO, SynchronizeKind::Report, 0);
57-
let sync: input_event = InputEvent::from(sync).into();
58-
eprintln!("Writing it");
59-
handle.write(&[event, sync]).map_err(|_| SimulateError)?;
60-
eprintln!("Could write it.");
74+
self.send_key_event(handle, ukey, KeyState::PRESSED)?;
6175
}
6276
}
6377
EventType::KeyRelease(key) => {
6478
if let Some(ukey) = ukey_from_key(*key) {
65-
let event = KeyEvent::new(ZERO, ukey, KeyState::RELEASED);
66-
let event: input_event = InputEvent::from(event).into();
67-
let sync = SynchronizeEvent::new(ZERO, SynchronizeKind::Report, 0);
68-
let sync: input_event = InputEvent::from(sync).into();
69-
handle.write(&[event, sync]).map_err(|_| SimulateError)?;
79+
self.send_key_event(handle, ukey, KeyState::RELEASED)?;
7080
}
7181
}
7282
EventType::ButtonPress(button) => {

0 commit comments

Comments
 (0)