mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-06-24 20:15:21 -04:00
shader-based scrolling wallpaper mode (#1802)
* feat: parallax-scroll wallpaper Add a `Scrolling` wallpaper fill mode that translates the wallpaper crop with the active workspace — like Android home-screen parallax, but along niri's vertical workspace axis. The image is scaled to cover the screen on its non-scroll axis, and the active workspace index drives a fractional offset into the cropped overflow along the scroll axis. Scroll position is spring-animated CPU-side and handed to a minimal single-texture shader as a UV offset. Per-monitor scroll position is published into SessionData so the lock screen renders the same crop as the active workspace, keeping visual continuity across lock/unlock. Two implementation details worth calling out for review: - QSG_USE_SIMPLE_ANIMATION_DRIVER=1 is exported to the spawned quickshell process. The default animation driver advances in fixed ~16ms steps, capping the scroll at 60Hz and desyncing it from compositor motion on high-refresh displays; the simple driver advances by real elapsed time, restoring native-refresh pacing. Removing it visibly regresses to 60Hz. - The wallpaper survives wl_output rebind cycles (e.g. OLED image-cleaning on DPMS soft-off), which otherwise leave a stuck or void background. Recovery re-anchors the scroll target on output-lifecycle signals, rebuilds the ShaderEffect against the current render context, and re-attaches the wallpaper-layer surface on unlock for parallax-active monitors — guarded against lock state so the shader gets reliable frame hints. * simplify bindings and gate lock screen shader in a loader --------- Co-authored-by: bbedward <bbedward@gmail.com>
This commit is contained in:
@@ -2015,6 +2015,23 @@ Singleton {
|
||||
}
|
||||
}
|
||||
|
||||
// Returns numeric fillMode value for shader use (matches shader calculateUV logic)
|
||||
function getShaderFillMode(modeName) {
|
||||
switch (modeName) {
|
||||
case "Stretch": return 0;
|
||||
case "Fit":
|
||||
case "PreserveAspectFit": return 1;
|
||||
case "Fill":
|
||||
case "PreserveAspectCrop": return 2;
|
||||
case "Tile": return 3;
|
||||
case "TileVertically": return 4;
|
||||
case "TileHorizontally": return 5;
|
||||
case "Pad": return 6;
|
||||
case "Scrolling": return 7;
|
||||
default: return 2;
|
||||
}
|
||||
}
|
||||
|
||||
function snap(value, dpr) {
|
||||
const s = dpr || 1;
|
||||
return Math.round(value * s) / s;
|
||||
|
||||
Reference in New Issue
Block a user