Typed native MoonBit bindings for Linux evdev and uinput
/dev/input/eventX
│
▼
thin C ABI shim
open/read/ioctl
│
▼
RawEvent (stable MoonBit fields)
│
▼
typed decoder
│
▼
InputEvent / EventStream or AsyncEventStreammoon add eisem/mooninput@0.1.0import {
"eisem/mooninput/src/codes",
"eisem/mooninput/src/event",
"eisem/mooninput/src/evdev",
}fn main {
let key = @codes.KeyCode::from_linux(30)
println(key.to_linux()) // 30 (KEY_A)
}moon update
moon check --warn-list +unnecessary_annotation --deny-warn
moon test --target native --deny-warn
moon build --target native --deny-warnmoon run examples/list_devicesmoon run examples/list_devices -- /dev/inputmoon run examples/monitor -- /dev/input/event4KEY A PRESSED
SYN Report
KEY A RELEASED
SYN Reportlet device = @evdev.Device::open("/dev/input/event4")
println(device.name())
let events = device.events()
for ;; {
let event = events.next()
println(event.to_repr())
}moon run examples/device_info -- /dev/input/event4moon run examples/async_monitor -- /dev/input/event4moon run examples/remapper -- /dev/input/event4sudo env PATH="$HOME/.moon/bin:$PATH" \
bash .ci/validate-uinput.sh "$PWD"