summaryrefslogtreecommitdiff
path: root/gtk/gtkcontainer.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2016-01-20 19:33:16 -0500
committerMatthias Clasen <mclasen@redhat.com>2016-01-20 19:33:16 -0500
commitc2d4fd6b9397f54a046adf1c9edbd1190961551d (patch)
treee4eefd8e67ac826d9249a42e7d2c871f36467ea9 /gtk/gtkcontainer.c
parent5150849a67f0c5d4d1649f33047cbb23500c88b0 (diff)
downloadgtk+-c2d4fd6b9397f54a046adf1c9edbd1190961551d.tar.gz
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.
Diffstat (limited to 'gtk/gtkcontainer.c')
-rw-r--r--gtk/gtkcontainer.c17
1 files 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;