aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-01-16 19:12:33 +0100
committerSimon Zeni <simon@bl4ckb0ne.ca>2023-01-18 11:23:05 -0500
commit6a3e265326fab11b8f68374c9f30410f647ae866 (patch)
treea365ec27dcbf1b28c215c121bb625870aef20455
parentd5b69d5912a5e12893ad6007f5a3bfe0bc6e047e (diff)
Fix pointer events for ext-session-lock surfaces
We were never sending any pointer event to ext-session-lock surfaces.
-rw-r--r--sway/input/cursor.c18
-rw-r--r--sway/input/seat.c15
2 files changed, 31 insertions, 2 deletions
diff --git a/sway/input/cursor.c b/sway/input/cursor.c
index 498ab4d6..efd67a76 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 18b63715..090a4d3c 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -1089,9 +1089,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) {