From 06f08ea80457b494561d8a008095cc0550bac1ae Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Fri, 4 Oct 2024 09:19:57 -0300 Subject: [PATCH] atcontext: Only recurse parents for non-widget accessibles The original intent was to only realize parents recursively for non-widget accessible objects. The implementation, however, always try to realize parents. In the case of GtkStackPage, which is a non-widget accessible with a widget accessible child, this breaks. Only realize non-widget accessible parents recursively if the current accessible is not a widget as well. Closes https://gitlab.gnome.org/GNOME/gtk/-/issues/7058 Fixes 6074a18e3ef807da09b968062d4c4cbf74e0cc7a --- gtk/gtkatcontext.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/gtk/gtkatcontext.c b/gtk/gtkatcontext.c index 6e38f14cd5..1d263832c6 100644 --- a/gtk/gtkatcontext.c +++ b/gtk/gtkatcontext.c @@ -515,29 +515,35 @@ static GtkATContext * get_parent_context (GtkATContext *self); static inline void maybe_realize_context (GtkATContext *self) { - GtkAccessible *accessible_parent; - GtkATContext *parent_context; - - parent_context = get_parent_context (self); - - if (!GTK_IS_WIDGET (self->accessible) || (parent_context && parent_context->realized)) - gtk_at_context_realize (self); - - g_clear_object (&parent_context); - - accessible_parent = self->accessible_parent; - while (accessible_parent && !GTK_IS_WIDGET (accessible_parent)) + if (GTK_IS_WIDGET (self->accessible)) { - parent_context = gtk_accessible_get_at_context (accessible_parent); + GtkATContext *parent_context = get_parent_context (self); - if (!parent_context) - break; - - gtk_at_context_realize (parent_context); - accessible_parent = parent_context->accessible_parent; + if (parent_context && parent_context->realized) + gtk_at_context_realize (self); g_clear_object (&parent_context); } + else + { + GtkAccessible *accessible_parent; + + gtk_at_context_realize (self); + + accessible_parent = self->accessible_parent; + while (accessible_parent && !GTK_IS_WIDGET (accessible_parent)) + { + GtkATContext *parent_context = gtk_accessible_get_at_context (accessible_parent); + + if (!parent_context) + break; + + gtk_at_context_realize (parent_context); + accessible_parent = parent_context->accessible_parent; + + g_clear_object (&parent_context); + } + } } /*< private >