diff options
| author | salmonik <salmonik@tuta.io> | 2026-08-17 18:56:04 +0200 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-08-17 18:56:04 +0200 |
| commit | 5558e3509d020a0e021a77f0617044497b2f2aee (patch) | |
| tree | cd7b6cee9f7c327f9fae7ad9ac27602d1a97b222 /rsnix/src/tty.rs | |
| parent | USB2/1.1 (EHCI/UHCI) drivers + real-hardware bring-up hardening (diff) | |
| download | rs-dos-5558e3509d020a0e021a77f0617044497b2f2aee.tar.gz rs-dos-5558e3509d020a0e021a77f0617044497b2f2aee.zip | |
Windowed GUI: wm module, input routing, and the paint app
- Add the wm window-manager facility per ADR 0004: overlapping
pixel-surface windows, damage-rectangle compositing, WM-drawn title
bar, focus/minimize/close, and F1-F4 keybindings
- Add gop shadow compositing primitives and vt::repaint_region so the
console stays layer 0 beneath windows
- Route mouse (absolute coords, press/release edges) and keyboard
(focus-aware input pump) to the focused window
- Add the rspaint drawing-program crate (pen, 8 colors, clear) and shell
draw/windows/restore commands
- Extend TaskMsg with AppMouse/Focus/Close and document the design in
CONTEXT.md + ADR 0004
Diffstat (limited to '')
| -rw-r--r-- | rsnix/src/tty.rs | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/rsnix/src/tty.rs b/rsnix/src/tty.rs index 0783521..6102fb5 100644 --- a/rsnix/src/tty.rs +++ b/rsnix/src/tty.rs | |||
| @@ -41,14 +41,31 @@ static mut RAW_LEN: usize = 0; | |||
| 41 | /// Combined blocking key poll: USB HID keyboard first (polled UHCI), then | 41 | /// Combined blocking key poll: USB HID keyboard first (polled UHCI), then |
| 42 | /// the PS/2 path (which parks via `hlt` until an IRQ-fed scancode lands). | 42 | /// the PS/2 path (which parks via `hlt` until an IRQ-fed scancode lands). |
| 43 | fn poll_key() -> KeyEvent { | 43 | fn poll_key() -> KeyEvent { |
| 44 | if let Some(ev) = crate::uhci::try_poll_key() { | 44 | loop { |
| 45 | return ev; | 45 | // A GUI window has focus: the keyboard pump owns the keys. Park so |
| 46 | // the shell/editor don't steal input from the focused app. | ||
| 47 | if crate::wm::focused().is_some() { | ||
| 48 | crate::sched::sleep_ms(5); | ||
| 49 | continue; | ||
| 50 | } | ||
| 51 | if let Some(ev) = crate::uhci::try_poll_key() { | ||
| 52 | return ev; | ||
| 53 | } | ||
| 54 | if let Some(ev) = ps2::try_poll_key() { | ||
| 55 | return ev; | ||
| 56 | } | ||
| 57 | // No key ready: park briefly, then re-check focus (so a focus change | ||
| 58 | // to a GUI window is noticed instead of blocking on a stolen key). | ||
| 59 | crate::sched::sleep_ms(5); | ||
| 46 | } | 60 | } |
| 47 | ps2::poll_key() | ||
| 48 | } | 61 | } |
| 49 | 62 | ||
| 50 | /// Combined non-blocking key poll (USB first, then PS/2). | 63 | /// Combined non-blocking key poll (USB first, then PS/2). Returns `None` |
| 64 | /// while a GUI window is focused (the keyboard pump owns the keys). | ||
| 51 | fn try_poll_key() -> Option<KeyEvent> { | 65 | fn try_poll_key() -> Option<KeyEvent> { |
| 66 | if crate::wm::focused().is_some() { | ||
| 67 | return None; | ||
| 68 | } | ||
| 52 | crate::uhci::try_poll_key().or_else(ps2::try_poll_key) | 69 | crate::uhci::try_poll_key().or_else(ps2::try_poll_key) |
| 53 | } | 70 | } |
| 54 | 71 | ||
