Skip to content

Fix/3958 lock placement atlas - #3960

Merged
bbedward merged 3 commits into
duxlabs-dev:masterfrom
PandorasFox:fix/3958-lock-placement-atlas
Oct 27, 2026
Merged

bbedward merged 3 commits into
duxlabs-dev:masterfrom
PandorasFox:fix/3958-lock-placement-atlas

Conversation

@PandorasFox

Copy link
Copy Markdown
Contributor

Description

This PR does two main things:

  • implements a luminance atlas for scrolling wallpapers, and samples from that for lockscreen clock / widget placement (no more rendering out to a hidden layer -> sampling that)
  • moves the placement sampling out of the GUI thread, so that all GUI rendering doesn't hitch for ~400ms whenever lockscreen preparaton takes place

Type of change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that changes existing behavior)
  • Refactor / internal cleanup
  • Documentation
  • Other

Related issues

#3958

Checklist

  • My code follows the conventions in CONTRIBUTING.md
  • I have tested my changes locally
  • [n/a] New user-facing strings are wrapped in I18n.tr() with translator context, reusing existing terms where possible
  • [n/a] Go changes: ran make fmt, added/updated tests, make test passes, and go mod tidy is clean
  • QML changes: ran make lint-qml with no new warnings
  • [n/a] I have opened a corresponding pull request in dlx-docs to document any new behaviors: https://github.com/duxlabs-dev/dux-docs

PandorasFox and others added 2 commits October 26, 2026 21:09
Every workspace switch changed the lock placement key, so the preparer
mapped a hidden window and rendered the whole lock background again,
blocking the gui thread for ~450ms per settle. A scrolling wallpaper only
changes its crop, so build one luminance atlas per wallpaper and crop it.

Refs duxlabs-dev#3958

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The lock itself still decodes synchronously so its first frame is
complete, but the hidden placement preparer has no such need.

Refs duxlabs-dev#3958

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@bbedward

Copy link
Copy Markdown
Member

/claude review

@claude

claude Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

Claude review

One placement bug in the scroll atlas; the rest looks good.

  • After a wallpaper transition, the atlas sample is built with the previous image's size and then kept, quickshell/Modules/WallpaperBackground.qml:781
    Checked: LockScrollAtlas.js math, the LockScrollSampler canvas build, busy and renderActive behaviour, LockPlacementService scroll sampler registration, preparer gating, async LockScreenBackground loading, deprecated shims. Model: claude-opus-5-5.

@bbedward

Copy link
Copy Markdown
Member

/claude review

@claude

claude Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

Claude review

The fix for the earlier transition finding works, but the new source check introduces a placement bug.

  • When the wallpaper path has spaces or non-ASCII characters, the source check never matches and the scroll atlas is never sampled. quickshell/Modules/WallpaperBackground.qml:781
    Checked: the metrics/source gating from ddbf14e against the transition flow, LockScrollAtlas.js math, LockScrollSampler canvas build and retry behaviour, backgroundKey invalidation, renderActive/busy, preparer gating, async LockScreenBackground, deprecated shims. Model: claude-opus-5-5.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@PandorasFox
PandorasFox force-pushed the fix/3958-lock-placement-atlas branch from 0075ecd to 4978844 Compare October 27, 2026 18:34
@PandorasFox

Copy link
Copy Markdown
Contributor Author

Refactored a bit so this should be less brittle; the lockscreen sampler pulls source (+url) the same way as the lockscreen now; bandaid fixing a second round felt wrong.

@bbedward

Copy link
Copy Markdown
Member

/claude review

@claude

claude Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

Claude review

No issues found. The refactor in 4978844 makes both earlier findings obsolete: the sampler now builds its own source URL and reads the image size from its own probe, so it no longer depends on imageMetrics timing or on URL string comparison.
Checked: LockScrollSampler source/probe/canvas flow, atlas key invalidation, retry and busy handling while the key changes, renderActive gating, the scrollSamplers registration against the preparer fallback, LockScrollAtlas.js math against the tests, async LockScreenBackground in the preparer, deprecated shims. Model: claude-opus-5-5.

@bbedward
bbedward merged commit ee6e941 into duxlabs-dev:master Oct 27, 2026
2 checks passed
dux-ci Bot pushed a commit that referenced this pull request Oct 27, 2026
port 2.0

(cherry picked from commit ee6e941)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants