Conversation
added 2 commits
September 24, 2026 01:19
The undecorated main window keeps the Windows resizable frame so that resizing, Aero Snap and the system move/size gestures stay available, but tao sizes the WebView to the client rectangle and leaves the window class without a background brush. The strips between the client rectangle and the window rectangle therefore stay unpainted on the left, right and bottom edge, and a transparent window composites them as bare window backdrop: the frame reads as a drop shadow around the window, while the top edge has no such strip. Collapse the non-client area so the client rectangle covers the window rectangle instead. Resizing, snapping and the move/size gestures are driven by the window rectangle, so the native interactions stay intact while the WebView paints the window edge-to-edge. Maximized windows keep the default handling: Windows inflates their window rectangle beyond the work area, which already moves the strips off-screen. Measured before the change on Windows 10 19045 at 150% scaling: window rect 289,188-2741,1863 against DWM extended frame bounds 299,188-2731,1853 (10px inset on the left/right/bottom, 0px on the top), and the strips sampled the desktop instead of app content.
…hosts it Windows 10 has no DWMWA_SYSTEMBACKDROP_TYPE, so the window material falls back to a live blur-behind that re-blurs everything behind the window on every move. Dragging the window then visibly drops frames (issue 3128). macOS vibrancy and the Windows 11 Mica/acrylic backdrops are compositor-owned and move smoothly. Gate both the native material and the frontend's transparent sidebar surfaces on that capability, so Windows 10 keeps the opaque fallback surfaces that the frontend already implements for reduced transparency and high contrast.
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.
Summary
Removes the window frame strips that render as a drop shadow around the main window, and stops Windows 10 from re-blurring the desktop on every window move.
The Windows main window is created with
decorations(false),transparent(true)and the native sidebar material. tao sizes the WebView to the client rectangle and leaves the window class without a background brush, so the resizable-frame strips on the left, right and bottom edge (the top edge has none) stay unpainted and composite as bare window backdrop. On Windows 10 that backdrop can only be a live blur-behind, which re-blurs everything behind the window on every move, so dragging the window drops frames (issue #3128).fix(desktop): cover the window frame strips with the WebView— collapses the non-client area so the client rectangle covers the window rectangle. Resizing, Aero Snap and the system move/size gestures are driven by the window rectangle, so they keep working; maximized windows keep the default handling.fix(desktop): request the sidebar material only where the compositor hosts it— gates the material, and the frontend's transparent sidebar surfaces that depend on it, on backdrop support (DWMWA_SYSTEMBACKDROP_TYPE, Windows 11 22H2+). Windows 10 keeps the fallback surfaces the frontend already implements for reduced transparency and high contrast.Fixes #3128
Type and Areas
Type: bug fix, UI/UX
Areas: Desktop/Tauri
Motivation / Impact
Measured on Windows 10 Pro for Workstations 22H2 (19045.6466), 150% scaling, OpenBitFun 1.0.1 (32e18ac), main window at 1635x1117 logical:
GetWindowRect= 289,188-2741,1863 device pixels; DWMDWMWA_EXTENDED_FRAME_BOUNDS= 299,188-2731,1853, i.e. the frame is inset by 10 device pixels on the left, right and bottom and 0 on the top.ClientToScreenputs the WebView at 300,188, so those strips sit outside the client area and nothing paints them.SM_CXSIZEFRAME + SM_CXPADDEDBORDER= 8 logical pixels).DWMWA_SYSTEMBACKDROP_TYPEreturnsE_INVALIDARGon this build, soEffect::Acrylicfalls back toACCENT_ENABLE_ACRYLICBLURBEHIND, the live blur-behind that has to re-blur the desktop on every move.User-facing: the window loses its translucent rim on the left, right and bottom edge, and dragging stays smooth on Windows 10. On Windows 10 the sidebar no longer shows the blurred desktop through its 10% transparency; it keeps the 90% theme tint plus the frontend CSS backdrop. Windows 11 and macOS behaviour is unchanged.
Verification
AI-assisted change. Testing level: compile-level only, not yet exercised on a real window.
Passed:
rustfmt --edition 2021 --check src/apps/desktop/src/appearance.rs src/apps/desktop/src/window_shell.rswindow_shell.rsagainst thewindows 0.61.3the workspace locks (SetWindowSubclass,SUBCLASSPROC,DefSubclassProc,IsZoomed,SetWindowPoswithSWP_FRAMECHANGED,WM_NCCALCSIZE,GetVersionExW/OSVERSIONINFOW,GetLastError):cargo checkclean. It caught one error before review:GetVersionExWprojects toResult<()>, notBOOL.Cargo.lockpins tauri 2.11.5, tao 0.36 and wry 0.56 onwindows 0.61.3, the same crate the desktop app depends on, soWebviewWindow::hwnd()returns theHWNDthese Win32 calls take.Not run:
cargo check -p openbitfun-desktopand a real build. The patch was prepared on a sparse checkout withoutnode_modules, andtauri-buildrequires the resource pathssrc/mobile-web/distandsrc/ext-host/extension-host.js, so the desktop check needspnpm install+pnpm run prepare:mobile-webfirst. CI covers it.Manual verification path (Windows):
Reviewer Notes
WM_ENTERSIZEMOVE/WM_EXITSIZEMOVE, orSetWinEventHook(EVENT_SYSTEM_MOVESIZESTART/END)). That keeps the material but flashes while dragging; happy to follow up on top of this PR.Effect::Acrylicand drops the subclass, i.e. the previous behaviour on every platform.Checklist