diff --git a/gtk/gtkcssmatcher.c b/gtk/gtkcssmatcher.c index ea082b1408..8a01779629 100644 --- a/gtk/gtkcssmatcher.c +++ b/gtk/gtkcssmatcher.c @@ -72,6 +72,80 @@ gtk_css_matcher_widget_path_get_previous (GtkCssMatcher *matcher, return TRUE; } +static const char * +gtk_css_matcher_widget_path_get_name (const GtkCssMatcher *matcher) +{ + const GtkWidgetPath *siblings; + + siblings = gtk_widget_path_iter_get_siblings (matcher->path.path, matcher->path.index); + if (siblings && matcher->path.sibling_index != gtk_widget_path_iter_get_sibling_index (matcher->path.path, matcher->path.index)) + { + const char *path_name = gtk_widget_path_iter_get_object_name (siblings, matcher->path.sibling_index); + + if (path_name == NULL) + path_name = g_type_name (gtk_widget_path_iter_get_object_type (siblings, matcher->path.sibling_index)); + + return path_name; + } + else + { + const char *path_name = gtk_widget_path_iter_get_object_name (matcher->path.path, matcher->path.index); + + if (path_name == NULL) + path_name = g_type_name (gtk_widget_path_iter_get_object_type (matcher->path.path, matcher->path.index)); + + return path_name; + } + + return NULL; +} + +static GQuark * +gtk_css_matcher_widget_path_get_classes (const GtkCssMatcher *matcher, + guint *n_classes, + gboolean *allocated) +{ + int num; + const GtkWidgetPath *siblings; + GSList *list, *l; + GQuark *classes; + const GQuark *decl_classes = NULL; + guint n_decl_classes = 0; + int i; + + if (matcher->path.decl) + decl_classes = gtk_css_node_declaration_get_classes (matcher->path.decl, &n_decl_classes); + + siblings = gtk_widget_path_iter_get_siblings (matcher->path.path, matcher->path.index); + if (siblings && matcher->path.sibling_index != gtk_widget_path_iter_get_sibling_index (matcher->path.path, matcher->path.index)) + list = gtk_widget_path_iter_list_classes (siblings, matcher->path.sibling_index); + else + list = gtk_widget_path_iter_list_classes (matcher->path.path, matcher->path.index); + + num = n_decl_classes + g_slist_length (list); + + classes = g_new (GQuark, num); + + i = 0; + if (matcher->path.decl) + { + for (; i < n_decl_classes; i++) + classes[i] = decl_classes[i]; + } + + for (l = list; l; l = l->next) + { + const char *name = l->data; + + classes[i++] = g_quark_from_string (name); + } + + *n_classes = num; + *allocated = TRUE; + + return classes; +} + static gboolean gtk_css_matcher_widget_path_has_state (const GtkCssMatcher *matcher, GtkStateFlags state) @@ -193,6 +267,8 @@ static const GtkCssMatcherClass GTK_CSS_MATCHER_WIDGET_PATH = { GTK_CSS_MATCHER_TYPE_WIDGET_PATH, gtk_css_matcher_widget_path_get_parent, gtk_css_matcher_widget_path_get_previous, + gtk_css_matcher_widget_path_get_name, + gtk_css_matcher_widget_path_get_classes, gtk_css_matcher_widget_path_has_state, gtk_css_matcher_widget_path_has_name, gtk_css_matcher_widget_path_has_class, @@ -266,6 +342,22 @@ gtk_css_matcher_node_get_previous (GtkCssMatcher *matcher, return gtk_css_node_init_matcher (node, matcher); } +static const char * +gtk_css_matcher_node_get_name (const GtkCssMatcher *matcher) +{ + return matcher->node.node_name; +} + +static GQuark * +gtk_css_matcher_node_get_classes (const GtkCssMatcher *matcher, + guint *n_classes, + gboolean *allocated) +{ + *n_classes = matcher->node.n_classes; + *allocated = FALSE; + return (GQuark *)matcher->node.classes; +} + static gboolean gtk_css_matcher_node_has_state (const GtkCssMatcher *matcher, GtkStateFlags state) @@ -378,6 +470,8 @@ static const GtkCssMatcherClass GTK_CSS_MATCHER_NODE = { GTK_CSS_MATCHER_TYPE_NODE, gtk_css_matcher_node_get_parent, gtk_css_matcher_node_get_previous, + gtk_css_matcher_node_get_name, + gtk_css_matcher_node_get_classes, gtk_css_matcher_node_has_state, gtk_css_matcher_node_has_name, gtk_css_matcher_node_has_class, diff --git a/gtk/gtkcssmatcherprivate.h b/gtk/gtkcssmatcherprivate.h index 69b4f0e2e4..da95e2d690 100644 --- a/gtk/gtkcssmatcherprivate.h +++ b/gtk/gtkcssmatcherprivate.h @@ -41,6 +41,11 @@ struct _GtkCssMatcherClass { gboolean (* get_previous) (GtkCssMatcher *matcher, const GtkCssMatcher *next); + const char * (* get_name) (const GtkCssMatcher *matcher); + GQuark * (* get_classes) (const GtkCssMatcher *matcher, + guint *n_classes, + gboolean *allocated); + gboolean (* has_state) (const GtkCssMatcher *matcher, GtkStateFlags state); gboolean (* has_name) (const GtkCssMatcher *matcher, @@ -106,6 +111,20 @@ _gtk_css_matcher_get_previous (GtkCssMatcher *matcher, return next->klass->get_previous (matcher, next); } +static inline const char * +_gtk_css_matcher_get_name (const GtkCssMatcher *matcher) +{ + return matcher->klass->get_name (matcher); +} + +static inline GQuark * +_gtk_css_matcher_get_classes (const GtkCssMatcher *matcher, + guint *n_classes, + gboolean *allocated) +{ + return matcher->klass->get_classes (matcher, n_classes, allocated); +} + static inline gboolean _gtk_css_matcher_has_state (const GtkCssMatcher *matcher, GtkStateFlags state)