From a4c84ac62026551f043240689f5c135d3b1fd30b Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Thu, 2 Jul 2026 16:24:23 +0200 Subject: [PATCH] feat(clients/windows): all-vendor video pipeline rewrite + app icon + hosts-page tiles Decode+present rewrite (first real pixels on glass for this client): - Decode: FFmpeg D3D11VA on NVIDIA/AMD/Intel. get_format now only returns AV_PIX_FMT_D3D11 and lets libavcodec build the decode pool from hw_device_ctx (hand-built frames contexts failed three different ways: NVIDIA rejects DECODER|SHADER_RESOURCE arrays, BindFlags=0 fails texture creation, Intel rejects non-128-aligned HEVC surfaces at the first SubmitDecoderBuffers). A DXVA profile probe before the hwdevice commits hardware-vs-software up front instead of burning the opening IDR; extra_hw_frames covers the frames the client holds. - Present: the decoded slice is copied with ONE display-size-boxed CopySubresourceRegion (a planar slice is a single subresource in D3D11; the old two-copy D3D12-style code silently no-opped - the black screen) into a sampleable NV12/P010 texture, per-plane SRVs + YUV->RGB shaders. - New dedicated render thread (render.rs): presenting is decoupled from the XAML thread; frame-latency-waitable swapchain + SetMaximumFrameLatency(1), newest-wins drain after the wait, crossbeam frame channel with pts for a capture->presented p50 log. - HiDPI: pixel-sized buffers + SetMatrixTransform(96/dpi) - was blurry at 125/150 % scaling. - Software fallback now feeds the same shaders (swscale -> NV12/P010 planes -> two dynamic plane textures); ps_rgba/X2BGR10 path deleted, hw/sw colour math identical. - Adapter selection for hybrid boxes: PUNKTFUNK_ADAPTER > the window's monitor's adapter > default; PUNKTFUNK_D3D_DEBUG=1 debug layer. - Session pump: request_keyframe at start and on hw->sw demotion (infinite GOP would otherwise sit on a black screen). Validated live on the Arc Pro + RTX 3500 Ada laptop against the local Windows host: 60 fps D3D11VA on both vendors, software path, GUI on glass. Also: embedded app icon (build.rs winresource + WM_SETICON, MSIX Square44x44 targetsize assets, pack-msix stages them) and the hosts-page tile rework (tap-to-connect tiles with sibling overflow menu - fixes forget-also-connects - in-tile rename editor, add-host modal via root state). Co-Authored-By: Claude Fable 5 --- CLAUDE.md | 64 +- Cargo.lock | 21 + clients/windows/Cargo.toml | 9 + clients/windows/build.rs | 18 + .../assets/Square44x44Logo.targetsize-16.png | Bin 0 -> 785 bytes ...x44Logo.targetsize-16_altform-unplated.png | Bin 0 -> 785 bytes .../assets/Square44x44Logo.targetsize-20.png | Bin 0 -> 913 bytes ...x44Logo.targetsize-20_altform-unplated.png | Bin 0 -> 913 bytes .../assets/Square44x44Logo.targetsize-24.png | Bin 0 -> 1123 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1123 bytes .../assets/Square44x44Logo.targetsize-256.png | Bin 0 -> 11522 bytes ...44Logo.targetsize-256_altform-unplated.png | Bin 0 -> 11522 bytes .../assets/Square44x44Logo.targetsize-30.png | Bin 0 -> 1422 bytes ...x44Logo.targetsize-30_altform-unplated.png | Bin 0 -> 1422 bytes .../assets/Square44x44Logo.targetsize-32.png | Bin 0 -> 1513 bytes ...x44Logo.targetsize-32_altform-unplated.png | Bin 0 -> 1513 bytes .../assets/Square44x44Logo.targetsize-36.png | Bin 0 -> 1699 bytes ...x44Logo.targetsize-36_altform-unplated.png | Bin 0 -> 1699 bytes .../assets/Square44x44Logo.targetsize-40.png | Bin 0 -> 1832 bytes ...x44Logo.targetsize-40_altform-unplated.png | Bin 0 -> 1832 bytes .../assets/Square44x44Logo.targetsize-48.png | Bin 0 -> 2222 bytes ...x44Logo.targetsize-48_altform-unplated.png | Bin 0 -> 2222 bytes .../assets/Square44x44Logo.targetsize-64.png | Bin 0 -> 2890 bytes ...x44Logo.targetsize-64_altform-unplated.png | Bin 0 -> 2890 bytes clients/windows/packaging/pack-msix.ps1 | 19 + clients/windows/src/app/hosts.rs | 501 +++++++++++----- clients/windows/src/app/mod.rs | 128 +++- clients/windows/src/app/stream.rs | 119 ++-- clients/windows/src/app/style.rs | 78 ++- clients/windows/src/gpu.rs | 218 +++++-- clients/windows/src/input.rs | 115 +++- clients/windows/src/main.rs | 2 + clients/windows/src/present.rs | 554 ++++++++++++------ clients/windows/src/render.rs | 204 +++++++ clients/windows/src/session.rs | 42 +- clients/windows/src/video.rs | 286 ++++++--- 36 files changed, 1797 insertions(+), 581 deletions(-) create mode 100644 clients/windows/build.rs create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-16.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-16_altform-unplated.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-20.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-20_altform-unplated.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-24.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-256.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-256_altform-unplated.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-30.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-30_altform-unplated.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-32.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-32_altform-unplated.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-36.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-36_altform-unplated.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-40.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-40_altform-unplated.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-48.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-48_altform-unplated.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-64.png create mode 100644 clients/windows/packaging/assets/Square44x44Logo.targetsize-64_altform-unplated.png create mode 100644 clients/windows/src/render.rs diff --git a/CLAUDE.md b/CLAUDE.md index 6ebc747..0f1149e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -102,7 +102,17 @@ Low-latency desktop/game streaming stack, Linux-first, with a shared Rust protoc **pf-vdisplay** virtual display (`capture/windows/idd_push.rs`, `vdisplay/windows/pf_vdisplay.rs`; DXGI Desktop Duplication / WGC as fallbacks, `capture/windows/dxgi.rs`), GPU encode (NVENC `--features nvenc`; AMD/Intel `--features amf-qsv`), SendInput + the in-house UMDF gamepad drivers - (`inject/windows/`), WASAPI loopback + virtual mic (`audio/windows/wasapi_*`). Ships as a **signed + (`inject/windows/`), WASAPI loopback + virtual mic (`audio/windows/wasapi_*`). **Keyboard wire + convention: US-positional VKs** (every first-party client sends the physical key's US-layout VK; + the Windows client derives it from the scancode, NOT the layout-resolved `vkCode`) — the Windows + injector resolves them via a fixed table mirroring the Linux `vk_to_evdev` (never through a + keyboard layout: the SYSTEM service thread's layout re-reads positions as characters — the + German y↔z / ö→ü scramble), while GameStream/Moonlight VKs are layout-semantic + (`KEY_FLAG_SEMANTIC_VK`, resolved under the foreground app's layout, Sunshine's model). Linux + renders positions under the session compositor's layout (libei) or the virtual keyboard's + uploaded keymap (Sway/wlroots — honors `XKB_DEFAULT_LAYOUT` et al., default US); the Android + client reads `KeyEvent.scanCode` first so a user-selected physical-keyboard layout can't + re-map keycodes semantically. Ships as a **signed Inno Setup installer** that registers a `LocalSystem` SCM service launching into the interactive session for secure-desktop (UAC/lock-screen) capture (`windows/service.rs`), bundles the pf-vdisplay driver + the FFmpeg DLLs (+ VB-CABLE for the virtual mic), and is published by @@ -224,23 +234,39 @@ Low-latency desktop/game streaming stack, Linux-first, with a shared Rust protoc **Windows stage 1 done 2026-06-15** (`clients/windows`, binary `punktfunk-client`): pure-Rust **WinUI 3** UI via **windows-reactor** (a declarative React-like framework backed by WinUI; PR #4499 added the `SwapChainPanel` widget + `set_swap_chain`). The - video is a **`SwapChainPanel`** bound to a **D3D11 composition swapchain** (WARP fallback for - the GPU-less dev box; runtime-compiled fullscreen-triangle shaders, Contain-fit letterbox), - driven by reactor's per-frame `on_rendering`. **FFmpeg HEVC decode with a D3D11VA - zero-copy hardware path** (`gpu.rs` shares one D3D11 device — hardware+`VIDEO_SUPPORT`, WARP - fallback, multithread-protected — between the decoder and presenter; the decoder outputs - NV12/P010 `ID3D11Texture2D` array slices with `BIND_SHADER_RESOURCE` and the presenter samples - them via per-plane SRVs + YUV→RGB shaders — NV12/BT.709, P010/BT.2020-PQ; **software CPU decode - stays as the robust fallback**, auto-selected with a `DecoderPref` override). **HDR10**: the - client advertises 10-bit/HDR (Settings toggle), detects PQ in-band (`transfer == SMPTE2084`), - and flips the swapchain to `R10G10B10A2` + ST.2084 with HDR10 metadata. **WASAPI** render + mic - capture, **SDL3** gamepads (rumble/lightbar/DualSense), `mdns-sd` discovery, and the full trust - surface — all **in-app**: a polished WinUI shell (host cards w/ monogram + status pills, + video is a **`SwapChainPanel`** bound to a **D3D11 composition swapchain**, presented from a + **dedicated render thread** (`render.rs`, 2026-07-02 rewrite — presenting never touches or is + stalled by the XAML thread): frame-latency-waitable swapchain + `SetMaximumFrameLatency(1)` + (≤1 queued present, newest-wins drain after the wait, so a stream faster than the display drops + backlog before any GPU work), **HiDPI-correct** (pixel-sized buffers + `SetMatrixTransform` + 96/DPI — DIP-sized buffers were blurry at 125/150 %), Contain-fit letterbox, WARP fallback. + **FFmpeg decode with a D3D11VA hardware path on all vendors** (`gpu.rs` shares one D3D11 device + between decoder + presenter, adapter picked by console pref `PUNKTFUNK_ADAPTER` > the window's + monitor's adapter > default; `PUNKTFUNK_D3D_DEBUG=1` adds the debug layer): the decode pool is + **decoder-only bind, sized/aligned by libavcodec itself** (get_format returns `AV_PIX_FMT_D3D11` + and lets `hw_device_ctx` drive — three hand-built-frames-context strikes are why: NVIDIA rejects + `DECODER|SHADER_RESOURCE` arrays, `BindFlags=0` fails texture creation, and Intel rejects + non-128-aligned HEVC surfaces at the first `SubmitDecoderBuffers`), a DXVA **profile probe** + before the hwdevice commits software-vs-hardware up front (no burned first IDR), and the + presenter copies the decoded slice with ONE display-size-boxed `CopySubresourceRegion` (a planar + slice is a single subresource in D3D11 — the old two-copy D3D12-style code silently no-opped = + the black screen) into its sampleable NV12/P010 texture → per-plane SRVs + YUV→RGB shaders + (NV12/BT.709, P010/BT.2020-PQ). **Software CPU decode is the fallback** (auto-selected, + `DecoderPref` override, mid-session demotion + keyframe re-request) and now feeds the SAME + shaders (swscale → NV12/P010 planes → two dynamic plane textures) so hw/sw colour math is + identical. **HDR10**: the client advertises 10-bit/HDR (Settings toggle, gated on an HDR + display), detects PQ in-band (`transfer == SMPTE2084`), and flips the swapchain to + `R10G10B10A2` + ST.2084 with HDR10 metadata (0xCE mastering metadata plumbed). **WASAPI** render + + mic capture, **SDL3** gamepads (rumble/lightbar/DualSense), `mdns-sd` discovery, and the full + trust surface — all **in-app**: a polished WinUI shell (host tiles w/ monogram + status pills, `InfoBar` errors/hints, `ToggleSwitch` settings, status-chip stream HUD showing GPU/CPU decode + HDR), host list (live mDNS + saved + manual), settings (resolution/refresh/decoder/bitrate/HDR/ - mic), SPAKE2 PIN pairing screen, TOFU, pinned-fp-mismatch re-pair. **(D3D11VA + HDR present + the - GUI polish are written against the windows-rs/reactor APIs but not yet on-glass validated — the - dev VM is headless/WARP; needs the RTX box.)** **Stream input** is Win32 low-level hooks (`WH_KEYBOARD_LL`/`WH_MOUSE_LL`) — reactor + mic), SPAKE2 PIN pairing screen, TOFU, pinned-fp-mismatch re-pair. **Live-validated 2026-07-02 + on the hybrid laptop (Intel Arc Pro iGPU + RTX 3500 Ada) against the local Windows host**: + D3D11VA hardware decode 60 fps on BOTH vendors (headless, `PUNKTFUNK_ADAPTER`-forced; NVIDIA + 0.2 ms decode, Intel 0.2 ms), software path, and the GUI on glass (real decoded desktop pixels, + GPU-decode HUD chip, ~18 ms capture→decoded p50 over loopback — dominated by the host's 60 Hz + virtual-display capture cadence). HDR-on-glass still pending. **Stream input** is Win32 low-level hooks (`WH_KEYBOARD_LL`/`WH_MOUSE_LL`) — reactor exposes no raw key/pointer events; native Windows VK + absolute mouse (client-rect Contain-fit) + wheel, Ctrl+Alt+Shift+Q capture toggle. `--headless`/`--discover` keep CLI paths. Builds + clippy + fmt green on **`x86_64-pc-windows-msvc` and `aarch64-pc-windows-msvc`** — the latter @@ -268,9 +294,9 @@ Low-latency desktop/game streaming stack, Linux-first, with a shared Rust protoc loopback E2E (TOFU connect → clock skew → HEVC negotiate → shared-D3D11 + D3D11VA init → WASAPI → session end; synthetic payload isn't decodable so decode output stays unvalidated), speed-test E2E. The WinUI window itself CANNOT be launched from SSH (session-0 → WinAppSDK 0x80070005, - pre-existing) — GUI on-glass validation still pending (needs the console session, e.g. PsExec -i 1). - Next: **on-glass validation** of the D3D11VA decode + HDR present + GUI (console session on the - RTX box), then RAWINPUT relative-mouse pointer-lock. + pre-existing; needs the console session, e.g. PsExec -i 1). + Next: **HDR on-glass validation** (Windows host with `PUNKTFUNK_10BIT` → the HDR laptop + display), then RAWINPUT relative-mouse pointer-lock. **Android stage 1 done** (`clients/android`, Kotlin app + `native/` Rust JNI core linking `punktfunk-core`; phone + Android TV): NDK `AMediaCodec` hardware HEVC decode → `SurfaceView` incl. **HDR10** (Main10/BT.2020 PQ) with low-latency tuning + a live stats HUD (`decode.rs`/`stats.rs`), diff --git a/Cargo.lock b/Cargo.lock index 1f5a71b..2977bfa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -770,6 +770,15 @@ dependencies = [ "itertools 0.10.5", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -2760,6 +2769,7 @@ version = "0.4.2" dependencies = [ "anyhow", "async-channel", + "crossbeam-channel", "ffmpeg-next", "mdns-sd", "opus", @@ -2772,6 +2782,7 @@ dependencies = [ "wasapi", "windows 0.62.2 (git+https://github.com/microsoft/windows-rs?rev=b4129fcc1ae81eec8bf1217539883db821bca3a1)", "windows-reactor", + "winresource", ] [[package]] @@ -5106,6 +5117,16 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "winresource" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0986a8b1d586b7d3e4fe3d9ea39fb451ae22869dcea4aa109d287a374d866087" +dependencies = [ + "toml 1.1.2+spec-1.1.0", + "version_check", +] + [[package]] name = "wit-bindgen" version = "0.57.1" diff --git a/clients/windows/Cargo.toml b/clients/windows/Cargo.toml index 355ebbb..6c18bff 100644 --- a/clients/windows/Cargo.toml +++ b/clients/windows/Cargo.toml @@ -39,6 +39,8 @@ windows = { git = "https://github.com/microsoft/windows-rs", rev = "b4129fcc1ae8 "Win32_Graphics_Gdi", "Win32_System_Console", "Win32_System_LibraryLoader", + "Win32_System_Threading", + "Win32_UI_HiDpi", "Win32_UI_Input_KeyboardAndMouse", "Win32_UI_WindowsAndMessaging", ] } @@ -57,8 +59,15 @@ sdl3 = { version = "0.18", features = ["build-from-source", "hidapi"] } mdns-sd = "0.20" async-channel = "2" +# The decoded-frame channel (session pump → render thread): crossbeam because the render loop +# blocks with `recv_timeout`, which async-channel has no sync analogue of. +crossbeam-channel = "0.5" serde = { version = "1", features = ["derive"] } serde_json = "1" anyhow = "1" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } + +# Embeds the app icon as an exe resource (build.rs) — Windows hosts only (rc.exe from the SDK). +[target.'cfg(windows)'.build-dependencies] +winresource = "0.1" diff --git a/clients/windows/build.rs b/clients/windows/build.rs new file mode 100644 index 0000000..4c69540 --- /dev/null +++ b/clients/windows/build.rs @@ -0,0 +1,18 @@ +//! Embed the Windows version-info + icon resources into `punktfunk-client.exe`. The icon drives +//! Explorer / Alt-Tab / the unpackaged taskbar, and `app::run` stamps it onto the WinUI window's +//! title bar via `WM_SETICON` (the MSIX taskbar/Start icons come from the package assets instead). + +fn main() { + // cfg(windows) is the HOST (skips the Linux/macOS workspace stub build); CARGO_CFG_WINDOWS + // is the TARGET (both the x64 and the cross-compiled ARM64 Windows builds pass). + #[cfg(windows)] + if std::env::var_os("CARGO_CFG_WINDOWS").is_some() { + let icon = "../../packaging/windows/branding/punktfunk.ico"; + println!("cargo:rerun-if-changed={icon}"); + winresource::WindowsResource::new() + // Ordinal 1 — app/mod.rs loads it by this id for WM_SETICON. + .set_icon_with_id(icon, "1") + .compile() + .expect("embed windows icon resource"); + } +} diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-16.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..1f6dfcd9cadecfdd08f570e93dc9fe69bcc4c321 GIT binary patch literal 785 zcmV+s1Md8ZP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0;WksK~y+TU6adC z6Hye#XDxzl=T4`c>2$EAKzTSb1>Ffn5_BPn2o|*jBSfhL0}?Uee=ur%VN@g}AWp389@$4NvxrU-#IE@CXY zi1yn>v|p)`Nimc8%~*8V18-e6{RH)LGBJ+2#ZtKKB~a`}iUN@M0*Dqb6v2QZ=o ztujb;aG1rB1${XIpb{<5irsZ zOijcw|7jENCgTjkItj0`SVt9ng*bvos9JVMenTzrMdZA~~#u$W_a5=h`<0p`DCI!OVRPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0;WksK~y+TU6adC z6Hye#XDxzl=T4`c>2$EAKzTSb1>Ffn5_BPn2o|*jBSfhL0}?Uee=ur%VN@g}AWp389@$4NvxrU-#IE@CXY zi1yn>v|p)`Nimc8%~*8V18-e6{RH)LGBJ+2#ZtKKB~a`}iUN@M0*Dqb6v2QZ=o ztujb;aG1rB1${XIpb{<5irsZ zOijcw|7jENCgTjkItj0`SVt9ng*bvos9JVMenTzrMdZA~~#u$W_a5=h`<0p`DCI!OVRPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D113pCK~y+Tm6S|JEfEYMksWq3W!0FpoBm)E(oF#mk41qt>6+d5aJDj%YhgO2vIf_ zFyL~Kcu+5z7ziE&6CwtqF=4p?(Q1Luyw?`&g3-g5nMvOJ&G-NQ@BJBuVVIDRXo-#! z>vgR7fmaH%|0A+T$B7Mw;DjK;V#o`x6yEAp3D9vC=s3}jEYPxXP{|^}Nh6?=MbU5P zdJD*2UMY@*2Z_OqmNPf#Rf*u0!iM6c2864Vu`Q+yDdH7u-BN-uRU(DE*EpfVb%tln zpU7XlAx@d;rsVibD9-zW%9B9VDbQ!p;b|n9&aFXRjA=%z6y`};zA&e=9p=k8e;TkA zE~Dbu;+kwHRw&#JB@Du1Xs~{O8bvG&p(!XiG6QR&!vnSkEnKF~_39*=DPj2qs%5c| z1jrF*EJJw#P@2Es19OX%pAb_)8|DXShHR4o(fU+mrB|TZ_8iUiE4Wa!gfoX0P=3@G zNXkyNT&3}N0nLyHM&Lkp4eqqeVXzl?`3#sEcVO(b11*i;QJlNz10@agv|LwgPM|^(iOjUK7`nd> z^M(?qQ{&5MZUAjmS;0JZTI!&Z8fjb}KvHh*-a0()^98!0eVul^8eT#7O*PnZYLef7wZ$;qgsWqU(Oqn-|c#v%)(=gmj!SMQJEK(fr)U4^!$ue5vu zfAj$8Xr95roLVR(Mrc`QX5Ml!J~KQkG`dF58q}cKj?A=j(x#_RNml|S)v9K_clum65Wi8iuPMp*#g*g)L nzlg5o#7SN$-q1_pLkR0P^j`N^DQ;Qy00000NkvXXu0mjfI7*p# literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-20_altform-unplated.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-20_altform-unplated.png new file mode 100644 index 0000000000000000000000000000000000000000..060fe58ef99e8a044bd49c86640aed66134c03ad GIT binary patch literal 913 zcmV;C18)3@P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D113pCK~y+Tm6S|JEfEYMksWq3W!0FpoBm)E(oF#mk41qt>6+d5aJDj%YhgO2vIf_ zFyL~Kcu+5z7ziE&6CwtqF=4p?(Q1Luyw?`&g3-g5nMvOJ&G-NQ@BJBuVVIDRXo-#! z>vgR7fmaH%|0A+T$B7Mw;DjK;V#o`x6yEAp3D9vC=s3}jEYPxXP{|^}Nh6?=MbU5P zdJD*2UMY@*2Z_OqmNPf#Rf*u0!iM6c2864Vu`Q+yDdH7u-BN-uRU(DE*EpfVb%tln zpU7XlAx@d;rsVibD9-zW%9B9VDbQ!p;b|n9&aFXRjA=%z6y`};zA&e=9p=k8e;TkA zE~Dbu;+kwHRw&#JB@Du1Xs~{O8bvG&p(!XiG6QR&!vnSkEnKF~_39*=DPj2qs%5c| z1jrF*EJJw#P@2Es19OX%pAb_)8|DXShHR4o(fU+mrB|TZ_8iUiE4Wa!gfoX0P=3@G zNXkyNT&3}N0nLyHM&Lkp4eqqeVXzl?`3#sEcVO(b11*i;QJlNz10@agv|LwgPM|^(iOjUK7`nd> z^M(?qQ{&5MZUAjmS;0JZTI!&Z8fjb}KvHh*-a0()^98!0eVul^8eT#7O*PnZYLef7wZ$;qgsWqU(Oqn-|c#v%)(=gmj!SMQJEK(fr)U4^!$ue5vu zfAj$8Xr95roLVR(Mrc`QX5Ml!J~KQkG`dF58q}cKj?A=j(x#_RNml|S)v9K_clum65Wi8iuPMp*#g*g)L nzlg5o#7SN$-q1_pLkR0P^j`N^DQ;Qy00000NkvXXu0mjfI7*p# literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-24.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-24.png new file mode 100644 index 0000000000000000000000000000000000000000..867fe7ad68b0eeaad347a473934e92f231edeb3a GIT binary patch literal 1123 zcmV-p1f2VcP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1NccqK~zXfm6m-> z6K5R9`}c&<_U^fs-W5lIC>YzjgGqeZmMmbyw#eNwpfN`Ghf~pHbH=yq58Xd%3~kxI%kQ}!wY|36ntan<+xvc=-^=rR z&Ss0hJWQ`tnBJ){?RSN#j}#X8pQ3xzI|WSZ@`&nU)0e+wQEl`}`deE=a;wlh6 zgX7q>5olTS3@vM(rsx^}t+r|qZbykx8%cxA)IV+10oeeQ_tWdOnsCUK&xkYKGX%zV#hiHq?#s+Qn#vlm>1pXw6p+?8$0I|Ldf-@&{K)`>u;ku z6vcbBPtY8)8k^eIFoX5)-k5D+3xM8T_ENa)^YKn_H})H%}l~eJBrU8)oTz3WbwVlII576HQbRPpQPsZ@;wHR(+pTYQG1mQ*lk_rf~ z2kL@ja5;*tDdL+bZyxr3a2CV8K&?)Q(pvAKgaOPr5JvTLnxBebWtNv zLrC^QYmuFEe5iS2I|ffC%t=3dW9ZVkXcFY}1J8L)UNm1_Gl6_(DX(ENfN2nNitthE z84Pq2z%Vy;{Of6SeV2exy2b~hXbweqcaeGMtqYjzuH<`$8YKxp=^^T&12=K%xD{YR zD3Z~>2(C=VaQ;jbn?iT7y5<6wX&vwg3uevDhDic=goQY?e<~xuOc&Lp``F+3^2kFJ zDa#<`74w|a;4{rF07?uJO;!I3dnh4Gk%b%|s$bi}i+tkS zM3K{J=oC=>k70)vdFm#N7Rv6!#po$u9q*)FYFkaOU{<-Y|+7fRIzn8^O5FZcgw5 zsT^(=SQ3At(30aWmZT>OMf5NAN_vmNw0kmBAIBd< p{Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1NccqK~zXfm6m-> z6K5R9`}c&<_U^fs-W5lIC>YzjgGqeZmMmbyw#eNwpfN`Ghf~pHbH=yq58Xd%3~kxI%kQ}!wY|36ntan<+xvc=-^=rR z&Ss0hJWQ`tnBJ){?RSN#j}#X8pQ3xzI|WSZ@`&nU)0e+wQEl`}`deE=a;wlh6 zgX7q>5olTS3@vM(rsx^}t+r|qZbykx8%cxA)IV+10oeeQ_tWdOnsCUK&xkYKGX%zV#hiHq?#s+Qn#vlm>1pXw6p+?8$0I|Ldf-@&{K)`>u;ku z6vcbBPtY8)8k^eIFoX5)-k5D+3xM8T_ENa)^YKn_H})H%}l~eJBrU8)oTz3WbwVlII576HQbRPpQPsZ@;wHR(+pTYQG1mQ*lk_rf~ z2kL@ja5;*tDdL+bZyxr3a2CV8K&?)Q(pvAKgaOPr5JvTLnxBebWtNv zLrC^QYmuFEe5iS2I|ffC%t=3dW9ZVkXcFY}1J8L)UNm1_Gl6_(DX(ENfN2nNitthE z84Pq2z%Vy;{Of6SeV2exy2b~hXbweqcaeGMtqYjzuH<`$8YKxp=^^T&12=K%xD{YR zD3Z~>2(C=VaQ;jbn?iT7y5<6wX&vwg3uevDhDic=goQY?e<~xuOc&Lp``F+3^2kFJ zDa#<`74w|a;4{rF07?uJO;!I3dnh4Gk%b%|s$bi}i+tkS zM3K{J=oC=>k70)vdFm#N7Rv6!#po$u9q*)FYFkaOU{<-Y|+7fRIzn8^O5FZcgw5 zsT^(=SQ3At(30aWmZT>OMf5NAN_vmNw0kmBAIBd< p{{ep^U&~!b zQ3m)vME?)lfY?Z@O9Q}<1j1VjTx^@bMd`IW0FZS2cY%7GORNCkQJS)x^h+Ppz0U+5 zFZF6JMi*}uZW^dqN{xhNiCGBPAu?tA#9_)wuQz^VU*e3#n8coch@RE4g){D!Ri|<9zP;1HcKBpS zf9YpRe`v|fS4O?r1MPsFrlY&aWXeU4gv`-?ip^nlHHR!XSf?y<9_lFMGU2tkRlZin5tb?ClH zREX+$%Nh5zM#bo&Bum~h@rF3l8E?Hp$E$=gb*XQj^&^o%l|+`$mRO(%%q`^gpRWxT zd>mar{DpTo;A_{4xk{uNjBhl)MDOIjbG|!-b!$MFT%5WP6JNKpj9s6r4|-YLq$V!u zT3njyVLs-Zs|kjPNyE*SJg;jxc_juNxP*)|F#q&_^*VK7ggXwOf49kJkcB3$d5Ko1 z9>xsnTgIlY{h9H7iH1oYJ=jozgrWXn(t1iYpUft_HLxEX%WBd5|U_w5V z@Jrs)csP;nbGe&FUCF)ZlZz*_pDFvP(&oovBN)A|9uyfu8MS11<{c2^CQgwR@uH?T z!SOj3WohO(Ns1#I>3eWi!p)<3jlD;c=MOlIVXR9!w}gY|unCUrTZdaB3Q$PA>`b6_ zBT;`lJEdmR9UGlwhul3`$ead7uqsf0=a|!~xQ=Sinf~Odnicu;;7f%yodBFcFGIes z)`N3da9-liDjPH%aJ5VFRFKWkbAxXaa}E`HEn*s&{Tbs;8(1m4$rW8us-oXCZT;1O zgXhkF>hght2AJ5V_35l*>NmOK1MBR;9=MyXC`;NL2}Z06Z8}+|$6J6`^vSI|$HGcc zjk^VjUo-ulxA{ZLZt>Ka4eTA#pGd6i{DHzwmg7|>&CqGp&MhS{QYCIS`qvYU zS&3o)e(^M}8cN^A@A>sP@t~K&EYYR8;JD54rCUt}6)^ z-w2y7*yRtLY7TNt7`s{%DG)@Kj&hgZFW>iccHXu-tQwe@MrLnmS2OuKNp`$qa^=V< zJ9{>JrAIULzXS@v4I;bXvC$yoJ*u&Ea* zWN8}F@BP+ve*WGY=q`M~f{@U4B?28H%xg|~9}A4>9-)&h5k>i^sbu<$b{~r=xEIW6 zuhTkZe@|)J6Hi-X17`nGJl1J2L$jQg?~9Q7N1Yq%1ntJ6{!+cw$j)J>i485M35K=d z-^F;P%{+siyuK@*EO^pMN^z<*?WlYgNA}egkls6+nv2Bn=WDm8HbF7DZTLAe@NU0e z6YknJcKg{i;jyptrnD1i9NO`VR=f5kXS?G{cR@Z3Sbdl)Q-Bqv!}IV zhd}*-*LzM8kK!{JaAm zLjpC@hHGh-gtGEC7dft?=(oy^4cX^o4M(iYe>;9#c({xbhmt<~bEwNL7H}PQk)VuHq~H2)}Hf zGS-Mzt5cWtK|F4nLy`~{=rO*dTbfSh*HjkB`+>v@dPh`?iM@ty6}pGL%+UWmx*$1s zxnpp6FjFS9v5CX@UFW=RL=K_AlXqI&G89phb-@@i<<7XZA#Hw0Fnr0P3f+N5gw12N zaK1|r<-3N8+P=Cdh~WLK`O#;_fYJw-EJRs0DEBenq^^l`1YVc|+Dj9&3`}FBg zUNSL6sc@TF>%es~rP+%hn4>)`-n`0klap!=SP{31eei^9389FA@dYH(A z(K;+Z-wQW8=tEgNKLt?RAsM!cXteYgv#6>)94>Oj!EnY&Wjh32O1}qICJ$;tQ}&zV z#|*0r+UcNk+`o=K03v}2?zhf1S|nf9J?9)t79IIx)g_-*$a&0W#Is&=Q}zx;hqe|N zoz|z2y<3yp-6f`5ms%|S>6Y8`&p%5X5Y3O3qj_?xPOFiJUF>o8^~l=3L0rgB(~y=u zQZ1FggTd4`C!2OO9&V+E+Hdkd(kE;47DOnH+_fnp_VA4Fh(;iz_3N1^-NmgRq|bov zTrKEYdJuxs>{`nx5|YovZ0bz6s(PhXJINnJw*N`iRUBIKZzY3{&;LV2p%AliH6^prJ3m? zmc@QaSs>G@tNj7qV+yNB;g5f!4V#nlt-72Lmq;#n<>yFomSY#C}IpUW4F-wx~UpOIlv!zdo&ZR~P z-l&~eTUvFN+&guut=Qf6IJtO;^9cB`s_!ao<2Oxdrg8fkpXh$u4+n$-BS$9-3+x)L zKuZnuN+;AyvgH)5uWmbHhY&}dqlPMCYaHil9PWbHhzXIMOaDkO5K_e*D}9eoHr}k^ zkJAp=pnQa)>aRrK3qAtwhxYRvo<`F3Y9e;PN8K;2Kg}l&5}Jb&sat*CobDaUFrSmo zzlwXt-H-c)jYjL@-lFFkwl@W9iOX_kVmV29*Mbmq0QtdaP^*UpK#2U(IjNF2#5d_S zzsM=o$wkbQ>sQ^Vl@DW~zW%HTrUnSw#Dl6w&L%PZ!TqAL!jzWc%o}@I<aaWT3dP3&~D;^`29*iDRSg;v~`t*8kp7Q9&+6}Q&3L+ zZ?|#mg%aauzlsS$TZjkFg`HWu`^-Q2Od1KtsV)$#|3wR%4@*O>!+3vQ90~h_%gx^j`h?HZ#Nf21HyhiX9^@TYxc9TT?uoz^b zDKtG{gbHKX7F^t#{rm;|umEng3O_eDypyN>yVs0zlu2q<3&WLS)ne*S21T=;6j|(c zq%3dRw&!A~dKbPx&3L-O%)~*iRvzZX23Ko2dpwkE^K|1(Oh<0agh=+fl!)LiMW&#&n(O*6x6i97wL?bJC`u;!W2Fbx27Go?wz$(b*S;=8yDQ&Pq zc-~}3nuJFFp-p6bYdhGeWOvN3H-YW02N~4cT5RLB0|om^ky?&R;iie_({9sB1#=pE6eT zQ74#uC{(J#Ygpbxi<=M$VJ1j1@rJ5D(C-unv>|Q)&Wq-Uep0OCgedGje86i~@2U3k z0-)S}a1z{R{syTesL(;I%YU6@$ZlfJpMczh%a%w_j1)|g5EoYz{I8d1rKZK_L&p-u>d%rOL(zune|uxCJpq|d zym$v&H;Mf`j*5R>A0hs3j2GMWMBJaL3g4=C#PhGY&)}E6^;Ng<^h&Yt^j~D*=`{9= zTrKoiY1Vmhtw7Lx(s=(xU2(cs1%JK`<8xKj{pYe(J#@?MTN1cnAHqk_2@s={=`clb zU?(H;Epnu1vW$yJqD7zcS;=U2!>=r9@3;jyRYnno9fLrAqJTw`{7vusd-EDAi{6e6 zN}@uaXuy?$fdY<3HkH2WN5WoSMkshxzwdAm%pDK_$$W=tF8|C>h@E zZfbMaul*nHr%T_S$^aqR!M-N~N%+dBy!nJE4J~Rwxowp3NbJqkz?hI=<))0G;6b28 z-HrEy$G1cAo3e4&hEqR_qRyRoixT?9uXsCp6yqzG`xAx<6P5?lRKs9%;(3YPr}7KP zW^jfS6AG(<@%QhoNdToTJQ5bCE@#fYgT0;#6%=ExojA8en;Rd~>t6qbd_u^Dr22Ff)^5YI-dWCX@5Q z?TP;c`VcA2BISe1lfG=TLn$p{)k^Mm`(R|_;!kA>zM!QNxL@6s!bgcQ^RGB-pauVG zIjh^j2qT6R8t^Gy?h!N)Z$rKBB@+xY(Jq-Kj#LWXZ<;b2FS@qdlaFh)>F+{ONCreO zS)FXN`t7715=fCjL4C3O`wyw#$_Pz3P%*ZAD!|+wbf~*q@uBpslSH}M zS$WA$R=fsh-~Heo8DfDC0YU8|KEHNbsuWC-{&?RB*#R!%D}h8nj;_*oF@kjVo)mm~ zvK;;Sm!&MZcw_1px2p;W3GQA+XI`%TrueELYuM6J+pQ$Ng;rWtQshT-{kK$aV$@ry*Mf90s9#jzs`Py z^do-22dCs@amIsvZ|;>^qmbTk2HGVAzEo(#L5c&;eG}Xv$IB?D%EkijkP#NQWS+y^ zE&dnm=+t3Qf5GM+m*Xr5YlE3fBTKU4>GW?(ub<^+;)T6@*47g4J30ho2z>-Lu;ToQ zsdf5t3C+d`TiSt8hws&QH}*6ck+pkBP*hv0Q-Uza`0 z&A0#*6%oq|9?IUghpv#^(TwIjMbXxLwY|VFZ%h)fA<5Do>ggGw(@F8R=_<>Da z9_uI4T)V4HJGlzoHP`$z;U@-26XJdXsSgEt=Kn&OqCezJ+wOKxJd;1YJ1Aer%{74; zWT-y~%H(t@&MiSN<`1UkpH0TCLxAsy1*Bs5jOzf=_3xne$b=O?oV<}xv1rpb)ypX5Kq@P?d%ksr+5WZ3*xgc0|JFVf>#XQbT844ul^!9L|oP1-U~6{r=YUsr0S zpfj)biRP|~BX{jG5>0_Oh*TN0|3EQX`{QLJEflxx`r(lalBDg7cQ`sPKTpAuhG??Y zyD@O3fj`4As3Kwvj65=BJvY0>7Z@9LAR38*;<5(B{;3XG=`L*Ie-dm$IU)D@O}CayK?H%$R=Bb5f>AZtt0Y+CU&*`e4CJ)@;hRu zJ65?|Pt=OPKkgSeccL#>f!Kfa{0#QqV(=_Og~E7 z`dz6uXU52bD^;qUX84Sb!}?aKE@OzKnSC zK~z_U-Y~G-=2l7tguFrYqz~@inc={q@yIXd@9tl}bR(C7Rr)vUbpRcgJ*3w(y zLpSLc3Lxb!(;la5Py)M#XgkF#6S>IjG*NogSZ?J0Pn~C|sH>6HoQ%Jt$C`J{e+hs& zgz;|gKISagWogO1n+WtkH4KU)B)qTp zD5(d?Eup@@aUITe7?e?hFwVS-BNL{}Qd3h%9#$ec_leZ`VEF3AvNy+<`@pALRnKPy zdi|{%$7WO@av!gE0u27T-)k(Oe@7-&Z8x}IYeK1`V#SuuFKnxH1uxlOY)|)H2EPO& zFIzJtlm>2QTe2H5W%tEk35?3sD5>*AS zruzS9>JPK##sR8H|14nv_rP377`_O zIzHoHfm;dz2v7uUldj;(OsNbqmbL}QE|1gr-~Ko`Iq+*x_i3^$P_%ABCVY8n+x+VD=b;)sk@y8)<8KUTWG{!W3!D~Nf z{sDf=j$6>QyLp_IqyWU-VH8eb!a#U zsX{xyp@dbph6I+Wkum~ROwlcO45ZqjV-l2Ryj?ZXEjco@SaHnR*-@OGq&m66K#}{> z1Ex|R4lhNQDZsbl%Vm(IXnrCD3+0O;d$$G z{l)5CjOWhb4yudk5s<{r4LOAV(Fj<(;E;iotvY}nf;6$8vd-7$Gt;q@G?yiKs<=J7 zEdO_VKB)K5(Rikj8p{K$BW`D25k7~*Ox`vce(AY*{>E=Lmz+@wTBbte!fB3P)qDDw z{#k%=Uoelj?uiO_>m-l;-neRTOSFIcg+=nuRuCeO#bmK?zr0rWs{-NwBs03iTKw9#C{~|LZB>x_LYBH; zW{TL06C%S2?t$+|No!Bl=S7`62#Dc^kwl);j4tDFoNg0xtTdbyI2-4#6W*zrI8Q4E z&M=V)Z+pF~&Tx8n2dN%1`40$9lC*@po!D34iRP0lXH*sw+|3Q!)cHBp+)9Gg4-)w1 zlFVRR!Fzu9)^WkPyP}S_US(JPkmZ_H4RM&r8*j1kqv6ZvD?Y24J{l`}99YqD11wJv z{a~`Ux!X@Y=e&-9B`)7f?0;xKT9T*fM#bERTv`;c)|CQeE^u|5mDm9u!EcLC&VhVv z%xrla#M^>6$u=)zvV)*tcuyj2Knf4Yka>Yj)}SadEcGF@jzL=l$5!svZ2tL4xqK%QK$_?x%SOJ+YP^g`;#RKe});eAaHZzyAU;#=&k1DvA zWe*-SP+;Bqf~u!&&_AR!=nFXz2hnsFE+{rQR64W;g_^+uyijvES$7jx`Zo52r9$!L z%zJMwgTKEgz~gR%M(3Lio`OjYa#Lc)3uv&j2&y?v&q?TF5Lt6gdJOC zehSPWhwD}jMu3aj!rz*8WE3AJmac(ZeO^W*WPccA5=3B3yF8&hwkF- z2X@BGK7ZY;RNlMZs>D_Z)P08HZ2t}PX4t4P&jMW_Mw-}U){expTKzejlz0GOdU?pv z267A-6IT+tV8|C-Zz|}qzJx7QMY*p~uOHLb6Y2;qd+{#k_T%4VqvInp%gdNU!IX*13zGe=( zR*m9-0J*I2yYuS*dM;bwn@O7J-srawz;pFQHZ>N-Y8}nyo1-zu)w);P>&Wsc7WF_BG22{z{E zw#%k9OJ86Y;omh*ynBBK7eWAYedIzezN3+MgqPz=SZ>_zoGtrZ=1wS%CqjJ9-)arz z1_qXNNcOA3&fU40Ib6_+#QrfR2tspZ5Yi|bFYm?%V;Y5;sLsnuB#^vhB+KN>z_4(< z_&Ie}3w)#m>Qcyn0TSbrPD!7zI`*Zpjg4{Kwc%arlB=p6eo<;FU^Tozwo6gDd zk1$joCU|Q;rI=RpRBkvTEq?KS3IVdeG|+(q1l8F|>s632r-{yXKk2q=mlj}{k{9&5 z91X6^nGGzL$pCy_?xj=V0)^6Z9B{0{c~O}q8?1yJM(;o1kFFdjbeVJJc`igxRZI&afrmdq0ZcgP9{8!=- zZc-sG4U&8Y&xtjgu8sAKkW@=7P^!J1<-f_h65U21d4r5>nawMYR@OPQ*5AdswDZ6w zuvpsmWc6b-s>QRecBSOoHh=k#%9EdH!s_*38p6vy$1h4iD;7%!M&9#% z5)lg{sh%}dFN$wPXWJ0GBwIDCc{*0G>L8FkFEVG@iY6aK?RblxNeH}B!kZc0zU($qMC>?|$QmJH(X$B`wbPDbCCYK!+vQ3|^%W zV+NDDpFU++lK~TN*s?tO)d8qh3CK~1s7DW5tpDXNQ9luAUys!Kc{EGI_U}NHInK-n zaBblnNm*)RVWsD!6|lv1eC=*HR#&hm$Ffl2v$!)fGSyVvr5mj1qlmv^QDN)ehmEa~ z*aD;)cg7{R$G$i%aYKUs*Fnp7tje|*EubdJFiDrI&AF?e=~Xa)S;wGlMe_Ec)ZLG7 z!OTrSF(S741Tes>cI<3~!9zA!V0c8GPK?rj4%_m54|Hd#E#)&P<8?QN!+!9y93fol zDHkhkDFLLKupD5JRNd@L&zF88w6~zvE?;xq$zpZBJdNsjeTyRBp0fX0@{f&Zg$Qv9 zqVpC#OlJ!So9p{C1vd>>`91*%$%*L|4dL4o74v)Jgd}0pu&Ba`rfBV z5mk5VX0`In`1_mZY^6a+n&NYwNL>BS zvF)4U8!PIvUEW^yr1L)c@pU+*8sj858#o;kKiD);~ zEG`Y{m9u5Lgvob7q-q{)_mS9Ytg3mlnz5YmddVvr_X6~p3>;#hgqZLryprWLpp zNc#3IXF|X8%!k28Jb(q?{h8eE!I;GR=;*8P=?#7(A;vgC?=enyh(q^V-w2~&ykTQH7xaA0`9+-JgJ%OZ zL0#+7C!21JxebT0#Wled^xeZ#sEo31TlATUJ-Yn2n<(0Un$R5fj*W3m1A}RB`o?5a zbChHJxOn5FbB9KR1_hsxkGpfT_s-gDl<6p`vO(F@?CJqv3Tt? zE}SEev|yEGX2IAO8U=oRQ~&uc@-+m;*#ymU-*PUT7-;TwNVYI@Dn4h91vw06 z|2UhArm5L#<}?;f7A_U?iAQcj9z>MVh6o_!=I_4prOEc6lo=9)p>Er;uf z{Z`MwM5_X`$s7jdSoxUKaLh0mA9i;_T6~W?{1_g%g^$hJ6-~c?)M{++rCY0ucyO=B z0@MM6MerZL&1qak%MN&1Hm>WPf}Eaha*w?aM@H+1L>%b^JEu3FA=4e<~|dE<LkfeL-#ge^ynpZx0m zCV@fUT5SWtDe5*;M~S&tt9t`uvOWy8k~UxKg!OXVpG#|+YW4ekO?PUb)q&ITg2b71-z0>y?+Nne-Ecf?A*vrH|tRsRd7$?n0q;FZbRhl(jBJPwu;8 z$#-_wG>kN5_?leUUoklqoA#93ejcHV*H(Jmg~?YOfA9NpF~_9roT1|-Q;V~4gn{4G u-k%AdPcz1~WoKP)8-D!A`1te^Lz>7M4&ck%7-8#{0cCj&x$iROA^#7q!65Mf literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-256_altform-unplated.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-256_altform-unplated.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3c97b306d85bec83f9d8d9f5e79aff7e1455f4 GIT binary patch literal 11522 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 literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-30.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-30.png new file mode 100644 index 0000000000000000000000000000000000000000..6ab279fe8ea0fbd93fe2d701a6c2b774a26debb7 GIT binary patch literal 1422 zcmV;91#$X`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1tUpBK~zXfwU=9L z6lE00`=SXnwB6mA>2_zfyKU(m*qL5{mdd3lrLjbzDs3rH5HDTqg(^H49#jZHgoidl zKzeWKOa4JV*i2C6sP=;cw2j-DbNpyOf}l{Ij#0ne+S34F~ z7L@-;Y0PG{kPb7ieBuYS?XpB>LgE!jy!?c+!DN_)D19)WyRZm5l`RGR%~6+3$R~6;Xy{4Vwz{T;kFfgh+ziLZR?C99RmX z^hq%46ESbr7Oc+y7H__G1Di|!LV3|Gl)ZczdD#aMD=vl*9;14nu{c{#h{(wUln4I@ zw57nPPk_~!h1JWy!MhuPnlhkrtrHccBd9EWfa-N_ytff3FTRD$)C%UkuZ?lm@08zR zDgre`Et4S?l$Lcb{mhKNv*um^IZ(CE#TJ#BS_vV7Johk&CGxgA1im>{Fc~OV)Pb$9 z6V#yrRKxAXcMvD$vf}fCCEj*x%3#WClBIx!l%xh}$-yF%pVKfA@+St+fOHs>kKo1E$X;%L~-Sm4=!9h@4~eUE(~6Fqjmp-pztm0AEBh+ z9P^git0tJW!SF=v*nSo#dV!9{Q3fT^eOL1+E}V7Y^7kJ2rG5{*Zs$nAuv1kpkhen! zR@J)D7!Sz3=M)wpAX-jAuF4;phbOg#`th409lIHq`C8j@~1IbF3vQ#kvJ=|_6;t+IO6RthFc%h9%n$e3LSK8%V;4SOt@@|+a21Z{`^o|4zJI9lYk zsxP4rja5OklgZ#ESFTqWvLSA{HA2L{1*`AAJa( zzoZ&%hwn0vXaU_VZWh*_)`$3_3pjBU*!|&oBv=-Kn-M?mi5lduan>IpB5!Ng8ukdD z9FvRkjScv8?{&1-JJ8uQg64y_vHOE_SegGmJHaTgQ-zXHDnsWss8#kZ4`V`nhg;4BH9*?**5F=tvrG<%OQvnv?fhBIgD)VlvETi=dOssH47X zQ$6!|(Lg_!ysh*5HzDt%Vf+953!{R1FOxofk(o>Dka*=ck(X~%**}duHk2WWSGvrC clIzR*7q%3s)zxiiUjP6A07*qoM6N<$f})tL&Hw-a literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-30_altform-unplated.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-30_altform-unplated.png new file mode 100644 index 0000000000000000000000000000000000000000..6ab279fe8ea0fbd93fe2d701a6c2b774a26debb7 GIT binary patch literal 1422 zcmV;91#$X`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1tUpBK~zXfwU=9L z6lE00`=SXnwB6mA>2_zfyKU(m*qL5{mdd3lrLjbzDs3rH5HDTqg(^H49#jZHgoidl zKzeWKOa4JV*i2C6sP=;cw2j-DbNpyOf}l{Ij#0ne+S34F~ z7L@-;Y0PG{kPb7ieBuYS?XpB>LgE!jy!?c+!DN_)D19)WyRZm5l`RGR%~6+3$R~6;Xy{4Vwz{T;kFfgh+ziLZR?C99RmX z^hq%46ESbr7Oc+y7H__G1Di|!LV3|Gl)ZczdD#aMD=vl*9;14nu{c{#h{(wUln4I@ zw57nPPk_~!h1JWy!MhuPnlhkrtrHccBd9EWfa-N_ytff3FTRD$)C%UkuZ?lm@08zR zDgre`Et4S?l$Lcb{mhKNv*um^IZ(CE#TJ#BS_vV7Johk&CGxgA1im>{Fc~OV)Pb$9 z6V#yrRKxAXcMvD$vf}fCCEj*x%3#WClBIx!l%xh}$-yF%pVKfA@+St+fOHs>kKo1E$X;%L~-Sm4=!9h@4~eUE(~6Fqjmp-pztm0AEBh+ z9P^git0tJW!SF=v*nSo#dV!9{Q3fT^eOL1+E}V7Y^7kJ2rG5{*Zs$nAuv1kpkhen! zR@J)D7!Sz3=M)wpAX-jAuF4;phbOg#`th409lIHq`C8j@~1IbF3vQ#kvJ=|_6;t+IO6RthFc%h9%n$e3LSK8%V;4SOt@@|+a21Z{`^o|4zJI9lYk zsxP4rja5OklgZ#ESFTqWvLSA{HA2L{1*`AAJa( zzoZ&%hwn0vXaU_VZWh*_)`$3_3pjBU*!|&oBv=-Kn-M?mi5lduan>IpB5!Ng8ukdD z9FvRkjScv8?{&1-JJ8uQg64y_vHOE_SegGmJHaTgQ-zXHDnsWss8#kZ4`V`nhg;4BH9*?**5F=tvrG<%OQvnv?fhBIgD)VlvETi=dOssH47X zQ$6!|(Lg_!ysh*5HzDt%Vf+953!{R1FOxofk(o>Dka*=ck(X~%**}duHk2WWSGvrC clIzR*7q%3s)zxiiUjP6A07*qoM6N<$f})tL&Hw-a literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-32.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-32.png new file mode 100644 index 0000000000000000000000000000000000000000..b84fb1dcf9bcdf0b66fc93ee70e53b7738f37702 GIT binary patch literal 1513 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1%63HK~z{rt(SXj z6jc<)_g`LiA2YMNotZwDM=7#1TMd>J{{U=2EsqAeg|^#DMT(ZT0%GJ91WXOYLSn2C zpaOl!tBn5w#|CRYx+Ifxmdv~U zj<>#uI3W$PpgvP*PMTZh)qf<5k{cp!7t}17iMk;1$`d2U3Swr(I5%R8VZee&_IZs zlL;reh_j}lc+RgVo$o_&b|)6)gbV3W;dubh%=2sq(P9QPK!c1!6EHS;DvIW9 z#YbySp}Oh{T3ft0ez*s9pWnyo(z|#wyAyBE3m4Q<;ps);%yu^KfClX5aj*iSc{e>5`Bm-zwk0@cY1OBXb&!(@!`TxK6L!-!GS)JViE$%F!Z;*>9ah4h85qBo zdM}=L#n{BV9oylDAbmfarG4l P00000NkvXXu0mjfjDW!R literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-32_altform-unplated.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-32_altform-unplated.png new file mode 100644 index 0000000000000000000000000000000000000000..b84fb1dcf9bcdf0b66fc93ee70e53b7738f37702 GIT binary patch literal 1513 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1%63HK~z{rt(SXj z6jc<)_g`LiA2YMNotZwDM=7#1TMd>J{{U=2EsqAeg|^#DMT(ZT0%GJ91WXOYLSn2C zpaOl!tBn5w#|CRYx+Ifxmdv~U zj<>#uI3W$PpgvP*PMTZh)qf<5k{cp!7t}17iMk;1$`d2U3Swr(I5%R8VZee&_IZs zlL;reh_j}lc+RgVo$o_&b|)6)gbV3W;dubh%=2sq(P9QPK!c1!6EHS;DvIW9 z#YbySp}Oh{T3ft0ez*s9pWnyo(z|#wyAyBE3m4Q<;ps);%yu^KfClX5aj*iSc{e>5`Bm-zwk0@cY1OBXb&!(@!`TxK6L!-!GS)JViE$%F!Z;*>9ah4h85qBo zdM}=L#n{BV9oylDAbmfarG4l P00000NkvXXu0mjfjDW!R literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-36.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-36.png new file mode 100644 index 0000000000000000000000000000000000000000..43c6b3840b9250c67534ec0b8dcea2bed84e6edc GIT binary patch literal 1699 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 literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-48_altform-unplated.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-48_altform-unplated.png new file mode 100644 index 0000000000000000000000000000000000000000..abf387b6d45bc1ef496798a9dd546b5e3807d559 GIT binary patch literal 2222 zcmV;f2vPTmP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2t!FkK~!i%&02eO z6xAKhzpV<{?9A+DcW3h;4?_}mX0k!#O$7=@1W6zek`2g1Q^5pME2T%|v<(6+J;BGZ z$3UuiKqP=f&?uH7j{_>iCMIg7wDr**ZEGKffScXWujhAnHzYIr&Ym3RoG)jyduQ(V z-QV~7-Fs&yE-t`f;-m>8m$yyi<&zd(zGC5|FD;z()hOXh3orjk-5CwUZp|HM_40dn-N^7EiLb{soutVf*b3|VGicYfd zGAz7w%YX(`6qJ8kc-ta1Z+2LD=^jy#`$?_(T=8?FMoY2llOtyiI@A# zdMRyCfSH#Lcx%m6JXS(gCCm=AwC5LT^a*@rtgfp4Aw?{ULcU2%$(HjA#bo} zi_Gt__PoqU5kZqa8@XxAF)M!u?w@rKMRVUk(cE?{n0Wv*>@~>A!)5SR`DL9WGJ_u|q{~y+`=)?LI zSN&o`={0OD_lQ|K?<7)8(_n}n7gPjAz`{!%B;YTxOI{E8?9`>GSoRM_NKH04`q(+^ zmVA!Pqyh->sR2dMTtSmw9Q|Sc_-PawWEgbm$h6MK50?MSJLF!R#aF%w|sa$)9j;JCk&5r~fbO%W7{W%JL#sLS+Qp}d^`88ZR=*d)xf zKgB$+B@`X#T9a*$vr4A!FQx)$^r zuXVIUqDLPSVasr^iEn71F%>`|zIS><6jdiQ=$f-9JK&JEyl zmm8Nq7{DL92k`szZnV@nQT^amCPYmvT+o_n$@foqlQ;?i^cz`4%36Th9o=~CFmR{| zIPe?iAe#0%app}IKDy+_2k&~&bIFY>Jp;IO)`gv0u3_~9(TSiWo;P)`W-bUzfRFs$ zN(q|xeS@}_hZ7$vp#7EpVFG;k_2xz&MI(ZeIDh;j-gQw#0%UM^q$4+D9-8+4 zhgoHR{kIzOg#GnS9Bgo+^MV`Q?`cJRc!@*|VAoHsMP#Q+hYM?$e2yf;M3}go$OMqz z4Z1As`q}%;??h5fd?*_0oH*6)!bcri0lr9doO7dkbzj(tO-qS;Ce>=@fUpFRbru(F z#qmRAn|=*pHJa<4c=;tKOWvM~S^)&giG%gdFrv`Qs?X}eD{S3QJ32MLpaN+0P5NBy z+4%Ui5Dz64rIWjmIDALq)(S^fK#II-JN&D}fMTV-r*Wd4Gz% zjFE47(WN083}mJDBmKa~uRd`JN_SviV-#p=A8 zU^pNV6bVXd%88-T_@rw9ZTp>ATQpn%?Tg9tw2`r8l>7C4*a8x6OTl9sj3Og zhoddg3m`P_bE0vt6Neg|c(bh^=YH#ANq)NBiFHf=jM4>NSUmd}rYYMn&OD1vR*CxY z0c{h3fHXY0`Q(TN_&^nkgiusy+41Yz&yZ@GjKqZTEJ<$?*AfkcAOfg_rl5NL;SpIV z5Dqs3yKA~()Mde>A3ixnf}jE@iB}ZuiaLpdfd*ys#^Y=`t|k=;f(qcrWMGn9j6+Q~ zA}*t$K!Z|Pu$4`eYEqFPr~uE+*ev|Ari-nC)Fh%sYvT5<-uUJ*jEUNA=QiK%1?ktZ<$4|GM!SUA6i@9K+b19N_&-@iB zrn^Qw`h<`I2*TJ*WF$?;zUTgiwwCBb&^d>jXcOeZ6niO4-a!3D0=kCh)*>%`8tCRO zHPYXn3MuP8CL$U;(OlBn*pIo>AMsjeq9e;pxxdDBkUfBCGka8F?SPoS%;qIYka+q2cg6GNSrTw^yd- zmtj@O9&Fk4I<{}UfTx~(2T%Oy1Rh>lhuPCAkYu#8QKz=C@VpxA`L$k|>U+p{G*lFZ zf;K#~;3I;RBb4ky{GHI>KF<5yI7VE3UaY_#FY(gbgHI`~ygfzam8;=JLJN8@7w*Hk zk%Dm)<{9 literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-64.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-64.png new file mode 100644 index 0000000000000000000000000000000000000000..e254fd8fa7c22d57bb459caa9377f73446951d6c GIT binary patch literal 2890 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 literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/assets/Square44x44Logo.targetsize-64_altform-unplated.png b/clients/windows/packaging/assets/Square44x44Logo.targetsize-64_altform-unplated.png new file mode 100644 index 0000000000000000000000000000000000000000..e254fd8fa7c22d57bb459caa9377f73446951d6c GIT binary patch literal 2890 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 literal 0 HcmV?d00001 diff --git a/clients/windows/packaging/pack-msix.ps1 b/clients/windows/packaging/pack-msix.ps1 index dd807d0..7d23197 100644 --- a/clients/windows/packaging/pack-msix.ps1 +++ b/clients/windows/packaging/pack-msix.ps1 @@ -106,6 +106,25 @@ Copy-Item (Join-Path $assets '*') (Join-Path $layout 'Assets') -Force $manifest = (Get-Content -Raw $manifestTemplate).Replace('{VERSION}', $Version).Replace('{PUBLISHER}', $Publisher).Replace('{ARCH}', $Arch) Set-Content -Path (Join-Path $layout 'AppxManifest.xml') -Value $manifest -Encoding UTF8 +# --- resource index (resources.pri) --- +# The shell resolves the manifest's logo assets through MRT, so the qualified variants +# (Square44x44Logo.targetsize-*_altform-unplated.png — the alpha-transparent taskbar icons) only +# take effect if a pri indexes them; without one the taskbar falls back to plating the base +# 44x44 onto a solid square (the white-cornered icon). makepri's default config indexes the +# layout's asset files AND merges any existing .pri it finds (reactor's staged WinUI resources) +# via its PRI indexer, yielding one combined resources.pri. Output lands outside the layout +# first — the reactor pri is an input while indexing — then replaces it. +$makepri = Find-SdkTool 'makepri.exe' +$priconfig = Join-Path $OutDir 'priconfig.xml' +New-Item -ItemType Directory -Force -Path $OutDir | Out-Null +& $makepri createconfig /cf $priconfig /dq en-US /o +if ($LASTEXITCODE -ne 0) { throw "makepri createconfig failed ($LASTEXITCODE)" } +$priOut = Join-Path $OutDir 'resources.pri' +if (Test-Path $priOut) { Remove-Item $priOut -Force } +& $makepri new /pr $layout /cf $priconfig /mn (Join-Path $layout 'AppxManifest.xml') /of $priOut /o +if ($LASTEXITCODE -ne 0) { throw "makepri new failed ($LASTEXITCODE)" } +Move-Item $priOut (Join-Path $layout 'resources.pri') -Force + Write-Host "layout assembled at $layout :" Get-ChildItem $layout -Recurse -File | ForEach-Object { " $($_.FullName.Substring($layout.Length + 1))" } diff --git a/clients/windows/src/app/hosts.rs b/clients/windows/src/app/hosts.rs index e907053..012cdde 100644 --- a/clients/windows/src/app/hosts.rs +++ b/clients/windows/src/app/hosts.rs @@ -1,5 +1,6 @@ -//! The hosts page: saved (trusted/paired) hosts with per-host actions (speed test, forget), -//! live mDNS discovery, and a manual connect entry. +//! The hosts page: saved (trusted/paired) hosts and live mDNS discovery as tap-to-connect +//! tiles in a responsive grid, with a per-host "…" menu (connect / speed test / rename / +//! forget) and a manual connect entry — the same card layout as the Linux and Apple clients. use super::connect::initiate; use super::speed::SpeedState; @@ -9,74 +10,190 @@ use crate::discovery::DiscoveredHost; use crate::trust::KnownHosts; use windows_reactor::*; +/// Overflow-menu item labels — `on_menu_item_clicked` reports the clicked item by its text. +const MENU_CONNECT: &str = "Connect"; +const MENU_SPEED: &str = "Test network speed\u{2026}"; +const MENU_RENAME: &str = "Rename\u{2026}"; +const MENU_FORGET: &str = "Forget\u{2026}"; + +/// Tile-grid metrics: minimum tile width before dropping a column, and the gap between tiles. +const TILE_MIN_WIDTH: f64 = 320.0; +const TILE_GAP: f64 = 12.0; + /// Props for the hosts page: the services plus the changing discovery/status data that must /// drive its re-render (compared by value, so a new host list or error refreshes the page). +/// +/// `forget` and `rename` are the per-host action state, and they live in ROOT (not this page's +/// own `use_state`) on purpose: the "…" overflow is a WinUI `MenuFlyout`, whose item clicks are +/// wired directly in the reactor backend (`add_Click`) and so bypass the normal event-dispatch +/// flush — a *sync* child `SetState` from that handler marks state dirty but never pumps the +/// reconciler, so nothing re-renders. Root `AsyncSetState` re-renders the whole tree; because +/// these values are props, the changed value propagates back into this page (a child's own async +/// state would be memoised away when its props are unchanged). `(fp_hex, _)` in each identifies +/// the target saved host; `rename`'s second field is the in-progress draft name. #[derive(Clone)] pub(crate) struct HostsProps { pub(crate) svc: Svc, pub(crate) hosts: Vec, pub(crate) status: String, + pub(crate) forget: Option<(String, String)>, + pub(crate) rename: Option<(String, String)>, + /// Whether the "Add host" modal is open. Root state (like `forget`/`rename`), not the page's + /// own `use_state`: a child component's sync `SetState` marks its slot dirty but does not + /// re-render when its props are otherwise unchanged, so the toggle wouldn't take. + pub(crate) show_add: bool, + pub(crate) set_forget: AsyncSetState>, + pub(crate) set_rename: AsyncSetState>, + pub(crate) set_show_add: AsyncSetState, } impl PartialEq for HostsProps { fn eq(&self, other: &Self) -> bool { - self.svc == other.svc && self.hosts == other.hosts && self.status == other.status + // Setters are identity-stable; only the value fields drive re-render. + self.svc == other.svc + && self.hosts == other.hosts + && self.status == other.status + && self.forget == other.forget + && self.rename == other.rename + && self.show_add == other.show_add } } -/// A clickable host row: monogram + name/address + optional action buttons + status pill + -/// chevron. `actions` land between the text and the pill (saved hosts: speed test / forget). -fn host_card( +/// A host tile. The tap-to-connect summary (monogram, name, address, status row) and the +/// optional "…" menu button are SIBLINGS overlaid in one grid cell, never nested: WinUI bubbles +/// `Tapped` out of buttons (reactor doesn't mark it handled), so a button inside the tap target +/// would fire both its own click and the tile's connect (the old forget-also-connects bug). +fn host_tile( name: &str, sub: &str, - badge: &str, - actions: Vec, - on_tap: impl Fn() + 'static, + status_row: Element, + menu: Option