rdev
Simple library to listen globally and send events to keyboard and mouse on MacOS, Windows and Linux (x11).
You can also check out Enigo which is another crate which helped me write this one.
This crate is so far a pet project for me to understand the rust ecosystem.
Listening to global events
use ;
// This will block.
if let Err = listen
Sending some events
use ;
use ;
send;
send;
send;
send;
send;
send;
send;
Main structs
Event
In order to detect what a user types, we need to plug to the OS level management of keyboard state (modifiers like shift, ctrl, but also dead keys if they exist).
EventType
corresponds to a physical event, corresponding to QWERTY layout
Event
corresponds to an actual event that was received and Event.name
reflects
what key was interpreted by the OS at that time, it will respect the layout.
/// When events arrive from the system we can add some information
/// time is when the event was received.
Be careful, Event::name, might be None, but also String::from(""), and might contain not displayable unicode characters. We send exactly what the OS sends us so do some sanity checking before using it. Caveat: Dead keys don't function yet on Linux
EventType
In order to manage different OS, the current EventType choices is a mix&match to account for all possible events. There is a safe mechanism to detect events no matter what, which are the Unknown() variant of the enum which will contain some OS specific value. Also not that not all keys are mapped to an OS code, so simulate might fail if you try to send an unmapped key. Sending Unknown() variants will always work (the OS might still reject it).
/// In order to manage different OS, the current EventType choices is a mix&match
/// to account for all possible events.
OS Specificities
For now the code only works for Linux (X11), MacOS and Windows. On MacOS, the listen loop needs to be the primary app (no fork before) and needs to have accessibility settings enabled (Terminal added in System Preferences > Security & Privacy > Privacy > Accessibility).
Getting the main screen size
use ;
let = display_size.unwrap;
assert!;
assert!;
Keyboard state
We can define a dummy Keyboard, that we will use to detect what kind of EventType trigger some String. We get the currently used layout for now ! Caveat : This is layout dependent. If your app needs to support layout switching don't use this ! Caveat: On Linux, the dead keys mechanism is not implemented. Caveat: Only shift and dead keys are implemented, Alt+unicode code on windows won't work.
use ;
let mut keyboard = new.unwrap;
let string = keyboard.add;
// string == Some("s")
Grabbing global events. (Requires unstable_grab
feature)
In the callback, returning None ignores the event and returning the event let's it pass. There is no modification of the event possible here. Caveat: On MacOS, you require the grab loop needs to be the primary app (no fork before) and need to have accessibility settings enabled. Not implemented on Linux, you will always receive an error.
Serialization
Serialization and deserialization. (Requires serialize
feature).