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:
parent
1528e5693b
commit
30fa6ee507
16 changed files with 1105 additions and 24 deletions
|
|
@ -2628,7 +2628,44 @@ public sealed class RetailUiRuntime : IDisposable
|
|||
DialogFactory.MakeConfirmation(
|
||||
message,
|
||||
data => onResult(data.GetBoolean(RetailDialogProperty.ConfirmationResult)));
|
||||
}));
|
||||
},
|
||||
// OP8 re-gate (2026-08-14): retail's capture-instruction dialog
|
||||
// (InitiateBinding @ 0x004899D0 → OpenMapWarnDialog @ 0x00488A00):
|
||||
// a type-2 wait dialog on retail's own MapWarn queue key
|
||||
// 0x10000001, text = ID_ActionKeyMap_MapInstructions (table
|
||||
// 0x23000004) with the row's action label as its one ACTION
|
||||
// variable. Same lazy DialogFactory read as ConfirmOverwrite.
|
||||
OpenCaptureInstructions: actionLabel =>
|
||||
{
|
||||
if (DialogFactory is null) return 0u;
|
||||
string? text = strings.ResolveTemplate(
|
||||
0x23000004u,
|
||||
"ID_ActionKeyMap_MapInstructions",
|
||||
new Dictionary<uint, string>
|
||||
{
|
||||
[DatStringResolver.ComputeHash("ACTION")] = actionLabel,
|
||||
});
|
||||
if (text is null) return 0u; // no invented English
|
||||
// The authored text stores its blank line as a literal
|
||||
// "\n\n" two-character escape (live-probed) — same
|
||||
// convention DatWidgetFactory/IndicatorDetailText already
|
||||
// unescape for other DAT-authored strings.
|
||||
text = text.Replace("\\n", "\n", StringComparison.Ordinal);
|
||||
return DialogFactory.MakeWait(text, queueKey: 0x10000001u);
|
||||
},
|
||||
CloseCaptureInstructions: context =>
|
||||
DialogFactory?.CloseDialog(context)),
|
||||
resolveTemplateFont: (templateLayoutId, templateElementId) =>
|
||||
{
|
||||
lock (_bindings.Assets.DatLock)
|
||||
{
|
||||
ElementInfo? templateInfo = LayoutImporter.ImportInfos(
|
||||
_bindings.Assets.Dats, templateLayoutId, templateElementId);
|
||||
return templateInfo is null || templateInfo.FontDid == 0u
|
||||
? null
|
||||
: _bindings.Assets.ResolveFont(templateInfo.FontDid);
|
||||
}
|
||||
});
|
||||
|
||||
if (controller is null)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue