mirror of
https://github.com/labwc/labwc.git
synced 2025-11-04 13:30:07 -05:00
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.
This commit is contained in:
parent
b7bd5a52e4
commit
00ce7a2b5e
3 changed files with 35 additions and 4 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue