Codeman maintainer
312a8faa06
fix(tiles): wire the Android soft-keyboard controller into every tile ( #541 parity)
...
#541 fixed Android autocorrect duplicating the typed line in the primary
pane: xterm's keyCode-229 textarea diff is append-only, so an autocorrect on
space (delete a word, insert the corrected one) sent the whole line again.
The fix, an edit-based diff that sends one DEL per deleted code point and
then the inserted text, lives in terminal-keycode229-recovery.js together
with #441 's next-keydown drain (a character committed in the same task as
Enter goes out ahead of the \r) and the original orphaned-insertText
recovery. Only the primary pane created that controller, so a grid tile or
the split's Pane B still ran xterm's stock behaviour. Both are gated on
width alone (1180 CSS px), which a wide Android tablet clears.
TerminalTile now creates its own controller in connect(), after the xterm
opens and before the first await, handed this tile's textarea, this tile's
CompositionHelper and _onTerminalData as the send path, so recovered bytes
go to the tile's own session through the exactly-once queue. As in the
primary pane, handleKeyEvent runs first in the custom key handler, above the
keyCode-229 early return, and notifyCanonicalData sits in the onData lambda,
gated on the same two CodemanTerminalInput predicates, never in
_onTerminalData, which the recovered bytes also take. destroy() tears the
controller down before disposing the xterm, which restores xterm's own diff
and removes the capture listeners. No mode or device gate, matching the
primary. The module itself is unchanged apart from its header; terminal-ui.js
gains only a comment naming the twin.
Tests: test/terminal-tile-input.test.ts now loads the real module into its
vm harness (with window timers, without which create() would silently throw
and every test would run against no controller) and drives a fake
CompositionHelper carrying xterm's own append-only diff. It covers install
and restore on the tile's own helper and textarea, autocorrect sent as an
edit (with a control reproducing the device-log duplicate), the last
character and an autocorrect each followed by Enter in one task, a
self-rescued 229 key delivered once, the onData gate ignoring query replies
and focus reports, two refused inserts after one keydown both recovered,
robustness when the controller throws, per-tile controllers, and a source pin
keeping the call above the early return. Removing the create, the
handleKeyEvent call, the notify, its gate, or the destroy each turns at least
one of them red, as does moving the notify into _onTerminalData. The browser
suite gains a TerminalTile block in
test/terminal-keycode229-recovery.browser.test.ts (real xterm, trusted
execCommand input, chunks asserted to address the tile's session, with a
destroyed-controller control).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com >
2026-10-09 08:20:02 +02:00
..
2026-08-22 14:13:57 +02:00
2026-09-14 23:46:28 +02:00
2026-09-28 15:23:22 +02:00
2026-10-09 08:20:02 +02:00
2026-10-09 06:11:18 +02:00
2026-09-06 21:53:38 +02:00
2026-09-22 17:11:33 +02:00
2026-06-10 01:38:40 +02:00
2026-07-20 17:35:40 +02:00
2026-08-10 12:29:00 +02:00
2026-10-04 23:52:41 +02:00
2026-09-07 19:09:24 +02:00
2026-09-28 16:28:29 +02:00
2026-08-12 02:30:08 +02:00
2026-09-02 08:26:45 +08:00
2026-09-07 19:09:24 +02:00
2026-08-08 22:30:39 +03:00
2026-08-21 02:37:58 +02:00
2026-08-05 01:40:37 +02:00
2026-01-27 23:15:25 +01:00
2026-06-09 20:02:15 +02:00
2026-09-24 01:57:35 +02:00
2026-09-22 08:10:05 +02:00
2026-07-12 17:50:21 +02:00
2026-10-08 14:56:42 +02:00
2026-06-19 17:58:06 -04:00
2026-06-19 17:58:06 -04:00
2026-09-06 23:11:01 +02:00
2026-09-04 16:08:57 -04:00
2026-02-12 13:44:07 +01:00
2026-10-05 20:00:30 +02:00
2026-03-07 07:33:44 +01:00
2026-02-26 16:44:34 +01:00
2026-09-22 18:53:46 +05:30
2026-09-18 16:43:04 +02:00
2026-10-05 19:51:59 +02:00
2026-10-05 20:00:30 +02:00
2026-10-05 19:51:59 +02:00
2026-09-28 16:28:56 +02:00
2026-08-07 16:41:39 +02:00
2026-08-10 11:19:51 +02:00
2026-07-20 02:48:14 +02:00
2026-09-24 01:48:33 +02:00
2026-10-08 14:55:02 +02:00
2026-03-01 16:50:23 +01:00
2026-09-02 08:26:45 +08:00
2026-09-13 17:43:13 +08:00
2026-08-22 14:36:23 +02:00
2026-09-24 01:48:26 +02:00
2026-09-24 01:48:26 +02:00
2026-10-03 11:19:42 +08:00
2026-09-02 08:26:45 +08:00
2026-09-24 01:48:26 +02:00
2026-09-28 16:18:27 +02:00
2026-10-04 23:52:41 +02:00
2026-09-04 14:20:11 +02:00
2026-08-22 14:13:57 +02:00
2026-10-08 14:56:42 +02:00
2026-08-26 18:43:52 +08:00
2026-08-09 05:02:14 +02:00
2026-10-01 17:16:18 +02:00
2026-09-06 21:53:38 +02:00
2026-08-21 08:23:31 -04:00
2026-06-10 22:47:02 +02:00
2026-09-06 21:53:38 +02:00
2026-10-01 11:18:56 +02:00
2026-07-12 18:42:36 +02:00
2026-08-09 15:56:44 +02:00
2026-09-06 23:05:26 +02:00
2026-09-28 17:10:12 +02:00
2026-06-29 11:35:56 +05:30
2026-10-06 15:46:49 +02:00
2026-09-16 20:47:12 +08:00
2026-09-19 12:32:50 +02:00
2026-09-17 13:41:19 +08:00
2026-09-17 13:41:19 +08:00
2026-09-17 12:22:45 +08:00
2026-09-20 21:19:42 +08:00
2026-09-21 04:30:01 +02:00
2026-09-17 11:09:24 +08:00
2026-09-04 16:08:57 -04:00
2026-03-01 16:50:23 +01:00
2026-08-24 18:00:52 +02:00
2026-09-13 17:42:35 +08:00
2026-10-07 19:27:45 +02:00
2026-08-24 18:00:52 +02:00
2026-08-25 18:30:41 +02:00
2026-08-25 03:08:15 +02:00
2026-10-05 19:51:59 +02:00
2026-08-22 14:13:57 +02:00
2026-10-03 08:21:54 -04:00
2026-09-23 11:40:03 +02:00
2026-09-16 16:51:00 +02:00
2026-09-14 23:56:19 +02:00
2026-09-14 23:56:19 +02:00
2026-09-13 17:43:14 +08:00
2026-09-02 19:33:32 +08:00
2026-09-28 16:28:29 +02:00
2026-08-27 19:38:38 +08:00
2026-07-20 02:36:02 +02:00
2026-09-23 14:44:26 +08:00
2026-09-04 14:36:35 +02:00
2026-10-05 19:51:59 +02:00
2026-10-05 19:51:59 +02:00
2026-06-14 08:43:57 +02:00
2026-06-14 08:43:57 +02:00
2026-06-12 09:09:14 -04:00
2026-07-12 17:50:21 +02:00
2026-09-23 11:40:03 +02:00
2026-09-02 20:41:24 -05:00
2026-06-07 04:33:11 +02:00
2026-10-07 00:03:37 +02:00
2026-08-09 22:39:07 +02:00
2026-08-23 21:40:10 -04:00
2026-09-22 13:22:28 +05:30
2026-08-05 08:44:47 +02:00
2026-06-10 01:30:43 +02:00
2026-08-29 23:31:28 -07:00
2026-09-15 20:19:47 +08:00
2026-10-01 11:19:46 +02:00
2026-09-04 16:08:57 -04:00
2026-08-19 23:35:45 +02:00
2026-06-09 20:02:15 +02:00
2026-10-06 15:46:49 +02:00
2026-09-21 04:39:28 +02:00
2026-10-09 07:35:29 +02:00
2026-09-01 12:30:48 +08:00
2026-06-19 13:10:17 -04:00
2026-07-12 17:50:21 +02:00
2026-09-23 14:44:26 +08:00
2026-09-28 16:28:56 +02:00
2026-10-09 05:36:57 +02:00
2026-10-06 20:04:45 +08:00
2026-08-23 08:39:03 +02:00
2026-08-23 08:39:03 +02:00
2026-10-08 21:36:04 +02:00
2026-10-08 22:17:27 +02:00
2026-07-12 18:06:59 +02:00
2026-10-08 04:10:55 +02:00
2026-08-10 03:15:13 +02:00
2026-09-25 19:05:16 -05:00
2026-08-10 11:16:58 +02:00
2026-09-24 22:18:07 +02:00
2026-10-09 01:02:57 +02:00
2026-08-09 14:04:34 +02:00
2026-10-04 21:36:44 +02:00
2026-09-18 22:46:11 +02:00
2026-10-09 05:57:49 +02:00
2026-08-23 14:46:10 -04:00
2026-08-14 00:14:21 +02:00
2026-10-07 06:45:16 +02:00
2026-10-07 02:11:01 +02:00
2026-10-06 09:09:51 +02:00
2026-06-12 09:09:14 -04:00
2026-10-05 09:47:08 -04:00
2026-09-14 23:56:19 +02:00
2026-08-17 01:46:48 +02:00
2026-10-06 08:55:05 +02:00
2026-10-06 08:55:05 +02:00
2026-09-13 17:43:13 +08:00
2026-09-21 03:03:31 +02:00
2026-09-02 20:41:24 -05:00
2026-08-09 18:03:13 +02:00
2026-10-04 23:52:41 +02:00
2026-09-22 19:02:55 +02:00
2026-08-16 20:34:34 +02:00
2026-08-23 08:39:03 +02:00
2026-09-02 08:26:45 +08:00
2026-03-07 07:33:44 +01:00
2026-09-28 15:22:37 -04:00
2026-10-04 23:52:41 +02:00
2026-10-04 23:52:41 +02:00
2026-08-16 20:34:34 +02:00
2026-02-26 16:44:34 +01:00
2026-10-08 20:01:45 +02:00
2026-09-08 00:56:39 -04:00
2026-10-04 23:52:41 +02:00
2026-10-04 23:52:41 +02:00
2026-09-26 22:47:48 -04:00
2026-08-19 19:14:52 +00:00
2026-09-24 01:48:26 +02:00
2026-09-22 13:22:28 +05:30
2026-09-14 23:30:14 +02:00
2026-09-28 15:23:22 +02:00
2026-09-08 00:56:39 -04:00
2026-10-08 14:56:42 +02:00
2026-02-18 12:51:35 +01:00
2026-08-09 13:23:24 +02:00
2026-06-08 11:01:34 -04:00
2026-07-19 15:32:45 +02:00
2026-02-12 13:44:07 +01:00
2026-08-04 15:02:46 +02:00
2026-07-28 23:20:01 +03:00
2026-08-28 11:32:30 -05:00
2026-09-12 05:15:41 +02:00
2026-08-28 13:45:12 -05:00
2026-09-07 22:11:54 -05:00
2026-10-09 05:13:06 +02:00
2026-09-02 20:41:24 -05:00
2026-03-21 19:23:37 +01:00
2026-03-21 07:20:18 +01:00
2026-09-14 23:56:19 +02:00
2026-07-20 04:02:46 +02:00
2026-09-24 22:18:07 +02:00
2026-09-24 22:18:07 +02:00
2026-08-09 16:16:54 +02:00
2026-09-10 12:42:33 +08:00
2026-09-20 07:18:49 +00:00
2026-10-09 05:13:06 +02:00
2026-02-26 16:44:34 +01:00
2026-08-21 02:37:58 +02:00
2026-08-13 17:23:27 +02:00
2026-09-01 11:32:18 +02:00
2026-09-14 15:59:00 +02:00
2026-08-26 18:43:52 +08:00
2026-09-14 14:28:57 +02:00
2026-08-07 01:34:47 +02:00
2026-02-12 18:26:16 +01:00
2026-06-09 20:02:17 +02:00
2026-08-09 16:03:27 +02:00
2026-10-08 14:56:42 +02:00
2026-09-24 01:35:23 +02:00
2026-01-21 22:36:45 +01:00
2026-09-02 20:41:24 -05:00
2026-02-19 14:00:10 +01:00
2026-08-20 12:58:17 -04:00
2026-06-10 18:06:45 +02:00
2026-03-01 16:50:23 +01:00
2026-08-09 23:05:11 +02:00
2026-08-09 23:05:11 +02:00
2026-09-08 00:56:39 -04:00
2026-08-09 23:05:11 +02:00
2026-09-24 22:18:07 +02:00
2026-09-14 23:56:19 +02:00
2026-10-06 08:55:05 +02:00
2026-09-04 13:50:22 +02:00
2026-07-17 16:03:03 -04:00
2026-09-14 23:42:06 +02:00
2026-09-15 14:20:31 +02:00
2026-07-17 15:54:32 -04:00
2026-09-07 21:30:31 -05:00
2026-09-14 23:42:06 +02:00
2026-08-07 05:05:41 +02:00
2026-10-08 10:39:19 -04:00
2026-10-08 00:15:50 -04:00
2026-08-21 02:25:43 +02:00
2026-03-07 07:33:44 +01:00
2026-02-26 16:44:34 +01:00
2026-06-10 20:41:34 +02:00
2026-03-07 07:33:44 +01:00
2026-03-07 07:33:44 +01:00
2026-08-09 15:31:02 +02:00
2026-07-12 18:21:42 +02:00
2026-01-25 07:52:40 +01:00
2026-09-23 11:40:27 +02:00
2026-08-18 10:59:44 -04:00
2026-03-01 14:33:18 +01:00
2026-09-24 01:35:23 +02:00
2026-08-19 19:14:52 +00:00
2026-09-28 15:22:37 -04:00
2026-09-12 05:15:41 +02:00
2026-08-21 02:25:43 +02:00
2026-09-01 12:30:48 +08:00
2026-10-04 19:05:43 +02:00
2026-07-17 16:26:28 -04:00
2026-08-18 10:46:21 -04:00
2026-10-07 11:48:47 +02:00
2026-09-24 01:48:26 +02:00
2026-09-20 21:37:05 +08:00
2026-10-09 06:12:18 +02:00
2026-10-09 05:02:27 +02:00
2026-10-09 04:46:45 +02:00
2026-08-23 14:46:10 -04:00
2026-06-10 03:41:04 +02:00
2026-02-18 18:14:13 +01:00
2026-08-10 03:15:13 +02:00
2026-06-09 20:02:15 +02:00
2026-09-24 01:35:27 +02:00
2026-08-16 20:34:34 +02:00
2026-09-24 01:48:26 +02:00
2026-08-09 01:34:55 +02:00
2026-10-09 03:37:41 +02:00
2026-07-12 19:49:58 +02:00
2026-09-15 17:59:16 +02:00
2026-06-10 20:41:34 +02:00
2026-09-28 16:18:27 +02:00
2026-09-07 08:48:31 +02:00
2026-09-02 20:41:24 -05:00
2026-08-09 01:18:03 +02:00
2026-08-17 22:54:46 +02:00
2026-10-07 19:41:56 +02:00
2026-09-21 18:21:21 +02:00
2026-10-09 03:37:42 +02:00
2026-08-10 03:15:13 +02:00
2026-10-08 21:36:04 +02:00
2026-08-24 22:58:28 +02:00
2026-10-07 13:31:59 +02:00
2026-09-14 23:46:28 +02:00
2026-10-04 23:52:41 +02:00
2026-08-23 12:21:02 -04:00
2026-08-23 12:21:02 -04:00
2026-08-23 14:46:10 -04:00
2026-07-17 16:21:16 -04:00
2026-08-16 05:11:00 +02:00
2026-10-07 02:07:27 +02:00
2026-09-22 09:19:55 +02:00
2026-07-17 16:25:29 -04:00
2026-09-22 18:53:46 +05:30
2026-10-06 16:24:52 +02:00
2026-08-23 12:21:02 -04:00
2026-09-23 11:40:27 +02:00
2026-02-26 16:44:34 +01:00
2026-09-15 17:59:16 +02:00
2026-09-19 11:38:59 +02:00
2026-09-01 02:31:26 +02:00
2026-08-09 01:18:03 +02:00
2026-10-09 03:37:41 +02:00
2026-08-09 21:32:04 -04:00
2026-06-10 01:30:43 +02:00
2026-09-24 01:35:23 +02:00
2026-09-28 16:30:40 +02:00
2026-08-05 01:40:37 +02:00
2026-10-06 09:28:08 +02:00
2026-10-06 09:28:08 +02:00
2026-10-08 20:00:10 +02:00
2026-09-23 11:40:03 +02:00
2026-09-21 04:53:19 +02:00
2026-09-20 13:10:26 -05:00
2026-10-07 13:32:00 +02:00
2026-09-20 13:10:34 -05:00
2026-09-20 13:10:27 -05:00
2026-09-20 13:10:30 -05:00
2026-09-20 13:10:32 -05:00
2026-09-20 13:10:29 -05:00
2026-10-09 05:13:06 +02:00
2026-10-03 08:21:54 -04:00
2026-10-05 21:30:29 -04:00
2026-09-27 07:55:29 -04:00
2026-10-05 21:30:29 -04:00
2026-10-05 21:30:29 -04:00
2026-08-07 01:31:50 +02:00
2026-09-15 21:01:53 +02:00
2026-09-02 20:41:24 -05:00
2026-08-13 17:28:35 +02:00
2026-06-09 20:02:15 +02:00
2026-09-18 22:46:11 +02:00
2026-08-13 17:28:35 +02:00
2026-09-02 20:41:24 -05:00
2026-10-09 04:48:43 +02:00
2026-03-07 07:33:44 +01:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-10-08 00:24:55 -04:00
2026-09-14 15:59:00 +02:00
2026-01-22 11:30:10 +01:00
2026-05-12 10:11:47 +02:00
2026-06-15 01:43:15 +02:00
2026-09-22 12:25:36 +05:30
2026-10-04 23:52:41 +02:00
2026-10-08 21:36:04 +02:00
2026-10-09 01:02:57 +02:00
2026-10-04 20:10:32 -04:00
2026-10-04 20:21:44 -04:00
2026-10-05 19:51:59 +02:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-10-04 20:10:32 -04:00
2026-08-23 14:46:10 -04:00
2026-08-24 00:59:48 +02:00
2026-10-08 22:17:27 +02:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-10-05 19:51:59 +02:00
2026-08-23 12:21:02 -04:00
2026-10-08 21:36:04 +02:00
2026-10-06 04:08:02 +02:00
2026-08-23 12:21:02 -04:00
2026-08-25 18:26:07 +02:00
2026-10-08 22:17:27 +02:00
2026-02-28 17:39:44 +01:00
2026-02-28 17:39:44 +01:00
2026-01-21 07:19:49 +01:00
2026-02-26 16:44:34 +01:00
2026-06-10 18:06:45 +02:00
2026-08-20 10:46:11 +02:00
2026-09-18 21:38:40 +02:00
2026-09-22 19:02:55 +02:00
2026-08-05 02:38:57 +02:00
2026-09-07 19:11:20 -04:00
2026-09-18 21:34:42 +02:00
2026-09-22 13:22:28 +05:30
2026-10-06 10:07:40 +02:00
2026-09-14 14:09:13 +02:00
2026-06-30 19:52:49 -04:00
2026-07-12 12:39:46 +02:00
2026-10-09 08:20:02 +02:00
2026-10-09 05:46:56 +02:00
2026-06-09 15:39:03 -04:00
2026-10-06 10:20:25 +02:00
2026-08-19 19:41:43 +00:00
2026-02-26 16:44:34 +01:00
2026-09-23 11:40:03 +02:00
2026-09-22 13:07:33 +05:30
2026-10-08 20:06:53 +02:00
2026-09-22 13:22:28 +05:30
2026-10-09 07:18:47 +02:00
2026-09-14 23:56:19 +02:00
2026-10-09 08:20:02 +02:00
2026-10-09 07:35:29 +02:00
2026-10-09 07:35:29 +02:00
2026-10-09 07:35:29 +02:00
2026-10-09 07:18:47 +02:00
2026-09-24 01:35:23 +02:00
2026-10-08 14:56:42 +02:00
2026-08-18 19:55:23 +02:00
2026-10-07 09:37:04 +02:00
2026-10-07 09:37:04 +02:00
2026-10-08 04:10:55 +02:00
2026-10-08 03:08:14 +02:00
2026-10-08 21:36:04 +02:00
2026-10-06 16:24:52 +02:00
2026-10-08 03:53:10 +02:00
2026-10-08 17:33:26 +02:00
2026-10-08 04:40:15 +02:00
2026-10-07 09:37:04 +02:00
2026-10-08 17:48:04 +02:00
2026-10-08 17:33:26 +02:00
2026-10-08 02:46:23 +02:00
2026-10-07 09:40:19 +02:00
2026-10-08 04:40:15 +02:00
2026-10-08 03:08:14 +02:00
2026-10-08 04:10:55 +02:00
2026-10-08 04:40:15 +02:00
2026-10-08 04:40:15 +02:00
2026-10-08 22:17:27 +02:00
2026-10-08 04:10:55 +02:00
2026-10-08 04:40:15 +02:00
2026-10-08 22:17:27 +02:00
2026-10-08 04:10:55 +02:00
2026-10-07 07:11:08 +02:00
2026-10-07 13:32:00 +02:00
2026-06-09 15:39:03 -04:00
2026-09-19 10:44:35 +02:00
2026-09-24 22:18:07 +02:00
2026-07-12 19:49:58 +02:00
2026-07-10 11:14:26 -04:00
2026-05-25 23:28:58 +02:00
2026-08-09 18:03:13 +02:00
2026-07-20 03:26:21 +02:00
2026-10-06 16:24:52 +02:00
2026-06-10 20:41:34 +02:00
2026-09-14 15:59:00 +02:00
2026-07-20 02:58:51 +02:00
2026-01-22 11:30:10 +01:00
2026-09-14 15:57:08 +02:00
2026-10-06 09:09:51 +02:00
2026-08-10 11:19:51 +02:00
2026-09-23 11:40:03 +02:00
2026-07-12 12:42:36 +02:00
2026-10-04 23:52:41 +02:00
2026-10-04 23:52:41 +02:00
2026-10-04 23:52:41 +02:00
2026-10-08 14:56:41 +02:00
2026-09-14 23:38:54 +02:00
2026-09-04 15:21:13 +02:00
2026-09-04 15:21:12 +02:00
2026-09-04 15:21:12 +02:00
2026-09-14 23:38:54 +02:00
2026-09-14 23:38:54 +02:00
2026-07-29 09:01:18 +02:00
2026-08-09 04:06:23 +02:00
2026-09-14 23:38:54 +02:00
2026-09-26 22:45:35 -04:00
2026-08-23 14:12:38 -04:00
2026-07-21 00:04:40 +08:00
2026-10-05 20:00:30 +02:00
2026-07-12 18:42:36 +02:00
2026-07-12 18:42:36 +02:00
2026-07-12 18:42:36 +02:00
2026-10-09 05:46:56 +02:00