if (result)
return g_object_ref (result);
- path = gtk_css_node_create_widget_path (cssnode);
-
- if (!_gtk_css_matcher_init (&matcher, path))
+ if (!gtk_css_node_init_matcher (cssnode, &matcher, &path))
{
g_assert_not_reached ();
}
&matcher,
parent);
- gtk_widget_path_free (path);
+ if (path)
+ gtk_widget_path_free (path);
store_in_global_parent_cache (cssnode, parent, decl, style);
if (style)
return g_object_ref (style);
- path = gtk_css_node_create_widget_path (cssnode);
-
- if (_gtk_css_matcher_init (&matcher, path))
+ if (gtk_css_node_init_matcher (cssnode, &matcher, &path))
style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode),
&matcher,
parent);
NULL,
parent);
- gtk_widget_path_free (path);
+ if (path)
+ gtk_widget_path_free (path);
store_in_global_parent_cache (cssnode, parent, decl, style);
return _gtk_bitmask_new ();
}
+gboolean
+gtk_css_node_real_init_matcher (GtkCssNode *cssnode,
+ GtkCssMatcher *matcher,
+ GtkWidgetPath **path_out)
+{
+ GtkWidgetPath *path;
+
+ path = gtk_css_node_create_widget_path (cssnode);
+
+ if (!_gtk_css_matcher_init (matcher, path))
+ {
+ gtk_widget_path_free (path);
+ return FALSE;
+ }
+
+ if (path_out == NULL)
+ {
+ gtk_widget_path_free (path);
+ g_assert_not_reached ();
+ return FALSE;
+ }
+
+ *path_out = path;
+ return TRUE;
+}
+
static GtkWidgetPath *
gtk_css_node_real_create_widget_path (GtkCssNode *cssnode)
{
klass->validate = gtk_css_node_real_validate;
klass->queue_validate = gtk_css_node_real_queue_validate;
klass->dequeue_validate = gtk_css_node_real_dequeue_validate;
+ klass->init_matcher = gtk_css_node_real_init_matcher;
klass->create_widget_path = gtk_css_node_real_create_widget_path;
klass->get_widget_path = gtk_css_node_real_get_widget_path;
klass->get_style_provider = gtk_css_node_real_get_style_provider;
_gtk_bitmask_free (changes);
}
+gboolean
+gtk_css_node_init_matcher (GtkCssNode *cssnode,
+ GtkCssMatcher *matcher,
+ GtkWidgetPath **path_out)
+{
+ if (path_out)
+ *path_out = NULL;
+
+ return GTK_CSS_NODE_GET_CLASS (cssnode)->init_matcher (cssnode, matcher, path_out);
+}
+
GtkWidgetPath *
gtk_css_node_create_widget_path (GtkCssNode *cssnode)
{
#define __GTK_CSS_NODE_PRIVATE_H__
#include "gtkcssnodedeclarationprivate.h"
-#include "gtkcssstyleprivate.h"
+#include "gtkbitmaskprivate.h"
+#include "gtkcsstypesprivate.h"
G_BEGIN_DECLS
{
GObjectClass object_class;
+ gboolean (* init_matcher) (GtkCssNode *cssnode,
+ GtkCssMatcher *matcher,
+ GtkWidgetPath **path);
GtkWidgetPath * (* create_widget_path) (GtkCssNode *cssnode);
const GtkWidgetPath * (* get_widget_path) (GtkCssNode *cssnode);
GtkStyleProviderPrivate *(* get_style_provider) (GtkCssNode *cssnode);
const GtkBitmask *parent_changes);
void gtk_css_node_set_invalid (GtkCssNode *node,
gboolean invalid);
+
+gboolean gtk_css_node_init_matcher (GtkCssNode *cssnode,
+ GtkCssMatcher *matcher,
+ GtkWidgetPath **path);
GtkWidgetPath * gtk_css_node_create_widget_path (GtkCssNode *cssnode);
const GtkWidgetPath * gtk_css_node_get_widget_path (GtkCssNode *cssnode);
GtkStyleProviderPrivate *gtk_css_node_get_style_provider(GtkCssNode *cssnode);