Brennan Benson
cd98242b8c
fix(terminal): harden kitty Option-chord mirror for soft resets, replay redelivery, and non-QWERTY layouts
...
Three review findings on the kitty keyboard mirror, each verified against a
live omp 16.3.15 pty session using the real production modules:
- DECSTR: xterm's soft reset (CSI ! p) clears its kitty flags and stacks for
both screens without switching buffers; the tracker now mirrors that, so a
soft-resetting TUI stops receiving kitty-encoded Option chords.
- Replay redelivery: relay reconnects can redeliver the retained replay
window, and each scan of the app's one-time CSI > u push grew the mirrored
stack while the renderer's post-replay reset drained xterm's copy. The
TUI's single exit pop (omp emits a bare CSI < u on quit) then landed on a
stale frame, leaving Option+B/F/D kitty-encoded in a plain shell. Replay
paths now scan with scanReplay(), which applies pushes as idempotent sets
so redelivery cannot grow the stack; the live-output funnel and the
daemon's once-per-byte emulator keep full stack semantics.
- Layout-correct base keys: kitty CSI-u reports must carry the key's
unshifted codepoint in the active layout, but the encoder resolved it from
a US-QWERTY physical-code table — on Dvorak/Colemak/AZERTY-class layouts
(exactly the population whose effective Option-as-Alt default activates
this path) the wrong key's chord fired, e.g. Colemak Option+P sent alt+r.
A new keyboard-layout module caches Chromium's KeyboardLayoutMap (fetched
at terminal setup and on focus-in, like the option-as-alt probe) and the
policy resolves through it before the US fallback. Verified live: the
layout-resolved bytes open omp's model selector; the US-table bytes do not.
2026-07-10 01:00:18 -07:00
..
2026-07-07 14:21:23 -07:00
2026-07-08 21:47:02 -07:00
2026-06-29 22:38:29 -07:00
2026-07-03 16:26:53 -07:00
2026-07-06 02:12:32 -07:00
2026-07-06 02:12:32 -07:00
2026-07-05 23:09:14 -07:00
2026-07-05 23:09:14 -07:00
2026-07-09 02:13:13 -07:00
2026-07-03 16:26:53 -07:00
2026-07-06 01:16:23 -07:00
2026-07-06 02:12:32 -07:00
2026-07-06 02:12:32 -07:00
2026-07-09 17:16:49 -07:00
2026-07-09 19:40:11 -07:00
2026-06-08 19:23:32 -04:00
2026-07-06 02:12:32 -07:00
2026-07-03 16:26:53 -07:00
2026-07-05 21:55:03 -07:00
2026-07-03 16:26:53 -07:00
2026-06-30 01:21:07 -07:00
2026-07-03 16:26:53 -07:00
2026-07-10 01:00:18 -07:00
2026-07-03 16:26:53 -07:00
2026-07-06 15:12:56 -07:00
2026-05-16 14:36:46 -07:00
2026-07-07 14:21:23 -07:00
2026-07-05 23:56:37 -07:00
2026-07-03 16:26:53 -07:00
2026-07-05 23:56:37 -07:00
2026-07-09 18:06:30 -04:00
2026-07-05 23:09:14 -07:00
2026-07-06 22:02:59 -07:00
2026-07-09 18:06:30 -04:00
2026-07-03 16:26:53 -07:00
2026-06-29 22:38:29 -07:00
2026-06-29 20:02:28 -07:00
2026-07-09 22:37:40 -04:00
2026-06-29 22:38:29 -07:00
2026-06-29 22:38:29 -07:00
2026-07-03 16:26:53 -07:00
2026-04-20 19:41:12 -07:00
2026-07-05 23:55:56 -07:00
2026-06-29 20:17:46 -07:00
2026-07-05 02:53:17 -07:00
2026-06-29 22:38:29 -07:00
2026-07-05 01:15:16 -07:00
2026-07-06 19:08:42 -07:00
2026-06-29 22:38:29 -07:00
2026-07-07 19:21:07 -04:00
2026-05-30 02:46:28 -07:00
2026-07-06 02:12:32 -07:00
2026-07-06 02:12:32 -07:00
2026-07-09 02:13:13 -07:00
2026-07-08 17:05:21 -07:00
2026-06-29 22:38:29 -07:00
2026-07-06 02:12:32 -07:00
2026-07-08 19:41:09 -04:00
2026-07-07 21:24:08 -07:00
2026-07-09 14:47:28 -07:00
2026-07-09 19:21:55 -07:00
2026-06-28 15:43:07 -07:00
2026-07-06 02:12:32 -07:00
2026-07-09 05:00:58 -07:00
2026-05-30 13:26:48 -07:00
2026-07-08 13:59:42 -07:00
2026-06-29 22:38:29 -07:00
2026-07-06 02:13:10 -07:00
2026-06-29 22:38:29 -07:00
2026-06-29 18:09:33 -07:00
2026-06-29 22:38:29 -07:00
2026-07-08 21:39:49 -07:00
2026-07-05 23:56:37 -07:00
2026-07-09 13:05:32 -07:00
2026-06-17 16:20:37 -07:00
2026-06-17 16:20:37 -07:00
2026-05-18 14:09:21 -07:00
2026-05-18 14:09:21 -07:00
2026-05-18 14:09:21 -07:00
2026-06-17 16:08:14 -07:00
2026-06-17 16:08:14 -07:00
2026-06-22 18:01:37 -07:00
2026-06-22 18:01:37 -07:00
2026-04-19 12:09:32 -07:00
2026-05-15 23:52:37 -07:00
2026-06-30 11:31:55 -07:00
2026-06-30 11:31:55 -07:00
2026-06-30 11:31:55 -07:00
2026-06-30 11:31:55 -07:00
2026-06-30 11:31:55 -07:00
2026-07-09 22:37:40 -04:00
2026-07-09 22:37:40 -04:00
2026-05-30 15:26:11 -04:00
2026-06-29 22:38:29 -07:00
2026-06-19 17:14:55 -07:00
2026-06-29 22:38:29 -07:00
2026-06-30 11:31:55 -07:00
2026-06-30 11:31:55 -07:00
2026-07-09 17:16:49 -07:00
2026-06-29 22:38:29 -07:00
2026-05-30 09:04:52 -07:00
2026-05-30 09:04:52 -07:00
2026-06-17 16:08:14 -07:00
2026-06-29 00:53:07 -07:00
2026-06-29 00:53:07 -07:00
2026-06-28 23:23:47 -07:00
2026-06-28 23:23:47 -07:00
2026-07-06 16:43:05 -07:00
2026-07-06 16:43:05 -07:00
2026-05-30 09:04:52 -07:00
2026-05-30 09:04:52 -07:00
2026-07-09 14:52:03 -07:00
2026-07-09 14:52:03 -07:00
2026-06-24 00:17:49 -07:00
2026-06-24 00:17:49 -07:00
2026-06-17 16:08:14 -07:00
2026-06-17 16:08:14 -07:00
2026-06-24 21:07:15 -04:00
2026-06-29 22:38:29 -07:00
2026-06-18 16:24:22 -07:00
2026-06-25 17:24:09 -07:00
2026-06-24 19:19:31 -07:00
2026-06-24 19:19:31 -07:00
2026-06-24 19:19:31 -07:00
2026-07-03 19:40:45 -04:00
2026-07-03 19:40:45 -04:00
2026-06-29 22:38:29 -07:00
2026-06-29 22:38:29 -07:00
2026-06-29 22:38:29 -07:00
2026-07-09 16:24:20 -07:00
2026-07-09 16:24:20 -07:00
2026-07-03 17:52:59 -07:00
2026-07-03 17:52:59 -07:00
2026-06-21 18:51:44 -07:00
2026-06-13 14:16:05 -07:00
2026-05-21 21:52:26 -07:00
2026-05-21 21:52:26 -07:00
2026-05-21 21:52:26 -07:00
2026-05-21 21:52:26 -07:00
2026-07-06 20:21:58 -07:00
2026-07-06 20:21:58 -07:00
2026-07-07 12:43:53 -07:00
2026-07-07 12:43:53 -07:00
2026-07-06 02:12:32 -07:00
2026-06-29 22:38:29 -07:00
2026-07-09 02:13:13 -07:00
2026-04-14 10:25:55 -07:00
2026-07-05 23:09:14 -07:00
2026-06-20 16:39:42 -07:00
2026-05-26 20:56:11 -07:00
2026-06-17 16:20:37 -07:00
2026-05-30 13:09:17 -07:00
2026-07-05 23:09:14 -07:00
2026-05-27 00:47:01 -07:00
2026-07-05 02:53:17 -07:00
2026-07-05 23:56:37 -07:00
2026-07-06 15:12:56 -07:00
2026-05-26 20:56:11 -07:00
2026-06-20 16:39:42 -07:00
2026-07-08 22:28:13 -07:00
2026-07-08 22:28:13 -07:00
2026-05-31 10:11:51 -07:00
2026-05-31 10:11:51 -07:00
2026-05-06 23:30:03 -07:00
2026-06-29 22:38:29 -07:00
2026-07-09 22:37:40 -04:00
2026-06-10 16:41:22 -04:00
2026-05-30 11:01:09 -07:00
2026-07-06 02:12:32 -07:00
2026-05-30 11:01:09 -07:00
2026-07-04 21:31:51 -07:00
2026-07-04 21:31:51 -07:00
2026-07-04 21:31:51 -07:00
2026-06-29 18:02:10 -07:00
2026-06-03 12:25:54 -07:00
2026-06-03 12:25:54 -07:00
2026-06-29 22:38:29 -07:00
2026-07-02 11:24:07 -07:00
2026-07-02 11:24:07 -07:00
2026-07-02 11:24:07 -07:00
2026-06-15 14:54:50 -07:00
2026-06-29 22:38:29 -07:00
2026-05-29 16:06:33 -07:00
2026-05-29 16:06:33 -07:00
2026-05-29 16:06:33 -07:00
2026-06-29 00:32:36 -07:00
2026-06-29 22:38:29 -07:00
2026-06-29 22:38:29 -07:00
2026-06-29 22:38:29 -07:00