|
|
|
@ -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);
|
|
|
|
|