aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/input/seat.h8
-rw-r--r--sway/input/seat.c45
-rw-r--r--sway/tree/layout.c4
3 files changed, 33 insertions, 24 deletions
diff --git a/include/sway/input/seat.h b/include/sway/input/seat.h
index c7be58b5..05fff6f7 100644
--- a/include/sway/input/seat.h
+++ b/include/sway/input/seat.h
@@ -87,8 +87,12 @@ struct sway_container *seat_get_focus(struct sway_seat *seat);
struct sway_container *seat_get_focus_inactive(struct sway_seat *seat,
struct sway_container *container);
-struct sway_container *seat_get_focus_by_type(struct sway_seat *seat,
- struct sway_container *container, enum sway_container_type type);
+/**
+ * Descend into the focus stack to find the focus-inactive view. Useful for
+ * container placement when they change position in the tree.
+ */
+struct sway_container *seat_get_focus_inactive_view(struct sway_seat *seat,
+ struct sway_container *container);
void seat_apply_config(struct sway_seat *seat, struct seat_config *seat_config);
diff --git a/sway/input/seat.c b/sway/input/seat.c
index b94e3291..1a646715 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -86,6 +86,31 @@ static void seat_send_focus(struct sway_seat *seat,
}
}
+static struct sway_container *seat_get_focus_by_type(struct sway_seat *seat,
+ struct sway_container *container, enum sway_container_type type) {
+ if (container->type == C_VIEW || container->children->length == 0) {
+ return container;
+ }
+
+ struct sway_seat_container *current = NULL;
+ wl_list_for_each(current, &seat->focus_stack, link) {
+ if (current->container->type != type && type != C_TYPES) {
+ continue;
+ }
+
+ if (container_has_child(container, current->container)) {
+ return current->container;
+ }
+ }
+
+ return NULL;
+}
+
+struct sway_container *seat_get_focus_inactive_view(struct sway_seat *seat,
+ struct sway_container *container) {
+ return seat_get_focus_by_type(seat, container, C_VIEW);
+}
+
static void handle_seat_container_destroy(struct wl_listener *listener,
void *data) {
struct sway_seat_container *seat_con =
@@ -549,26 +574,6 @@ struct sway_container *sway_seat_get_focus(struct sway_seat *seat) {
return seat_get_focus_inactive(seat, &root_container);
}
-struct sway_container *seat_get_focus_by_type(struct sway_seat *seat,
- struct sway_container *container, enum sway_container_type type) {
- if (container->type == C_VIEW || container->children->length == 0) {
- return container;
- }
-
- struct sway_seat_container *current = NULL;
- wl_list_for_each(current, &seat->focus_stack, link) {
- if (current->container->type != type && type != C_TYPES) {
- continue;
- }
-
- if (container_has_child(container, current->container)) {
- return current->container;
- }
- }
-
- return NULL;
-}
-
struct sway_container *seat_get_focus(struct sway_seat *seat) {
if (!seat->has_focus) {
return NULL;
diff --git a/sway/tree/layout.c b/sway/tree/layout.c
index e81facc6..ce4457b1 100644
--- a/sway/tree/layout.c
+++ b/sway/tree/layout.c
@@ -872,7 +872,7 @@ struct sway_container *container_get_in_direction(
}
if (next->children && next->children->length) {
// TODO consider floating children as well
- return seat_get_focus_by_type(seat, next, C_VIEW);
+ return seat_get_focus_inactive_view(seat, next);
} else {
return next;
}
@@ -910,7 +910,7 @@ struct sway_container *container_get_in_direction(
wlr_log(L_DEBUG,
"cont %d-%p dir %i sibling %d: %p", idx,
container, dir, desired, desired_con);
- struct sway_container *next = seat_get_focus_by_type(seat, desired_con, C_VIEW);
+ struct sway_container *next = seat_get_focus_inactive_view(seat, desired_con);
return next;
}
}