From 1d2aa614078a1bcc9e270aceb265cefc6fc1702d Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Sat, 20 Mar 2010 13:07:41 +0100 Subject: [PATCH] GtkStyleContext: Add child style classes. Child style classes are like style classes, but with additional positional information. This would be usually set by the parent container. --- gtk/gtkstylecontext.c | 139 ++++++++++++++++++++++++++++++++++++++++++ gtk/gtkstylecontext.h | 17 ++++++ 2 files changed, 156 insertions(+) diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index 59fc5c3f9b..ddb34dc322 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -30,6 +30,13 @@ typedef struct GtkStyleContextPrivate GtkStyleContextPrivate; typedef struct GtkStyleProviderData GtkStyleProviderData; +typedef struct GtkChildClass GtkChildClass; + +struct GtkChildClass +{ + GQuark class_quark; + GtkChildClassFlags flags; +}; struct GtkStyleProviderData { @@ -45,6 +52,7 @@ struct GtkStyleContextPrivate GtkStateFlags state_flags; GList *style_classes; + GList *child_style_classes; GtkThemingEngine *theming_engine; }; @@ -444,5 +452,136 @@ gtk_style_context_has_class (GtkStyleContext *context, return FALSE; } +static gint +child_style_class_compare (gconstpointer p1, + gconstpointer p2) +{ + const GtkChildClass *c1, *c2; + + c1 = p1; + c2 = p2; + + return (gint) c1->class_quark - c2->class_quark; +} + +void +gtk_style_context_set_child_class (GtkStyleContext *context, + const gchar *class_name, + GtkChildClassFlags flags) +{ + GtkStyleContextPrivate *priv; + GtkChildClass *child_class; + GQuark class_quark; + GList *link; + + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); + g_return_if_fail (class_name != NULL); + + priv = GTK_STYLE_CONTEXT_GET_PRIVATE (context); + class_quark = g_quark_from_string (class_name); + link = priv->style_classes; + + while (link) + { + GtkChildClass *link_class; + + link_class = link->data; + + if (link_class->class_quark == class_quark) + { + link_class->flags = flags; + return; + } + else if (link_class->class_quark > class_quark) + break; + + link = link->next; + } + + child_class = g_slice_new0 (GtkChildClass); + child_class->class_quark = class_quark; + child_class->flags = flags; + + if (link) + priv->style_classes = g_list_insert_before (priv->style_classes, + link, child_class); + else + priv->style_classes = g_list_append (priv->style_classes, child_class); +} + +void +gtk_style_context_unset_child_class (GtkStyleContext *context, + const gchar *class_name) +{ + GtkStyleContextPrivate *priv; + GtkChildClass child_class; + GQuark class_quark; + GList *link; + + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); + g_return_if_fail (class_name != NULL); + + class_quark = g_quark_try_string (class_name); + + if (!class_quark) + return; + + priv = GTK_STYLE_CONTEXT_GET_PRIVATE (context); + child_class.class_quark = class_quark; + + link = g_list_find_custom (priv->child_style_classes, + &child_class, child_style_class_compare); + + if (link) + { + priv->child_style_classes = g_list_remove_link (priv->child_style_classes, link); + g_slice_free (GtkChildClass, link->data); + g_list_free1 (link); + } +} + +gboolean +gtk_style_context_has_child_class (GtkStyleContext *context, + const gchar *class_name, + GtkChildClassFlags *flags_return) +{ + GtkStyleContextPrivate *priv; + GtkChildClass child_class; + GQuark class_quark; + GList *link; + + g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), FALSE); + g_return_val_if_fail (class_name != NULL, FALSE); + + if (flags_return) + *flags_return = 0; + + class_quark = g_quark_try_string (class_name); + + if (!class_quark) + return FALSE; + + priv = GTK_STYLE_CONTEXT_GET_PRIVATE (context); + child_class.class_quark = class_quark; + + link = g_list_find_custom (priv->child_style_classes, + &child_class, child_style_class_compare); + + if (link) + { + if (*flags_return) + { + GtkChildClass *found_class; + + found_class = link->data; + *flags_return = found_class->flags; + } + + return TRUE; + } + + return FALSE; +} + #define __GTK_STYLE_CONTEXT_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkstylecontext.h b/gtk/gtkstylecontext.h index 3d594ee2a5..cc8336ecd3 100644 --- a/gtk/gtkstylecontext.h +++ b/gtk/gtkstylecontext.h @@ -36,6 +36,15 @@ G_BEGIN_DECLS typedef struct GtkStyleContext GtkStyleContext; typedef struct GtkStyleContextClass GtkStyleContextClass; +typedef enum { + GTK_CHILD_CLASS_EVEN = 1 << 0, + GTK_CHILD_CLASS_ODD = 1 << 1, + GTK_CHILD_CLASS_FIRST = 1 << 2, + GTK_CHILD_CLASS_LAST = 1 << 3, + GTK_CHILD_CLASS_DEFAULT = 1 << 4, + GTK_CHILD_CLASS_SORTED = 1 << 5 +} GtkChildClassFlags; + struct GtkStyleContext { GObject parent_object; @@ -84,6 +93,14 @@ void gtk_style_context_unset_class (GtkStyleContext *context, gboolean gtk_style_context_has_class (GtkStyleContext *context, const gchar *class_name); +void gtk_style_context_set_child_class (GtkStyleContext *context, + const gchar *class_name, + GtkChildClassFlags flags); +void gtk_style_context_unset_child_class (GtkStyleContext *context, + const gchar *class_name); +gboolean gtk_style_context_has_child_class (GtkStyleContext *context, + const gchar *class_name, + GtkChildClassFlags *flags_return); G_END_DECLS