# Design doc ## Obligatory diagram ## main - read args - read config - start event loops ## event loop - read key events - send events to processing loop on channel ## processing loop - check for events on mpsc - if event: send event to layout - tick() the keyberon layout, send any events needed - if no event: sleep for 1ms - separate monotonic time checks, because can't rely on sleep to be fine-grained or accurate - send `ServerMessage`s to the TCP server ## TCP server - listen for `ClientMessage`s and act on them - recv `ServerMessage`s from processing loop and forward to all connected clients ## layout - uses keyberon - indices of `kanata_keyberon::layout::Event::{Press, Release}(x,y)`: x = 0 or 1 (0 is for physical key presses, 1 is for fake keys) y = OS code of key used as an index ## OS-specific code Most of the OS specific code is in `oskbd/` and `keys/`. There's a bit of it in `kanata/` since the event loops to receive OS events are different.