Replaces the no-op stub with a working implementation for KDE6 Wayland.
Wayland's privacy model prevents querying focused-window state from outside
the compositor, so the monitor injects a KWin JavaScript snippet at runtime
that subscribes to workspace.windowActivated and calls back via D-Bus.
On startup:
- Writes the KWin script to a NamedTempFile
- Registers dev.rootiest.qmk_host on the session bus at /AppMonitor
- Loads the script via org.kde.kwin.Scripting.loadScript(), then calls
start() to activate it (loadScript alone does not execute the script)
On each window-activation event:
- Truncates app_id to 27 UTF-8 bytes at a char boundary
- Skips no-op updates when the active app has not changed
- Broadcasts CMD_ACTIVE_APP (0x43) to all connected keyboards
Depends on new crates: zbus v4 (blocking D-Bus) and tempfile v3.
Add clap CLI argument parsing with three log-level controls:
-q/--quiet errors only
(default) info — connections and value changes
-v debug — every packet's cmd/src/flags logged on TX and RX
-vv trace — full 32-byte hex dump of every packet on the wire
RUST_LOG env var continues to work as a fine-grained override for any
of the above levels.
Also expand the TX log line to include src and flags fields to match
the RX line, making the two symmetric.
Add a Rust daemon that connects to QMK keyboards over their Raw HID
interface (VID 0x3434, usage page 0xFF60 / usage 0x0061) and provides:
- Bi-directional layer sync: CMD_LAYER_SYNC (0x40) packets are bridged
between all connected keyboards so their active layers stay in sync.
On connect, a FLAG_QUERY packet requests the current state from each
keyboard. A second keyboard (numpad) is stubbed and ready to enable.
- Volume monitoring: polls `pactl get-sink-volume @DEFAULT_SINK@` every
2 s and pushes CMD_VOLUME (0x41) packets on change. Compatible with
both PulseAudio and PipeWire on KDE6/Wayland.
- Brightness monitoring: polls /sys/class/backlight on the same interval
and pushes CMD_BRIGHTNESS (0x42) packets on change.
- Active-app stub: CMD_ACTIVE_APP (0x43) is reserved with detailed notes
on KDE6/Wayland implementation approaches (KWin D-Bus, foreign
toplevel protocol) for a future commit.
Each keyboard runs a single combined read/write IO thread using a 10 ms
read timeout to interleave HID reads and queued writes without needing
two file handles. Protocol constants in src/protocol.rs mirror
hid_protocol.h in the QMK firmware exactly.
Licensed under GPL-3.0-or-later.