cssnode: Turn into a GObject
authorBenjamin Otte <otte@redhat.com>
Sat, 10 Jan 2015 22:49:04 +0000 (23:49 +0100)
committerBenjamin Otte <otte@redhat.com>
Wed, 18 Mar 2015 14:23:28 +0000 (15:23 +0100)
This will allow us to use subclasses.

gtk/gtkcssnode.c
gtk/gtkcssnodeprivate.h
gtk/gtkstylecontext.c

index 5993b3a83b559df91c75aed6cf89f30a7f1a8649..a4b5a6308a60fb23600055185803e973f190ec44 100644 (file)
 
 #include "gtkcssnodeprivate.h"
 
-struct _GtkCssNode
+G_DEFINE_TYPE (GtkCssNode, gtk_css_node, G_TYPE_OBJECT)
+
+static void
+gtk_css_node_finalize (GObject *object)
 {
-  GtkCssNodeDeclaration *decl;
-  GtkCssNode            *parent;
-  GtkCssStyle           *style;
-};
+  GtkCssNode *cssnode = GTK_CSS_NODE (object);
 
-GtkCssNode *
-gtk_css_node_new (void)
+  if (cssnode->style)
+    g_object_unref (cssnode->style);
+  gtk_css_node_declaration_unref (cssnode->decl);
+
+  G_OBJECT_CLASS (gtk_css_node_parent_class)->finalize (object);
+}
+
+static void
+gtk_css_node_class_init (GtkCssNodeClass *klass)
 {
-  GtkCssNode *cssnode;
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-  cssnode = g_slice_new0 (GtkCssNode);
+  object_class->finalize = gtk_css_node_finalize;
+}
+
+static void
+gtk_css_node_init (GtkCssNode *cssnode)
+{
   cssnode->decl = gtk_css_node_declaration_new ();
+}
 
-  return cssnode;
+GtkCssNode *
+gtk_css_node_new (void)
+{
+  return g_object_new (GTK_TYPE_CSS_NODE, NULL);
 }
 
 GtkCssNode *
@@ -49,15 +65,6 @@ gtk_css_node_copy (GtkCssNode *cssnode)
   return copy;
 }
 
-void
-gtk_css_node_free (GtkCssNode *cssnode)
-{
-  if (cssnode->style)
-    g_object_unref (cssnode->style);
-  gtk_css_node_declaration_unref (cssnode->decl);
-  g_slice_free (GtkCssNode, cssnode);
-}
-
 void
 gtk_css_node_set_parent (GtkCssNode *cssnode,
                          GtkCssNode *parent)
index 0999ab5c8904360c84eff3e7734a4e45e8529624..7d217d9a56608dfc0ac8e42f4e02021ca1f0392d 100644 (file)
 
 G_BEGIN_DECLS
 
-typedef struct _GtkCssNode GtkCssNode;
+#define GTK_TYPE_CSS_NODE           (gtk_css_node_get_type ())
+#define GTK_CSS_NODE(obj)           (G_TYPE_CHECK_INSTANCE_CAST (obj, GTK_TYPE_CSS_NODE, GtkCssNode))
+#define GTK_CSS_NODE_CLASS(cls)     (G_TYPE_CHECK_CLASS_CAST (cls, GTK_TYPE_CSS_NODE, GtkCssNodeClass))
+#define GTK_IS_CSS_NODE(obj)        (G_TYPE_CHECK_INSTANCE_TYPE (obj, GTK_TYPE_CSS_NODE))
+#define GTK_IS_CSS_NODE_CLASS(obj)  (G_TYPE_CHECK_CLASS_TYPE (obj, GTK_TYPE_CSS_NODE))
+#define GTK_CSS_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CSS_NODE, GtkCssNodeClass))
+
+typedef struct _GtkCssNode           GtkCssNode;
+typedef struct _GtkCssNodeClass      GtkCssNodeClass;
+
+struct _GtkCssNode
+{
+  GObject object;
+
+  GtkCssNodeDeclaration *decl;
+  GtkCssNode            *parent;
+  GtkCssStyle           *style;
+};
+
+struct _GtkCssNodeClass
+{
+  GObjectClass object_class;
+};
+
+GType                   gtk_css_node_get_type           (void) G_GNUC_CONST;
 
 GtkCssNode *            gtk_css_node_new                (void);
 GtkCssNode *            gtk_css_node_copy               (GtkCssNode            *cssnode);
 
-void                    gtk_css_node_free               (GtkCssNode            *cssnode);
-
 void                    gtk_css_node_set_parent         (GtkCssNode            *cssnode,
                                                          GtkCssNode            *parent);
 GtkCssNode *            gtk_css_node_get_parent         (GtkCssNode            *cssnode);
index 9c15207e332c4781a7bd0a7669dc0aa24dbd5800..ef6dcaac0a9fb3b56180197e491bb504af5facc5 100644 (file)
@@ -316,7 +316,7 @@ gtk_style_context_pop_style_node (GtkStyleContext *context)
 
   g_return_if_fail (priv->saved_nodes != NULL);
 
-  gtk_css_node_free (priv->cssnode);
+  g_object_unref (priv->cssnode);
   priv->cssnode = priv->saved_nodes->data;
   priv->saved_nodes = g_slist_remove (priv->saved_nodes, priv->cssnode);
 }
@@ -529,7 +529,7 @@ gtk_style_context_finalize (GObject *object)
 
   while (priv->saved_nodes)
     gtk_style_context_pop_style_node (style_context);
-  gtk_css_node_free (priv->cssnode);
+  g_object_unref (priv->cssnode);
 
   gtk_style_context_clear_property_cache (style_context);
   g_array_free (priv->property_cache, TRUE);