Skip to content

feat(input): raw keyboard event API for userland (#466) - #701

Merged
alexis900 merged 1 commit into
developfrom
feat/466-raw-keyboard
Oct 13, 2026
Merged

alexis900 merged 1 commit into
developfrom
feat/466-raw-keyboard

Conversation

@alexis900

Copy link
Copy Markdown
Collaborator

Fixes #466.

What

A raw keyboard event API for Ring 3, per the design doc docs/design/raw-keyboard-api-design.md.

  • Kernel: input/kbd/ring.rs — KeyEvent (16-byte ABI), bounded lock-free SPSC KeyEventRing (overwrite oldest + dropped), and vk_from_scancode with the E0 split (KBD-EXTKEYS: Restaurar teclas extendidas (flechas/Home/End/Del) #391: E0 arrows no longer collide with the numpad). One ring + raw flag per VT (input/manager.rs); the ring is cleared when raw mode is enabled; raw is cleared when the foreground process exits.
  • kbd::process_scancode emits every make/break with vk + modifiers and suppresses cooked byte delivery while raw.
  • kwait::WaitReason::Keyboard { vt }; the keyboard IRQ wakes a blocked reader.
  • ObInfoClass::KeyboardRead (44) / KeyboardPoll (45); ObSetInfoClass::KeyboardSetRawMode (55).
  • libneodos: KeyEvent + VK_* table + kbd_set_raw / kbd_poll_event / kbd_read_event.
  • userbin/keyread: enables raw, prints up to 10 make/break events, restores cooked.

VirtualBox evidence (NAT, e1000)

keyread in the guest:

  sc=30 vk=0 - down mod=32
  sc=30 vk=0 - up   mod=32
  sc=48 vk=0 - down mod=32
  sc=48 vk=0 - up   mod=32
  sc=42 vk=0 - down mod=33 ext
  sc=72 vk=38 UP down mod=33 ext
  sc=72 vk=38 UP up   mod=33 ext
  sc=42 vk=0 - up   mod=32 ext
  sc=29 vk=17 ? down mod=34
  sc=57 vk=32 SPACE down mod=34

a/b make/break, E0 Up arrow (vk=UP, ext), and Ctrl+Space (mod=34, vk=SPACE).

Tests

  • QEMU neodev test: 960/960 (kbd_ring_push_pop_fifo, kbd_ring_overflow_drops_oldest, kbd_key_event_is_16_bytes, kbd_vk_extended_split).
  • check-deps clean; check-irq-locks OK.

Deferred (documented)

sys_poll keyboard readiness and a distinct timeout status for the blocking read (the caller re-issues, like ob_wait). Raw codepoint is left 0 (clients use vk/scancode); text entry still goes through cooked stdin.

Note

Full packaging requires the one-line NeoDev image-allowlist addition (keyread), same as the other network/time userbins.

- input/kbd/ring.rs: KeyEvent (16-byte ABI), bounded lock-free SPSC
  KeyEventRing (overwrite-oldest + dropped), and vk_from_scancode with the E0
  split (#391: E0 arrows no longer collide with the numpad).
- input/manager: per-VT KeyEventRing + raw flag; push on scancode; clear the
  ring when raw is enabled; clear raw when the foreground process exits.
- kbd::process_scancode: emit every make/break with vk + modifiers; suppress
  cooked byte delivery while raw.
- kwait: WaitReason::Keyboard { vt }; keyboard IRQ wakes a blocked reader.
- ObInfoClass::KeyboardRead (44) / KeyboardPoll (45), ObSetInfoClass::
  KeyboardSetRawMode (55).
- libneodos: KeyEvent + VK table + kbd_set_raw/kbd_poll_event/kbd_read_event.
- userbin/keyread: enables raw, prints make/break events, restores cooked.
- tests: kbd_ring_push_pop_fifo, kbd_ring_overflow_drops_oldest,
  kbd_key_event_is_16_bytes, kbd_vk_extended_split.

Verified: QEMU 960/960; VirtualBox guest keyread -> 'a'/'b' make/break,
Up arrow (sc=72 vk=38 UP ext) and Ctrl+Space (mod=34 vk=32).
@alexis900
alexis900 merged commit 190ebb7 into develop Oct 13, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[INPUT] Raw keyboard event API for userland

1 participant