diff --git a/quickshell/ShellCore.qml b/quickshell/ShellCore.qml index 7649f70f9..88d7ffb0b 100644 --- a/quickshell/ShellCore.qml +++ b/quickshell/ShellCore.qml @@ -236,6 +236,10 @@ Item { } function refreshScreenSurfaces() { + if (!_hasRealScreen()) { + log.info("Surface refresh skipped: no real screen"); + return; + } log.info("Refreshing layer surfaces, screens:", Quickshell.screens.length, Quickshell.screens.map(s => s.name).join(",")); SurfaceRecovery.refreshAll(); surfaceRefreshVerifyTimer.restart(); @@ -289,6 +293,14 @@ Item { repeat: false property int pass: 0 onTriggered: { + // Rebuilding against a placeholder-only screen list feeds a dangling screen to the per-screen delegate models and segfaults (#3057); onScreensChanged reschedules once outputs return. + if (!root._hasRealScreen()) { + log.info("Surface recovery skipped: no real screen"); + pass = 0; + interval = 800; + return; + } + pass++; log.info("Surface recovery pass", pass, "screens:", Quickshell.screens.length, Quickshell.screens.map(s => s.name).join(","));