Skip to content

Commit d8bfd39

Browse files
committed
fix: pass through unconsumed evdev events without duplicate SYN_REPORT events
1 parent 1a6e5bc commit d8bfd39

File tree

2 files changed

+37
-26
lines changed

2 files changed

+37
-26
lines changed

evdev/src/main/rust/evdev_manager/core/src/event_loop.rs

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::evdev_error::EvdevError;
66
use crate::grab_device_request::GrabDeviceRequest;
77
use crate::grabbed_device::GrabbedDevice;
88
use crate::runtime::get_runtime;
9-
use evdev::enums::{EventCode, EventType};
9+
use evdev::enums::{EventCode, EventType, EV_SYN};
1010
use evdev::util::{event_code_to_int, int_to_event_code};
1111
use evdev::{DeviceWrapper, InputEvent, ReadFlag, ReadStatus};
1212
use libc::c_uint;
@@ -23,7 +23,7 @@ use std::io::ErrorKind;
2323
use std::os::fd::AsRawFd;
2424
use std::path::PathBuf;
2525
use std::sync::atomic::{AtomicBool, Ordering};
26-
use std::sync::{mpsc, Arc, OnceLock, RwLock, RwLockWriteGuard};
26+
use std::sync::{mpsc, Arc, OnceLock, RwLock};
2727
use std::time::{Duration, Instant};
2828
use tokio::task::JoinHandle;
2929

@@ -335,7 +335,22 @@ impl EventLoopManager {
335335
let device = devices
336336
.get(device_id) // O(1) slab lookup
337337
.ok_or_else(|| EvdevError::new(-libc::ENODEV))?;
338-
device.write_event(event_type, code, value)
338+
339+
debug!(
340+
"Write evdev event: device_id={} event_type={} code={} value={}",
341+
device_id, event_type, code, value
342+
);
343+
344+
device
345+
.uinput
346+
.write_event(EventType::EV_KEY as c_uint, code, value)
347+
.map_err(|err| EvdevError::from(err))?;
348+
349+
// Send SYN_REPORT
350+
device
351+
.uinput
352+
.write_syn_event(EV_SYN::SYN_REPORT)
353+
.map_err(|err| err.into())
339354
}
340355

341356
pub fn write_key_code_event(
@@ -358,9 +373,23 @@ impl EventLoopManager {
358373
error!("Failed to find scan code for key: {}", key_code);
359374
Err(Box::new(EvdevError::new(-libc::ENODATA)))
360375
}
361-
Some(code) => device
362-
.write_event(EventType::EV_KEY as c_uint, code, value)
363-
.map_err(|err| err.into()),
376+
Some(code) => {
377+
debug!(
378+
"Write key code evdev event: key_code={} value={}",
379+
key_code, value
380+
);
381+
382+
device
383+
.uinput
384+
.write_event(EventType::EV_KEY as c_uint, code, value)
385+
.map_err(|err| EvdevError::from(err))?;
386+
387+
// Send SYN_REPORT
388+
device
389+
.uinput
390+
.write_syn_event(EV_SYN::SYN_REPORT)
391+
.map_err(|err| err.into())
392+
}
364393
}
365394
}
366395

@@ -503,6 +532,7 @@ impl EventLoopThread {
503532
if !consumed {
504533
let (event_type, event_code) = event_code_to_int(&event.event_code);
505534
grabbed_device
535+
.uinput
506536
.write_event(event_type, event_code, event.value)
507537
.inspect_err(|e| {
508538
error!(

evdev/src/main/rust/evdev_manager/core/src/grabbed_device.rs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::device_identifier::DeviceIdentifier;
22
use crate::evdev_error::EvdevError;
3-
use evdev::enums::{EventCode, EV_SYN};
3+
use evdev::enums::EventCode;
44
use evdev::{Device, DeviceWrapper, GrabMode, UInputDevice};
55
use std::fs::OpenOptions;
66
use std::os::unix::fs::OpenOptionsExt;
@@ -73,25 +73,6 @@ impl GrabbedDevice {
7373
let evdev = Device::new_from_file(file).map_err(EvdevError::from)?;
7474
Ok(evdev)
7575
}
76-
77-
/// Write an event to the uinput device
78-
pub fn write_event(&self, event_type: u32, code: u32, value: i32) -> Result<(), EvdevError> {
79-
debug!(
80-
"Write evdev event: type={} code={} value={} code={}",
81-
event_type, code, value, code
82-
);
83-
84-
self.uinput
85-
.write_event(event_type, code, value)
86-
.map_err(EvdevError::from)?;
87-
88-
// Send SYN_REPORT
89-
self.uinput
90-
.write_syn_event(EV_SYN::SYN_REPORT)
91-
.map_err(EvdevError::from)?;
92-
93-
Ok(())
94-
}
9576
}
9677

9778
impl Drop for GrabbedDevice {

0 commit comments

Comments
 (0)