 gtkbindings.c |   62 +++++++--
 gtkrc.c       |  372 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
 gtkrc.h       |    7 +
 3 files changed, 390 insertions(+), 51 deletions(-)
Index: gtkbindings.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkbindings.c,v
retrieving revision 1.53
diff -u -p -r1.53 gtkbindings.c
--- gtkbindings.c	5 Jan 2006 15:56:14 -0000	1.53
+++ gtkbindings.c	22 Mar 2006 17:51:58 -0000
@@ -44,7 +44,9 @@
 
 /* --- structures --- */
 typedef struct {
+  GtkPathType type;
   GPatternSpec *pspec;
+  GSList *widget_class_pspecs;
   gpointer user_data;
   guint seq_id;
 } PatternSpec;
@@ -59,6 +61,15 @@ static GQuark		 key_id_class_binding_set
 
 
 /* --- functions --- */
+static void
+pattern_spec_free (PatternSpec * pspec)
+{
+  _gtk_rc_free_widget_class_pspec_list (pspec->widget_class_pspecs);
+  if (pspec->pspec)
+    g_pattern_spec_free (pspec->pspec);
+  g_free (pspec);
+}
+
 static GtkBindingSignal*
 binding_signal_new (const gchar *signal_name,
 		    guint	 n_args)
@@ -869,7 +880,18 @@ gtk_binding_set_add_path (GtkBindingSet	
     }
   
   pspec = g_new (PatternSpec, 1);
-  pspec->pspec = g_pattern_spec_new (path_pattern);
+  pspec->type = path_type;
+  if (path_type != GTK_PATH_WIDGET_CLASS)
+    {
+      pspec->pspec = g_pattern_spec_new (path_pattern);
+      pspec->widget_class_pspecs = NULL;
+    }
+  else
+    {
+      pspec->pspec = NULL;
+      pspec->widget_class_pspecs = _gtk_rc_create_widget_class_pspec_list (path_pattern);
+    }
+    
   pspec->seq_id = priority << 28;
   pspec->user_data = binding_set;
   
