Skip to content

m3: localize the sheet buttons, cap the editor height, follow SHELLDRIVE_LANG in the shellext, record the lab acceptance - #4

Merged
FacuM merged 8 commits into
mainfrom
wip/m3-acceptance
Nov 1, 2026
Merged

FacuM merged 8 commits into
mainfrom
wip/m3-acceptance

Conversation

@FacuM

@FacuM FacuM commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

M3 acceptance: three code fixes and the lab acceptance record

Carries the M3 acceptance outcome end to end: the three defects the lab runs confirmed, the acceptance
record that documents what the lab verified, and the XP floor-list lines the fixes need.

Code fixes

  • Property sheet buttons are localized (5f6f16c). The wizard and the profile editor are comctl32
    property sheets, so their own OK/Cancel/Back/Next/Finish buttons came from the comctl32 resources, in
    the language of Windows rather than ours. PSH_USECALLBACK plus the new ui_win_sheet_callback gives
    them the catalog texts on PSCB_INITIALIZED; the five new SD_MSG_UI_SHEET_* strings land in all six
    locales.
  • The profile editor fits a 1080 px screen at 150 % DPI (3f95100). The sheet is as tall as its
    tallest page (Connection), which pushed the sheet's own OK and Cancel off the screen. The page-template
    height is now capped to the work area minus the sheet chrome, and a page whose content is taller gets a
    vertical scroll bar (ScrollWindowEx moves the children; the bar, the mouse wheel, Tab and the error
    box of a failed apply scroll the hidden controls into view). Pages that fit are untouched.
  • The Explorer context menu follows SHELLDRIVE_LANG (269ae73, found in lab run 9). The shell
    extension passed a NULL override to sd_l10n_init and never read the variable, so with
    SHELLDRIVE_LANG=es the menus stayed English while the tray followed Spanish. 03 §9.3 ranks
    SHELLDRIVE_LANG above the user UI language for every catalog-loaded binary, and a shell extension has
    no command line; it now reads the variable like the CLI and the tray app do.
  • XP floor lists (4af9caf): the editor fix imports GetWindow, ScrollWindowEx and
    SetScrollInfo; all three are documented from Windows 2000 and are added to the XP SP2/SP3 lists in the
    established round style.

Acceptance record

9c953aa replaces the placeholder in docs/dev/m3-acceptance.md with the Hyper-V lab record
(runs 6–9, 2026-10-30, Windows 10 LTSC 2021 VM, Spanish and German at 150 % DPI):

Verified: wizard driven to the end in Spanish and German; profile "Laboratorio SFTP" created in the
editor and visible under "Ubicaciones de red"; This PC ▸ "Mount with ShellDrive" mounted the drive (tray
"Desmontar Z: (Laboratorio SFTP)", main window "1 unidad montada.", dark mode at 150 %); offline
disconnect/reconnect cycle; unmount from the drive menu. Host-key prompt: no TM-R03 violation — the
agent parked the handshake and stored the key only after the scripted "Confiar y conectar" click, and
later connections verify against the stored fingerprint. Accessibility evidence from the UIA/tab dumps
(names, control ids, tab order, mnemonics, no traps).

Not verified: the host-key prompt dialog itself (self-closes unanswered, see (a)); the Explorer menu
language fix needs a lab re-verification; the WOW64 file-dialog step cannot pass (see (c)).

Open defects (follow-ups):

  • (a) The host-key prompt dialog can vanish unanswered ~2 s after appearing (run 8). Agent behaviour
    is correct; the UI-side cause is unidentified and needs a no-answer probe run.
  • (b) Status mismatch: tray and main-window status bar reported "1 unidad montada." /
    "Desmontar Z:" while the agent mount state was failed (run 8); the DataGrid row showed "Falló"
    correctly.
  • (c) WOW64: the 32-bit common Open dialog reaches This PC, but the Z: drive item is not found by UIA
    in that view (reproduced twice in run 9).

The doc also records the doc skew the harness found: shelldrive hostkey list requires <host[:port]>
in this build while 03 §6.1 documents the host as optional.

Gate

tools/ci-local.ps1 (ctest excludes the matrix|bench|repro labels): all five presets pass —
x64-modern, x64-xp, x86-ia32, x86-sse2, x64-analysis (the x86 dokany.mount skips under WOW64
as expected). The repro label was run separately for x64-modern Release and Debug: 1/1 pass each.
Nothing is merged by this PR.

