From c2d4fd6b9397f54a046adf1c9edbd1190961551d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 20 Jan 2016 19:33:16 -0500 Subject: [PATCH] Fix GtkShortcutsWindow crash GtkShortcutsWindow is among the 'cheating' containers that iterate over indirect children in forall, and this is now triggering an assertion in gtk_container_propagate_draw. For now, just exclude the cheating containers from the assertion. Eventually, this needs a better solution. --- gtk/gtkcontainer.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c index 090b4d7100..1df06adb4e 100644 --- a/gtk/gtkcontainer.c +++ b/gtk/gtkcontainer.c @@ -54,6 +54,16 @@ #include "gtkpopovermenu.h" #include "gtkshortcutswindow.h" +/* A handful of containers inside GTK+ are cheating and widgets + * inside internal structure as direct children for the purpose + * of forall(). + */ +#define SPECIAL_CONTAINER(x) (GTK_IS_ASSISTANT (x) || \ + GTK_IS_ACTION_BAR (x) || \ + GTK_IS_POPOVER_MENU (x) || \ + GTK_IS_SHORTCUTS_SECTION (x) || \ + GTK_IS_SHORTCUTS_WINDOW (x)) + /** * SECTION:gtkcontainer * @Short_description: Base class for widgets which contain other widgets @@ -661,9 +671,7 @@ gtk_container_buildable_set_child_property (GtkContainer *container, GObjectNotifyQueue *nqueue; if (_gtk_widget_get_parent (child) != (GtkWidget *)container && - !GTK_IS_ASSISTANT (container) && - !GTK_IS_ACTION_BAR (container) && - !GTK_IS_POPOVER_MENU (container)) + !SPECIAL_CONTAINER (container)) { /* This can happen with internal children of complex widgets. * Silently ignore the child properties in this case. We explicitly @@ -3749,7 +3757,8 @@ gtk_container_propagate_draw (GtkContainer *container, g_return_if_fail (GTK_IS_WIDGET (child)); g_return_if_fail (cr != NULL); - g_assert (_gtk_widget_get_parent (child) == GTK_WIDGET (container)); + g_assert (_gtk_widget_get_parent (child) == GTK_WIDGET (container) || + SPECIAL_CONTAINER (container)); if (!gtk_container_should_propagate_draw (container, child, cr)) return;