Component: HubWindow¶
Canonical source:
SmrtApps/CSApps/HubWindow/README.md(mirrored below)
HubWindow — SmrtHub shell and tray front-end¶
HubWindow is the WinUI 3 shell that owns the visible UI, native system tray, Jump List, and high-contrast aware iconography for SmrtHub. This document is a canonical reference of current behavior and implementation.
Highlights¶
- Single-instance guard with IPC and legacy restore event so secondary launches route actions (Jump List, shortcuts) to the running window.
- Per-Monitor-V2 DPI enforcement end-to-end: process awareness at startup, thread scopes for tray/menu work, SVG rasterization bound to
XamlRoot.RasterizationScale, and dynamic title-bar region recalculation for interactive controls. - Theme pipeline built on
ThemeSettings,UISettings, and Win32 fallbacks to keep caption buttons, tray icon, and title logo in sync across light/dark and high-contrast schemes. - Native tray service with Jump List parity: Diagnostics submenu (Export Logs HTML, Support Bundle) plus Legal & Compliance submenu (Retention Evidence export, Compliance Report), all while preserving restore-on-click behavior.
- Title bar composition is intentionally minimal: logo, divider, search, always-on-top pin, a small user profile chip, and the native caption buttons. Interactive controls in the title bar use passthrough regions (not custom drag-rectangle splitting) so caption interactions remain native.
- Title bar now includes a centered search box (
Smrt.UI.Controls.SmrtSearchBox) that provides lightweight command search (proof-of-concept) with suggestions and action invocation. - Logging everywhere via
SmrtHub.Loggingusing thehub-windowslug, surfacing key events such as IPC routing, theme transitions, DPI changes, tray commands, and Supervisor hand-offs. - HubWindow now includes a fixed-height window scaffold (48 DIP rows) used for the upcoming collapse/expand UX; build/staging + layout dimensions are tracked in README.BuildAndLayout.md.
- vNext chat windowing split: HubWindow can open and own a Document Chat window (in-memory transcript UX; no transcript persistence) while the general chat shell remains a separate app (SmrtChat); both windows can be active at the same time.
- Document Chat is implemented as an owned tool window (owned by HubWindow; no separate taskbar presence).
- General chat remains a standalone window/app (
SmrtChat) with its own taskbar presence.
Dependencies and integrations¶
- Supervisor control plane: HubWindow routes certain diagnostics and lifecycle actions via Supervisor.
- Settings Host: HubWindow launches
SettingsHostfor multi-page settings surfaces. - SmrtSpace catalog/active selection: HubWindow uses Settings Host IPC snapshots (no direct file reads).
- Local bridge (
python-net): pollsGET /sourcefor snapshot data and forwards certain actions. - Support Bundle: tray diagnostics generate bundles for local-first troubleshooting.
Support Bundle¶
- HubWindow exposes Support Bundle generation via tray diagnostics; prefer this over manual log collection.
- HubWindow logs use slug
hub-windowand should appear in bundle log exports.
Related docs¶
- Settings Host: ../SettingsHost/README.md
- Support Bundle reference: ../../../README.Files/Reference-Guides/Smrt.SupportBundle.README.md
- Logging reference: ../../../README.Files/Reference-Guides/SmrtHub.Logging.README.md
Top Panel Bars (Bars0–2)¶
HubWindow includes three “info bars” in the top panel that mirror the legacy Flintr expandable rows:
- Bar 0 (Row B0): Source name — current source label (app/window/web).
- Bar 1 (Row B1): Source path — file path or URL.
- Bar 2 (Row B2): Clipboard content (preview) — single-line preview of the clipboard; full text is available via tooltip.
Data source:
- HubWindow polls the local Python bridge endpoint
GET /source(component:python-net) on a short interval (currently ~750ms) viaHubWindow.Services.HubWindowSnapshotClient. - The
/sourcepayload is additive: it preserves legacy keys (lblSourceName,lblPath,clipboardFragments) and adds richer fields (sourceType,appIdentity,sourceData, etc.). HubWindow consumes both to remain resilient across versions. - Polling is best-effort: if the bridge is unavailable or returns a non-success status, HubWindow keeps the last-known data or shows empty/unknown values.
Icon mapping:
- Column A icons (A0–A2) are derived from snapshot state; A0 is driven by
sourceType(e.g.,web→ globe).
Left rail layout note:
- The Column A left rail is implemented as a WinUI
SplitViewin CompactInline mode:- Compact (IsPaneOpen=false): icons-only, visually identical to the prior fixed 48-DIP rail.
- Expanded (IsPaneOpen=true): reveals static labels aligned to rows A0–A3 (Source Name, Source Path, Clipboard, Settings).
- The pane is not a navigation surface; A0–A2 remain non-interactive and do not change the main content.
Window sizing note (no content reflow):
- When the left rail pane opens/closes, HubWindow resizes the outer window by the rail delta so the main content region keeps a stable width.
- Clipboard-driven auto-width (image clipboard) is pane-aware and will not shrink the window back below the open-pane delta.
Note: HubWindow intentionally does not implement custom window snapping/docking controls. We rely on the native Windows caption controls for all snapping.
Layout note (ribbon effect):
- The top panel uses a dark “ribbon” backdrop (
SmrtHub.Surface.SubChrome.Background). - Bars0–2 render as three separate light “card” surfaces in column B; each card uses full rounding (
CornerRadius="8") and vertical spacing so the ribbon effect appears naturally against the ribbon backdrop. - Column C remains reserved as a fixed 48-DIP spacer over the ribbon backdrop (future use).
Title Bar, Fluent Iconography, and Caption Controls¶
- HubWindow extends content into the title bar and lays out a small left-side group: logo → divider → pin. This keeps app controls visually independent of the native caption button alignment rules.
- HubWindow also shows a small user profile chip immediately left of the native caption buttons. It uses WinUI
PersonPicturewith a best-effort profile picture and friendly name derived from the signed-in Windows identity. - The user profile chip acts as a trigger for a small flyout that mirrors the native Windows account card layout:
- header with a larger profile picture + display name
- optional email/UPN line when Windows exposes it (best-effort; may not be available for local accounts)
- link-text account link (placeholder) and a few user-scoped action buttons (currently visual placeholders)
- flyout is configured not to constrain to the window bounds so it can render outside the content area like a native menu.
- Fallback behavior for the profile chip is owned by
PersonPicture:- picture when available
- otherwise initials when available
- otherwise the platform-provided default glyph The app intentionally does not override the glyph visuals so it stays consistent with the OS.
- The profile chip hover treatment is intentionally custom. HubWindow uses a theme-driven overlay behind the avatar to avoid hover-time layout nudging.
- The always-on-top control is a
ToggleButtonthat drivesOverlappedPresenter.IsAlwaysOnTop.
UI Icon Strategy (Update)¶
- HubWindow UI icons are implemented with Fluent UI System Icons via
FluentIcons.WinUI(ic:FluentIcon). - Icons are theme-tinted (no baked colors) and follow the project interaction convention:
- Default: Regular
- Hover: tint only (no geometry swap)
Fluent UI System Icons reference: - Browse/search: https://fluenticons.co/
When requesting an icon change, provide:
- Icon name + size + variant (example: Calendar 24 Regular)
- Where it will be used (control/surface) and the intended meaning
- Whether it must be monochrome (theme-tinted) or explicitly Color
- Some UX surfaces may still require custom icons (per product/design) and will be added via the approved asset pipeline.
- Hover/pressed colors are TBD in documentation. The canonical source of truth is the theme/palette dictionaries and their keys:
SmrtHub.Surface.Chrome.Content.HoverSmrtHub.Surface.Chrome.Content.PressedSeeSmrtApps/src/Smrt.UI/Themes/Palettes/*.xamlfor current values.
- Pin state: the checked/unchecked state is communicated by a glyph change (Pin → PinOff). Hover/pressed are communicated via theme-driven icon tint + subtle background.
- Pressed animation convention: most icon buttons use a small scale-down press animation.
- Caption button backgrounds are intentionally transparent for non-close buttons so hover is conveyed by glyph color. The Close button retains the native Windows hover/pressed background behavior (including the expected red hover treatment) because HubWindow does not set Close-button-specific background overrides.
Startup & Single Instance¶
App.xaml.csappliesSetProcessDpiAwarenessContext(PER_MONITOR_AWARE_V2)before any UI exists, sets the process AppUserModelID, and builds DI services (ITrayControllerFactory,INotificationService, and headless OCR viaSmrt.ExtractText).- A global mutex (
Global/SmrtHub.HubWindow) plusSingleInstanceIpckeeps only one instance running. Secondary instances parse--actionarguments and post them to the primary (restore, Jump List verbs), falling back to a legacyEventWaitHandleif IPC fails. - The primary instance spins a restore loop and IPC listener before logging is initialized to ensure early actions succeed. All unhandled exception surfaces are wired into
Logger.Fatal. - Jump List rebuild occurs once during first activation, then again explicitly after
OnLaunched; the handler lives inServicesUtilities.JumpListService.
Command Entry Points (Action Verbs)¶
HubWindow supports a small set of command entry points exposed via --action <verb>.
Important separation of responsibilities:
- Global hotkeys are owned by TriggerManager, not HubWindow. HubWindow does not register system-wide hotkeys.
- HubWindow surfaces (Jump List, tray menu, title-bar search) invoke action verbs which route through the single-instance IPC channel to the primary instance.
Current action verbs:
restore— Restore the HubWindow UI.open-settings— Open the Settings Host (best-effort) or fall back to HubWindow.open-settings?page=providers— Open Settings Host directly to Cloud Providers.open-settings?page=providers&vendor=openai&profile=default— Open Cloud Providers to a specific vendor/profile.- Command-line passthrough (secondary launches):
--action open-settings --page providers --vendor openai --profile defaultis converted into the equivalent query-style action so the primary instance receives vendor/profile targeting. open-smrtspace-create— Open the HubWindow-owned Create New SmrtSpace window.- The name and root path are independent inputs; no auto-updates occur between fields.
- Selecting a folder sets the root path to that exact folder.
open-smrtspace-folder— Open the active SmrtSpace root folder in Explorer (best-effort).open-smartspace-archive— Open the SmartSpace Archive folder in Explorer (best-effort).set-active-smrtspace?id=<id>— Request that Settings Host switches the active SmrtSpace (by catalog entry id).open-quick-settings?feature=extract-text— Open Quick Settings → Extract Text (non-secret preferences only).- Command-line passthrough (secondary launches):
--action open-quick-settings --feature extract-textis converted into the equivalent query-style action so the primary instance receives feature targeting. open-quick-settings?feature=extract-structured-text— Open Quick Settings → Extract Structured Text (non-secret preferences only).- Command-line passthrough (secondary launches):
--action open-quick-settings --feature extract-structured-textis converted into the equivalent query-style action so the primary instance receives feature targeting. open-quick-settings?feature=chat— Open Quick Settings → Chat (non-secret preferences only).- Command-line passthrough (secondary launches):
--action open-quick-settings --feature chatis converted into the equivalent query-style action so the primary instance receives feature targeting. open-document-chat— Open the HubWindow-owned Document Chat window (metadata-only actions).open-smrtchat— Open the separate SmrtChat shell (taskbar app).- Implementation detail: HubWindow launches
SmrtChat.exe --action "restore".
- Implementation detail: HubWindow launches
create-chat-session— Create a new chat session (metadata-only; no prompt/response stored).create-chat-session?kind=document— Create a document-focused chat session (metadata-only).- Command-line passthrough (secondary launches):
--action create-chat-session --kind documentis converted into the equivalent query-style action so the primary instance receives kind targeting. list-chat-sessions— Copy chat session metadata to clipboard (metadata-only).list-chat-sessions?kind=document— Copy document chat session metadata to clipboard.- Command-line passthrough (secondary launches):
--action list-chat-sessions --kind documentis converted into the equivalent query-style action so the primary instance receives kind targeting. delete-chat-session?sessionId=<guid>&confirm=true— Delete a chat session (metadata-only state) by sessionId.- Safety: deletion requires
confirm=true(or--confirm) and is not exposed via tray/Jump List/search. - Command-line passthrough (secondary launches):
--action delete-chat-session --sessionId <guid> --confirmis converted into the equivalent query-style action so the primary instance receives the sessionId and confirmation. set-chat-session-title?sessionId=<guid>&title=<text>— Set or clear a chat session title (metadata-only state).- Safety: title content is treated as potentially sensitive user input; HubWindow does not log it, and this action is not exposed via tray/Jump List/search.
- Command-line passthrough (secondary launches):
--action set-chat-session-title --sessionId <guid> --title "My title"is converted into the equivalent query-style action so the primary instance receives the sessionId and title. - Command-line passthrough (clear title):
--action set-chat-session-title --sessionId <guid> --clear-titlesetstitle=(clears the stored title). export-chat-session?sessionId=<guid>— Copy a single chat session’s metadata to clipboard (metadata-only).- Safety: clipboard output is user-triggered and not logged; this action is not exposed via tray/Jump List/search.
- Command-line passthrough (secondary launches):
--action export-chat-session --sessionId <guid>is converted into the equivalent query-style action so the primary instance receives the sessionId. purge-chat-sessions?kind=document&confirm=true— Delete all chat sessions of a specific kind (metadata-only state).- Safety: purge requires
confirm=true(or--confirm) and is not exposed via tray/Jump List/search.
- Safety: purge requires
- Command-line passthrough (secondary launches):
--action purge-chat-sessions --kind document --confirmis converted into the equivalent query-style action so the primary instance receives kind targeting and confirmation. - HubWindow passes W3C
traceparentto Settings Host for log correlation. extract-clipboard-text— OCR clipboard image → copy text to clipboard.open-screen-clip— Launch the Windows Snipping Tool capture UX (no OCR; clipboard is not modified by HubWindow).snip-and-extract-clipboard-text— Snipping Tool capture → OCR snip → copy text to clipboard.extract-clipboard-structured— Structured extraction → copy structured JSON to clipboard and save to active SmrtSpace.send-clipboard-structured-to-ai— Structured extraction (clipboard image) → open Document Chat → send structured JSON (text/structure only).- Privacy: HubWindow does not persist or log prompt/response content; only safe metadata.
- Attachment policy: no auto-attach from URLs; no raw document bytes/images sent by default.
- Entry points: Jump List, tray menu, title-bar search.
send-documents-structured-to-ai— File picker (single-select) → structured extraction → best-effort save to active SmrtSpace → open Document Chat → send structured JSON (text/structure only).- UX decision (locked-in): “Send to AI” always opens the HubWindow-owned Document Chat window.
extract-documents-structured— File picker (multi-select) → structured extraction → save to active SmrtSpace.- If exactly one file is selected, the resulting structured JSON is also copied to clipboard.
- Entry points: Jump List, tray menu, title-bar search.
extract-folder-structured— Folder picker → structured extraction for supported files → save to active SmrtSpace.- Safety: processes up to 500 supported files per run.
- Entry points: Jump List, tray menu, title-bar search.
UX decisions (locked-in)¶
- Files vs folder selection: when a UI control can operate on either files or folders, HubWindow will show a small prompt ("Files" vs "Folder") and then invoke the appropriate action verb (
extract-documents-structuredvsextract-folder-structured) and picker. - OCR group toggle (planned): the OCR/snipping button can toggle between:
- Snip only (
open-screen-clip) - Snip + OCR (
snip-and-extract-clipboard-text)
- Snip only (
exit-smrthub— Request shutdown + exit HubWindow.
Extract Text contracts (clipboard / file / network)¶
HubWindow is a primary consumer of Smrt.ExtractText. The following contracts are enforced and intentionally scoped to explicit user-triggered actions.
-
Clipboard contract:
- HubWindow reads clipboard content only when the user invokes an Extract Text action verb.
- HubWindow writes extracted plain text back to the clipboard (clipboard-out).
- HubWindow does not rewrite ClipboardMonitor / Python shared state.
-
File contract:
- HubWindow does not persist OCR payload bytes or extracted text by default.
- Any file-path driven OCR flows (for developer validation) are explicit opt-in and must avoid logging file paths.
-
Network contract:
- Cloud OCR is optional and credential-gated; local-first behavior is the default.
- Logs must not include OCR payload bytes, extracted text, secrets, or file paths.
Validation notes:
- Run
extract-clipboard-textandsnip-and-extract-clipboard-textagainst a known test image and confirm:- clipboard-out contains extracted text,
- logs do not contain OCR payload bytes or extracted text.
- When using the DEBUG
ocr-fileaction, confirm HubWindow logs do not contain the input/output paths.
URI Scheme Deep Links¶
HubWindow can be registered as the handler for the SmrtHub URI scheme and will route deep links to the correct surface (for example, launching Settings Host).
Supported examples:
- smrthub://settings?page=providers
- smrthub://settings/providers
- smrthub://settings?page=providers&vendor=openai&profile=default
Dev registration (current user, HKCU):
- Register: Tools/Run/Register-SmrthubUriScheme.ps1
- Unregister: Tools/Run/Register-SmrthubUriScheme.ps1 -Unregister
Deep-link diagnostics (local-first)¶
SmrtHub is local-first for diagnostics: deep-link troubleshooting is done via local logs (and Support Bundles), not by assuming a telemetry server.
Primary log locations:
- HubWindow:
%LocalAppData%/SmrtHub/Logs/hub-window/ - Settings Host:
%LocalAppData%/SmrtHub/Logs/settings-host/
HubWindow emits stable event-name logs for Settings deep links:
hubwindow.deeplink.settings.parsed— Settings deep link parsed; routes toopen-settings.hubwindow.deeplink.settings.parse.failed— Parsing failed; includesfailure={Failure}and whether a URI was present.hubwindow.open-settings.resolved— Resolved Settings Host path / arguments.hubwindow.open-settings.launched— Successfully launched Settings Host.hubwindow.open-settings.launch_failed— Generic Settings Host launch failure.hubwindow.open-settings.exe.not_found— Settings Host executable not found.hubwindow.open-settings.process.start_failed— Process start threw.
Parsing failures are classified without logging the raw URI. The deep-link parser returns a stable reason:
RawUriMissing,InvalidUri,WrongScheme,WrongHost,MissingSection
Settings Host logs its parsed open arguments and trace correlation:
settingshost.open.args— selected page/vendor/profile and whethertraceparentwas present.settingshost.open.traceparent.accepted/settingshost.open.traceparent.invalidsettingshost.providers.deeplink.args— Providers page received vendor/profile args.settingshost.providers.deeplink.applied— Providers page applied vendor/profile targeting.
Cloud Providers (inside Settings Host) logs deep-link selection application best-effort:
cloudproviders.deeplink.requested,cloudproviders.deeplink.deferred,cloudproviders.deeplink.applied,cloudproviders.deeplink.failed
Failure outcomes for cloudproviders.deeplink.failed are stable codes:
invalid_vendor,vendor_not_found,profile_not_found
System Tray & Jump List¶
SystemTrayServiceruns under PMv2 scopes, loads DPI-appropriate icons, debounces theme changes, and groups commands into submenus:- Diagnostics:
- SmrtSupport Logs:
Logger.ExportUnifiedHtmlLogs()then shell-launches the viewer. - Generate Support Bundle (24h):
DiagnosticsActions.GenerateSupportBundleAsync()writes intoDesktop/SmrtHub-Bundles.
- SmrtSupport Logs:
- Extract:
- Extract Clipboard as Text
- Snip and Extract as Text
- Extract Clipboard as Structured
- Send Clipboard Structured to AI
- Extract Documents as Structured
- Extract Folder as Structured
- Legal & Compliance:
- Export Retention Evidence:
DiagnosticsActions.ExportRetentionEvidenceAsync()copies the retention policy, legal holds, verification, and health artifacts intoDesktop/SmrtHub-Legal/<timestamp>with a manifest identifying the operator. - Generate Compliance Report (7d):
DiagnosticsActions.GenerateComplianceReportAsync()runs the Support Bundle compliance generator for the last seven days, dropping bundles + hashes underDesktop/SmrtHub-Compliance.
- Export Retention Evidence:
- Exit SmrtHub: Root-level command that calls
SupervisorControlClient.RequestShutdownAsync()then signalsApp.Exit()to mirror the tray.
- Diagnostics:
-
Jump List verbs map to the same actions via the single-instance channel:
-
The tray root menu includes quick actions:
- Settings
- Cloud Providers
- Extract Text Quick Settings
- Extract Structured Text Quick Settings
- Chat Quick Settings
- Create Chat Session
- List Chat Sessions
- Extract (submenu)
-
Jump List verbs map to the same actions via the single-instance channel:
--action open-smartspace-archive→ Open the SmartSpace Archive folder--action open-settings→ Settings--action open-settings --page providers→ Cloud Providers--action open-quick-settings --feature extract-text→ Extract Text Quick Settings--action open-quick-settings --feature extract-structured-text→ Extract Structured Text Quick Settings--action open-quick-settings --feature chat→ Chat Quick Settings--action create-chat-session --kind general→ Create Chat Session--action list-chat-sessions→ List Chat Sessions--action extract-clipboard-text→ Extract Clipboard as Text--action snip-and-extract-clipboard-text→ Snip and Extract as Text--action extract-clipboard-structured→ Extract Clipboard as Structured--action send-clipboard-structured-to-ai→ Send Clipboard Structured to AI--action extract-documents-structured→ Extract Documents as Structured--action extract-folder-structured→ Extract Folder as Structured--action exit-smrthub→ Request Supervisor shutdown + exit HubWindow
Note: HubWindow’s “Extract Documents/Folder as Structured” pickers allow a broader set of extensions for forward compatibility with future cloud structured-extraction executors. Local structured extraction (Windows OCR) is image/PDF-centric; additional formats (DOCX/HTML/etc.) require registering an appropriate cloud executor and enabling cloud execution in Quick Settings.
Diagnostics & Logging¶
- Component slug:
hub-window; logs land under%LocalAppData%/SmrtHub/Logs/hub-window/with text + JSON sinks per logging policy. - Tray diagnostics log the icon path, DPI metrics, high-contrast detection, and Support Bundle export outcomes. IPC traffic is logged at info/debug levels for traceability when Jump List commands misbehave.
- Support Bundle exports are intentionally headless. Use
README.Files/Reference-Guides/Smrt.SupportBundle.README.mdfor detailed bundle expectations.
Privacy note: - The title bar profile chip is a UI-only convenience surface. It does not write identity data to disk and should not log names/emails/profile-picture paths.
Debug: Testing Profile Fallbacks¶
HubWindow includes a DEBUG-only test hook to simulate missing profile fields without modifying the actual Windows account.
- Environment variable:
SMRTHUB_HUBWINDOW_DEBUG_PROFILE_BLOCK - Values (comma/semicolon/space separated):
picture,initials,name
Examples:
- Force initials fallback: picture
- Force built-in glyph fallback: picture,initials,name
This hook is intended for local UI validation only and should not be relied upon in production.
Debug: OCR Action Verb¶
HubWindow includes a DEBUG-only action verb for exercising Smrt.ExtractText without adding UI.
- Action:
--action ocr-file - Required:
--path <imagePath>(or--file <imagePath>) - Optional:
--out <outputPath>(writes extracted text; sensitive operational data) - Optional modes:
--cloud-first(prefer cloud, then local fallback)--cloud-only(cloud only)--local-only(local only)
- Optional:
--lang <language>(passed through to OCR providers when supported)
Examples:
- Local-first (default): HubWindow.exe --action ocr-file --path "C:\temp\img.png"
- Cloud-first (with local fallback): HubWindow.exe --action ocr-file --path "C:\temp\img.png" --cloud-first
- Write output explicitly: HubWindow.exe --action ocr-file --path "C:\temp\img.png" --out "C:\temp\ocr.txt"
Privacy note: HubWindow does not log OCR payload bytes or extracted text. Writing output requires explicit --out.
Debug: Structured Extraction File Action Verb¶
HubWindow includes a DEBUG-only action verb for exercising Smrt.ExtractStructuredText against a file path without adding UI.
- Action:
--action extract-structured-file - Required:
--path <documentPath>(or--file <documentPath>)
Example:
HubWindow.exe --action extract-structured-file --path "C:\temp\doc.pdf"
Privacy note: HubWindow does not log document payload bytes or extracted structured content. Output is copied to clipboard and may be saved to the active SmrtSpace via python-net when available.
Files & Responsibilities¶
App.xaml— global resources,UseLayoutRounding=True, theme dictionary staging.App.xaml.cs— process DPI enforcement, single-instance guard, logging setup, DI container, Jump List scheduling, command-line action routing.MainWindow.xaml/.cs— window creation, caption customization, DPI/theme event handling, tray initialization entry point, window restore path.Services/SystemTrayService.cs— native tray icon hosting, theme/DPI refresh, context menu actions, support bundle/log export orchestration.Services/SingleInstanceIpc.cs— named pipe server/client used by the mutex guard.QuickSettings/*— feature-scoped quick settings windows (non-secret config/state only).Services/SupervisorControlClient.cs— HTTP bridge to request shutdown from the Supervisor service.Interop/NativeMethods.cs— P/Invoke surface,PerMonitorV2Scope, metrics, menu helpers.ServicesUtilities/JumpListService.cs— builds the default Jump List with SmrtHub verbs.
Generated Output¶
bin/andobj/contain build artifacts produced by WinUI tooling. They are excluded from README coverage requirements per the Documentation Policy.
Build & Run (Staged)¶
HubWindow is typically launched from the staged output path to match the runtime footprint policy.
- Script:
SmrtApps/CSApps/HubWindow/Build-HubWindow.ps1- Supports
-Mode Menufor an interactive menu. - Supports
-Mode BuildStage|BuildRun|BuildRunInitialsFallback|BuildRunGlyphFallback.
- Supports
- Convenience wrapper:
SmrtApps/CSApps/HubWindow/Build-HubWindow.bat- Runs
-Mode Menuwhen no arguments are supplied.
- Runs
Validation Checklist¶
- Move the window between monitors at 125%/150% DPI: title logo remains crisp, drag regions stay aligned, and logs show
[DPI] XamlRoot scale changed. - Drag the window from a wide landscape monitor to a narrow/portrait monitor: window sizing does not jump mid-drag; constraints apply after mouse release.
- Switch Windows theme (Light/Dark) and High Contrast: caption buttons, tray icon, and title logo should all update; logs verify
ApplyThemesources and HC detection. - Hover/click the always-on-top pin and caption buttons: glyph hover/press is visible in both Light and Dark without background boxes; Close retains the native background hover behavior.
- Trigger Jump List entries (
Open SmartSpace Archive,Exit SmrtHub) while the app is running: one instance stays alive and actions log via IPC. - Use the tray menu to export logs and support bundles: exported files should appear, and the tray menu remains sharp.
Notes¶
- The title bar control budget is intentionally small to stay “system-first”: logo, divider, search, pin, and native caption buttons. Search is a proof-of-concept command surface today and will be expanded later.
References¶
README.Files/System/Policies/SmrtHub-WinUI3-DPI-Discipline.README.md— canonical DPI guidance (implemented here)README.Files/Capabilities/Shell-Surfaces/README.md— tray + taskbar + single-instance routing flowREADME.Files/Reference-Guides/SmrtHub.Logging.README.md— unified logging and HTML exportREADME.Files/System/Policies/SmrtHub-Operational-Data-Policy-v1.0.README.md— paths and slug usage