Follow-up fixes (three more commits)

  • fc0fda2 ui: count only mounted drives in the tray and the status bar fixes (b). The tray tooltip,
    tray menu and status bar counted every model entry; they now count mounted or reconnecting drives
    (03 §7.2), and a failed mount gets no Unmount item. Regression test in tests/ui/test_mainview.c.
  • ad88527 agent: offer prompts it still holds to a UI that reconnects: the likely cause of run 8's
    self-closing host-key dialog. When the UI's agent pipe is reported down it destroys every prompt dialog
    without answering; the agent keeps the prompt, but subscribe redelivers only queued prompts and
    prompt.list only closed dialogs, so the prompt was lost until the server dropped the connection.
    prompt.list now carries the prompt.request fields (like the service's list) and the UI builds
    dialogs for prompts it does not already show. The agent logs UI client connect, disconnect and
    subscribe at INFO. 03 §2.1 updated; regression test m3_prompt_list_offers_delivered_prompt_again.
  • 33889c4 cli: make the host optional in hostkey list resolves the doc skew above. Without a
    host, every key in the machine and user stores is listed with the same JSON shape. Three new strings
    in all six CLI catalogs.

Gate rerun on 33889c4: all five presets pass. One webdav.redirector failure in x64-modern Debug
(redirector_large_file_round_trip: the backend was read before the redirector's PUT landed) is a
pre-existing flake untouched by these commits. It passed 3/3 in isolation, and the x64-modern test
rerun passed 109/109 and 107/107.

FacuM added 8 commits October 30, 2026 18:25
The wizard and the profile editor are comctl32 property sheets, so their own
buttons (OK, Cancel, Back, Next, Finish) come from the comctl32 resources, in
the language of Windows rather than ours. Wire PSH_USECALLBACK in both sheets
and give the buttons the catalog texts on PSCB_INITIALIZED through the new
ui_win_sheet_callback, with the five new SD_MSG_UI_SHEET_* strings in every
locale.
The sheet is as tall as its tallest page, so on a 1080 px screen at 150 % DPI
the Connection page pushed the sheet's own OK and Cancel off the screen. Cap
the template height to the work area minus the sheet chrome, and give a page
whose content is taller a vertical scroll bar: the children below the fold are
moved with ScrollWindowEx, scrolled with the bar, the wheel and Tab, and the
error box of a failed apply scrolls into view when the page comes to the
front.
The context menu verbs came out in the Windows UI language: sd_l10n_init got
a NULL override and nothing read SHELLDRIVE_LANG, so resolution fell through
to GetUserDefaultUILanguage. 03 §9.3 ranks SHELLDRIVE_LANG above the user UI
language for every catalog-loaded binary, and the CLI and the tray app read
it (03 §9.1 leaves no Windows-loaded exception for these verbs); a shell
extension has no command line, so the environment variable is its first
choice. Found in the M3 lab (run 9): with SHELLDRIVE_LANG=es the This PC
submenu stayed English while the tray followed es.
The GUI flow and Explorer steps of the M3 outcome ran in the Hyper-V lab on
2026-10-30; the acceptance doc carried only the local gate and a placeholder
for them. Record per demo step what is verified and what is not: wizard,
editor, Network locations, This PC mount, offline state and unmount verified
in Spanish and German at 150 % DPI; the host-key prompt verified agent-side
(no TM-R03 violation, the key is stored only after the consent click) with
the dialog self-close left open; the Explorer menu language defect noted as
fixed on this branch with the lab re-verification pending. List the open
defects (prompt self-close, tray/status-bar mismatch on a failed mount,
WOW64 drive item) and the hostkey list doc skew the harness found.
The editor height fix imports GetWindow, ScrollWindowEx and SetScrollInfo;
all three are documented from Windows 2000, so they belong on the XP SP2/SP3
floor lists the same way the earlier UI rounds were added. Found by the local
gate: the x64-xp import audit of shelldrive-ui.exe failed with 3 violations.
A mount whose agent state is failed was still counted as a mounted drive:
the tray tooltip and the status bar said "1 drive mounted." and the tray
menu offered "Unmount Z: (profile)" while the main window's row already
showed "Failed". The tooltip and the status bar now count drives that are
mounted or reconnecting (03 7.2), and the tray menu skips a failed mount,
which gets no Unmount item (the Reconnect of 03 1.11 needs an agent method
this build does not have yet). Regression test in tests/ui.
When the UI's agent pipe was reported down, the dialogs were destroyed
without an answer and nothing showed the prompts again: the agent keeps
them (no prompt-capable UI left when it checked, or the reconnect won the
race), subscribe redelivers queued prompts only, and prompt.list only
closed dialogs. The mount waited for the server to drop the connection.

prompt.list now carries the prompt.request fields of every prompt it
lists (like the service's list), and the UI builds dialogs from the
entries it is not already showing, so a prompt that was showing when the
connection dropped is shown again with its remaining deadline; an open
dialog stays, so no prompt is shown twice. The agent logs UI client
connect, disconnect and prompt subscribe at INFO.
03 §6.1 documents `shelldrive hostkey list [host]`, but the parser still
required the host and exited 2. Without a host every stored key of the
machine and user stores is listed through sd_known_hosts_list_all (the
host key manager read of 5.1; live sources are not enumerated), with the
same JSON shape as the per-host list and a Host column in the text table.
The --help synopsis now matches the command set.
@FacuM
FacuM merged commit 668fb2d into main Nov 1, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant