git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit5dfda6663a7baedaff1080536c8cf1bd4a1519b8
parentba02f0f703
authorIsaac Freund <[email protected]>
date2025-12-04 22:34
WindowManager: send session lock events

 river/LockManager.zig   | 18 ++++++++++--------
 river/WindowManager.zig | 14 ++++++++++++++
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/river/LockManager.zig b/river/LockManager.zig
index a4be23e..ee38395 100644
--- a/river/LockManager.zig
+++ b/river/LockManager.zig
@@ -166,23 +166,25 @@ pub fn maybeLock(manager: *LockManager) void {
 
     switch (manager.state) {
         .waiting_for_lock_surfaces => if (all_outputs_rendered_lock_surface) {
-            log.info("session locked", .{});
-            // The lock client may have been destroyed, for example due to a protocol error.
-            if (manager.lock) |lock| lock.sendLocked();
-            manager.state = .locked;
+            manager.sendLocked();
             server.scene.normal_tree.node.setEnabled(false);
             manager.lock_surfaces_timer.timerUpdate(0) catch {};
         },
         .waiting_for_blank => if (all_outputs_blanked) {
-            log.info("session locked", .{});
-            // The lock client may have been destroyed, for example due to a protocol error.
-            if (manager.lock) |lock| lock.sendLocked();
-            manager.state = .locked;
+            manager.sendLocked();
         },
         .unlocked, .locked => unreachable,
     }
 }
 
+fn sendLocked(manager: *LockManager) void {
+    log.info("session locked", .{});
+    // The lock client may have been destroyed, for example due to a protocol error.
+    if (manager.lock) |lock| lock.sendLocked();
+    manager.state = .locked;
+    server.wm.dirtyWindowing();
+}
+
 fn handleUnlock(listener: *wl.Listener(void)) void {
     const manager: *LockManager = @fieldParentPtr("unlock", listener);
 
diff --git a/river/WindowManager.zig b/river/WindowManager.zig
index 1208af4..3438d10 100644
--- a/river/WindowManager.zig
+++ b/river/WindowManager.zig
@@ -63,6 +63,8 @@ scheduled: struct {
 
 /// State sent to the wm in the latest update sequence.
 sent: struct {
+    session_locked: bool = false,
+
     outputs: wl.list.Head(Output, .link_sent),
     output_config: ?*wlr.OutputConfigurationV1 = null,
 
@@ -268,6 +270,18 @@ fn manageStart(wm: *WindowManager) void {
 
     log.debug("manage sequence start", .{});
 
+    const session_locked = server.lock_manager.state == .locked;
+    if (session_locked != wm.sent.session_locked) {
+        if (wm.object) |wm_v1| {
+            if (session_locked) {
+                wm_v1.sendSessionLocked();
+            } else {
+                wm_v1.sendSessionUnlocked();
+            }
+        }
+        wm.sent.session_locked = session_locked;
+    }
+
     server.om.autoLayout();
     {
         var it = server.om.outputs.safeIterator(.forward);