From 00ce7a2b5e29162a020a126e0b42e43601a172fe Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Wed, 4 Oct 2023 23:54:27 -0400 Subject: [PATCH] session-lock: reconfigure for output layout changes 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 | 4 ++++ src/output.c | 1 + src/session-lock.c | 34 ++++++++++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/include/session-lock.h b/include/session-lock.h index 8c8a0ff6..d43003c7 100644 --- a/include/session-lock.h +++ b/include/session-lock.h @@ -4,6 +4,9 @@ #include +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 */ diff --git a/src/output.c b/src/output.c index b5d5a601..c60328c3 100644 --- a/src/output.c +++ b/src/output.c @@ -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 diff --git a/src/session-lock.c b/src/session-lock.c index fe920f41..d3a3ca8a 100644 --- a/src/session-lock.c +++ b/src/session-lock.c @@ -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); + } +}