diff --git a/Services/Compositor/CompositorService.qml b/Services/Compositor/CompositorService.qml index 28205682..67cfe408 100644 --- a/Services/Compositor/CompositorService.qml +++ b/Services/Compositor/CompositorService.qml @@ -375,16 +375,73 @@ Singleton { Quickshell.execDetached(["sh", "-c", "systemctl hibernate || loginctl hibernate"]); } + property int lockAndSuspendCheckCount: 0 + function lockAndSuspend() { Logger.i("Compositor", "Lock and suspend requested"); + + // If already locked, suspend immediately + if (PanelService && PanelService.lockScreen && PanelService.lockScreen.active) { + Logger.i("Compositor", "Screen already locked, suspending"); + suspend(); + return; + } + + // Lock the screen first try { - if (PanelService && PanelService.lockScreen && !PanelService.lockScreen.active) { + if (PanelService && PanelService.lockScreen) { PanelService.lockScreen.active = true; + lockAndSuspendCheckCount = 0; + + // Wait for lock screen to be confirmed active before suspending + lockAndSuspendTimer.start(); + } else { + Logger.w("Compositor", "Lock screen not available, suspending without lock"); + suspend(); } } catch (e) { Logger.w("Compositor", "Failed to activate lock screen before suspend: " + e); + suspend(); + } + } + + Timer { + id: lockAndSuspendTimer + interval: 100 + repeat: true + running: false + + onTriggered: { + lockAndSuspendCheckCount++; + + // Check if lock screen is now active + if (PanelService && PanelService.lockScreen && PanelService.lockScreen.active) { + // Verify the lock screen component is loaded + if (PanelService.lockScreen.item) { + Logger.i("Compositor", "Lock screen confirmed active, suspending"); + stop(); + lockAndSuspendCheckCount = 0; + suspend(); + } else { + // Lock screen is active but component not loaded yet, wait a bit more + if (lockAndSuspendCheckCount > 20) { + // Max 2 seconds wait + Logger.w("Compositor", "Lock screen active but component not loaded, suspending anyway"); + stop(); + lockAndSuspendCheckCount = 0; + suspend(); + } + } + } else { + // Lock screen not active yet, keep checking + if (lockAndSuspendCheckCount > 30) { + // Max 3 seconds wait + Logger.w("Compositor", "Lock screen failed to activate, suspending anyway"); + stop(); + lockAndSuspendCheckCount = 0; + suspend(); + } + } } - // Queue suspend to the next event loop cycle to allow lock UI to render - Qt.callLater(suspend); } }