diff options
-rw-r--r-- | gtk/gtkwidget.c | 62 |
1 files changed, 52 insertions, 10 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 6efeee8fb5..9637bc8a7b 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -63,6 +63,7 @@ #include "gtkplug.h" #include "gtktypebuiltins.h" #include "a11y/gtkwidgetaccessible.h" +#include "actors/gtkwidgetactorprivate.h" /** * SECTION:gtkwidget @@ -321,9 +322,6 @@ struct _GtkWidgetPrivate guint anchored : 1; guint composite_child : 1; guint no_window : 1; - guint realized : 1; - guint mapped : 1; - guint visible : 1; guint sensitive : 1; guint can_focus : 1; guint has_focus : 1; @@ -357,6 +355,9 @@ struct _GtkWidgetPrivate /* SizeGroup related flags */ guint have_size_groups : 1; + /* The base actor for the widget. */ + GtkActor *actor; + /* The widget's name. If the widget does not have a name * (the name is NULL), then its name (as returned by * "gtk_widget_get_name") is its class's name. @@ -3655,6 +3656,10 @@ gtk_widget_init (GtkWidget *widget) GtkWidgetPrivate); priv = widget->priv; + priv->actor = g_object_new (GTK_TYPE_WIDGET_ACTOR, + "widget", widget, + "visible", FALSE, NULL); + priv->child_visible = TRUE; priv->name = NULL; priv->allocation.x = -1; @@ -7494,7 +7499,17 @@ void _gtk_widget_set_visible_flag (GtkWidget *widget, gboolean visible) { - widget->priv->visible = visible; + gboolean was_mapped = gtk_widget_get_mapped (widget); + gboolean was_realized = gtk_widget_get_realized (widget); + + if (visible) + _gtk_widget_actor_show (widget->priv->actor); + else + _gtk_widget_actor_hide (widget->priv->actor); + + g_assert (_gtk_actor_get_visible (widget->priv->actor) == visible); + g_assert (was_mapped == gtk_widget_get_mapped (widget)); + g_assert (was_realized == gtk_widget_get_realized (widget)); } /** @@ -7518,7 +7533,7 @@ gtk_widget_get_visible (GtkWidget *widget) { g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); - return widget->priv->visible; + return _gtk_actor_get_visible (widget->priv->actor); } /** @@ -7662,7 +7677,7 @@ gtk_widget_get_realized (GtkWidget *widget) { g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); - return widget->priv->realized; + return _gtk_actor_get_realized (widget->priv->actor); } /** @@ -7681,9 +7696,21 @@ void gtk_widget_set_realized (GtkWidget *widget, gboolean realized) { + gboolean was_visible, was_mapped; + g_return_if_fail (GTK_IS_WIDGET (widget)); - widget->priv->realized = realized; + was_visible = gtk_widget_get_visible (widget); + was_mapped = gtk_widget_get_mapped (widget); + + if (realized) + _gtk_widget_actor_realize (widget->priv->actor); + else + _gtk_widget_actor_unrealize (widget->priv->actor); + + g_assert (_gtk_actor_get_realized (widget->priv->actor) == realized); + g_assert (was_visible == gtk_widget_get_visible (widget)); + g_assert (was_mapped == gtk_widget_get_mapped (widget)); } /** @@ -7701,7 +7728,7 @@ gtk_widget_get_mapped (GtkWidget *widget) { g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); - return widget->priv->mapped; + return _gtk_actor_get_mapped (widget->priv->actor); } /** @@ -7720,9 +7747,21 @@ void gtk_widget_set_mapped (GtkWidget *widget, gboolean mapped) { + gboolean was_visible, was_realized; + g_return_if_fail (GTK_IS_WIDGET (widget)); - widget->priv->mapped = mapped; + was_visible = gtk_widget_get_visible (widget); + was_realized = gtk_widget_get_realized (widget); + + if (mapped) + _gtk_widget_actor_map (widget->priv->actor); + else + _gtk_widget_actor_unmap (widget->priv->actor); + + g_assert (_gtk_actor_get_mapped (widget->priv->actor) == mapped); + g_assert (was_visible == gtk_widget_get_visible (widget)); + g_assert (was_realized == gtk_widget_get_realized (widget)); } /** @@ -10329,7 +10368,7 @@ gtk_widget_dispose (GObject *object) else if (gtk_widget_get_visible (widget)) gtk_widget_hide (widget); - priv->visible = FALSE; + _gtk_widget_actor_hide (priv->actor); if (gtk_widget_get_realized (widget)) gtk_widget_unrealize (widget); @@ -10388,6 +10427,9 @@ gtk_widget_finalize (GObject *object) gtk_grab_remove (widget); + g_object_unref (priv->actor); + priv->actor = NULL; + g_object_unref (priv->style); priv->style = NULL; |