aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/input/seat.h2
-rw-r--r--sway/input/cursor.c9
-rw-r--r--sway/input/seat.c12
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) {