mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-05-04 09:54:17 +02:00
This commit tries to render move/resize animations on a DWM-thumbnail "ghost" window instead of calling MoveWindow per-frame on the real HWND. The source is cloaked via IApplicationView::SetCloak, the thumbnail is animated via DwmUpdateThumbnailProperties on a layered host owned by a single "ghost owner" thread, the border for the source follows the lerped rect via a new WM_ANIMATE_RECT message handled on the border's own WndProc thread (preserving today's per-frame border tracking), and the real SetWindowPos happens once at the end of the animation. Apps repaint exactly once per animation instead of N times, which is a substantial win for heavy renderers (browsers, IDEs, Office). For non-Chromium sources the source is also pre-positioned to target_rect before the thumbnail is registered so the captured texture is target- sized and downscales to native 1:1 at the end of the animation rather than upscaling to a stretched/blurry final frame. Chromium-shell sources skip the pre-paint step: their NativeWindowOcclusionTrackerWin reads DWMWA_CLOAKED and treats any cloak value as hidden, suspending the renderer; WM_SIZE while cloaked produces no new frame and the post-uncloak swap chain shows stale or black content. For those apps we keep the source cloaked at start_rect for the whole animation and do the SetWindowPos in post_render after uncloak, where the visibility flip is what wakes Viz back up. A short ease-in opacity crossfade in post_render masks the texture transition for the Chromium path and gives slow renderers time to present their first post-resize frame before the overlay is removed.
131 KiB
131 KiB