Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
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);