fix(wallpaper): keep rendering until the scrolling image has decoded (#3725)

In scroll fill mode the parallax layer decodes its own copy of the
wallpaper (parallaxImage, asynchronous). renderActive only waited for
currentWallpaper and nextWallpaper, so after a wallpaper change it could
drop to false and let updatesEnabled run out after the three settle
frames while parallaxImage was still loading. The window then kept
showing the black backing until something else, like a workspace
switch, started rendering again.

Count parallaxImage loading as active too. When it turns Ready,
renderActive flips back and onRenderActiveChanged invalidates, so the
finished image gets its settle frames.

Fixes #3702. Diagnosis and fix by @clethbridgedaniel in the issue.
This commit is contained in:
Mario Mohar
2026-10-08 11:33:25 -04:00
committed by GitHub
parent 97004ffd6e
commit 1d120f94bf
+1 -1
View File
@@ -160,7 +160,7 @@ Variants {
readonly property var backingWindow: Window.window
readonly property bool showsBackdrop: !source || isColorSource || currentWallpaper.status === Image.Error
readonly property bool backdropBusy: showsBackdrop && !(backdropLoader.item?.ready ?? false)
readonly property bool renderActive: backdropBusy || effectActive || overviewBlurActive || pendingWallpaper !== "" || _deferredSource !== "" || changePending || _freezeWaitFrames > 0 || frameAnim.running || currentWallpaper.status === Image.Loading || nextWallpaper.status === Image.Loading
readonly property bool renderActive: backdropBusy || effectActive || overviewBlurActive || pendingWallpaper !== "" || _deferredSource !== "" || changePending || _freezeWaitFrames > 0 || frameAnim.running || currentWallpaper.status === Image.Loading || nextWallpaper.status === Image.Loading || parallaxImage.status === Image.Loading
property int _settleFrames: 3
function invalidate() {