diff --git a/examples/blink_keyboard_leds.rs b/examples/blink_keyboard_leds.rs new file mode 100644 index 0000000..3d7c3c8 --- /dev/null +++ b/examples/blink_keyboard_leds.rs @@ -0,0 +1,31 @@ +use evdev::{EventType, InputEvent, LedType}; + +mod _pick_device; + +fn main() { + let mut d = _pick_device::pick_device(); + println!("{}", d); + println!("Blinking the Keyboard LEDS..."); + for i in 0..5 { + let on = i % 2 != 0; + d.send_event(&InputEvent::new( + EventType::LED, + LedType::LED_CAPSL.0, + if on { i32::MAX } else { 0 }, + )) + .unwrap(); + d.send_event(&InputEvent::new( + EventType::LED, + LedType::LED_NUML.0, + if on { i32::MAX } else { 0 }, + )) + .unwrap(); + d.send_event(&InputEvent::new( + EventType::LED, + LedType::LED_SCROLLL.0, + if on { i32::MAX } else { 0 }, + )) + .unwrap(); + std::thread::sleep(std::time::Duration::from_secs(1)); + } +} diff --git a/src/raw_stream.rs b/src/raw_stream.rs index 984a113..ddfa403 100644 --- a/src/raw_stream.rs +++ b/src/raw_stream.rs @@ -610,6 +610,22 @@ impl RawDevice { } Ok(()) } + + /// Send an event to the device. + /// + /// Events that are typically sent to devices are + /// [EventType::LED] (turn device LEDs on and off), + /// [EventType::SOUND] (play a sound on the device) + /// and [EventType::FORCEFEEDBACK] (play force feedback events on the device, i.e. rumble). + pub fn send_event(&mut self, event: &InputEvent) -> io::Result<()> { + let raw_event = event.as_ref(); + let bytes_written = unsafe { + let buf = crate::cast_to_bytes(raw_event); + nix::unistd::write(self.as_raw_fd(), buf)? + }; + debug_assert_eq!(bytes_written, mem::size_of_val(raw_event)); + Ok(()) + } } impl AsRawFd for RawDevice { diff --git a/src/sync_stream.rs b/src/sync_stream.rs index 14dba2f..6c3b8c9 100644 --- a/src/sync_stream.rs +++ b/src/sync_stream.rs @@ -342,6 +342,16 @@ impl Device { pub fn ungrab(&mut self) -> io::Result<()> { self.raw.ungrab() } + + /// Send an event to the device. + /// + /// Events that are typically sent to devices are + /// [EventType::LED] (turn device LEDs on and off), + /// [EventType::SOUND] (play a sound on the device) + /// and [EventType::FORCEFEEDBACK] (play force feedback events on the device, i.e. rumble). + pub fn send_event(&mut self, event: &InputEvent) -> io::Result<()> { + self.raw.send_event(event) + } } impl AsRawFd for Device {