]> git.mdlowis.com Git - proto/labwc.git/commitdiff
session-lock: reconfigure for output layout changes
authorJohn Lindgren <john@jlindgren.net>
Thu, 5 Oct 2023 03:54:27 +0000 (23:54 -0400)
committerJohan Malm <johanmalm@users.noreply.github.com>
Thu, 5 Oct 2023 19:10:37 +0000 (20:10 +0100)
Currently, if the output layout changes while the session is locked,
the lock surfaces may end up wrongly positioned, which looks bad and
may reveal some of the user's workspace underneath.

To prevent this, re-align the scene trees and reconfigure the lock
surfaces when the output layout changes.

include/session-lock.h
src/output.c
src/session-lock.c

index 8c8a0ff6099af486192882e85c26a9f95a01a378..d43003c72e70737ee7921c654cf8c6331c236140 100644 (file)
@@ -4,6 +4,9 @@
 
 #include <wlr/types/wlr_session_lock_v1.h>
 
+struct output;
+struct server;
+
 struct session_lock {
        struct wlr_session_lock_v1 *lock;
        struct wlr_surface *focused;
@@ -18,5 +21,6 @@ struct session_lock {
 
 void session_lock_init(struct server *server);
 void session_lock_output_create(struct session_lock *lock, struct output *output);
+void session_lock_update_for_layout_change(void);
 
 #endif /* LABWC_SESSION_LOCK_H */
index b5d5a60171d5233ff1f04c6679abe1ac93904ccb..c60328c32460805133a05948347763ff9e4e2e8b 100644 (file)
@@ -272,6 +272,7 @@ static void
 output_update_for_layout_change(struct server *server)
 {
        output_update_all_usable_areas(server, /*layout_changed*/ true);
+       session_lock_update_for_layout_change();
 
        /*
         * "Move" each wlr_output_cursor (in per-output coordinates) to
index fe920f413a8c5855c75d7a8a3bc4395ded7f53e9..d3a3ca8a06bdbbaa92fc5b369d963213649087be 100644 (file)
@@ -148,6 +148,14 @@ handle_commit(struct wl_listener *listener, void *data)
        }
 }
 
+static void
+align_session_lock_tree(struct output *output)
+{
+       struct wlr_box box;
+       wlr_output_layout_get_box(g_server->output_layout, output->wlr_output, &box);
+       wlr_scene_node_set_position(&output->session_lock_tree->node, box.x, box.y);
+}
+
 void
 session_lock_output_create(struct session_lock *lock, struct output *output)
 {
@@ -178,9 +186,7 @@ session_lock_output_create(struct session_lock *lock, struct output *output)
                goto exit_session;
        }
 
-       struct wlr_box box;
-       wlr_output_layout_get_box(g_server->output_layout, output->wlr_output, &box);
-       wlr_scene_node_set_position(&output->session_lock_tree->node, box.x, box.y);
+       align_session_lock_tree(output);
 
        lock_output->output = output;
        lock_output->tree = tree;
@@ -301,7 +307,8 @@ handle_manager_destroy(struct wl_listener *listener, void *data)
        wlr_session_lock_manager = NULL;
 }
 
-void session_lock_init(struct server *server)
+void
+session_lock_init(struct server *server)
 {
        g_server = server;
        wlr_session_lock_manager = wlr_session_lock_manager_v1_create(server->wl_display);
@@ -312,3 +319,22 @@ void session_lock_init(struct server *server)
        manager_destroy.notify = handle_manager_destroy;
        wl_signal_add(&wlr_session_lock_manager->events.destroy, &manager_destroy);
 }
+
+void
+session_lock_update_for_layout_change(void)
+{
+       if (!g_server->session_lock) {
+               return;
+       }
+
+       struct output *output;
+       wl_list_for_each(output, &g_server->outputs, link) {
+               align_session_lock_tree(output);
+       }
+
+       struct session_lock *lock = g_server->session_lock;
+       struct session_lock_output *lock_output;
+       wl_list_for_each(lock_output, &lock->session_lock_outputs, link) {
+               lock_output_reconfigure(lock_output);
+       }
+}