mirror of
https://github.com/swaywm/sway.git
synced 2025-10-08 21:25:58 +00:00
Fix cursor events on screen lock/unlock
Inspired by https://github.com/swaywm/sway/pull/8343 cursor_rebase_all calls node_at_coords, and node_at_coords only returns the lock surface after the surface has been committed(not mapped). Also add the missing cursor_rebase_all in handle_unlock.
This commit is contained in:
parent
14fbe9242f
commit
76d739188d
1 changed files with 14 additions and 7 deletions
21
sway/lock.c
21
sway/lock.c
|
@ -25,7 +25,8 @@ struct sway_session_lock_output {
|
|||
|
||||
// invalid if surface is NULL
|
||||
struct wl_listener surface_destroy;
|
||||
struct wl_listener surface_map;
|
||||
struct wl_listener surface_commit;
|
||||
bool surface_committed;
|
||||
};
|
||||
|
||||
static void focus_surface(struct sway_session_lock *lock,
|
||||
|
@ -59,12 +60,16 @@ static void refocus_output(struct sway_session_lock_output *output) {
|
|||
}
|
||||
}
|
||||
|
||||
static void handle_surface_map(struct wl_listener *listener, void *data) {
|
||||
struct sway_session_lock_output *surf = wl_container_of(listener, surf, surface_map);
|
||||
static void handle_surface_commit(struct wl_listener *listener, void *data) {
|
||||
struct sway_session_lock_output *surf = wl_container_of(listener, surf, surface_commit);
|
||||
if (surf->surface_committed) {
|
||||
return;
|
||||
}
|
||||
if (surf->lock->focused == NULL) {
|
||||
focus_surface(surf->lock, surf->surface->surface);
|
||||
}
|
||||
cursor_rebase_all();
|
||||
surf->surface_committed = true;
|
||||
}
|
||||
|
||||
static void handle_surface_destroy(struct wl_listener *listener, void *data) {
|
||||
|
@ -75,7 +80,7 @@ static void handle_surface_destroy(struct wl_listener *listener, void *data) {
|
|||
sway_assert(output->surface, "Trying to destroy a surface that the lock doesn't think exists");
|
||||
output->surface = NULL;
|
||||
wl_list_remove(&output->surface_destroy.link);
|
||||
wl_list_remove(&output->surface_map.link);
|
||||
wl_list_remove(&output->surface_commit.link);
|
||||
}
|
||||
|
||||
static void lock_output_reconfigure(struct sway_session_lock_output *output) {
|
||||
|
@ -123,8 +128,8 @@ static void handle_new_surface(struct wl_listener *listener, void *data) {
|
|||
|
||||
lock_output->surface_destroy.notify = handle_surface_destroy;
|
||||
wl_signal_add(&lock_surface->events.destroy, &lock_output->surface_destroy);
|
||||
lock_output->surface_map.notify = handle_surface_map;
|
||||
wl_signal_add(&lock_surface->surface->events.map, &lock_output->surface_map);
|
||||
lock_output->surface_commit.notify = handle_surface_commit;
|
||||
wl_signal_add(&lock_surface->surface->events.commit, &lock_output->surface_commit);
|
||||
|
||||
lock_output_reconfigure(lock_output);
|
||||
}
|
||||
|
@ -133,7 +138,7 @@ static void sway_session_lock_output_destroy(struct sway_session_lock_output *ou
|
|||
if (output->surface) {
|
||||
refocus_output(output);
|
||||
wl_list_remove(&output->surface_destroy.link);
|
||||
wl_list_remove(&output->surface_map.link);
|
||||
wl_list_remove(&output->surface_commit.link);
|
||||
}
|
||||
|
||||
wl_list_remove(&output->destroy.link);
|
||||
|
@ -237,6 +242,8 @@ static void handle_unlock(struct wl_listener *listener, void *data) {
|
|||
|
||||
// Views are now visible, so check if we need to activate inhibition again.
|
||||
sway_idle_inhibit_v1_check_active();
|
||||
|
||||
cursor_rebase_all();
|
||||
}
|
||||
|
||||
static void handle_abandon(struct wl_listener *listener, void *data) {
|
||||
|
|
Loading…
Add table
Reference in a new issue