@@ -885,8 +907,7 @@ gtk_binding_set_add_path (GtkBindingSet	
 	{
 	  GtkPathPriorityType lprio = tmp_pspec->seq_id >> 28;
 
-	  g_pattern_spec_free (pspec->pspec);
-	  g_free (pspec);
+	  pattern_spec_free (pspec);
 	  pspec = NULL;
 	  if (lprio < priority)
 	    {
@@ -907,25 +928,32 @@ static gboolean
 binding_match_activate (GSList          *pspec_list,
 			GtkObject	*object,
 			guint	         path_length,
-			const gchar     *path,
-			const gchar     *path_reversed)
+			gchar           *path,
+			gchar           *path_reversed)
 {
   GSList *slist;
 
   for (slist = pspec_list; slist; slist = slist->next)
     {
       PatternSpec *pspec;
+      GtkBindingSet *binding_set;
 
+      binding_set = NULL;
       pspec = slist->data;
-      if (g_pattern_match (pspec->pspec, path_length, path, path_reversed))
-	{
-	  GtkBindingSet *binding_set;
-
-	  binding_set = pspec->user_data;
+      
+      if (pspec->type != GTK_PATH_WIDGET_CLASS)
+        {
+          if (g_pattern_match (pspec->pspec, path_length, path, path_reversed))
+	    binding_set = pspec->user_data;
+        }
+      else
+        {
+          if (_gtk_rc_match_widget_class (pspec->widget_class_pspecs, path_length, path, path_reversed))
+	    binding_set = pspec->user_data;
+        }
 
-	  if (gtk_binding_entry_activate (binding_set->current, object))
-	    return TRUE;
-	}
+      if (binding_set && gtk_binding_entry_activate (binding_set->current, object))
+        return TRUE;
     }
 
   return FALSE;
@@ -1052,14 +1080,15 @@ gtk_bindings_activate_list (GtkObject *o
       while (class_type && !handled)
 	{
 	  guint path_length;
-	  const gchar *path;
+	  gchar *path;
 	  gchar *path_reversed;
 	  
-	  path = g_type_name (class_type);
+	  path = g_strdup (g_type_name (class_type));
 	  path_reversed = g_strdup (path);
 	  g_strreverse (path_reversed);
 	  path_length = strlen (path);
 	  handled = binding_match_activate (patterns, object, path_length, path, path_reversed);
+	  g_free (path);
 	  g_free (path_reversed);
 
 	  class_type = g_type_parent (class_type);
@@ -1417,8 +1446,7 @@ free_pattern_specs (GSList *pattern_spec
 
       pspec = slist->data;
 
-      g_pattern_spec_free (pspec->pspec);
-      g_free (pspec);
+      pattern_spec_free (pspec);
     }
 
   g_slist_free (pattern_specs);
Index: gtkrc.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkrc.c,v
retrieving revision 1.170
diff -u -p -r1.170 gtkrc.c
--- gtkrc.c	16 Dec 2005 18:45:31 -0000	1.170
+++ gtkrc.c	22 Mar 2006 17:52:01 -0000
@@ -66,9 +66,21 @@ typedef struct _GtkRcSet    GtkRcSet;
 typedef struct _GtkRcNode   GtkRcNode;
 typedef struct _GtkRcFile   GtkRcFile;
 
+typedef struct
+{
+  gboolean is_class;
+  GType class_type;
+  gchar * class_name;
+  GPatternSpec * pspec;
+} GtkRcSetPSpecList;
+
 struct _GtkRcSet
 {
+  GtkPathType type;
+  
   GPatternSpec *pspec;
+  GSList * widget_class_pspecs;
+
   GtkRcStyle *rc_style;
   gint priority;
 };
@@ -130,8 +142,8 @@ static GtkRcStyle* gtk_rc_style_find    
 static GSList *    gtk_rc_styles_match               (GSList          *rc_styles,
                                                       GSList          *sets,
                                                       guint            path_length,
-                                                      const gchar     *path,
-                                                      const gchar     *path_reversed);
+                                                      gchar           *path,
+                                                      gchar           *path_reversed);
 static GtkStyle *  gtk_rc_style_to_style             (GtkRcContext    *context,
 						      GtkRcStyle      *rc_style);
 static GtkStyle*   gtk_rc_init_style                 (GtkRcContext    *context,
@@ -213,6 +225,7 @@ static GtkRcStyle* gtk_rc_style_real_cre
 static GtkStyle*   gtk_rc_style_real_create_style    (GtkRcStyle      *rc_style);
 static gint	   gtk_rc_properties_cmp	     (gconstpointer    bsearch_node1,
 						      gconstpointer    bsearch_node2);
+static void        gtk_rc_set_free                   (GtkRcSet        *rc_set);
 
 static gpointer parent_class = NULL;
 
@@ -737,19 +750,8 @@ _gtk_rc_init (void)
 		       "\n"
 		       "class \"GtkProgressBar\" style : gtk \"gtk-default-progress-bar-style\"\n"
 		       "widget \"gtk-tooltips*\" style : gtk \"gtk-default-tooltips-style\"\n"
-		       "class \"GtkMenuItem\" style : gtk \"gtk-default-menu-item-style\"\n"
-		       "widget_class \"*.GtkMenuItem.*\" style : gtk \"gtk-default-menu-item-style\"\n"
-		       "widget_class \"*.GtkAccelMenuItem.*\" style : gtk \"gtk-default-menu-item-style\"\n"
-		       "widget_class \"*.GtkRadioMenuItem.*\" style : gtk \"gtk-default-menu-item-style\"\n"
-		       "widget_class \"*.GtkCheckMenuItem.*\" style : gtk \"gtk-default-menu-item-style\"\n"
-		       "widget_class \"*.GtkImageMenuItem.*\" style : gtk \"gtk-default-menu-item-style\"\n"
-		       "widget_class \"*.GtkSeparatorMenuItem.*\" style : gtk \"gtk-default-menu-item-style\"\n"
-		       "widget_class \"*.GtkCellViewMenuItem.*\" style : gtk \"gtk-default-menu-item-style\"\n"
-		       "widget_class \"*GtkMenuBar*GtkMenuItem\" style : gtk \"gtk-default-menu-bar-item-style\"\n"
-		       "widget_class \"*GtkMenuBar*GtkAccelMenuItem\" style : gtk \"gtk-default-menu-bar-item-style\"\n"
-		       "widget_class \"*GtkMenuBar*GtkRadioMenuItem\" style : gtk \"gtk-default-menu-bar-item-style\"\n"
-		       "widget_class \"*GtkMenuBar*GtkCheckMenuItem\" style : gtk \"gtk-default-menu-bar-item-style\"\n"
-		       "widget_class \"*GtkMenuBar*GtkImageMenuItem\" style : gtk \"gtk-default-menu-bar-item-style\"\n"
+		       "widget_class \"*<GtkMenuItem>*\" style : gtk \"gtk-default-menu-item-style\"\n"
+		       "widget_class \"*<GtkMenuBar>*<GtkMenuItem>\" style : gtk \"gtk-default-menu-bar-item-style\"\n"
       );
 }
   
@@ -1329,8 +1331,7 @@ gtk_rc_free_rc_sets (GSList *slist)
       GtkRcSet *rc_set;
 
       rc_set = slist->data;
-      g_pattern_spec_free (rc_set->pspec);
-      g_free (rc_set);
+      gtk_rc_set_free (rc_set);
 
       slist = slist->next;
     }
@@ -1623,8 +1624,8 @@ static GSList *
 gtk_rc_styles_match (GSList       *rc_styles,
 		     GSList	  *sets,
 		     guint         path_length,
-		     const gchar  *path,
-		     const gchar  *path_reversed)
+		     gchar        *path,
+		     gchar        *path_reversed)
 		     
 {
   GtkRcSet *rc_set;
@@ -1634,10 +1635,18 @@ gtk_rc_styles_match (GSList       *rc_st
       rc_set = sets->data;
       sets = sets->next;
 
-      if (g_pattern_match (rc_set->pspec, path_length, path, path_reversed))
-	rc_styles = g_slist_append (rc_styles, rc_set);
+      if (rc_set->type != GTK_PATH_WIDGET_CLASS)
+        {
+          if (g_pattern_match (rc_set->pspec, path_length, path, path_reversed))
+	    rc_styles = g_slist_append (rc_styles, rc_set);
+	}
+      else
+        {
+          if (_gtk_rc_match_widget_class (rc_set->widget_class_pspecs, path_length, path, path_reversed))
+	    rc_styles = g_slist_append (rc_styles, rc_set);
+        }
     }
-  
+
   return rc_styles;
 }
 
@@ -1746,16 +1755,17 @@ gtk_rc_get_style (GtkWidget *widget)
       type = G_TYPE_FROM_INSTANCE (widget);
       while (type)
 	{
-	  const gchar *path;
+	  gchar *path;
           gchar *path_reversed;
 	  guint path_length;
 
-	  path = g_type_name (type);
+	  path = g_strdup (g_type_name (type));
 	  path_length = strlen (path);
 	  path_reversed = g_strdup (path);
 	  g_strreverse (path_reversed);
 	  
 	  rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_class, path_length, path, path_reversed);
+	  g_free (path);
 	  g_free (path_reversed);
       
 	  type = g_type_parent (type);
@@ -1832,27 +1842,33 @@ gtk_rc_get_style_by_paths (GtkSettings *
 
   if (widget_path && context->rc_sets_widget)
     {
+      gchar *path;
       gchar *path_reversed;
       guint path_length;
 
       path_length = strlen (widget_path);
+      path = g_strdup (widget_path);
       path_reversed = g_strdup (widget_path);
       g_strreverse (path_reversed);
 
-      rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_widget, path_length, widget_path, path_reversed);
+      rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_widget, path_length, path, path_reversed);
+      g_free (path);
       g_free (path_reversed);
     }
   
   if (class_path && context->rc_sets_widget_class)
     {
+      gchar *path;
       gchar *path_reversed;
       guint path_length;
 
+      path = g_strdup (class_path);
       path_length = strlen (class_path);
       path_reversed = g_strdup (class_path);
       g_strreverse (path_reversed);
 
-      rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_widget_class, path_length, class_path, path_reversed);
+      rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_widget_class, path_length, path, path_reversed);
+      g_free (path);
       g_free (path_reversed);
     }
 
