aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/input/seat.c27
-rw-r--r--sway/tree/container.c15
2 files changed, 23 insertions, 19 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c
index d2ffca64..ab751b54 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -70,6 +70,20 @@ static void handle_new_container(struct wl_listener *listener, void *data) {
seat_container_from_container(seat, con);
}
+static void collect_focus_iter(swayc_t *con, void *data) {
+ struct sway_seat *seat = data;
+ if (con->type > C_WORKSPACE) {
+ return;
+ }
+ struct sway_seat_container *seat_con =
+ seat_container_from_container(seat, con);
+ if (!seat_con) {
+ return;
+ }
+ wl_list_remove(&seat_con->link);
+ wl_list_insert(&seat->focus_stack, &seat_con->link);
+}
+
struct sway_seat *sway_seat_create(struct sway_input_manager *input,
const char *seat_name) {
struct sway_seat *seat = calloc(1, sizeof(struct sway_seat));
@@ -92,17 +106,8 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input,
// init the focus stack
wl_list_init(&seat->focus_stack);
- list_t *containers = container_list_children(&root_container);
- if (containers == NULL) {
- wlr_seat_destroy(seat->wlr_seat);
- free(seat);
- return NULL;
- }
- for (int i = containers->length - 1; i >= 0; --i) {
- swayc_t *con = containers->items[i];
- seat_container_from_container(seat, con);
- }
- free(containers);
+
+ container_for_each_bfs(&root_container, collect_focus_iter, seat);
wl_signal_add(&root_container.sway_root->events.new_container,
&seat->new_container);
diff --git a/sway/tree/container.c b/sway/tree/container.c
index 67fac5ee..ebf9f98e 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -381,13 +381,13 @@ void container_map(swayc_t *container, void (*f)(swayc_t *view, void *data), voi
}
}
-/**
- * Get a list of containers that are descendents of the container in rendering
- * order
- */
-list_t *container_list_children(swayc_t *con) {
- list_t *list = create_list();
+void container_for_each_bfs(swayc_t *con, void (*f)(swayc_t *con, void *data),
+ void *data) {
list_t *queue = create_list();
+ if (queue == NULL) {
+ wlr_log(L_ERROR, "could not allocate list");
+ return;
+ }
list_add(queue, con);
@@ -395,11 +395,10 @@ list_t *container_list_children(swayc_t *con) {
while (queue->length) {
current = queue->items[0];
list_del(queue, 0);
- list_add(list, current);
+ f(current, data);
// TODO floating containers
list_cat(queue, current->children);
}
list_free(queue);
- return list;
}