From 1e4807efa0647b2d856a4c8e9b23aff35625d1d8 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 2 Jul 2018 22:16:20 +1000 Subject: [PATCH] Don't return pending children in seat_get_active_current_child Fixes #2192. seat_get_active_current_child is intended to return a child of the given container which has finished its mapping transaction and is able to be rendered on screen. The previous implementation was capable of returning a pending child, which caused a child of a tabbed or stacked view to be rendered prematurely while it was mapping. --- sway/input/seat.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sway/input/seat.c b/sway/input/seat.c index 2c2087da..a934d4a8 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -832,12 +832,12 @@ struct sway_container *seat_get_active_child(struct sway_seat *seat, struct sway_container *seat_get_active_current_child(struct sway_seat *seat, struct sway_container *container) { - struct sway_container *child = seat_get_active_child(seat, container); - if (child) { - return child; - } - if (container->current.children->length == 1) { - return container->current.children->items[0]; + struct sway_seat_container *current = NULL; + wl_list_for_each(current, &seat->focus_stack, link) { + if (current->container->current.parent == container && + current->container->current.layout != L_FLOATING) { + return current->container; + } } return NULL; }