Windows Computer Use Ctrl chords fail in Flutter with zero scan codes
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.4k
- PR merge metrics
- PR metrics pending
Description
Summary
The supported Computer Use @oai/sky API cannot paste or select all in a focused standard Flutter Windows TextField on the tested setup. Incoming Ctrl and letter-key messages have scan code zero. Flutter maps them to the same physical key identity and loses the Ctrl modifier before handling the letter key.
This matches the class of Windows synthetic-input compatibility problem described in flutter/flutter#99198, which was still open when checked. It does not establish that Computer Use is the only component responsible, or that zero scan codes are unique to this tool.
Please investigate whether the Windows input backend can provide consistent ordinary-key scan codes and extended-key information for generated chords. The internal injection implementation and exact function used by the tool have not been inspected.
Tested environment
- Windows desktop, x64, visible focused test window.
- Computer Use bundle:
26.901.51231. - Client: the supported
@oai/skyAPI through Codex Node REPL. - Flutter:
3.44.9, Windows Debug. - Engine revision:
5a2a6a42cce67f965cf540fcecf616faca624aa1. - The baseline and comparison receiver used the same engine DLL.
- A standalone receiver with a default Flutter TextField was used; no application-specific shortcuts or input filters were involved.
Reproduction
- Open a standalone Flutter Windows app containing a default TextField.
- Select its actual returned Computer Use window, click the field, and refresh to verify focus. Use that returned object as
windowbelow. - Call
await sky.type_text({window, text: 'q'}), then refresh. The field remains empty. - Call
await sky.press_key({window, key: 'q'}), then refresh. The field now containsq. - Call
await sky.press_key({window, key: 'Control_L+a'}), then refresh. The text is not selected; the selection stays collapsed at the end. - As a control, put a known synthetic sentence on the clipboard and use the field's visible Paste menu. The full sentence appears.
Expected: type_text inserts the requested text and Ctrl+A selects the field contents.
Observed: the supported type_text call reaches this receiver as Ctrl+V. It does not deliver a q character through the printable WM_CHAR path in step 3. The documented Control_L chord spelling does not resolve the selection failure.
Receiver evidence
Baseline observations from 2026-09-07 UTC:
| Action | Native receiver | Flutter result |
|---|---|---|
type_text('q'), 18:22:03 |
Ctrl/V, ordinary scan fields zero, WM_CHAR 0x16 |
Ctrl/V share physical ID 0x1600000000; V keydown has Ctrl false; field remains empty |
press_key('q'), 18:22:24 |
WM_CHAR 0x71 |
Text becomes q |
Control_L+a, 18:22:55 |
Ctrl/A, ordinary scan fields zero | A keydown has Ctrl false; selection remains 1:1 |
| Visible Paste menu, 18:23:52 | Clipboard control | Entire 55-character Korean/English sentence appears |
The native receiver saw generic Ctrl down while V was delivered. The issue is therefore not explained solely by the absence of an OS Ctrl-down event.
The baseline native observer forwards the exact received arguments to DefSubclassProc. Its Dart HardwareKeyboard observer returns false. Both observers log synchronously; timing-neutral behavior is not claimed. Duplicate native messages may be engine redispatch and are not evidence of duplicate tool calls.
Controlled comparison
Only in the separate diagnostic receiver, missing ordinary-key scan fields and related WM_CHAR scan fields were supplied using MapVirtualKeyEx. The same tool and engine then produced:
- Ctrl scan
0x1d, physical ID0x700e0. - V scan
0x2f, physical ID0x70019; Ctrl remained true at V keydown. - Successful insertion of the same 55-character Korean/English sentence.
- Successful
Control_L+a, selection0:55. - Successful replacement of that selection by the same
type_text('q')call.
This comparison establishes that distinct ordinary-key scan information resolves the tested failure. It is not a production patch or complete IME, keyboard-layout, extended-key, or accessibility compatibility test. VK_PACKET was excluded from the experimental normalization; its Unicode WM_CHAR path should be handled separately.
Upstream context and limits
- Flutter issue #99198 describes different logical keys sharing scan code zero during emulated Windows shortcuts, including Ctrl+V. The issue remained open on 2026-09-08 KST.
- The inspected Flutter
stableandmaincopies of keyboard_key_embedder_handler.cc had the same blob SHA,9351f6e04d791d4c70dfbe60ecc0e1037270af2a.GetPhysicalKeystill uses the scan code for its fallback physical identity. This source observation does not substitute for testing a different SDK or prove that no other input-path changes exist. - No applicable released fix was identified in this bounded source/issue review. No SDK update was installed or tested as part of that review.
- Physical-keyboard and general IME behavior were not tested. The finding concerns the observed automated input sequence.
- No Computer Use implementation, Flutter SDK, or product keyboard handler was patched.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the standalone Flutter Windows TextField reproduction and compare type_text('q'), press_key('q'), and Control_L+a while logging the received messages. Read Flutter's keyboard_key_embedder_handler.cc, especially GetPhysicalKey, and trace the Computer Use Windows input path. Done means ordinary-key scan codes and extended-key information are consistent enough for text insertion, Ctrl+A selection, and replacement to work.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- dart, flutter
- Domain
- desktop, operating-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100