fix #394 #395 #396: OP8 re-gate round — caption font, retail key names, capture dialog

Three findings from the user's first Configure Keyboard look (OP8 gate,
2026-08-14), each root-caused against the named retail decomp:

- #394 row-caption font: the synthesized action-label UiText never set
  DatFont and fell to the debug bitmap font. The authored row template
  (0x21000009/0x1000002F, retail UIOption_ActionKeyMap) carries FontDid
  0x4000000A (18px serif) — Bind now takes resolveTemplateFont and applies
  the template's own authored font, resolved once per template pair.

- #395 key captions: raw enum spellings ("Shift+ShiftLeft") replaced by the
  port of CInputManager_WIN32::GetNameFromKey @0x00687F40 /
  GetNameFromKey_Internal @0x00687800 (RetailKeyNames): DAT string-table
  override by DIK-name hash (key enum 4 -> 0x2300000A, meta enum 5 ->
  0x2300000B, delimiter enum 3 -> 0x23000007 — GetDIDByEnum category 4,
  live-probed), else the OS keyboard layout's own key name ("SKIFT") via
  PlatformKeyNameProvider (Win32 GetKeyNameTextW — register row AD-96 for
  the DirectInput-vs-GetKeyNameText adaptation), else the DIK-suffix
  spelling. Bare modifier-key bindings show only the key name.

- #396 capture feedback: clicking a mapping button now opens retail's
  instruction dialog (InitiateBinding @0x004899D0 -> OpenMapWarnDialog
  @0x00488A00): a type-2 WAIT dialog on retail's MapWarn queue key
  0x10000001 with ID_ActionKeyMap_MapInstructions (0x23000004, ACTION
  variable interpolated), closed on key hit or ESC through the capture
  callback; capture is not armed if the dialog cannot open, matching
  retail. New RetailWaitDialogView (wait root 0x31 — same authored
  popup/message pair 0x3D/0x3E as the confirmation root, live-DAT probed)
  behind a shared IRetailDialogView presenter seam.

Probe evidence (env-gated, kept):
KeyboardConfigLiveMountProbeTests.ProbeKeyboardFontsAndKeyNameStrings.
Register: AD-96 filed. Gate script OP8 section updated (step 4 rewritten;
the "pressed/active state is enough" contract is retired).

Full Release solution suite green (13,424 passed / 4 skips).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-14 13:45:55 +02:00
parent 1528e5693b
commit 30fa6ee507
16 changed files with 1105 additions and 24 deletions

View file

@ -24,6 +24,62 @@ What does NOT go here:
- Every session: scan OPEN issues at start; promote/close anything we touched during the session before ending.
- Promoting to a Phase: mark as `DONE (promoted to Phase X)` + commit SHA where the Phase entry landed.
## #396 — Configure Keyboard: no capture-instruction dialog on a mapping-button click
**Status:** ROOT-CAUSED + FIXED (this commit) — pending the user's re-gate.
Filed 2026-08-14 at the OP8 re-gate (user report: "nothing happens when I
press an option button", with the retail screenshot showing the instruction
dialog). The OP8 port armed `InputDispatcher.BeginCapture` with no visible
feedback; retail's `UIOption_ActionKeyMap::InitiateBinding @0x004899D0`
opens a type-2 WAIT dialog (`OpenMapWarnDialog @0x00488A00`: queue key
`0x10000001`, text `ID_ActionKeyMap_MapInstructions` from table `0x23000004`
with the row's action label as its ACTION variable — "The next key you press
or mouse button that you click will be mapped to the '…' action. … Press the
ESC key to cancel.") BEFORE registering the key handler, and refuses to arm
capture if the dialog cannot open. Fix: `RetailWaitDialogView` (wait root
`0x31` — same authored popup/message pair `0x3D`/`0x3E` as the confirmation
root, live-DAT probed) + `RetailDialogFactory.MakeWait` +
`KeyboardConfigController.Bindings.Open/CloseCaptureInstructions`, closed on
key hit or ESC through the capture callback. Retail's own text supplies the
ESC line; ESC handling stays in the dispatcher's modal capture (a dialog-side
cancel would race it).
## #395 — Configure Keyboard: key captions show raw enum spellings, not retail's localized key names
**Status:** ROOT-CAUSED + FIXED (this commit) — pending the user's re-gate.
Filed 2026-08-14 at the OP8 re-gate (user report: acdream shows
"Shift+ShiftLeft" where retail shows "SKIFT" on their Swedish layout).
`DescribeChord` printed Silk enum spellings; retail's
`CInputManager_WIN32::GetNameFromKey @0x00687F40` resolves each control
through `GetNameFromKey_Internal @0x00687800`: DAT string-table override by
ELF hash of the DIK name (key table enum 4 → `0x2300000A`, meta enum 5 →
`0x2300000B` — GetDIDByEnum category 4, live-probed; the shipped tables
author exactly `DIK_LCONTROL` → "Left Ctrl" and `DIK_LMENU` → "Left Alt"),
else the OS keyboard layout's own name, with modifier prefixes joined by the
authored `ID_KeyDescDelimiter` ("+", `0x23000007`) and a bare modifier-key
binding showing only the key name (retail's walk-mode row is meta-mode 0).
Fix: `RetailKeyNames` (the pipeline port) + `PlatformKeyNameProvider`
(Win32 `GetKeyNameTextW` — register row AD-96 for the
DirectInput-vs-GetKeyNameText adaptation and the non-Windows fallback).
## #394 — Configure Keyboard: row captions render in the debug bitmap font, not the authored 18px serif
**Status:** ROOT-CAUSED + FIXED (this commit) — pending the user's re-gate.
Filed 2026-08-14 at the OP8 re-gate (user side-by-side screenshot: acdream's
"Move Forward" label vs retail's serif). The controller-synthesized row
caption (`BuildActionRow`'s composed `UiText`) never set `DatFont`, so it
fell back to the debug bitmap font; the authored action-row template
(`0x21000009` element `0x1000002F`, retail type `UIOption_ActionKeyMap`)
carries `FontDid 0x4000000A` — the 18px serif retail draws the label with
(live-DAT probed: header `0x1000002E` = `0x4000000F` 30px gothic, key
buttons `0x10000030-32` = `0x40000001` 18px serif — the buttons already
resolved their authored font through the production template build; only the
synthesized caption was wrong). Fix: `Bind` takes `resolveTemplateFont`,
resolved once per template pair from the row template's own authored FontDid
and applied to the caption `UiText`. Probe evidence:
`KeyboardConfigLiveMountProbeTests.ProbeKeyboardFontsAndKeyNameStrings`
(env-gated, kept).
## #393 — Texture detail options: retail's "High Resolution Textures" toggle + Landscape/Environment TextureDetail mip-skip
**Status:** OPEN — filed 2026-08-14 from the highres-texture verification