diff options
| author | Simon Ser <contact@emersion.fr> | 2023-01-16 19:12:33 +0100 |
|---|---|---|
| committer | Simon Ser <contact@emersion.fr> | 2023-02-10 18:12:27 +0100 |
| commit | 3696060549c24fc667779d04b184db5e398b573c (patch) | |
| tree | b7fd9a783dee213a0f0d9e461c7a05a21ac5cbc2 | |
| parent | 9e9b812e3b1e9b5b406f52335550a00693570d10 (diff) | |
Fix pointer events for ext-session-lock surfaces
We were never sending any pointer event to ext-session-lock
surfaces.
(cherry picked from commit 6a3e265326fab11b8f68374c9f30410f647ae866)
| -rw-r--r-- | sway/input/cursor.c | 18 | ||||
| -rw-r--r-- | sway/input/seat.c | 15 |
2 files changed, 31 insertions, 2 deletions
diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 9d83008f..a5f1204b 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -97,6 +97,24 @@ struct sway_node *node_at_coords( double ox = lx, oy = ly; wlr_output_layout_output_coords(root->output_layout, wlr_output, &ox, &oy); + if (server.session_lock.locked) { + if (server.session_lock.lock == NULL) { + return NULL; + } + struct wlr_session_lock_surface_v1 *lock_surf; + wl_list_for_each(lock_surf, &server.session_lock.lock->surfaces, link) { + if (lock_surf->output != wlr_output) { + continue; + } + + *surface = wlr_surface_surface_at(lock_surf->surface, ox, oy, sx, sy); + if (*surface != NULL) { + return NULL; + } + } + return NULL; + } + // layer surfaces on the overlay layer are rendered on top if ((*surface = layer_surface_at(output, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], diff --git a/sway/input/seat.c b/sway/input/seat.c index 0bd33581..28210bb5 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -1080,9 +1080,20 @@ void seat_configure_xcursor(struct sway_seat *seat) { bool seat_is_input_allowed(struct sway_seat *seat, struct wlr_surface *surface) { + if (server.session_lock.locked) { + if (server.session_lock.lock == NULL) { + return false; + } + struct wlr_session_lock_surface_v1 *lock_surf; + wl_list_for_each(lock_surf, &server.session_lock.lock->surfaces, link) { + if (lock_surf->surface == surface) { + return true; + } + } + return false; + } struct wl_client *client = wl_resource_get_client(surface->resource); - return seat->exclusive_client == client || - (seat->exclusive_client == NULL && !server.session_lock.locked); + return seat->exclusive_client == client || seat->exclusive_client == NULL; } static void send_unfocus(struct sway_container *con, void *data) { |
