Repository navigation
m3: localize the sheet buttons, cap the editor height, follow SHELLDRIVE_LANG in the shellext, record the lab acceptance - #4
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
5f6f16c). The wizard and the profile editor are comctl32property sheets, so their own OK/Cancel/Back/Next/Finish buttons came from the comctl32 resources, in
the language of Windows rather than ours.
PSH_USECALLBACKplus the newui_win_sheet_callbackgivesthem the catalog texts on
PSCB_INITIALIZED; the five newSD_MSG_UI_SHEET_*strings land in all sixlocales.
3f95100). The sheet is as tall as itstallest 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 (
ScrollWindowExmoves the children; the bar, the mouse wheel, Tab and the errorbox of a failed apply scroll the hidden controls into view). Pages that fit are untouched.
SHELLDRIVE_LANG(269ae73, found in lab run 9). The shellextension passed a NULL override to
sd_l10n_initand never read the variable, so withSHELLDRIVE_LANG=esthe menus stayed English while the tray followed Spanish. 03 §9.3 ranksSHELLDRIVE_LANGabove the user UI language for every catalog-loaded binary, and a shell extension hasno command line; it now reads the variable like the CLI and the tray app do.
4af9caf): the editor fix importsGetWindow,ScrollWindowExandSetScrollInfo; all three are documented from Windows 2000 and are added to the XP SP2/SP3 lists in theestablished round style.
Acceptance record
9c953aareplaces the placeholder indocs/dev/m3-acceptance.mdwith 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):
is correct; the UI-side cause is unidentified and needs a no-answer probe run.
"Desmontar Z:" while the agent mount state was
failed(run 8); the DataGrid row showed "Falló"correctly.
in that view (reproduced twice in run 9).
The doc also records the doc skew the harness found:
shelldrive hostkey listrequires<host[:port]>in this build while 03 §6.1 documents the host as optional.
Gate
tools/ci-local.ps1(ctest excludes thematrix|bench|reprolabels): all five presets pass —x64-modern,x64-xp,x86-ia32,x86-sse2,x64-analysis(the x86dokany.mountskips under WOW64as expected). The repro label was run separately for
x64-modernRelease and Debug: 1/1 pass each.Nothing is merged by this PR.
Follow-up fixes (three more commits)
fc0fda2ui: 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.ad88527agent: offer prompts it still holds to a UI that reconnects: the likely cause of run 8'sself-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.listonly closed dialogs, so the prompt was lost until the server dropped the connection.prompt.listnow carries theprompt.requestfields (like the service's list) and the UI buildsdialogs 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.33889c4cli: make the host optional in hostkey list resolves the doc skew above. Without ahost, 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. Onewebdav.redirectorfailure in x64-modern Debug(
redirector_large_file_round_trip: the backend was read before the redirector's PUT landed) is apre-existing flake untouched by these commits. It passed 3/3 in isolation, and the x64-modern test
rerun passed 109/109 and 107/107.