From: Benjamin Otte Date: Sun, 8 Feb 2015 15:37:08 +0000 (+0100) Subject: widget: Create the CssNode X-Git-Tag: archive/raspbian/4.4.1+ds1-2+rpi1^2~18^2~24^2~10115 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ffb410f11ee032ba8792a5b3c3ee1f739aa8c841;p=gtk4.git widget: Create the CssNode ... and pass it to the style context instead of having the style context create it for us. --- diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index aad8e901bb..f7d9fd9ebb 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -551,36 +551,21 @@ gtk_style_context_new (void) return g_object_new (GTK_TYPE_STYLE_CONTEXT, NULL); } -void -_gtk_style_context_set_widget (GtkStyleContext *context, - GtkWidget *widget) +GtkStyleContext * +gtk_style_context_new_for_node (GtkCssNode *node) { GtkStyleContextPrivate *priv; + GtkStyleContext *context; - g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); - g_return_if_fail (widget == NULL || GTK_IS_WIDGET (widget)); - g_return_if_fail (!gtk_style_context_is_saved (context)); + g_return_val_if_fail (GTK_IS_CSS_NODE (node), NULL); - priv = context->priv; + context = gtk_style_context_new (); - if (!GTK_IS_CSS_WIDGET_NODE (priv->cssnode)) - { - g_object_unref (priv->cssnode); - priv->cssnode = gtk_css_widget_node_new (widget); - gtk_css_node_set_state (priv->cssnode, GTK_STATE_FLAG_DIR_LTR); - } - - if (widget) - { - gtk_css_node_set_widget_type (priv->cssnode, G_OBJECT_TYPE (widget)); - } - else - { - gtk_css_node_set_widget_type (priv->cssnode, G_TYPE_NONE); - gtk_css_widget_node_widget_destroyed (GTK_CSS_WIDGET_NODE (priv->cssnode)); - } + priv = context->priv; + g_object_unref (priv->cssnode); + priv->cssnode = g_object_ref (node); - gtk_css_node_invalidate (gtk_style_context_get_root (context), GTK_CSS_CHANGE_ANY_SELF); + return context; } /** @@ -1166,9 +1151,11 @@ gtk_style_context_set_parent (GtkStyleContext *context, if (parent) { + GtkCssNode *root = gtk_style_context_get_root (context); g_object_ref (parent); - gtk_css_node_set_parent (gtk_style_context_get_root (context), - gtk_style_context_get_root (parent)); + + if (gtk_css_node_get_parent (root) == NULL) + gtk_css_node_set_parent (root, gtk_style_context_get_root (parent)); } else { diff --git a/gtk/gtkstylecontextprivate.h b/gtk/gtkstylecontextprivate.h index c51f5aa6fc..d849d14071 100644 --- a/gtk/gtkstylecontextprivate.h +++ b/gtk/gtkstylecontextprivate.h @@ -28,8 +28,8 @@ G_BEGIN_DECLS -void _gtk_style_context_set_widget (GtkStyleContext *context, - GtkWidget *widget); +GtkStyleContext *gtk_style_context_new_for_node (GtkCssNode *node); + GtkCssNode * gtk_style_context_get_root (GtkStyleContext *context); void gtk_style_context_set_id (GtkStyleContext *context, const char *id); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index a6bfecb7ff..f5b8510d27 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -60,6 +60,7 @@ #include "gtksizerequest.h" #include "gtkstylecontextprivate.h" #include "gtkcssprovider.h" +#include "gtkcsswidgetnodeprivate.h" #include "gtkmodifierstyle.h" #include "gtkversion.h" #include "gtkdebug.h" @@ -557,6 +558,7 @@ struct _GtkWidgetPrivate * the font to use for text. */ GtkStyle *style; + GtkCssNode *cssnode; GtkStyleContext *context; /* Widget's path for styling */ @@ -733,7 +735,8 @@ struct _GtkStateData static void gtk_widget_base_class_init (gpointer g_class); static void gtk_widget_class_init (GtkWidgetClass *klass); static void gtk_widget_base_class_finalize (GtkWidgetClass *klass); -static void gtk_widget_init (GtkWidget *widget); +static void gtk_widget_init (GTypeInstance *instance, + gpointer g_class); static void gtk_widget_set_property (GObject *object, guint prop_id, const GValue *value, @@ -992,7 +995,7 @@ gtk_widget_get_type (void) NULL, /* class_init */ sizeof (GtkWidget), 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_widget_init, + gtk_widget_init, NULL, /* value_table */ }; @@ -4454,8 +4457,9 @@ _gtk_widget_cancel_sequence (GtkWidget *widget, } static void -gtk_widget_init (GtkWidget *widget) +gtk_widget_init (GTypeInstance *instance, gpointer g_class) { + GtkWidget *widget = GTK_WIDGET (instance); GtkWidgetPrivate *priv; widget->priv = gtk_widget_get_instance_private (widget); @@ -4506,6 +4510,11 @@ gtk_widget_init (GtkWidget *widget) _gtk_size_request_cache_init (&priv->requests); + priv->cssnode = gtk_css_widget_node_new (widget); + gtk_css_node_set_state (priv->cssnode, GTK_STATE_FLAG_DIR_LTR); + /* need to set correct type here, and only class has the correct type here */ + gtk_css_node_set_widget_type (priv->cssnode, G_TYPE_FROM_CLASS (g_class)); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; priv->style = gtk_widget_get_default_style (); G_GNUC_END_IGNORE_DEPRECATIONS; @@ -4738,6 +4747,7 @@ gtk_widget_unparent (GtkWidget *widget) gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_BACKDROP); if (priv->context) gtk_style_context_set_parent (priv->context, NULL); + gtk_css_node_set_parent (widget->priv->cssnode, NULL); _gtk_widget_update_parent_muxer (widget); @@ -9524,6 +9534,8 @@ gtk_widget_set_parent (GtkWidget *widget, data.flags_to_unset = 0; gtk_widget_propagate_state (widget, &data); + if (gtk_css_node_get_parent (widget->priv->cssnode) == NULL) + gtk_css_node_set_parent (widget->priv->cssnode, parent->priv->cssnode); if (priv->context) gtk_style_context_set_parent (priv->context, gtk_widget_get_style_context (parent)); @@ -12175,11 +12187,11 @@ gtk_widget_finalize (GObject *object) if (priv->path) gtk_widget_path_free (priv->path); + gtk_css_widget_node_widget_destroyed (GTK_CSS_WIDGET_NODE (priv->cssnode)); + g_object_unref (priv->cssnode); + if (priv->context) - { - _gtk_style_context_set_widget (priv->context, NULL); - g_object_unref (priv->context); - } + g_object_unref (priv->context); _gtk_size_request_cache_free (&priv->requests); @@ -16424,7 +16436,7 @@ gtk_widget_get_style_context (GtkWidget *widget) GdkScreen *screen; GdkFrameClock *frame_clock; - priv->context = gtk_style_context_new (); + priv->context = gtk_style_context_new_for_node (priv->cssnode); gtk_style_context_set_id (priv->context, priv->name); gtk_style_context_set_state (priv->context, priv->state_flags); @@ -16438,8 +16450,6 @@ gtk_widget_get_style_context (GtkWidget *widget) if (frame_clock) gtk_style_context_set_frame_clock (priv->context, frame_clock); - _gtk_style_context_set_widget (priv->context, widget); - if (priv->parent) gtk_style_context_set_parent (priv->context, gtk_widget_get_style_context (priv->parent));