| Crates.io | kinput |
| lib.rs | kinput |
| version | 0.3.1 |
| created_at | 2026-01-10 19:46:26.713887+00 |
| updated_at | 2026-01-21 03:12:34.385089+00 |
| description | Low-level Rust library for input injection and global key capture on Linux |
| homepage | |
| repository | https://github.com/alan-venv/kinput |
| max_upload_size | |
| id | 2034612 |
| size | 60,367 |
Low-level Rust library for input injection and global key capture on Linux.
Creates virtual devices and captures global input events directly via the kernel subsystem, operating independently of any graphical environment or display server.
use kinput::{InputDevice, Key::*};
fn main() {
let device = InputDevice::new();
device.keyboard.text([H, E, L, L, O, Space, W, O, R, L, D]);
// Relative movement.
device.mouse.rel.reset_axis();
device.mouse.rel.move_xy(500, 350);
device.mouse.rel.left_click();
// Absolute positioning.
device.mouse.abs.move_xy(300, 300);
device.mouse.abs.left_click();
}
use kinput::{InputReader, Key::*};
fn main() {
let mut reader = InputReader::new();
reader.start().unwrap();
while let Ok(key) = reader.receive() {
if key == A {
println!("A key pressed");
}
}
}
Run this script to configure permissions and use the library without sudo.
#!/bin/bash
MODULE_GROUP=$(stat -c %G /dev/uinput 2>/dev/null || echo "root")
if [ "$MODULE_GROUP" = "input" ]; then
sudo usermod -aG input "$USER"
else
RULE_FILE="/etc/udev/rules.d/99-uinput.rules"
RULE_CONTENT="KERNEL==\"uinput\", MODE=\"0660\", GROUP=\"input\""
echo "$RULE_CONTENT" | sudo tee "$RULE_FILE" > /dev/null
sudo udevadm control --reload-rules
sudo udevadm trigger
sudo usermod -aG input "$USER"
fi
Note: A system logout/login is required for changes to take effect.