@@ -1860,16 +1876,17 @@ gtk_rc_get_style_by_paths (GtkSettings *
     {
       while (type)
 	{
-	  const gchar *path;
+	  gchar *path;
           gchar *path_reversed;
 	  guint path_length;
 
-	  path = g_type_name (type);
+	  path = g_strdup (g_type_name (type));
 	  path_length = strlen (path);
 	  path_reversed = g_strdup (path);
 	  g_strreverse (path_reversed);
 	  
 	  rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_class, path_length, path, path_reversed);
+	  g_free (path);
 	  g_free (path_reversed);
       
 	  type = g_type_parent (type);
@@ -1887,7 +1904,8 @@ gtk_rc_get_style_by_paths (GtkSettings *
 static GSList *
 gtk_rc_add_rc_sets (GSList      *slist,
 		    GtkRcStyle  *rc_style,
-		    const gchar *pattern)
+		    const gchar *pattern,
+		    GtkPathType  path_type)
 {
   GtkRcStyle *new_style;
   GtkRcSet *rc_set;
@@ -1903,7 +1921,19 @@ gtk_rc_add_rc_sets (GSList      *slist,
     new_style->bg_pixmap_name[i] = g_strdup (rc_style->bg_pixmap_name[i]);
   
   rc_set = g_new (GtkRcSet, 1);
-  rc_set->pspec = g_pattern_spec_new (pattern);
+  rc_set->type = path_type;
+  
+  if (path_type == GTK_PATH_WIDGET_CLASS)
+    {
+      rc_set->pspec = NULL;
+      rc_set->widget_class_pspecs = _gtk_rc_create_widget_class_pspec_list (pattern);
+    }
+  else
+    {
+      rc_set->pspec = g_pattern_spec_new (pattern);
+      rc_set->widget_class_pspecs = NULL;
+    }
+  
   rc_set->rc_style = rc_style;
   
   return g_slist_prepend (slist, rc_set);
@@ -1920,7 +1950,7 @@ gtk_rc_add_widget_name_style (GtkRcStyle
 
   context = gtk_rc_context_get (gtk_settings_get_default ());
   
-  context->rc_sets_widget = gtk_rc_add_rc_sets (context->rc_sets_widget, rc_style, pattern);
+  context->rc_sets_widget = gtk_rc_add_rc_sets (context->rc_sets_widget, rc_style, pattern, GTK_PATH_WIDGET);
 }
 
 void
@@ -1934,7 +1964,7 @@ gtk_rc_add_widget_class_style (GtkRcStyl
 
   context = gtk_rc_context_get (gtk_settings_get_default ());
   
-  context->rc_sets_widget_class = gtk_rc_add_rc_sets (context->rc_sets_widget_class, rc_style, pattern);
+  context->rc_sets_widget_class = gtk_rc_add_rc_sets (context->rc_sets_widget_class, rc_style, pattern, GTK_PATH_WIDGET_CLASS);
 }
 
 void
@@ -1948,7 +1978,7 @@ gtk_rc_add_class_style (GtkRcStyle  *rc_
 
   context = gtk_rc_context_get (gtk_settings_get_default ());
   
-  context->rc_sets_class = gtk_rc_add_rc_sets (context->rc_sets_class, rc_style, pattern);
+  context->rc_sets_class = gtk_rc_add_rc_sets (context->rc_sets_class, rc_style, pattern, GTK_PATH_CLASS);
 }
 
 GScanner*
@@ -3870,7 +3900,19 @@ gtk_rc_parse_path_pattern (GtkRcContext 
 	}
 
       rc_set = g_new (GtkRcSet, 1);
-      rc_set->pspec = g_pattern_spec_new (pattern);
+      rc_set->type = path_type;
+      
+      if (path_type == GTK_PATH_WIDGET_CLASS)
+        {
+          rc_set->pspec = NULL;
+          rc_set->widget_class_pspecs = _gtk_rc_create_widget_class_pspec_list (pattern);
+        }
+      else
+        {
+          rc_set->pspec = g_pattern_spec_new (pattern);
+          rc_set->widget_class_pspecs = NULL;
+        }
+      
       rc_set->rc_style = rc_style;
       rc_set->priority = priority;
 
@@ -4213,6 +4255,268 @@ gtk_rc_parse_logical_color (GScanner   *
   g_hash_table_insert (hash, color_id, gdk_color_copy (&color));
 
   return G_TOKEN_NONE;
+}
+
+
+GSList *
+_gtk_rc_create_widget_class_pspec_list (const gchar * pattern)
+{
+  GSList * result = NULL;
+  GtkRcSetPSpecList * list_pspec;
+  const gchar * current = pattern;
+  const gchar * class_start;
+  const gchar * class_end;
+  gchar * sub_pattern;
+  
+  while ((class_start = strchr (current, '<')) && (class_end = strchr (class_start, '>')))
+    {
+      /* Add patterns, but ignore single dots */
+      if (!(class_start == current || (class_start == current + 1 && current[0] == '.')))
+        {
+          const gchar * pattern_end = class_start - 1;
+          const gchar * pattern_start = current;
+          
+          list_pspec = g_new (GtkRcSetPSpecList, 1);
+          
+          sub_pattern = g_strndup (pattern_start, pattern_end - pattern_start + 1);
+          list_pspec->is_class = FALSE;
+          list_pspec->pspec = g_pattern_spec_new (sub_pattern);
+          list_pspec->class_name = NULL;
+          g_free (sub_pattern);
+          
+          result = g_slist_append (result, list_pspec);
+        }
+      
+      list_pspec = g_new (GtkRcSetPSpecList, 1);
+      
+      /* The < > need to be removed from the string. */
+      sub_pattern = g_strndup (class_start + 1, class_end - class_start - 1);
+      
+      list_pspec->is_class = TRUE;
+      list_pspec->class_type = G_TYPE_INVALID;
+      list_pspec->class_name = sub_pattern;
+      list_pspec->pspec = NULL;
+      
+      result = g_slist_append (result, list_pspec);
+      
+      current = class_end + 1;
+    }
+  
+  /* Add the rest, if anything is left */
+  if (strlen (current) > 0)
+    {
+      list_pspec = g_new (GtkRcSetPSpecList, 1);
+      list_pspec->is_class = FALSE;
+      list_pspec->pspec = g_pattern_spec_new (current);
+      list_pspec->class_name = NULL;
+      
+      result = g_slist_append (result, list_pspec);
+    }
+  
+  return result;
+}
+
+static void
+free_widget_class_pspec (gpointer data, gpointer user_data)
+{
+  GtkRcSetPSpecList * pspec_list = data;
+
+  if (pspec_list->pspec)  
+    g_pattern_spec_free (pspec_list->pspec);
+  g_free (pspec_list->class_name);
+  
+  g_free(pspec_list);
+}
+
+void
+_gtk_rc_free_widget_class_pspec_list (GSList * pspecs)
+{
+  g_slist_foreach (pspecs, free_widget_class_pspec, NULL);
+  g_slist_free (pspecs);
+}
+
+static void
+gtk_rc_set_free (GtkRcSet * rc_set)
+{
+  g_assert (rc_set != NULL);
+  
+  if (rc_set->pspec)
+    g_pattern_spec_free (rc_set->pspec);
+  _gtk_rc_free_widget_class_pspec_list (rc_set->widget_class_pspecs);
+  
+  g_free (rc_set);
+}
+
+static gboolean
+match_class (GtkRcSetPSpecList * rc_set, gchar *type_name)
+{
+  GType type;
+  
+  if (rc_set->class_type == G_TYPE_INVALID)
+    {
+      type = g_type_from_name (rc_set->class_name);
+      if (type != G_TYPE_INVALID)
+        {
+          rc_set->class_type = type;
+          g_free (rc_set->class_name);
+          rc_set->class_name = NULL;
+        }
+      else
+        {
+          /* Just compare the two strings we got, cannot do any better in this case. */
+          return g_str_equal (type_name, rc_set->class_name);
+        }
+    }
+
+  return g_type_is_a (g_type_from_name (type_name), rc_set->class_type);
+}
+
+static gboolean
+match_widget_class_recursive (GSList * list, guint length, gchar * path, gchar * path_reversed)
+{
+  GtkRcSetPSpecList * pspec_list;
+  
+  /* break out if we cannot match anymore. */
+  if (list == NULL)
+    {
+      if (length > 0)
+        return FALSE;
+      else
+        return TRUE;
+    }
+  
+  /* there are two possibilities:
+   *  1. The next pattern should match the class.
+   *  2. First normal matching, and then maybe a class */
+  
+  pspec_list = list->data;
+  
+  if (pspec_list->is_class)
+    {
+      gchar * class_start = path;
+      gchar * class_end;
+      
+      /* ignore leading dot */
+      if (class_start[0] == '.')
+        class_start++;
+      class_end = strchr (class_start, '.');
+      
+      if (class_end == NULL)
+        {
+          if (!match_class (pspec_list, class_start))
+            return FALSE;
+          else
+            return match_widget_class_recursive (g_slist_next (list), 0, "", "");
+        }
+      else
+        {
+          class_end[0] = '\0';
+          if (!match_class (pspec_list, class_start))
+            {
+              class_end[0] = '.';
+              return FALSE;
+            }
+          else
+            {
+              gboolean result;
+              gint new_length = length - (class_end - path);
+              gchar old_char = path_reversed[new_length];
+              
+              class_end[0] = '.';
+              
+              path_reversed[new_length] = '\0';
+              result = match_widget_class_recursive (g_slist_next (list), new_length, class_end, path_reversed);
+              path_reversed[new_length] = old_char;
+              
+              return result;
+            }
+        }
+    }
+  else
+    {
+      GtkRcSetPSpecList * class_pspec_list;
+      gchar * class_start;
+      gchar * class_end;
+      gboolean result = FALSE;
+      
+      /* If there is nothing after this (ie. no class match), just need to compare the param spec. */
+      if (g_slist_next (list) == NULL)
+        return g_pattern_match (pspec_list->pspec, length, path, path_reversed);
+      
+      class_pspec_list = (g_slist_next (list))->data;
+      g_assert (class_pspec_list->is_class);
+      
+      class_start = path;
+      if (class_start[0] == '.')
+        class_start++;
+      
+      while (TRUE)
+        {
+          class_end = strchr (class_start, '.');
+          
+          /* It should be cheaper to match the class first. (either the pattern
+           * is simple, and will match most of the times, or it may be complex
+           * and matching is slow) */
+          if (class_end == NULL)
+            {
+              result = match_class (class_pspec_list, class_start);
+            }
+          else
+            {
+              class_end[0] = '\0';
+              result = match_class (class_pspec_list, class_start);
+              class_end[0] = '.';
+            }
+          
+          if (result)
+            {
+              gchar old_char;
+              result = FALSE;
+              
+              /* terminate the string in front of the class. It does not matter that the class becomes
+               * unusable, because it is not needed inside the recursion */
+              old_char = class_start[0];
+              class_start[0] = '\0';
+              
+              if (g_pattern_match (pspec_list->pspec, class_start - path, path, path_reversed + length - (class_start - path)))
+                {
+                  if (class_end != NULL)
+                    {
+                      gint new_length = length - (class_end - path);
+                      gchar path_reversed_char = path_reversed[new_length];
+                      
+                      path_reversed[new_length] = '\0';
+                      
+                      result = match_widget_class_recursive (g_slist_next(g_slist_next (list)), new_length, class_end, path_reversed);
+                      
+                      path_reversed[new_length] = path_reversed_char;
+                    }
+                  else
+                    result = match_widget_class_recursive (g_slist_next(g_slist_next (list)), 0, "", "");
+                }
+                
+              class_start[0] = old_char;
+            }
+          
+          if (result)
+            return TRUE;
+          
+          /* get next class in path, or break out */
+          if (class_end != NULL)
+            class_start = class_end + 1;
+          else
+            return FALSE;
+        }
+    }
+}
+
+gboolean
+_gtk_rc_match_widget_class (GSList  *pspecs,
+                            gint     length,
+                            gchar   *path,
+                            gchar   *path_reversed)
+{
+  return match_widget_class_recursive (pspecs, length, path, path_reversed);
 }
 
 #ifdef G_OS_WIN32
Index: gtkrc.h
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkrc.h,v
retrieving revision 1.44
diff -u -p -r1.44 gtkrc.h
--- gtkrc.h	23 Nov 2005 10:33:57 -0000	1.44
+++ gtkrc.h	22 Mar 2006 17:52:01 -0000
@@ -127,6 +127,13 @@ struct _GtkRcStyleClass
 #endif
 
 void	  _gtk_rc_init			(void);
+GSList*   _gtk_rc_create_widget_class_pspec_list (const gchar  *pattern);
+void      _gtk_rc_free_widget_class_pspec_list   (GSList       *pspecs);
+gboolean  _gtk_rc_match_widget_class    (GSList      *pspecs,
+                                         gint         length,
+                                         gchar       *path,
+                                         gchar       *path_reversed);
+
 void      gtk_rc_add_default_file	(const gchar *filename);
 void      gtk_rc_set_default_files      (gchar **filenames);
 gchar**   gtk_rc_get_default_files      (void);
