CompositorService: lockAndSuspend - wait for lock before suspending

This commit is contained in:
Ly-sec
2025-11-29 13:05:24 +01:00
parent 75b17b9185
commit e07f2d34c0
+60 -3
View File
@@ -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);
}
}