From d5659948f1105b99d08542de7c370ba908b8cec8 Mon Sep 17 00:00:00 2001 From: Ferdinand Schober Date: Mon, 19 Sep 2022 23:20:02 +0200 Subject: [PATCH] allow pointer_constraints on layer_shell surfaces --- include/sway/input/seat.h | 2 ++ sway/input/cursor.c | 9 +++------ sway/input/seat.c | 12 ++++++++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/include/sway/input/seat.h b/include/sway/input/seat.h index c2041742..e795ad5e 100644 --- a/include/sway/input/seat.h +++ b/include/sway/input/seat.h @@ -192,6 +192,8 @@ void seat_set_exclusive_client(struct sway_seat *seat, struct sway_node *seat_get_focus(struct sway_seat *seat); +struct wlr_surface *seat_get_focused_surface(struct sway_seat *seat); + struct sway_workspace *seat_get_focused_workspace(struct sway_seat *seat); // If a scratchpad container is fullscreen global, this can be used to try to diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 2ee63124..78a221d8 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -1372,12 +1372,9 @@ void handle_pointer_constraint(struct wl_listener *listener, void *data) { sway_constraint->destroy.notify = handle_constraint_destroy; wl_signal_add(&constraint->events.destroy, &sway_constraint->destroy); - struct sway_node *focus = seat_get_focus(seat); - if (focus && node_is_view(focus)) { - struct wlr_surface *surface = focus->sway_container->view->surface; - if (surface == constraint->surface) { - sway_cursor_constrain(seat->cursor, constraint); - } + struct wlr_surface *surface = seat_get_focused_surface(seat); + if (surface == constraint->surface) { + sway_cursor_constrain(seat->cursor, constraint); } } diff --git a/sway/input/seat.c b/sway/input/seat.c index b21e1b86..6abb54e8 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -1462,6 +1462,18 @@ struct sway_node *seat_get_focus(struct sway_seat *seat) { return current->node; } +struct wlr_surface *seat_get_focused_surface(struct sway_seat *seat) { + struct sway_node *focus = seat_get_focus(seat); + if (focus && node_is_view(focus)) { + return focus->sway_container->view->surface; + } + struct sway_seat_node *current = wl_container_of(seat->focus_stack.next, current, link); + struct wlr_layer_surface_v1 *layer = current->seat->focused_layer; + if (layer && layer->surface) + return layer->surface; + return NULL; +} + struct sway_workspace *seat_get_focused_workspace(struct sway_seat *seat) { struct sway_node *focus = seat_get_focus_inactive(seat, &root->node); if (!focus) {