[gtk+/wip/cssnode3: 32/102] widget: Create the CssNode



commit e2e299660ef7635bfeaa7daac0483edf857bc9db
Author: Benjamin Otte <otte redhat com>
Date:   Sun Feb 8 16:37:08 2015 +0100

    widget: Create the CssNode
    
    ... and pass it to the style context instead of having the style context
    create it for us.

 gtk/gtkstylecontext.c        |   39 +++++++++++++--------------------------
 gtk/gtkstylecontextprivate.h |    4 ++--
 gtk/gtkwidget.c              |   30 ++++++++++++++++++++----------
 3 files changed, 35 insertions(+), 38 deletions(-)
---
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index 4bfb4c1..fb60999 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 ea16ab8..3dc5bf0 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 b2e3bca..a836ecc 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));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]