mirror of
https://github.com/zoriya/noctalia-shell.git
synced 2026-08-15 18:43:59 +00:00
CompositorService: lockAndSuspend - wait for lock before suspending
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user