diff --git a/include/sway/tree/container.h b/include/sway/tree/container.h index 40847f5a2..02f2a6c06 100644 --- a/include/sway/tree/container.h +++ b/include/sway/tree/container.h @@ -164,8 +164,7 @@ struct sway_container *tiling_container_at( struct sway_node *parent, double lx, double ly, struct wlr_surface **surface, double *sx, double *sy); -void container_get_first_view(struct sway_container *container, - struct sway_container **view); +struct sway_container *container_get_first_view(struct sway_container *container); void container_for_each_child(struct sway_container *container, void (*f)(struct sway_container *container, void *data), void *data); diff --git a/sway/commands/swap_workspace.c b/sway/commands/swap_workspace.c index 6aacdd4c1..1138ce572 100644 --- a/sway/commands/swap_workspace.c +++ b/sway/commands/swap_workspace.c @@ -90,10 +90,13 @@ static void set_new_focus(struct sway_workspace *ws, struct sway_seat *seat) { if (ws->tiling->length) { // this needs to be more specific (focus not just every container, // but single windows - struct sway_container *first_view; struct sway_container *container = ws->tiling->items[0]; + struct sway_container *first_view = container_get_first_view(container); + + if (!first_view) { + seat_set_focus(seat, &ws->node); + } - container_get_first_view(container, &first_view); seat_set_focus(seat, &first_view->node); } else if (ws->floating->length) { seat_set_focus(seat, ws->floating->items[0]); diff --git a/sway/tree/container.c b/sway/tree/container.c index acc9778bd..36499ed35 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -430,18 +430,23 @@ struct sway_container *container_at(struct sway_workspace *workspace, return NULL; } -void container_get_first_view(struct sway_container *container, - struct sway_container **view) { +struct sway_container *container_get_first_view(struct sway_container *container) { if (container->view) { - *view = container; + return container; } if (container->pending.children) { for (int i = 0; i < container->pending.children->length; ++i) { struct sway_container *child = container->pending.children->items[i]; - container_get_first_view(child, view); + struct sway_container *view = container_get_first_view(child); + + if (view) { + return view; + } } } + + return NULL; } void container_for_each_child(struct sway_container *container,