[gtk+] Remove dead Gtk[Rc]Style code



commit 56c3d4b1be15e294eee8efe964b1307f7bceff29
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Dec 18 11:27:26 2010 +0100

    Remove dead Gtk[Rc]Style code
    
    Most code in gtkrc.c has been turned into a no-op, but that one
    reverting in public API (gtk_rc_scanner_new() and such). GtStyle
    is also more shallow, now fully relies in the backing
    GtkStyleContext and all connection to gtkrc.c has been removed.
    
    GtkBinding has been also affected, there is no replacement yet
    for custom keybindings in style files, so that piece of code that
    hooked into gtkrc has been replaced by a FIXME so in the future
    it may be added back.

 gtk/gtkbindings.c |  407 +------------
 gtk/gtkrc.c       | 1796 +----------------------------------------------------
 gtk/gtkrc.h       |   18 -
 gtk/gtksettings.c |    2 -
 gtk/gtkstyle.c    |  481 ++-------------
 gtk/gtkstyle.h    |   10 +-
 gtk/gtkwidget.c   |  163 ++----
 7 files changed, 95 insertions(+), 2782 deletions(-)
---
diff --git a/gtk/gtkbindings.c b/gtk/gtkbindings.c
index 6973a6a..fcf5316 100644
--- a/gtk/gtkbindings.c
+++ b/gtk/gtkbindings.c
@@ -47,7 +47,6 @@
 typedef struct {
   GtkPathType   type;
   GPatternSpec *pspec;
-  GSList       *path;
   gpointer      user_data;
   guint         seq_id;
 } PatternSpec;
@@ -65,7 +64,6 @@ static GQuark		 key_id_class_binding_set = 0;
 static void
 pattern_spec_free (PatternSpec *pspec)
 {
-  _gtk_rc_free_widget_class_path (pspec->path);
   if (pspec->pspec)
     g_pattern_spec_free (pspec->pspec);
   g_free (pspec);
@@ -972,6 +970,8 @@ gtk_binding_entry_add_signal (GtkBindingSet  *binding_set,
  *
  * This function is used internally by the GtkRC parsing mechanism to
  * assign match patterns to #GtkBindingSet structures.
+ *
+ * Deprecated: 3.0
  */
 void
 gtk_binding_set_add_path (GtkBindingSet	     *binding_set,
@@ -1009,16 +1009,10 @@ gtk_binding_set_add_path (GtkBindingSet	     *binding_set,
   pspec = g_new (PatternSpec, 1);
   pspec->type = path_type;
   if (path_type == GTK_PATH_WIDGET_CLASS)
-    {
-      pspec->pspec = NULL;
-      pspec->path = _gtk_rc_parse_widget_class_path (path_pattern);
-    }
+    pspec->pspec = NULL;
   else
-    {
-      pspec->pspec = g_pattern_spec_new (path_pattern);
-      pspec->path = NULL;
-    }
-    
+    pspec->pspec = g_pattern_spec_new (path_pattern);
+
   pspec->seq_id = priority << 28;
   pspec->user_data = binding_set;
   
@@ -1070,13 +1064,8 @@ binding_match_activate (GSList          *pspec_list,
 
       binding_set = NULL;
       pspec = slist->data;
-      
-      if (pspec->type == GTK_PATH_WIDGET_CLASS)
-        {
-          if (_gtk_rc_match_widget_class (pspec->path, path_length, path, path_reversed))
-	    binding_set = pspec->user_data;
-        }
-      else
+
+      if (pspec->type != GTK_PATH_WIDGET_CLASS)
         {
           if (g_pattern_match (pspec->pspec, path_length, path, path_reversed))
 	    binding_set = pspec->user_data;
@@ -1175,47 +1164,12 @@ gtk_bindings_activate_list (GObject   *object,
 			    GSList    *entries,
 			    gboolean   is_release)
 {
-  GtkWidget *widget = GTK_WIDGET (object);
   gboolean handled = FALSE;
 
   if (!entries)
     return FALSE;
 
-  if (!handled)
-    {
-      guint path_length;
-      gchar *path, *path_reversed;
-      GSList *patterns;
-      gboolean unbound;
-
-      gtk_widget_path (widget, &path_length, &path, &path_reversed);
-      patterns = gtk_binding_entries_sort_patterns (entries, GTK_PATH_WIDGET, is_release);
-      handled = binding_match_activate (patterns, object, path_length, path, path_reversed, &unbound);
-      g_slist_free (patterns);
-      g_free (path);
-      g_free (path_reversed);
-
-      if (unbound)
-        return FALSE;
-    }
-
-  if (!handled)
-    {
-      guint path_length;
-      gchar *path, *path_reversed;
-      GSList *patterns;
-      gboolean unbound;
-
-      gtk_widget_class_path (widget, &path_length, &path, &path_reversed);
-      patterns = gtk_binding_entries_sort_patterns (entries, GTK_PATH_WIDGET_CLASS, is_release);
-      handled = binding_match_activate (patterns, object, path_length, path, path_reversed, &unbound);
-      g_slist_free (patterns);
-      g_free (path);
-      g_free (path_reversed);
-
-      if (unbound)
-        return FALSE;
-    }
+  /* FIXME: Add back binding parsing from user config files */
 
   if (!handled)
     {
@@ -1333,348 +1287,3 @@ gtk_bindings_activate_event (GObject     *object,
 
   return handled;
 }
-
-static guint
-gtk_binding_parse_signal (GScanner       *scanner,
-			  GtkBindingSet  *binding_set,
-			  guint		  keyval,
-			  GdkModifierType modifiers)
-{
-  gchar *signal;
-  guint expected_token = 0;
-  GSList *args;
-  GSList *slist;
-  gboolean done;
-  gboolean negate;
-  gboolean need_arg;
-  gboolean seen_comma;
-  guint token;
-
-  g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
-  
-  g_scanner_get_next_token (scanner);
-  if (scanner->token != G_TOKEN_STRING)
-    return G_TOKEN_STRING;
-  g_scanner_peek_next_token (scanner);
-  if (scanner->next_token != '(')
-    {
-      g_scanner_get_next_token (scanner);
-      return '(';
-    }
-  signal = g_strdup (scanner->value.v_string);
-  g_scanner_get_next_token (scanner);
-
-  negate = FALSE;
-  args = NULL;
-  done = FALSE;
-  need_arg = TRUE;
-  seen_comma = FALSE;
-  scanner->config->scan_symbols = FALSE;
-  do
-    {
-      if (need_arg)
-	expected_token = G_TOKEN_INT;
-      else
-	expected_token = ')';
-
-      token = g_scanner_get_next_token (scanner);
-      switch (token)
-	{
-	  GtkBindingArg *arg;
-
-	case G_TOKEN_FLOAT:
-	  if (need_arg)
-	    {
-	      need_arg = FALSE;
-	      arg = g_new (GtkBindingArg, 1);
-	      arg->arg_type = G_TYPE_DOUBLE;
-	      arg->d.double_data = scanner->value.v_float;
-	      if (negate)
-		{
-		  arg->d.double_data = - arg->d.double_data;
-		  negate = FALSE;
-		}
-	      args = g_slist_prepend (args, arg);
-	    }
-	  else
-	    done = TRUE;
-	  break;
-	case G_TOKEN_INT:
-	  if (need_arg)
-	    {
-	      need_arg = FALSE;
-	      arg = g_new (GtkBindingArg, 1);
-	      arg->arg_type = G_TYPE_LONG;
-	      arg->d.long_data = scanner->value.v_int;
-	      if (negate)
-		{
-		  arg->d.long_data = - arg->d.long_data;
-		  negate = FALSE;
-		}
-	      args = g_slist_prepend (args, arg);
-	    }
-          else
-	    done = TRUE;
-	  break;
-	case G_TOKEN_STRING:
-	  if (need_arg && !negate)
-	    {
-	      need_arg = FALSE;
-	      arg = g_new (GtkBindingArg, 1);
-	      arg->arg_type = G_TYPE_STRING;
-	      arg->d.string_data = g_strdup (scanner->value.v_string);
-	      args = g_slist_prepend (args, arg);
-	    }
-	  else
-	    done = TRUE;
-	  break;
-	case G_TOKEN_IDENTIFIER:
-	  if (need_arg && !negate)
-	    {
-	      need_arg = FALSE;
-	      arg = g_new (GtkBindingArg, 1);
-	      arg->arg_type = GTK_TYPE_IDENTIFIER;
-	      arg->d.string_data = g_strdup (scanner->value.v_identifier);
-	      args = g_slist_prepend (args, arg);
-	    }
-	  else
-	    done = TRUE;
-	  break;
-	case '-':
-	  if (!need_arg)
-	    done = TRUE;
-	  else if (negate)
-	    {
-	      expected_token = G_TOKEN_INT;
-	      done = TRUE;
-	    }
-	  else
-	    negate = TRUE;
-	  break;
-	case ',':
-	  seen_comma = TRUE;
-	  if (need_arg)
-	    done = TRUE;
-	  else
-	    need_arg = TRUE;
-	  break;
-	case ')':
-	  if (!(need_arg && seen_comma) && !negate)
-	    {
-	      args = g_slist_reverse (args);
-	      _gtk_binding_entry_add_signall (binding_set,
-                                              keyval,
-                                              modifiers,
-                                              signal,
-                                              args);
-	      expected_token = G_TOKEN_NONE;
-	    }
-	  done = TRUE;
-	  break;
-	default:
-	  done = TRUE;
-	  break;
-	}
-    }
-  while (!done);
-  scanner->config->scan_symbols = TRUE;
-  
-  for (slist = args; slist; slist = slist->next)
-    {
-      GtkBindingArg *arg;
-
-      arg = slist->data;
-      if (G_TYPE_FUNDAMENTAL (arg->arg_type) == G_TYPE_STRING)
-	g_free (arg->d.string_data);
-      g_free (arg);
-    }
-  g_slist_free (args);
-  g_free (signal);
-
-  return expected_token;
-}
-
-static inline guint
-gtk_binding_parse_bind (GScanner       *scanner,
-			GtkBindingSet  *binding_set)
-{
-  guint keyval = 0;
-  GdkModifierType modifiers = 0;
-  gboolean unbind = FALSE;
-  guint token;
-
-  g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
-
-  token = g_scanner_get_next_token (scanner);
-  if (token != GTK_RC_TOKEN_BIND &&
-      token != GTK_RC_TOKEN_UNBIND)
-    return GTK_RC_TOKEN_BIND;
-  unbind = token == GTK_RC_TOKEN_UNBIND;
-  g_scanner_get_next_token (scanner);
-  if (scanner->token != G_TOKEN_STRING)
-    return G_TOKEN_STRING;
-  gtk_accelerator_parse (scanner->value.v_string, &keyval, &modifiers);
-  modifiers &= BINDING_MOD_MASK ();
-  if (keyval == 0)
-    return G_TOKEN_STRING;
-
-  if (unbind)
-    {
-      gtk_binding_entry_skip (binding_set, keyval, modifiers);
-      return G_TOKEN_NONE;
-    }
-
-  g_scanner_get_next_token (scanner);
-
-  if (scanner->token != '{')
-    return '{';
-
-  gtk_binding_entry_clear_internal (binding_set, keyval, modifiers);
-
-  g_scanner_peek_next_token (scanner);
-  while (scanner->next_token != '}')
-    {
-      switch (scanner->next_token)
-	{
-	  guint expected_token;
-
-	case G_TOKEN_STRING:
-	  expected_token = gtk_binding_parse_signal (scanner,
-						     binding_set,
-						     keyval,
-						     modifiers);
-	  if (expected_token != G_TOKEN_NONE)
-	    return expected_token;
-	  break;
-	default:
-	  g_scanner_get_next_token (scanner);
-	  return '}';
-	}
-      g_scanner_peek_next_token (scanner);
-    }
-  g_scanner_get_next_token (scanner);
-
-  return G_TOKEN_NONE;
-}
-
-guint
-_gtk_binding_parse_binding (GScanner *scanner)
-{
-  GtkBindingSet *binding_set;
-  gchar *name;
-  guint token;
-
-  g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
-
-  token = g_scanner_get_next_token (scanner);
-  if (token != GTK_RC_TOKEN_BINDING)
-    return GTK_RC_TOKEN_BINDING;
-  g_scanner_get_next_token (scanner);
-  if (scanner->token != G_TOKEN_STRING)
-    return G_TOKEN_STRING;
-  name = g_strdup (scanner->value.v_string);
-
-  g_scanner_get_next_token (scanner);
-  if (scanner->token != '{')
-    {
-      g_free (name);
-      return G_TOKEN_STRING;
-    }
-
-  binding_set = gtk_binding_set_find (name);
-  if (!binding_set)
-    {
-      binding_set = gtk_binding_set_new (name);
-      binding_set->parsed = 1;
-    }
-  g_free (name);
-
-  g_scanner_peek_next_token (scanner);
-  while (scanner->next_token != '}')
-    {
-      guint next_token = scanner->next_token;
-      switch (next_token)
-	{
-	  guint expected_token;
-
-	case GTK_RC_TOKEN_BIND:
-	case GTK_RC_TOKEN_UNBIND:
-	  expected_token = gtk_binding_parse_bind (scanner, binding_set);
-	  if (expected_token != G_TOKEN_NONE)
-	    return expected_token;
-	  break;
-	default:
-	  g_scanner_get_next_token (scanner);
-	  return '}';
-	}
-      g_scanner_peek_next_token (scanner);
-    }
-  g_scanner_get_next_token (scanner);
-
-  return G_TOKEN_NONE;
-}
-
-static void
-free_pattern_specs (GSList *pattern_specs)
-{
-  GSList *slist;
-
-  for (slist = pattern_specs; slist; slist = slist->next)
-    {
-      PatternSpec *pspec;
-
-      pspec = slist->data;
-
-      pattern_spec_free (pspec);
-    }
-
-  g_slist_free (pattern_specs);
-}
-
-static void
-binding_set_delete (GtkBindingSet *binding_set)
-{
-  GtkBindingEntry *entry, *next;
-
-  entry = binding_set->entries;
-  while (entry)
-    {
-      next = entry->set_next;
-      binding_entry_destroy (entry);
-      entry = next;
-    }
-  
-  free_pattern_specs (binding_set->widget_path_pspecs);
-  free_pattern_specs (binding_set->widget_class_pspecs);
-  free_pattern_specs (binding_set->class_branch_pspecs);
-
-  g_free (binding_set);
-}
-
-/**
- * _gtk_binding_reset_parsed:
- * 
- * Remove all binding sets that were added by gtk_binding_parse_binding().
- */
-void
-_gtk_binding_reset_parsed (void)
-{
-  GSList *slist, *next;
-  
-  slist = binding_set_list;
-  while (slist)
-    {
-      GtkBindingSet *binding_set;
-
-      binding_set = slist->data;
-      next = slist->next;
-
-      if (binding_set->parsed)
-	{
-	  binding_set_list = g_slist_delete_link (binding_set_list, slist);
-	  binding_set_delete (binding_set);
-	}
-
-      slist = next;
-    }
-}
diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c
index b0f239a..5f726bd 100644
--- a/gtk/gtkrc.c
+++ b/gtk/gtkrc.c
@@ -60,10 +60,6 @@
 #include <io.h>
 #endif
 
-typedef struct _GtkRcSet    GtkRcSet;
-typedef struct _GtkRcNode   GtkRcNode;
-typedef struct _GtkRcFile   GtkRcFile;
-
 enum 
 {
   PATH_ELT_PSPEC,
@@ -82,54 +78,6 @@ typedef struct
   } elt;
 } PathElt;
 
-struct _GtkRcSet
-{
-  GtkPathType   type;
-
-  GPatternSpec *pspec;
-  GSList       *path;
-
-  GtkRcStyle   *rc_style;
-  gint          priority;
-};
-
-struct _GtkRcFile
-{
-  time_t mtime;
-  gchar *name;
-  gchar *canonical_name;
-  gchar *directory;
-  guint  reload    : 1;
-  guint  is_string : 1;	/* If TRUE, name is a string to parse with gtk_rc_parse_string() */
-};
-
-
-struct _GtkRcContext
-{
-  GHashTable *rc_style_ht;
-  GtkSettings *settings;
-  GSList *rc_sets_widget;
-  GSList *rc_sets_widget_class;
-  GSList *rc_sets_class;
-
-  /* The files we have parsed, to reread later if necessary */
-  GSList *rc_files;
-
-  gchar    *theme_name;
-  gboolean  prefer_dark_theme;
-  gchar    *key_theme_name;
-  gchar    *font_name;
-  
-  gchar **pixmap_path;
-
-  gint default_priority;
-  GtkStyle *default_style;
-
-  GHashTable *color_hash;
-
-  guint reloading : 1;
-};
-
 #define GTK_RC_STYLE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_RC_STYLE, GtkRcStylePrivate))
 
 typedef struct _GtkRcStylePrivate GtkRcStylePrivate;
@@ -139,51 +87,13 @@ struct _GtkRcStylePrivate
   GSList *color_hashes;
 };
 
-static GtkRcContext *gtk_rc_context_get              (GtkSettings     *settings);
-
-static guint       gtk_rc_styles_hash                (const GSList    *rc_styles);
-static gboolean    gtk_rc_styles_equal               (const GSList    *a,
-                                                      const GSList    *b);
-static GSList *    gtk_rc_styles_match               (GSList          *rc_styles,
-                                                      GSList          *sets,
-                                                      guint            path_length,
-                                                      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,
-						      GSList          *rc_styles);
-static void        gtk_rc_parse_default_files        (GtkRcContext    *context);
-static gboolean    gtk_rc_parse_named                (GtkRcContext    *context,
-						      const gchar     *name,
-						      const gchar     *type,
-						      const gchar     *variant);
-static void        gtk_rc_context_parse_file         (GtkRcContext    *context,
-						      const gchar     *filename,
-						      gint             priority,
-                                                      gboolean         reload);
-static void        gtk_rc_parse_any                  (GtkRcContext    *context,
-						      const gchar     *input_name,
-                                                      gint             input_fd,
-                                                      const gchar     *input_string);
-
-static void        gtk_rc_clear_hash_node            (gpointer         key,
-                                                      gpointer         data,
-                                                      gpointer         user_data);
-static void        gtk_rc_clear_styles               (GtkRcContext    *context);
-static void        gtk_rc_add_initial_default_files  (void);
-
 static void        gtk_rc_style_finalize             (GObject         *object);
 static void        gtk_rc_style_real_merge           (GtkRcStyle      *dest,
                                                       GtkRcStyle      *src);
 static GtkRcStyle* gtk_rc_style_real_create_rc_style (GtkRcStyle      *rc_style);
 static GtkStyle*   gtk_rc_style_real_create_style    (GtkRcStyle      *rc_style);
-static void        gtk_rc_style_copy_icons_and_colors(GtkRcStyle      *rc_style,
-                                                      GtkRcStyle      *src_style,
-                                                      GtkRcContext    *context);
 static gint	   gtk_rc_properties_cmp	     (gconstpointer    bsearch_node1,
 						      gconstpointer    bsearch_node2);
-static void        gtk_rc_set_free                   (GtkRcSet        *rc_set);
 
 static void	   insert_rc_property		     (GtkRcStyle      *style,
 						      GtkRcProperty   *property,
@@ -319,23 +229,8 @@ static GHashTable *realized_style_ht = NULL;
 
 static gchar *im_module_file = NULL;
 
-static gint    max_default_files = 0;
 static gchar **gtk_rc_default_files = NULL;
 
-/* A stack of information of RC files we are parsing currently.
- * The directories for these files are implicitely added to the end of
- * PIXMAP_PATHS.
- */
-static GSList *current_files_stack = NULL;
-
-/* RC files and strings that are parsed for every context
- */
-static GSList *global_rc_files = NULL;
-
-/* Keep list of all current RC contexts for convenience
- */
-static GSList *rc_contexts;
-
 /* RC file handling */
 
 static gchar *
@@ -436,55 +331,6 @@ gtk_rc_get_module_dir (void)
   return gtk_rc_make_default_dir ("engines");
 }
 
-static void
-gtk_rc_add_initial_default_files (void)
-{
-  static gint init = FALSE;
-  const gchar *var;
-  gchar *str;
-  gchar **files;
-  gint i;
-
-  if (init)
-    return;
- 
-  gtk_rc_default_files = g_new (gchar*, 10);
-  max_default_files = 10;
-
-  gtk_rc_default_files[0] = NULL;
-  init = TRUE;
-
-  var = g_getenv ("GTK2_RC_FILES");
-
-  if (var)
-    {
-      files = g_strsplit (var, G_SEARCHPATH_SEPARATOR_S, -1);
-      i=0;
-      while (files[i])
-	{
-	  gtk_rc_add_default_file (files[i]);
-	  i++;
-	}
-      g_strfreev (files);
-    }
-  else
-    {
-      const gchar *home;
-      str = g_build_filename (GTK_SYSCONFDIR, "gtk-3.0", "gtkrc", NULL);
-
-      gtk_rc_add_default_file (str);
-      g_free (str);
-
-      home = g_get_home_dir ();
-      if (home)
-	{
-	  str = g_build_filename (home, ".gtkrc-3.0", NULL);
-	  gtk_rc_add_default_file (str);
-	  g_free (str);
-	}
-    }
-}
-
 /**
  * gtk_rc_add_default_file:
  * @filename: the pathname to the file. If @filename is not absolute, it
@@ -498,24 +344,6 @@ gtk_rc_add_initial_default_files (void)
 void
 gtk_rc_add_default_file (const gchar *filename)
 {
-  guint n;
-  
-  gtk_rc_add_initial_default_files ();
-
-  for (n = 0; n < max_default_files; n++) 
-    {
-      if (gtk_rc_default_files[n] == NULL)
-	break;
-    }
-
-  if (n == max_default_files)
-    {
-      max_default_files += 10;
-      gtk_rc_default_files = g_renew (gchar*, gtk_rc_default_files, max_default_files);
-    }
-  
-  gtk_rc_default_files[n++] = g_strdup (filename);
-  gtk_rc_default_files[n] = NULL;
 }
 
 /**
@@ -530,25 +358,6 @@ gtk_rc_add_default_file (const gchar *filename)
 void
 gtk_rc_set_default_files (gchar **filenames)
 {
-  gint i;
-
-  gtk_rc_add_initial_default_files ();
-
-  i = 0;
-  while (gtk_rc_default_files[i])
-    {
-      g_free (gtk_rc_default_files[i]);
-      i++;
-    }
-    
-  gtk_rc_default_files[0] = NULL;
-
-  i = 0;
-  while (filenames[i] != NULL)
-    {
-      gtk_rc_add_default_file (filenames[i]);
-      i++;
-    }
 }
 
 /**
@@ -566,490 +375,19 @@ gtk_rc_set_default_files (gchar **filenames)
 gchar **
 gtk_rc_get_default_files (void)
 {
-  gtk_rc_add_initial_default_files ();
-
   return gtk_rc_default_files;
 }
 
-static void
-gtk_rc_settings_changed (GtkSettings  *settings,
-			 GParamSpec   *pspec,
-			 GtkRcContext *context)
-{
-  gchar *new_theme_name;
-  gchar *new_key_theme_name;
-  gboolean new_prefer_dark_theme;
-
-  if (context->reloading)
-    return;
-
-  g_object_get (settings,
-		"gtk-theme-name", &new_theme_name,
-		"gtk-key-theme-name", &new_key_theme_name,
-		"gtk-application-prefer-dark-theme", &new_prefer_dark_theme,
-		NULL);
-
-  if ((new_theme_name != context->theme_name && 
-       !(new_theme_name && context->theme_name && strcmp (new_theme_name, context->theme_name) == 0)) ||
-      (new_key_theme_name != context->key_theme_name &&
-       !(new_key_theme_name && context->key_theme_name && strcmp (new_key_theme_name, context->key_theme_name) == 0)) ||
-      new_prefer_dark_theme != context->prefer_dark_theme)
-    {
-      gtk_rc_reparse_all_for_settings (settings, TRUE);
-    }
-
-  g_free (new_theme_name);
-  g_free (new_key_theme_name);
-}
-
-static void
-gtk_rc_font_name_changed (GtkSettings  *settings,
-                          GParamSpec   *pspec,
-                          GtkRcContext *context)
-{
-  if (!context->reloading)
-    _gtk_rc_context_get_default_font_name (settings);
-}
-
-static void
-gtk_rc_color_hash_changed (GtkSettings  *settings,
-			   GParamSpec   *pspec,
-			   GtkRcContext *context)
-{
-  GHashTable *old_hash;
-
-  old_hash = context->color_hash;
-
-  g_object_get (settings, "color-hash", &context->color_hash, NULL);
-
-  if (old_hash)
-    g_hash_table_unref (old_hash);
-
-  gtk_rc_reparse_all_for_settings (settings, TRUE);
-}
-
-static GtkRcContext *
-gtk_rc_context_get (GtkSettings *settings)
-{
-  if (!settings->rc_context)
-    {
-      GtkRcContext *context = settings->rc_context = g_new (GtkRcContext, 1);
-
-      context->settings = settings;
-      context->rc_style_ht = NULL;
-      context->rc_sets_widget = NULL;
-      context->rc_sets_widget_class = NULL;
-      context->rc_sets_class = NULL;
-      context->rc_files = NULL;
-      context->default_style = NULL;
-      context->reloading = FALSE;
-
-      g_object_get (settings,
-		    "gtk-theme-name", &context->theme_name,
-		    "gtk-key-theme-name", &context->key_theme_name,
-		    "gtk-font-name", &context->font_name,
-		    "color-hash", &context->color_hash,
-		    "gtk-application-prefer-dark-theme", &context->prefer_dark_theme,
-		    NULL);
-
-      g_signal_connect (settings,
-			"notify::gtk-theme-name",
-			G_CALLBACK (gtk_rc_settings_changed),
-			context);
-      g_signal_connect (settings,
-			"notify::gtk-key-theme-name",
-			G_CALLBACK (gtk_rc_settings_changed),
-			context);
-      g_signal_connect (settings,
-			"notify::gtk-font-name",
-			G_CALLBACK (gtk_rc_font_name_changed),
-			context);
-      g_signal_connect (settings,
-			"notify::color-hash",
-			G_CALLBACK (gtk_rc_color_hash_changed),
-			context);
-      g_signal_connect (settings,
-			"notify::gtk-application-prefer-dark-theme",
-			G_CALLBACK (gtk_rc_settings_changed),
-			context);
-
-      context->pixmap_path = NULL;
-
-      context->default_priority = GTK_PATH_PRIO_RC;
-
-      rc_contexts = g_slist_prepend (rc_contexts, settings->rc_context);
-    }
-
-  return settings->rc_context;
-}
-
-static void 
-gtk_rc_clear_rc_files (GtkRcContext *context)
-{
-  GSList *list;
-
-  list = context->rc_files;
-  while (list)
-    {
-      GtkRcFile *rc_file = list->data;
-      
-      if (rc_file->canonical_name != rc_file->name)
-	g_free (rc_file->canonical_name);
-      g_free (rc_file->directory);
-      g_free (rc_file->name);
-      g_free (rc_file);
-      
-      list = list->next;
-    }
-  
-  g_slist_free (context->rc_files);
-  context->rc_files = NULL;
-}
-
-void
-_gtk_rc_context_destroy (GtkSettings *settings)
-{
-  GtkRcContext *context;
-
-  g_return_if_fail (GTK_IS_SETTINGS (settings));
-
-  context = settings->rc_context;
-  if (!context)
-    return;
-
-  _gtk_settings_reset_rc_values (context->settings);
-  gtk_rc_clear_styles (context);
-  gtk_rc_clear_rc_files (context);
-
-  if (context->default_style)
-    g_object_unref (context->default_style);
-
-  g_strfreev (context->pixmap_path);
-
-  g_free (context->theme_name);
-  g_free (context->key_theme_name);
-  g_free (context->font_name);
-
-  if (context->color_hash)
-    g_hash_table_unref (context->color_hash);
-
-  g_signal_handlers_disconnect_by_func (settings,
-					gtk_rc_settings_changed, context);
-  g_signal_handlers_disconnect_by_func (settings,
-					gtk_rc_font_name_changed, context);
-  g_signal_handlers_disconnect_by_func (settings,
-					gtk_rc_color_hash_changed, context);
-
-  rc_contexts = g_slist_remove (rc_contexts, context);
-
-  g_free (context);
-
-  settings->rc_context = NULL;
-}
-
-static gboolean
-gtk_rc_parse_named (GtkRcContext *context,
-		    const gchar  *name,
-		    const gchar  *type,
-		    const gchar  *variant)
-{
-  gchar *path = NULL;
-  const gchar *home_dir;
-  gchar *subpath;
-  gboolean retval;
-
-  retval = FALSE;
-
-  if (type)
-    subpath = g_strconcat ("gtk-3.0-", type,
-			   G_DIR_SEPARATOR_S "gtkrc",
-			   NULL);
-  else
-    subpath = g_strconcat ("gtk-3.0" G_DIR_SEPARATOR_S "gtkrc",
-			   variant, NULL);
-
-  /* First look in the users home directory
-   */
-  home_dir = g_get_home_dir ();
-  if (home_dir)
-    {
-      path = g_build_filename (home_dir, ".themes", name, subpath, NULL);
-      if (!g_file_test (path, G_FILE_TEST_EXISTS))
-	{
-	  g_free (path);
-	  path = NULL;
-	}
-    }
-
-  if (!path)
-    {
-      gchar *theme_dir = gtk_rc_get_theme_dir ();
-      path = g_build_filename (theme_dir, name, subpath, NULL);
-      g_free (theme_dir);
-      
-      if (!g_file_test (path, G_FILE_TEST_EXISTS))
-	{
-	  g_free (path);
-	  path = NULL;
-	}
-    }
-
-  if (path)
-    {
-      gtk_rc_context_parse_file (context, path, GTK_PATH_PRIO_THEME, FALSE);
-      g_free (path);
-      retval = TRUE;
-    }
-
-  g_free (subpath);
-
-  return retval;
-}
-
-static void
-gtk_rc_parse_default_files (GtkRcContext *context)
-{
-  gint i;
-
-  gtk_rc_add_initial_default_files ();
-
-  for (i = 0; gtk_rc_default_files[i] != NULL; i++)
-    gtk_rc_context_parse_file (context, gtk_rc_default_files[i], GTK_PATH_PRIO_RC, FALSE);
-}
-
-void
-_gtk_rc_init (void)
-{
-  static gboolean initialized = FALSE;
-
-  if (!initialized)
-    {
-      initialized = TRUE;
-      
-      gtk_rc_add_initial_default_files ();
-    }
-  
-  /* Default RC string */
-  gtk_rc_parse_string ("style \"gtk-default-tooltips-style\" {\n"
-		       "  bg[NORMAL] = \"#eee1b3\"\n"
-		       "  fg[NORMAL] = \"#000000\"\n"
-		       "}\n"
-		       "\n"
-		       "style \"gtk-default-progress-bar-style\" {\n"
-		       "  bg[PRELIGHT] = \"#4b6983\"\n"
-		       "  fg[PRELIGHT] = \"#ffffff\"\n"
-		       "  bg[NORMAL]   = \"#c4c2bd\"\n"
-		       "}\n"
-		       "\n"
-		       "style \"gtk-default-entry-style\" {\n"
-		       "  bg[SELECTED] = \"#b7c3cd\"\n"
-		       "  fg[SELECTED] = \"#000000\"\n"
-		       "}\n"
-		       "\n"
-		       "style \"gtk-default-menu-bar-item-style\" {\n"
-		       "  GtkMenuItem::horizontal_padding = 5\n"
-		       "}\n"
-		       "\n"
-		       "style \"gtk-default-menu-item-style\" {\n"
-		       "  bg[PRELIGHT] = \"#4b6983\"\n"
-		       "  fg[PRELIGHT] = \"#ffffff\"\n"
-		       "  base[PRELIGHT] = \"#4b6983\"\n"
-		       "  text[PRELIGHT] = \"#ffffff\"\n"
-		       "}\n"
-		       "\n"
-		       "class \"GtkProgressBar\" style : gtk \"gtk-default-progress-bar-style\"\n"
-		       "class \"GtkEntry\" style : gtk \"gtk-default-entry-style\"\n"
-		       "widget \"gtk-tooltip*\" style : gtk \"gtk-default-tooltips-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"
-      );
-}
-  
-static void
-gtk_rc_context_parse_string (GtkRcContext *context,
-			     const gchar  *rc_string)
-{
-  gtk_rc_parse_any (context, "-", -1, rc_string);
-}
-
 void
 gtk_rc_parse_string (const gchar *rc_string)
 {
-}
-
-static GtkRcFile *
-add_to_rc_file_list (GSList     **rc_file_list,
-		     const char  *filename,
-		     gboolean     reload)
-{
-  GSList *tmp_list;
-  GtkRcFile *rc_file;
-  
-  tmp_list = *rc_file_list;
-  while (tmp_list)
-    {
-      rc_file = tmp_list->data;
-      if (!strcmp (rc_file->name, filename))
-	return rc_file;
-      
-      tmp_list = tmp_list->next;
-    }
-
-  rc_file = g_new (GtkRcFile, 1);
-  rc_file->is_string = FALSE;
-  rc_file->name = g_strdup (filename);
-  rc_file->canonical_name = NULL;
-  rc_file->directory = NULL;
-  rc_file->mtime = 0;
-  rc_file->reload = reload;
-  
-  *rc_file_list = g_slist_append (*rc_file_list, rc_file);
-  
-  return rc_file;
-}
-
-static void
-gtk_rc_context_parse_one_file (GtkRcContext *context,
-			       const gchar  *filename,
-			       gint          priority,
-			       gboolean      reload)
-{
-  GtkRcFile *rc_file;
-  struct stat statbuf;
-  gint saved_priority;
-
-  g_return_if_fail (filename != NULL);
-
-  saved_priority = context->default_priority;
-  context->default_priority = priority;
-
-  rc_file = add_to_rc_file_list (&context->rc_files, filename, reload);
-
-  if (!rc_file->canonical_name)
-    {
-      /* Get the absolute pathname */
-
-      if (g_path_is_absolute (rc_file->name))
-	rc_file->canonical_name = rc_file->name;
-      else
-	{
-	  gchar *cwd;
-
-	  cwd = g_get_current_dir ();
-	  rc_file->canonical_name = g_build_filename (cwd, rc_file->name, NULL);
-	  g_free (cwd);
-	}
-      
-      rc_file->directory = g_path_get_dirname (rc_file->canonical_name);
-    }
-
-  /* If the file is already being parsed (recursion), do nothing
-   */
-  if (g_slist_find (current_files_stack, rc_file))
-    return;
-
-  if (!g_lstat (rc_file->canonical_name, &statbuf))
-    {
-      gint fd;
-      
-      rc_file->mtime = statbuf.st_mtime;
-
-      fd = g_open (rc_file->canonical_name, O_RDONLY, 0);
-      if (fd < 0)
-	goto out;
-
-      /* Temporarily push information for this file on
-       * a stack of current files while parsing it.
-       */
-      current_files_stack = g_slist_prepend (current_files_stack, rc_file);
-      gtk_rc_parse_any (context, filename, fd, NULL);
-      current_files_stack = g_slist_delete_link (current_files_stack,
-						 current_files_stack);
-
-      close (fd);
-    }
-
- out:
-  context->default_priority = saved_priority;
-}
-
-static gchar *
-strchr_len (const gchar *str, gint len, char c)
-{
-  while (len--)
-    {
-      if (*str == c)
-	return (gchar *)str;
-
-      str++;
-    }
-
-  return NULL;
-}
-
-static void
-gtk_rc_context_parse_file (GtkRcContext *context,
-			   const gchar  *filename,
-			   gint          priority,
-			   gboolean      reload)
-{
-  gchar *locale_suffixes[2];
-  gint n_locale_suffixes = 0;
-  gchar *p;
-  gchar *locale;
-  gint length, j;
-  gboolean found = FALSE;
-
-  locale = _gtk_get_lc_ctype ();
-
-  if (strcmp (locale, "C") && strcmp (locale, "POSIX"))
-    {
-      /* Determine locale-specific suffixes for RC files.
-       */
-      length = strlen (locale);
-      
-      p = strchr (locale, '@');
-      if (p)
-	length = p - locale;
-
-      p = strchr_len (locale, length, '.');
-      if (p)
-	length = p - locale;
-      
-      locale_suffixes[n_locale_suffixes++] = g_strndup (locale, length);
-      
-      p = strchr_len (locale, length, '_');
-      if (p)
-	{
-	  length = p - locale;
-	  locale_suffixes[n_locale_suffixes++] = g_strndup (locale, length);
-	}
-    }
-
-  g_free (locale);
-  
-  gtk_rc_context_parse_one_file (context, filename, priority, reload);
-  for (j = 0; j < n_locale_suffixes; j++)
-    {
-      if (!found)
-	{
-	  gchar *name = g_strconcat (filename, ".", locale_suffixes[j], NULL);
-	  if (g_file_test (name, G_FILE_TEST_EXISTS))
-	    {
-	      gtk_rc_context_parse_one_file (context, name, priority, FALSE);
-	      found = TRUE;
-	    }
-	      
-	  g_free (name);
-	}
-      
-      g_free (locale_suffixes[j]);
-    }
+  g_return_if_fail (rc_string != NULL);
 }
 
 void
 gtk_rc_parse (const gchar *filename)
 {
+  g_return_if_fail (filename != NULL);
 }
 
 /* Handling of RC styles */
@@ -1206,85 +544,15 @@ gtk_rc_style_copy (GtkRcStyle *orig)
   style = GTK_RC_STYLE_GET_CLASS (orig)->create_rc_style (orig);
   GTK_RC_STYLE_GET_CLASS (style)->merge (style, orig);
 
-  gtk_rc_style_copy_icons_and_colors (style, orig, NULL);
-
   return style;
 }
 
-void
-_gtk_rc_style_set_rc_property (GtkRcStyle *rc_style,
-			       GtkRcProperty *property)
-{
-  g_return_if_fail (GTK_IS_RC_STYLE (rc_style));
-  g_return_if_fail (property != NULL);
-
-  insert_rc_property (rc_style, property, TRUE);
-}
-
-void
-_gtk_rc_style_unset_rc_property (GtkRcStyle *rc_style,
-				 GQuark      type_name,
-				 GQuark      property_name)
-{
-  GtkRcProperty *node;
-
-  g_return_if_fail (GTK_IS_RC_STYLE (rc_style));
-
-  node = (GtkRcProperty *) _gtk_rc_style_lookup_rc_property (rc_style,
-                                                             type_name,
-                                                             property_name);
-
-  if (node != NULL)
-    {
-      guint index = node - (GtkRcProperty *) rc_style->rc_properties->data;
-      g_value_unset (&node->value);
-      g_free (node->origin);
-      g_array_remove_index (rc_style->rc_properties, index);
-    }
-}
-
 static GtkRcStyle *
 gtk_rc_style_real_create_rc_style (GtkRcStyle *style)
 {
   return g_object_new (G_OBJECT_TYPE (style), NULL);
 }
 
-GSList *
-_gtk_rc_style_get_color_hashes (GtkRcStyle *rc_style)
-{
-  GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style);
-
-  return priv->color_hashes;
-}
-
-static void gtk_rc_style_prepend_empty_color_hash (GtkRcStyle *rc_style);
-
-void
-_gtk_rc_style_set_symbolic_color (GtkRcStyle     *rc_style,
-                                  const gchar    *name,
-                                  const GdkColor *color)
-{
-  GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style);
-  GHashTable *our_hash = NULL;
-
-  if (priv->color_hashes)
-    our_hash = priv->color_hashes->data;
-
-  if (our_hash == NULL)
-    {
-      if (color == NULL)
-        return;
-
-      gtk_rc_style_prepend_empty_color_hash (rc_style);
-      our_hash = priv->color_hashes->data;
-    }
-
-  if (color)
-    g_hash_table_insert (our_hash, g_strdup (name), gdk_color_copy (color));
-  else
-    g_hash_table_remove (our_hash, name);
-}
-
 static gint
 gtk_rc_properties_cmp (gconstpointer bsearch_node1,
 		       gconstpointer bsearch_node2)
@@ -1417,195 +685,6 @@ gtk_rc_style_real_create_style (GtkRcStyle *rc_style)
   return gtk_style_new ();
 }
 
-static void
-gtk_rc_style_prepend_empty_icon_factory (GtkRcStyle *rc_style)
-{
-  GtkIconFactory *factory = gtk_icon_factory_new ();
-
-  rc_style->icon_factories = g_slist_prepend (rc_style->icon_factories, factory);
-}
-
-static void
-gtk_rc_style_prepend_empty_color_hash (GtkRcStyle *rc_style)
-{
-  GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style);
-  GHashTable        *hash = g_hash_table_new_full (g_str_hash, g_str_equal,
-                                                   g_free,
-                                                   (GDestroyNotify) gdk_color_free);
-
-  priv->color_hashes = g_slist_prepend (priv->color_hashes, hash);
-}
-
-static void
-gtk_rc_style_append_icon_factories (GtkRcStyle *rc_style,
-                                    GtkRcStyle *src_style)
-{
-  GSList *concat = g_slist_copy (src_style->icon_factories);
-
-  g_slist_foreach (concat, (GFunc) g_object_ref, NULL);
-
-  rc_style->icon_factories = g_slist_concat (rc_style->icon_factories, concat);
-}
-
-static void
-gtk_rc_style_append_color_hashes (GtkRcStyle *rc_style,
-                                  GtkRcStyle *src_style)
-{
-  GtkRcStylePrivate *priv     = GTK_RC_STYLE_GET_PRIVATE (rc_style);
-  GtkRcStylePrivate *src_priv = GTK_RC_STYLE_GET_PRIVATE (src_style);
-  GSList            *concat   = g_slist_copy (src_priv->color_hashes);
-
-  g_slist_foreach (concat, (GFunc) g_hash_table_ref, NULL);
-
-  priv->color_hashes = g_slist_concat (priv->color_hashes, concat);
-}
-
-static void
-gtk_rc_style_copy_icons_and_colors (GtkRcStyle   *rc_style,
-                                    GtkRcStyle   *src_style,
-                                    GtkRcContext *context)
-{
-  GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style);
-
-  if (src_style)
-    {
-      GtkRcStylePrivate *src_priv = GTK_RC_STYLE_GET_PRIVATE (src_style);
-
-      /* Append src_style's factories, adding a ref to them */
-      if (src_style->icon_factories != NULL)
-        {
-          /* Add a factory for ourselves if we have none,
-           * in case we end up defining more stock icons.
-           * I see no real way around this; we need to maintain
-           * the invariant that the first factory in the list
-           * is always our_factory, the one belonging to us,
-           * and if we put src_style factories in the list we can't
-           * do that if the style is reopened.
-           */
-          if (rc_style->icon_factories == NULL)
-            gtk_rc_style_prepend_empty_icon_factory (rc_style);
-
-          gtk_rc_style_append_icon_factories (rc_style, src_style);
-        }
-
-      /* Also append src_style's color hashes, adding a ref to them */
-      if (src_priv->color_hashes != NULL)
-        {
-          /* See comment above .. */
-          if (priv->color_hashes == NULL)
-            gtk_rc_style_prepend_empty_color_hash (rc_style);
-
-          gtk_rc_style_append_color_hashes (rc_style, src_style);
-        }
-    }
-
-  /*  if we didn't get color hashes from the src_style, initialize
-   *  the list with the settings' color scheme (if it exists)
-   */
-  if (priv->color_hashes == NULL && context && context->color_hash != NULL)
-    {
-      gtk_rc_style_prepend_empty_color_hash (rc_style);
-
-      priv->color_hashes = g_slist_append (priv->color_hashes,
-                                           g_hash_table_ref (context->color_hash));
-    }
-}
-
-static void
-gtk_rc_clear_hash_node (gpointer key, 
-			gpointer data, 
-			gpointer user_data)
-{
-  g_object_unref (data);
-}
-
-static void
-gtk_rc_free_rc_sets (GSList *slist)
-{
-  while (slist)
-    {
-      GtkRcSet *rc_set;
-
-      rc_set = slist->data;
-      gtk_rc_set_free (rc_set);
-
-      slist = slist->next;
-    }
-}
-
-static void
-gtk_rc_clear_styles (GtkRcContext *context)
-{
-  /* Clear out all old rc_styles */
-
-  if (context->rc_style_ht)
-    {
-      g_hash_table_foreach (context->rc_style_ht, gtk_rc_clear_hash_node, NULL);
-      g_hash_table_destroy (context->rc_style_ht);
-      context->rc_style_ht = NULL;
-    }
-
-  gtk_rc_free_rc_sets (context->rc_sets_widget);
-  g_slist_free (context->rc_sets_widget);
-  context->rc_sets_widget = NULL;
-
-  gtk_rc_free_rc_sets (context->rc_sets_widget_class);
-  g_slist_free (context->rc_sets_widget_class);
-  context->rc_sets_widget_class = NULL;
-
-  gtk_rc_free_rc_sets (context->rc_sets_class);
-  g_slist_free (context->rc_sets_class);
-  context->rc_sets_class = NULL;
-}
-
-/* Reset all our widgets. Also, we have to invalidate cached icons in
- * icon sets so they get re-rendered.
- */
-static void
-gtk_rc_reset_widgets (GtkSettings *settings)
-{
-  GList *list, *toplevels;
-
-  _gtk_icon_set_invalidate_caches ();
-  
-  toplevels = gtk_window_list_toplevels ();
-  g_list_foreach (toplevels, (GFunc)g_object_ref, NULL);
-  
-  for (list = toplevels; list; list = list->next)
-    {
-      if (gtk_widget_get_screen (list->data) == settings->screen)
-	{
-	  gtk_widget_reset_rc_styles (list->data);
-	}
-
-      g_object_unref (list->data);
-    }
-  g_list_free (toplevels);
-}
-
-static void
-gtk_rc_clear_realized_style (gpointer key,
-			     gpointer value,
-			     gpointer data)
-{
-  GSList *rc_styles = key;
-  GtkStyle *style = value;
-  GSList *tmp_list = rc_styles;
-
-  g_object_unref (style);
- 
-  while (tmp_list)
-    {
-      GtkRcStyle *rc_style = tmp_list->data;
-      
-      rc_style->rc_style_lists = g_slist_remove_all (rc_style->rc_style_lists,
-						     rc_styles);
-      tmp_list = tmp_list->next;
-    }
-
-  g_slist_free (rc_styles);
-}
-
 /**
  * gtk_rc_reset_styles:
  * @settings: a #GtkSettings
@@ -1626,59 +705,7 @@ gtk_rc_clear_realized_style (gpointer key,
 void
 gtk_rc_reset_styles (GtkSettings *settings)
 {
-  GtkRcContext *context;
-  gboolean reset = FALSE;
-
-  g_return_if_fail (GTK_IS_SETTINGS (settings));
-
-  context = gtk_rc_context_get (settings);
-  
-  if (context->default_style)
-    {
-      g_object_unref (context->default_style);
-      context->default_style = NULL;
-      reset = TRUE;
-    }
-  
-  /* Clear out styles that have been looked up already
-   */
-  if (realized_style_ht)
-    {
-      g_hash_table_foreach (realized_style_ht, gtk_rc_clear_realized_style, NULL);
-      g_hash_table_destroy (realized_style_ht);
-      realized_style_ht = NULL;
-      reset = TRUE;
-    }
-  
-  if (reset)
-    gtk_rc_reset_widgets (settings);
-}
-
-const gchar*
-_gtk_rc_context_get_default_font_name (GtkSettings *settings)
-{
-  GtkRcContext *context;
-  gchar *new_font_name;
-  
-  g_return_val_if_fail (GTK_IS_SETTINGS (settings), NULL);
-
-  context = gtk_rc_context_get (settings);
-
-  g_object_get (context->settings,
-                "gtk-font-name", &new_font_name,
-                NULL);
-
-  if (new_font_name != context->font_name && !(new_font_name && strcmp (context->font_name, new_font_name) == 0))
-    {
-       g_free (context->font_name);
-       context->font_name = g_strdup (new_font_name);
- 
-       gtk_rc_reset_styles (settings);
-    }
-          
-  g_free (new_font_name);
-
-  return context->font_name;
+  gtk_style_context_reset_widgets (_gtk_settings_get_screen (settings));
 }
 
 /**
@@ -1696,97 +723,7 @@ gboolean
 gtk_rc_reparse_all_for_settings (GtkSettings *settings,
 				 gboolean     force_load)
 {
-  gboolean mtime_modified = FALSE;
-  GtkRcFile *rc_file;
-  GSList *tmp_list;
-  GtkRcContext *context;
-  struct stat statbuf;
-
-  g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE);
-
-  context = gtk_rc_context_get (settings);
-
-  if (context->reloading)
-    return FALSE;
-
-  if (!force_load)
-    {
-      /* Check through and see if any of the RC's have had their
-       * mtime modified. If so, reparse everything.
-       */
-      tmp_list = context->rc_files;
-      while (tmp_list)
-	{
-	  rc_file = tmp_list->data;
-
-	  if (!rc_file->is_string)
-	    {
-	      if (!g_lstat (rc_file->name, &statbuf) && 
-		  (statbuf.st_mtime != rc_file->mtime))
-		{
-		  mtime_modified = TRUE;
-		  break;
-		}
-	    }
-	  
-	  tmp_list = tmp_list->next;
-	}
-    }
-      
-  if (force_load || mtime_modified)
-    {
-      _gtk_binding_reset_parsed ();
-      gtk_rc_clear_styles (context);
-      context->reloading = TRUE;
-
-      _gtk_settings_reset_rc_values (context->settings);
-      gtk_rc_clear_rc_files (context);
-
-      gtk_rc_parse_default_files (context);
-
-      tmp_list = global_rc_files;
-      while (tmp_list)
-	{
-	  rc_file = tmp_list->data;
-
-	  if (rc_file->is_string)
-	    gtk_rc_context_parse_string (context, rc_file->name);
-	  else
-	    gtk_rc_context_parse_file (context, rc_file->name, GTK_PATH_PRIO_RC, FALSE);
-
-	  tmp_list = tmp_list->next;
-	}
-
-      g_free (context->theme_name);
-      g_free (context->key_theme_name);
-
-      g_object_get (context->settings,
-		    "gtk-theme-name", &context->theme_name,
-		    "gtk-key-theme-name", &context->key_theme_name,
-		    "gtk-application-prefer-dark-theme", &context->prefer_dark_theme,
-		    NULL);
-
-      if (context->theme_name && context->theme_name[0])
-        {
-          if (context->prefer_dark_theme)
-            {
-              if (!gtk_rc_parse_named (context, context->theme_name, NULL, "-dark"))
-                gtk_rc_parse_named (context, context->theme_name, NULL, NULL);
-	    }
-	  else
-	    {
-	      gtk_rc_parse_named (context, context->theme_name, NULL, NULL);
-	    }
-	}
-      if (context->key_theme_name && context->key_theme_name[0])
-	gtk_rc_parse_named (context, context->key_theme_name, "key", NULL);
-
-      context->reloading = FALSE;
-
-      gtk_rc_reset_widgets (context->settings);
-    }
-
-  return force_load || mtime_modified;
+  return FALSE;
 }
 
 /**
@@ -1801,89 +738,7 @@ gtk_rc_reparse_all_for_settings (GtkSettings *settings,
 gboolean
 gtk_rc_reparse_all (void)
 {
-  GSList *tmp_list;
-  gboolean result = FALSE;
-
-  for (tmp_list = rc_contexts; tmp_list; tmp_list = tmp_list->next)
-    {
-      GtkRcContext *context = tmp_list->data;
-      if (gtk_rc_reparse_all_for_settings (context->settings, FALSE))
-	result = TRUE;
-    }
-
-  return result;
-}
-
-static GSList *
-gtk_rc_styles_match (GSList       *rc_styles,
-		     GSList	  *sets,
-		     guint         path_length,
-		     gchar        *path,
-		     gchar        *path_reversed)
-		     
-{
-  GtkRcSet *rc_set;
-
-  while (sets)
-    {
-      rc_set = sets->data;
-      sets = sets->next;
-
-      if (rc_set->type == GTK_PATH_WIDGET_CLASS)
-        {
-          if (_gtk_rc_match_widget_class (rc_set->path, path_length, path, path_reversed))
-	    rc_styles = g_slist_append (rc_styles, rc_set);
-        }
-      else
-        {
-          if (g_pattern_match (rc_set->pspec, path_length, path, path_reversed))
-	    rc_styles = g_slist_append (rc_styles, rc_set);
-	}
-    }
-
-  return rc_styles;
-}
-
-static gint
-rc_set_compare (gconstpointer a, gconstpointer b)
-{
-  const GtkRcSet *set_a = a;
-  const GtkRcSet *set_b = b;
-
-  return (set_a->priority < set_b->priority) ? 1 : (set_a->priority == set_b->priority ? 0 : -1);
-}
-
-static GSList *
-sort_and_dereference_sets (GSList *styles)
-{
-  GSList *tmp_list;
-  
-  /* At this point, the list of sets is ordered by:
-   *
-   * a) 'widget' patterns are earlier than 'widget_class' patterns
-   *    which are ealier than 'class' patterns.
-   * a) For two matches for class patterns, a match to a child type
-   *    is before a match to a parent type
-   * c) a match later in the RC file (or in a later RC file) is before a
-   *    match earlier in the RC file.
-   *
-   * With a) taking precedence over b) which takes precendence over c).
-   *
-   * Now sort by priority, which has the highest precendence for sort order
-   */
-  styles = g_slist_sort (styles, rc_set_compare);
-
-  /* Make styles->data = styles->data->rc_style
-   */
-  tmp_list = styles;
-  while (tmp_list)
-    {
-      GtkRcSet *set = tmp_list->data;
-      tmp_list->data = set->rc_style;
-      tmp_list = tmp_list->next;
-    }
-
-  return styles;
+  return FALSE;
 }
 
 /**
@@ -1906,87 +761,11 @@ sort_and_dereference_sets (GSList *styles)
 GtkStyle *
 gtk_rc_get_style (GtkWidget *widget)
 {
-  GtkRcStyle *widget_rc_style;
-  GSList *rc_styles = NULL;
-  GtkRcContext *context;
-
-  static guint rc_style_key_id = 0;
-
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
 
-  context = gtk_rc_context_get (gtk_widget_get_settings (widget));
-
-  /* We allow the specification of a single rc style to be bound
-   * tightly to a widget, for application modifications
-   */
-  if (!rc_style_key_id)
-    rc_style_key_id = g_quark_from_static_string ("gtk-rc-style");
-
-  if (context->rc_sets_widget)
-    {
-      gchar *path, *path_reversed;
-      guint path_length;
+  gtk_widget_ensure_style (widget);
 
-      gtk_widget_path (widget, &path_length, &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 (context->rc_sets_widget_class)
-    {
-      gchar *path, *path_reversed;
-      guint path_length;
-
-      gtk_widget_class_path (widget, &path_length, &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);
-    }
-
-  if (context->rc_sets_class)
-    {
-      GType type;
-
-      type = G_TYPE_FROM_INSTANCE (widget);
-      while (type)
-	{
-	  gchar *path;
-          gchar *path_reversed;
-	  guint path_length;
-
-	  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);
-	}
-    }
-  
-  rc_styles = sort_and_dereference_sets (rc_styles);
-  
-  widget_rc_style = g_object_get_qdata (G_OBJECT (widget), rc_style_key_id);
-
-  if (widget_rc_style)
-    rc_styles = g_slist_prepend (rc_styles, widget_rc_style);
-
-  if (rc_styles)
-    return gtk_rc_init_style (context, rc_styles);
-  else
-    {
-      if (!context->default_style)
-	{
-	  context->default_style = gtk_style_new ();
-	  _gtk_style_init_for_settings (context->default_style, context->settings);
-	}
-
-      return context->default_style;
-    }
+  return gtk_widget_get_style (widget);
 }
 
 /**
@@ -2028,75 +807,6 @@ gtk_rc_get_style_by_paths (GtkSettings *settings,
 			   const char  *class_path,
 			   GType        type)
 {
-  /* We duplicate the code from above to avoid slowing down the above
-   * by generating paths when we don't need them. I don't know if
-   * this is really worth it.
-   */
-  GSList *rc_styles = NULL;
-  GtkRcContext *context;
-
-  g_return_val_if_fail (GTK_IS_SETTINGS (settings), NULL);
-
-  context = gtk_rc_context_get (settings);
-
-  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, 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, path, path_reversed);
-      g_free (path);
-      g_free (path_reversed);
-    }
-
-  if (type != G_TYPE_NONE && context->rc_sets_class)
-    {
-      while (type)
-	{
-	  gchar *path;
-          gchar *path_reversed;
-	  guint path_length;
-
-	  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);
-	}
-    }
- 
-  rc_styles = sort_and_dereference_sets (rc_styles);
-  
-  if (rc_styles)
-    return gtk_rc_init_style (context, rc_styles);
-
   return NULL;
 }
 
@@ -2111,144 +821,6 @@ gtk_rc_scanner_new (void)
   return g_scanner_new (&gtk_rc_scanner_config);
 }
 
-static void
-gtk_rc_parse_any (GtkRcContext *context,
-		  const gchar  *input_name,
-		  gint		input_fd,
-		  const gchar  *input_string)
-{
-}
-
-static guint	   
-gtk_rc_styles_hash (const GSList *rc_styles)
-{
-  guint result;
-  
-  result = 0;
-  while (rc_styles)
-    {
-      result += (result << 9) + GPOINTER_TO_UINT (rc_styles->data);
-      rc_styles = rc_styles->next;
-    }
-  
-  return result;
-}
-
-static gboolean
-gtk_rc_styles_equal (const GSList *a,
-		     const GSList *b)
-{
-  while (a && b)
-    {
-      if (a->data != b->data)
-	return FALSE;
-      a = a->next;
-      b = b->next;
-    }
-  
-  return (a == b);
-}
-
-static GtkStyle *
-gtk_rc_style_to_style (GtkRcContext *context,
-		       GtkRcStyle   *rc_style)
-{
-  GtkStyle *style;
-
-  style = GTK_RC_STYLE_GET_CLASS (rc_style)->create_style (rc_style);
-  _gtk_style_init_for_settings (style, context->settings);
-
-  style->rc_style = g_object_ref (rc_style);
-  
-  GTK_STYLE_GET_CLASS (style)->init_from_rc (style, rc_style);  
-
-  return style;
-}
-
-/* Reuses or frees rc_styles */
-static GtkStyle *
-gtk_rc_init_style (GtkRcContext *context,
-		   GSList       *rc_styles)
-{
-  GtkStyle *style = NULL;
-  gint i;
-
-  g_return_val_if_fail (rc_styles != NULL, NULL);
-  
-  if (!realized_style_ht)
-    realized_style_ht = g_hash_table_new ((GHashFunc) gtk_rc_styles_hash,
- (GEqualFunc) gtk_rc_styles_equal);
-
-  style = g_hash_table_lookup (realized_style_ht, rc_styles);
-
-  if (!style)
-    {
-      GtkRcStyle *base_style = NULL;
-      GtkRcStyle *proto_style;
-      GtkRcStyleClass *proto_style_class;
-      GSList *tmp_styles;
-      GType rc_style_type = GTK_TYPE_RC_STYLE;
-
-      /* Find the first style where the RC file specified engine "" {}
-       * or the first derived style and use that to create the
-       * merged style. If we only have raw GtkRcStyles, use the first
-       * style to create the merged style.
-       */
-      base_style = rc_styles->data;
-      tmp_styles = rc_styles;
-      while (tmp_styles)
-	{
-	  GtkRcStyle *rc_style = tmp_styles->data;
-          
-	  if (rc_style->engine_specified ||
-	      G_OBJECT_TYPE (rc_style) != rc_style_type)
-	    {
-	      base_style = rc_style;
-	      break;
-	    }
-          
-	  tmp_styles = tmp_styles->next;
-	}
-      
-      proto_style_class = GTK_RC_STYLE_GET_CLASS (base_style);
-      proto_style = proto_style_class->create_rc_style (base_style);
-
-      tmp_styles = rc_styles;
-      while (tmp_styles)
-	{
-	  GtkRcStyle *rc_style = tmp_styles->data;
-
-	  proto_style_class->merge (proto_style, rc_style);	  
-          
-	  /* Point from each rc_style to the list of styles */
-	  if (!g_slist_find (rc_style->rc_style_lists, rc_styles))
-	    rc_style->rc_style_lists = g_slist_prepend (rc_style->rc_style_lists, rc_styles);
-
-          gtk_rc_style_append_icon_factories (proto_style, rc_style);
-          gtk_rc_style_append_color_hashes (proto_style, rc_style);
-
-	  tmp_styles = tmp_styles->next;
-	}
-
-      for (i = 0; i < 5; i++)
-	if (proto_style->bg_pixmap_name[i] &&
-	    (strcmp (proto_style->bg_pixmap_name[i], "<none>") == 0))
-	  {
-	    g_free (proto_style->bg_pixmap_name[i]);
-	    proto_style->bg_pixmap_name[i] = NULL;
-	  }
-
-      style = gtk_rc_style_to_style (context, proto_style);
-      g_object_unref (proto_style);
-
-      g_hash_table_insert (realized_style_ht, rc_styles, style);
-    }
-  else
-    g_slist_free (rc_styles);
-
-  return style;
-}
-
 /*********************
  * Parsing functions *
  *********************/
@@ -2278,46 +850,6 @@ lookup_color (GtkRcStyle *style,
   return FALSE;
 }
 
-const GtkRcProperty*
-_gtk_rc_style_lookup_rc_property (GtkRcStyle *rc_style,
-				  GQuark      type_name,
-				  GQuark      property_name)
-{
-  GtkRcProperty *node = NULL;
-
-  g_return_val_if_fail (GTK_IS_RC_STYLE (rc_style), NULL);
-
-  if (rc_style->rc_properties)
-    {
-      GtkRcProperty key;
-
-      key.type_name = type_name;
-      key.property_name = property_name;
-
-      node = bsearch (&key,
-		      rc_style->rc_properties->data, rc_style->rc_properties->len,
-		      sizeof (GtkRcProperty), gtk_rc_properties_cmp);
-    }
-
-  return node;
-}
-
-static gchar*
-gtk_rc_check_pixmap_dir (const gchar *dir, 
-			 const gchar *pixmap_file)
-{
-  gchar *buf;
-
-  buf = g_build_filename (dir, pixmap_file, NULL);
-
-  if (g_file_test (buf, G_FILE_TEST_EXISTS))
-    return buf;
-   
-  g_free (buf);
- 
-   return NULL;
- }
-
 /**
  * gtk_rc_find_pixmap_in_path:
  * @settings: a #GtkSettings
@@ -2336,39 +868,8 @@ gtk_rc_find_pixmap_in_path (GtkSettings  *settings,
 			    GScanner     *scanner,
 			    const gchar  *pixmap_file)
 {
-  gint i;
-  gchar *filename;
-  GSList *tmp_list;
-
-  GtkRcContext *context = gtk_rc_context_get (settings);
-    
-  if (context->pixmap_path)
-    for (i = 0; context->pixmap_path[i] != NULL; i++)
-      {
-	filename = gtk_rc_check_pixmap_dir (context->pixmap_path[i], pixmap_file);
-	if (filename)
-	  return filename;
-      }
-  
-  tmp_list = current_files_stack;
-  while (tmp_list)
-    {
-      GtkRcFile *curfile = tmp_list->data;
-      filename = gtk_rc_check_pixmap_dir (curfile->directory, pixmap_file);
-      if (filename)
- 	return filename;
-       
-      tmp_list = tmp_list->next;
-    }
-  
-  if (scanner)
-    g_scanner_warn (scanner, 
-                    _("Unable to locate image file in pixmap_path: \"%s\""),
-                    pixmap_file);
-  else
-    g_warning (_("Unable to locate image file in pixmap_path: \"%s\""),
-	       pixmap_file);
-    
+  g_warning (_("Unable to locate image file in pixmap_path: \"%s\""),
+             pixmap_file);
   return NULL;
 }
 
@@ -2740,282 +1241,3 @@ gtk_rc_parse_color_full (GScanner   *scanner,
       return G_TOKEN_STRING;
     }
 }
-
-GSList *
-_gtk_rc_parse_widget_class_path (const gchar *pattern)
-{
-  GSList *result;
-  PathElt *path_elt;
-  const gchar *current;
-  const gchar *class_start;
-  const gchar *class_end;
-  const gchar *pattern_end;
-  const gchar *pattern_start;
-  gchar *sub_pattern;
-
-  result = NULL;
-  current = 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] == '.')))
-        {
-          pattern_end = class_start - 1;
-          pattern_start = current;
-          
-          path_elt = g_new (PathElt, 1);
-          
-          sub_pattern = g_strndup (pattern_start, pattern_end - pattern_start + 1);
-	  path_elt->type = PATH_ELT_PSPEC;
-          path_elt->elt.pspec = g_pattern_spec_new (sub_pattern);
-          g_free (sub_pattern);
-          
-          result = g_slist_prepend (result, path_elt);
-        }
-      
-      path_elt = g_new (PathElt, 1);
-      
-      /* The < > need to be removed from the string. */
-      sub_pattern = g_strndup (class_start + 1, class_end - class_start - 1);
-      
-      path_elt->type = PATH_ELT_UNRESOLVED;
-      path_elt->elt.class_name = sub_pattern;
-      
-      result = g_slist_prepend (result, path_elt);
-      
-      current = class_end + 1;
-    }
-  
-  /* Add the rest, if anything is left */
-  if (strlen (current) > 0)
-    {
-      path_elt = g_new (PathElt, 1);
-      path_elt->type = PATH_ELT_PSPEC;
-      path_elt->elt.pspec = g_pattern_spec_new (current);
-      
-      result = g_slist_prepend (result, path_elt);
-    }
-  
-  return g_slist_reverse (result);
-}
-
-static void
-free_path_elt (gpointer data, 
-	       gpointer user_data)
-{
-  PathElt *path_elt = data;
-
-  switch (path_elt->type)
-    {
-    case PATH_ELT_PSPEC:
-      g_pattern_spec_free (path_elt->elt.pspec);
-      break;
-    case PATH_ELT_UNRESOLVED:
-      g_free (path_elt->elt.class_name);
-      break;
-    case PATH_ELT_TYPE:
-      break;
-    default:
-      g_assert_not_reached ();
-    }
-
-  g_free (path_elt);
-}
-
-void
-_gtk_rc_free_widget_class_path (GSList *list)
-{
-  g_slist_foreach (list, free_path_elt, NULL);
-  g_slist_free (list);
-}
-
-static void
-gtk_rc_set_free (GtkRcSet *rc_set)
-{
-  if (rc_set->pspec)
-    g_pattern_spec_free (rc_set->pspec);
-
-  _gtk_rc_free_widget_class_path (rc_set->path);
-  
-  g_free (rc_set);
-}
-
-static gboolean
-match_class (PathElt *path_elt, 
-	     gchar   *type_name)
-{
-  GType type;
-  
-  if (path_elt->type == PATH_ELT_UNRESOLVED)
-    {
-      type = g_type_from_name (path_elt->elt.class_name);
-      if (type != G_TYPE_INVALID)
-        {
-          g_free (path_elt->elt.class_name);
-          path_elt->elt.class_type = type;
-	  path_elt->type = PATH_ELT_TYPE;
-        }
-      else
-	return g_str_equal (type_name, path_elt->elt.class_name);
-    }
-  
-  return g_type_is_a (g_type_from_name (type_name), path_elt->elt.class_type);
-}
-
-static gboolean
-match_widget_class_recursive (GSList *list, 
-			      guint   length, 
-			      gchar  *path, 
-			      gchar  *path_reversed)
-{
-  PathElt *path_elt;
-  
-  /* 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 */
-  
-  path_elt = list->data;
-
-  if (path_elt->type != PATH_ELT_PSPEC)
-    {
-      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 (path_elt, class_start))
-            return FALSE;
-	  else
-	    return match_widget_class_recursive (list->next, 0, "", "");
-        }
-      else
-        {
-          class_end[0] = '\0';
-          if (!match_class (path_elt, 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 (list->next, new_length, class_end, path_reversed);
-              path_reversed[new_length] = old_char;
-              
-              return result;
-            }
-        }
-    }
-  else
-    {
-      PathElt *class_elt;
-      gchar *class_start;
-      gchar *class_end;
-      gboolean result = FALSE;
-      
-      /* If there is nothing after this (ie. no class match), 
-       * just compare the pspec. 
-       */
-      if (list->next == NULL)
-        return g_pattern_match (path_elt->elt.pspec, length, path, path_reversed);
-      
-      class_elt = (PathElt *)list->next->data;
-      g_assert (class_elt->type != PATH_ELT_PSPEC);
-      
-      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_elt, class_start);
-	    }
-          else
-            {
-              class_end[0] = '\0';
-              result = match_class (class_elt, 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 (path_elt->elt.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 (list->next->next, new_length, class_end, path_reversed);
-                      
-                      path_reversed[new_length] = path_reversed_char;
-                    }
-                  else
-                    result = match_widget_class_recursive (list->next->next, 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  *list,
-                            gint     length,
-                            gchar   *path,
-                            gchar   *path_reversed)
-{
-  return match_widget_class_recursive (list, length, path, path_reversed);
-}
diff --git a/gtk/gtkrc.h b/gtk/gtkrc.h
index 65635ee..dc3abe7 100644
--- a/gtk/gtkrc.h
+++ b/gtk/gtkrc.h
@@ -123,7 +123,6 @@ struct _GtkRcStyleClass
   void (*_gtk_reserved4) (void);
 };
 
-void	  _gtk_rc_init			 (void);
 GSList*   _gtk_rc_parse_widget_class_path (const gchar *pattern);
 void      _gtk_rc_free_widget_class_path (GSList       *list);
 gboolean  _gtk_rc_match_widget_class     (GSList       *list,
@@ -234,23 +233,6 @@ struct _GtkRcProperty
   gchar *origin;
   GValue value;
 };
-const GtkRcProperty* _gtk_rc_style_lookup_rc_property (GtkRcStyle *rc_style,
-						       GQuark      type_name,
-						       GQuark      property_name);
-void	      _gtk_rc_style_set_rc_property	      (GtkRcStyle *rc_style,
-						       GtkRcProperty *property);
-void	      _gtk_rc_style_unset_rc_property	      (GtkRcStyle *rc_style,
-						       GQuark      type_name,
-						       GQuark      property_name);
-
-GSList     * _gtk_rc_style_get_color_hashes        (GtkRcStyle *rc_style);
-
-void         _gtk_rc_style_set_symbolic_color       (GtkRcStyle     *rc_style,
-                                                     const gchar    *name,
-                                                     const GdkColor *color);
-
-const gchar* _gtk_rc_context_get_default_font_name (GtkSettings *settings);
-void         _gtk_rc_context_destroy               (GtkSettings *settings);
 
 G_END_DECLS
 
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index f84bc9b..2e0f7d6 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -1334,8 +1334,6 @@ gtk_settings_finalize (GObject *object)
 
   object_list = g_slist_remove (object_list, settings);
 
-  _gtk_rc_context_destroy (settings);
-
   for (i = 0; i < class_n_properties; i++)
     g_value_unset (&settings->property_values[i].value);
   g_free (settings->property_values);
diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c
index 87f72be..419b098 100644
--- a/gtk/gtkstyle.c
+++ b/gtk/gtkstyle.c
@@ -82,7 +82,6 @@ typedef struct {
 typedef struct _GtkStylePrivate GtkStylePrivate;
 
 struct _GtkStylePrivate {
-  GSList *color_hashes;
   GtkStyleContext *context;
   gulong context_changed_id;
 };
@@ -104,8 +103,6 @@ static void      gtk_style_get_property         (GObject        *object,
                                                  GValue         *value,
                                                  GParamSpec     *pspec);
 
-static void	 gtk_style_realize		(GtkStyle	*style,
-						 GdkVisual      *visual);
 static void      gtk_style_real_realize        (GtkStyle	*style);
 static void      gtk_style_real_unrealize      (GtkStyle	*style);
 static void      gtk_style_real_copy           (GtkStyle	*style,
@@ -334,8 +331,6 @@ static void hls_to_rgb			(gdouble	 *h,
 					 gdouble	 *l,
 					 gdouble	 *s);
 
-static void style_unrealize_cursors     (GtkStyle *style);
-
 static void transform_detail_string (const gchar     *detail,
                                      GtkStyleContext *context);
 
@@ -378,54 +373,13 @@ G_DEFINE_TYPE (GtkStyle, gtk_style, G_TYPE_OBJECT)
 
 /* --- functions --- */
 
-/**
- * _gtk_style_init_for_settings:
- * @style: a #GtkStyle
- * @settings: a #GtkSettings
- * 
- * Initializes the font description in @style according to the default
- * font name of @settings. This is called for gtk_style_new() with
- * the settings for the default screen (if any); if we are creating
- * a style for a particular screen, we then call it again in a
- * location where we know the correct settings.
- * The reason for this is that gtk_rc_style_create_style() doesn't
- * take the screen for an argument.
- **/
-void
-_gtk_style_init_for_settings (GtkStyle    *style,
-			      GtkSettings *settings)
-{
-  const gchar *font_name = _gtk_rc_context_get_default_font_name (settings);
-
-  if (style->font_desc)
-    pango_font_description_free (style->font_desc);
-  
-  style->font_desc = pango_font_description_from_string (font_name);
-      
-  if (!pango_font_description_get_family (style->font_desc))
-    {
-      g_warning ("Default font does not have a family set");
-      pango_font_description_set_family (style->font_desc, "Sans");
-    }
-  if (pango_font_description_get_size (style->font_desc) <= 0)
-    {
-      g_warning ("Default font does not have a positive size");
-      pango_font_description_set_size (style->font_desc, 10 * PANGO_SCALE);
-    }
-}
-
 static void
 gtk_style_init (GtkStyle *style)
 {
   gint i;
-  
-  GtkSettings *settings = gtk_settings_get_default ();
-  
-  if (settings)
-    _gtk_style_init_for_settings (style, settings);
-  else
-    style->font_desc = pango_font_description_from_string ("Sans 10");
-  
+
+  style->font_desc = pango_font_description_from_string ("Sans 10");
+
   style->attach_count = 0;
   
   style->black.red = 0;
@@ -557,25 +511,6 @@ gtk_style_class_init (GtkStyleClass *klass)
 }
 
 static void
-clear_property_cache (GtkStyle *style)
-{
-  if (style->property_cache)
-    {
-      guint i;
-
-      for (i = 0; i < style->property_cache->len; i++)
-	{
-	  PropertyValue *node = &g_array_index (style->property_cache, PropertyValue, i);
-
-	  g_param_spec_unref (node->pspec);
-	  g_value_unset (&node->value);
-	}
-      g_array_free (style->property_cache, TRUE);
-      style->property_cache = NULL;
-    }
-}
-
-static void
 gtk_style_finalize (GObject *object)
 {
   GtkStyle *style = GTK_STYLE (object);
@@ -583,8 +518,6 @@ gtk_style_finalize (GObject *object)
 
   g_return_if_fail (style->attach_count == 0);
 
-  clear_property_cache (style);
-  
   /* All the styles in the list have the same 
    * style->styles pointer. If we delete the 
    * *first* style from the list, we need to update
@@ -612,9 +545,6 @@ gtk_style_finalize (GObject *object)
   g_slist_foreach (style->icon_factories, (GFunc) g_object_unref, NULL);
   g_slist_free (style->icon_factories);
 
-  g_slist_foreach (priv->color_hashes, (GFunc) g_hash_table_unref, NULL);
-  g_slist_free (priv->color_hashes);
-
   pango_font_description_free (style->font_desc);
 
   if (style->private_font_desc)
@@ -748,6 +678,7 @@ gtk_style_update_from_context (GtkStyle *style)
   GtkStylePrivate *priv;
   GtkStateType state;
   GtkBorder *padding;
+  gint i;
 
   priv = GTK_STYLE_GET_PRIVATE (style);
 
@@ -792,6 +723,33 @@ gtk_style_update_from_context (GtkStyle *style)
 
       gtk_border_free (padding);
     }
+
+  for (i = 0; i < 5; i++)
+    {
+      _gtk_style_shade (&style->bg[i], &style->light[i], LIGHTNESS_MULT);
+      _gtk_style_shade (&style->bg[i], &style->dark[i], DARKNESS_MULT);
+
+      style->mid[i].red = (style->light[i].red + style->dark[i].red) / 2;
+      style->mid[i].green = (style->light[i].green + style->dark[i].green) / 2;
+      style->mid[i].blue = (style->light[i].blue + style->dark[i].blue) / 2;
+
+      style->text_aa[i].red = (style->text[i].red + style->base[i].red) / 2;
+      style->text_aa[i].green = (style->text[i].green + style->base[i].green) / 2;
+      style->text_aa[i].blue = (style->text[i].blue + style->base[i].blue) / 2;
+    }
+
+  style->black.red = 0x0000;
+  style->black.green = 0x0000;
+  style->black.blue = 0x0000;
+
+  style->white.red = 0xffff;
+  style->white.green = 0xffff;
+  style->white.blue = 0xffff;
+
+  for (i = 0; i < 5; i++)
+    style->background[i] = cairo_pattern_create_rgb (style->bg[i].red / 65535.0,
+                                                     style->bg[i].green / 65535.0,
+                                                     style->bg[i].blue / 65535.0);
 }
 
 static void
@@ -840,26 +798,6 @@ gtk_style_copy (GtkStyle *style)
   return new_style;
 }
 
-static GtkStyle*
-gtk_style_duplicate (GtkStyle *style)
-{
-  GtkStyle *new_style;
-  
-  g_return_val_if_fail (GTK_IS_STYLE (style), NULL);
-  
-  new_style = gtk_style_copy (style);
-  
-  /* All the styles in the list have the same 
-   * style->styles pointer. When we insert a new 
-   * style, we append it to the list to avoid having 
-   * to update the existing ones. 
-   */
-  style->styles = g_slist_append (style->styles, new_style);
-  new_style->styles = style->styles;  
-  
-  return new_style;
-}
-
 /**
  * gtk_style_new:
  * @returns: a new #GtkStyle.
@@ -914,69 +852,10 @@ GtkStyle*
 gtk_style_attach (GtkStyle  *style,
                   GdkWindow *window)
 {
-  GSList *styles;
-  GtkStyle *new_style = NULL;
-  GdkVisual *visual;
-  
   g_return_val_if_fail (GTK_IS_STYLE (style), NULL);
   g_return_val_if_fail (window != NULL, NULL);
-  
-  visual = gdk_window_get_visual (window);
-  
-  if (!style->styles)
-    style->styles = g_slist_append (NULL, style);
-  
-  styles = style->styles;
-  while (styles)
-    {
-      new_style = styles->data;
-      
-      if (new_style->visual == visual)
-        break;
-
-      new_style = NULL;
-      styles = styles->next;
-    }
 
-  if (!new_style)
-    {
-      styles = style->styles;
-      
-      while (styles)
-	{
-	  new_style = styles->data;
-	  
-	  if (new_style->attach_count == 0)
-	    {
-	      gtk_style_realize (new_style, visual);
-	      break;
-	    }
-	  
-	  new_style = NULL;
-	  styles = styles->next;
-	}
-    }
-  
-  if (!new_style)
-    {
-      new_style = gtk_style_duplicate (style);
-      gtk_style_realize (new_style, visual);
-    }
-
-  /* A style gets a refcount from being attached */
-  if (new_style->attach_count == 0)
-    g_object_ref (new_style);
-
-  /* Another refcount belongs to the parent */
-  if (style != new_style) 
-    {
-      g_object_unref (style);
-      g_object_ref (new_style);
-    }
-  
-  new_style->attach_count++;
-  
-  return new_style;
+  return style;
 }
 
 /**
@@ -992,35 +871,6 @@ void
 gtk_style_detach (GtkStyle *style)
 {
   g_return_if_fail (GTK_IS_STYLE (style));
-
-  if (style->attach_count == 0)
-    return;
-
-  style->attach_count -= 1;
-  if (style->attach_count == 0)
-    {
-      g_signal_emit (style, unrealize_signal, 0);
-      
-      g_object_unref (style->visual);
-      style->visual = NULL;
-
-      if (style->private_font_desc)
-	{
-	  pango_font_description_free (style->private_font_desc);
-	  style->private_font_desc = NULL;
-	}
-
-      g_object_unref (style);
-    }
-}
-
-static void
-gtk_style_realize (GtkStyle  *style,
-                   GdkVisual *visual)
-{
-  style->visual = g_object_ref (visual);
-
-  g_signal_emit (style, realize_signal, 0);
 }
 
 /**
@@ -1141,8 +991,6 @@ static void
 gtk_style_real_copy (GtkStyle *style,
 		     GtkStyle *src)
 {
-  GtkStylePrivate *priv = GTK_STYLE_GET_PRIVATE (style);
-  GtkStylePrivate *src_priv = GTK_STYLE_GET_PRIVATE (src);
   gint i;
   
   for (i = 0; i < 5; i++)
@@ -1179,64 +1027,12 @@ gtk_style_real_copy (GtkStyle *style,
   g_slist_free (style->icon_factories);
   style->icon_factories = g_slist_copy (src->icon_factories);
   g_slist_foreach (style->icon_factories, (GFunc) g_object_ref, NULL);
-
-  g_slist_foreach (priv->color_hashes, (GFunc) g_hash_table_unref, NULL);
-  g_slist_free (priv->color_hashes);
-  priv->color_hashes = g_slist_copy (src_priv->color_hashes);
-  g_slist_foreach (priv->color_hashes, (GFunc) g_hash_table_ref, NULL);
-
-  /* don't copy, just clear cache */
-  clear_property_cache (style);
 }
 
 static void
 gtk_style_real_init_from_rc (GtkStyle   *style,
 			     GtkRcStyle *rc_style)
 {
-  GtkStylePrivate *priv = GTK_STYLE_GET_PRIVATE (style);
-  gint i;
-
-  /* cache _should_ be still empty */
-  clear_property_cache (style);
-
-  if (rc_style->font_desc)
-    pango_font_description_merge (style->font_desc, rc_style->font_desc, TRUE);
-    
-  for (i = 0; i < 5; i++)
-    {
-      if (rc_style->color_flags[i] & GTK_RC_FG)
-	style->fg[i] = rc_style->fg[i];
-      if (rc_style->color_flags[i] & GTK_RC_BG)
-	style->bg[i] = rc_style->bg[i];
-      if (rc_style->color_flags[i] & GTK_RC_TEXT)
-	style->text[i] = rc_style->text[i];
-      if (rc_style->color_flags[i] & GTK_RC_BASE)
-	style->base[i] = rc_style->base[i];
-    }
-
-  if (rc_style->xthickness >= 0)
-    style->xthickness = rc_style->xthickness;
-  if (rc_style->ythickness >= 0)
-    style->ythickness = rc_style->ythickness;
-
-  style->icon_factories = g_slist_copy (rc_style->icon_factories);
-  g_slist_foreach (style->icon_factories, (GFunc) g_object_ref, NULL);
-
-  priv->color_hashes = g_slist_copy (_gtk_rc_style_get_color_hashes (rc_style));
-  g_slist_foreach (priv->color_hashes, (GFunc) g_hash_table_ref, NULL);
-}
-
-static gint
-style_property_values_cmp (gconstpointer bsearch_node1,
-			   gconstpointer bsearch_node2)
-{
-  const PropertyValue *val1 = bsearch_node1;
-  const PropertyValue *val2 = bsearch_node2;
-
-  if (val1->widget_type == val2->widget_type)
-    return val1->pspec < val2->pspec ? -1 : val1->pspec == val2->pspec ? 0 : 1;
-  else
-    return val1->widget_type < val2->widget_type ? -1 : 1;
 }
 
 /**
@@ -1258,9 +1054,9 @@ gtk_style_get_style_property (GtkStyle     *style,
                               const gchar *property_name,
                               GValue      *value)
 {
+  GtkStylePrivate *priv;
   GtkWidgetClass *klass;
   GParamSpec *pspec;
-  GtkRcPropertyParser parser;
   const GValue *peek_value;
 
   klass = g_type_class_ref (widget_type);
@@ -1276,10 +1072,10 @@ gtk_style_get_style_property (GtkStyle     *style,
       return;
     }
 
-  parser = g_param_spec_get_qdata (pspec,
-                                   g_quark_from_static_string ("gtk-rc-property-parser"));
-
-  peek_value = _gtk_style_peek_property_value (style, widget_type, pspec, parser);
+  priv = GTK_STYLE_GET_PRIVATE (style);
+  peek_value = _gtk_style_context_peek_style_property (priv->context,
+                                                       widget_type,
+                                                       0, pspec);
 
   if (G_VALUE_TYPE (value) == G_PARAM_SPEC_VALUE_TYPE (pspec))
     g_value_copy (peek_value, value);
@@ -1312,6 +1108,7 @@ gtk_style_get_valist (GtkStyle    *style,
                       const gchar *first_property_name,
                       va_list      var_args)
 {
+  GtkStylePrivate *priv;
   const char *property_name;
   GtkWidgetClass *klass;
 
@@ -1319,11 +1116,11 @@ gtk_style_get_valist (GtkStyle    *style,
 
   klass = g_type_class_ref (widget_type);
 
+  priv = GTK_STYLE_GET_PRIVATE (style);
   property_name = first_property_name;
   while (property_name)
     {
       GParamSpec *pspec;
-      GtkRcPropertyParser parser;
       const GValue *peek_value;
       gchar *error;
 
@@ -1338,10 +1135,8 @@ gtk_style_get_valist (GtkStyle    *style,
           break;
         }
 
-      parser = g_param_spec_get_qdata (pspec,
-                                       g_quark_from_static_string ("gtk-rc-property-parser"));
-
-      peek_value = _gtk_style_peek_property_value (style, widget_type, pspec, parser);
+      peek_value = _gtk_style_context_peek_style_property (priv->context, widget_type,
+                                                           0, pspec);
       G_VALUE_LCOPY (peek_value, var_args, 0, &error);
       if (error)
         {
@@ -1383,195 +1178,14 @@ gtk_style_get (GtkStyle    *style,
   va_end (var_args);
 }
 
-const GValue*
-_gtk_style_peek_property_value (GtkStyle           *style,
-				GType               widget_type,
-				GParamSpec         *pspec,
-				GtkRcPropertyParser parser)
-{
-  PropertyValue *pcache, key = { 0, NULL, { 0, } };
-  const GtkRcProperty *rcprop = NULL;
-  guint i;
-
-  g_return_val_if_fail (GTK_IS_STYLE (style), NULL);
-  g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL);
-  g_return_val_if_fail (g_type_is_a (pspec->owner_type, GTK_TYPE_WIDGET), NULL);
-  g_return_val_if_fail (g_type_is_a (widget_type, pspec->owner_type), NULL);
-
-  key.widget_type = widget_type;
-  key.pspec = pspec;
-
-  /* need value cache array */
-  if (!style->property_cache)
-    style->property_cache = g_array_new (FALSE, FALSE, sizeof (PropertyValue));
-  else
-    {
-      pcache = bsearch (&key,
-			style->property_cache->data, style->property_cache->len,
-			sizeof (PropertyValue), style_property_values_cmp);
-      if (pcache)
-	return &pcache->value;
-    }
-
-  i = 0;
-  while (i < style->property_cache->len &&
-	 style_property_values_cmp (&key, &g_array_index (style->property_cache, PropertyValue, i)) >= 0)
-    i++;
-
-  g_array_insert_val (style->property_cache, i, key);
-  pcache = &g_array_index (style->property_cache, PropertyValue, i);
-
-  /* cache miss, initialize value type, then set contents */
-  g_param_spec_ref (pcache->pspec);
-  g_value_init (&pcache->value, G_PARAM_SPEC_VALUE_TYPE (pspec));
-
-  /* value provided by rc style? */
-  if (style->rc_style)
-    {
-      GQuark prop_quark = g_quark_from_string (pspec->name);
-
-      do
-	{
-	  rcprop = _gtk_rc_style_lookup_rc_property (style->rc_style,
-						     g_type_qname (widget_type),
-						     prop_quark);
-	  if (rcprop)
-	    break;
-	  widget_type = g_type_parent (widget_type);
-	}
-      while (g_type_is_a (widget_type, pspec->owner_type));
-    }
-
-  /* when supplied by rc style, we need to convert */
-  if (rcprop && !_gtk_settings_parse_convert (parser, &rcprop->value,
-					      pspec, &pcache->value))
-    {
-      gchar *contents = g_strdup_value_contents (&rcprop->value);
-      
-      g_message ("%s: failed to retrieve property `%s::%s' of type `%s' from rc file value \"%s\" of type `%s'",
-		 rcprop->origin ? rcprop->origin : "(for origin information, set GTK_DEBUG)",
-		 g_type_name (pspec->owner_type), pspec->name,
-		 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
-		 contents,
-		 G_VALUE_TYPE_NAME (&rcprop->value));
-      g_free (contents);
-      rcprop = NULL; /* needs default */
-    }
-  
-  /* not supplied by rc style (or conversion failed), revert to default */
-  if (!rcprop)
-    g_param_value_set_default (pspec, &pcache->value);
-
-  return &pcache->value;
-}
-
-static cairo_pattern_t *
-load_background (GdkVisual   *visual,
-	         GdkColor    *bg_color,
-	         const gchar *filename)
-{
-  if (filename == NULL)
-    {
-      return cairo_pattern_create_rgb (bg_color->red   / 65535.0,
-                                       bg_color->green / 65535.0,
-                                       bg_color->blue  / 65535.0);
-    }
-  if (strcmp (filename, "<parent>") == 0)
-    return NULL;
-  else
-    {
-      GdkPixbuf *pixbuf;
-      cairo_surface_t *surface;
-      cairo_pattern_t *pattern;
-      cairo_t *cr;
-      GdkScreen *screen = gdk_visual_get_screen (visual);
-  
-      pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
-      if (!pixbuf)
-        return NULL;
-
-      surface = gdk_window_create_similar_surface (gdk_screen_get_root_window (screen),
-                                                   CAIRO_CONTENT_COLOR,
-                                                   gdk_pixbuf_get_width (pixbuf),
-                                                   gdk_pixbuf_get_height (pixbuf));
-  
-      cr = cairo_create (surface);
-
-      gdk_cairo_set_source_color (cr, bg_color);
-      cairo_paint (cr);
-
-      gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
-      cairo_paint (cr);
-
-      cairo_destroy (cr);
-      g_object_unref (pixbuf);
-
-      pattern = cairo_pattern_create_for_surface (surface);
-
-      cairo_surface_destroy (surface);
-
-      return pattern;
-    }
-}
-
 static void
 gtk_style_real_realize (GtkStyle *style)
 {
-  gint i;
-
-  for (i = 0; i < 5; i++)
-    {
-      _gtk_style_shade (&style->bg[i], &style->light[i], LIGHTNESS_MULT);
-      _gtk_style_shade (&style->bg[i], &style->dark[i], DARKNESS_MULT);
-
-      style->mid[i].red = (style->light[i].red + style->dark[i].red) / 2;
-      style->mid[i].green = (style->light[i].green + style->dark[i].green) / 2;
-      style->mid[i].blue = (style->light[i].blue + style->dark[i].blue) / 2;
-
-      style->text_aa[i].red = (style->text[i].red + style->base[i].red) / 2;
-      style->text_aa[i].green = (style->text[i].green + style->base[i].green) / 2;
-      style->text_aa[i].blue = (style->text[i].blue + style->base[i].blue) / 2;
-    }
-
-  style->black.red = 0x0000;
-  style->black.green = 0x0000;
-  style->black.blue = 0x0000;
-
-  style->white.red = 0xffff;
-  style->white.green = 0xffff;
-  style->white.blue = 0xffff;
-
-  for (i = 0; i < 5; i++)
-    {
-      const char *image_name;
-
-      if (style->rc_style)
-        image_name = style->rc_style->bg_pixmap_name[i];
-      else
-        image_name = NULL;
-
-      style->background[i] = load_background (style->visual,
-					      &style->bg[i],
-					      image_name);
-    }
 }
 
 static void
 gtk_style_real_unrealize (GtkStyle *style)
 {
-  int i;
-
-  for (i = 0; i < 5; i++)
-    {
-      if (style->background[i])
-	{
-	  cairo_pattern_destroy (style->background[i]);
-	  style->background[i] = NULL;
-	}
-      
-    }
-  
-  style_unrealize_cursors (style);
 }
 
 static void
@@ -4320,19 +3934,6 @@ struct _CursorInfo
   GdkColor secondary;
 };
 
-static void
-style_unrealize_cursors (GtkStyle *style)
-{
-  CursorInfo *
-  
-  cursor_info = g_object_get_data (G_OBJECT (style), "gtk-style-cursor-info");
-  if (cursor_info)
-    {
-      g_free (cursor_info);
-      g_object_set_data (G_OBJECT (style), I_("gtk-style-cursor-info"), NULL);
-    }
-}
-
 static const GdkColor *
 get_insertion_cursor_color (GtkWidget *widget,
 			    gboolean   is_primary)
diff --git a/gtk/gtkstyle.h b/gtk/gtkstyle.h
index 3d44b1f..efd78a7 100644
--- a/gtk/gtkstyle.h
+++ b/gtk/gtkstyle.h
@@ -634,14 +634,6 @@ void gtk_style_get                (GtkStyle    *style,
 #endif
 
 /* --- private API --- */
-const GValue* _gtk_style_peek_property_value (GtkStyle           *style,
-					      GType               widget_type,
-					      GParamSpec         *pspec,
-					      GtkRcPropertyParser parser);
-
-void          _gtk_style_init_for_settings   (GtkStyle           *style,
-                                              GtkSettings        *settings);
-
 void          _gtk_style_shade               (const GdkColor     *a,
                                               GdkColor           *b,
                                               gdouble             k);
@@ -655,7 +647,7 @@ void   gtk_draw_insertion_cursor    (GtkWidget          *widget,
 void   _gtk_widget_get_cursor_color (GtkWidget          *widget,
 				     GdkColor           *color);
 
-gboolean   gtk_style_has_context     (GtkStyle *style);
+gboolean   gtk_style_has_context    (GtkStyle *style);
 
 
 
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index ca61f04..ffdd76d 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -45,7 +45,6 @@
 #include "gtkbindings.h"
 #include "gtkprivate.h"
 #include "gdk/gdk.h"
-#include "gdk/gdkprivate.h" /* Used in gtk_reset_shapes_recurse to avoid copy */
 #include <gobject/gvaluecollector.h>
 #include <gobject/gobjectnotifyqueue.c>
 #include <cairo-gobject.h>
@@ -560,10 +559,7 @@ static PangoContext*	gtk_widget_peek_pango_context		(GtkWidget	  *widget);
 static void     	gtk_widget_update_pango_context		(GtkWidget	  *widget);
 static void		gtk_widget_propagate_state		(GtkWidget	  *widget,
 								 GtkStateData 	  *data);
-static void             gtk_widget_reset_rc_style               (GtkWidget        *widget);
-static void		gtk_widget_set_style_internal		(GtkWidget	  *widget,
-								 GtkStyle	  *style,
-								 gboolean	   initial_emission);
+;
 static gint		gtk_widget_event_internal		(GtkWidget	  *widget,
 								 GdkEvent	  *event);
 static gboolean		gtk_widget_real_mnemonic_activate	(GtkWidget	  *widget,
@@ -6290,9 +6286,29 @@ gtk_widget_real_query_tooltip (GtkWidget  *widget,
 static void
 gtk_widget_real_style_updated (GtkWidget *widget)
 {
+  if (gtk_widget_get_realized (widget))
+    {
+      /* Trigger ::style-set for old
+       * widgets not listening to this
+       */
+      g_signal_emit (widget,
+                     widget_signals[STYLE_SET],
+                     0,
+                     widget->priv->style);
+    }
+
   if (widget->priv->context)
-    gtk_style_context_invalidate (widget->priv->context);
-  gtk_widget_queue_resize (widget);
+    {
+      gtk_style_context_invalidate (widget->priv->context);
+
+      if (gtk_widget_get_realized (widget) &&
+          gtk_widget_get_has_window (widget))
+        gtk_style_context_set_background (widget->priv->context,
+                                          widget->priv->window);
+    }
+
+  if (widget->priv->anchored)
+    gtk_widget_queue_resize (widget);
 }
 
 static gboolean
@@ -6734,9 +6750,6 @@ gtk_widget_set_name (GtkWidget	 *widget,
   if (priv->context)
     gtk_style_context_set_path (priv->context, priv->path);
 
-  if (priv->rc_style)
-    gtk_widget_reset_rc_style (widget);
-
   g_object_notify (G_OBJECT (widget), "name");
 }
 
@@ -7658,23 +7671,6 @@ gtk_widget_set_style (GtkWidget *widget,
 		      GtkStyle	*style)
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
-
-  if (style)
-    {
-      gboolean initial_emission;
-
-      initial_emission = !widget->priv->rc_style && !widget->priv->user_style;
-
-      widget->priv->rc_style = FALSE;
-      widget->priv->user_style = TRUE;
-
-      gtk_widget_set_style_internal (widget, style, initial_emission);
-    }
-  else
-    {
-      if (widget->priv->user_style)
-	gtk_widget_reset_rc_style (widget);
-    }
 }
 
 /**
@@ -7698,42 +7694,21 @@ gtk_widget_ensure_style (GtkWidget *widget)
     {
       GtkStyle *style;
 
+      if (widget->priv->style)
+        g_object_unref (widget->priv->style);
+
       style = g_object_new (GTK_TYPE_STYLE,
                             "context", gtk_widget_get_style_context (widget),
                             NULL);
 
-      gtk_widget_set_style_internal (widget, style, TRUE);
-      g_object_unref (style);
-    }
-
-#if 0
-  if (!widget->priv->rc_style && !widget->priv->user_style)
-    gtk_widget_reset_rc_style (widget);
-#endif
-}
+      widget->priv->style = g_object_ref (style);
 
-/* Look up the RC style for this widget, unsetting any user style that
- * may be in effect currently
- **/
-static void
-gtk_widget_reset_rc_style (GtkWidget *widget)
-{
-  GtkWidgetPrivate *priv = widget->priv;
-  GtkStyle *new_style = NULL;
-  gboolean initial_emission;
-
-  initial_emission = !priv->rc_style && !priv->user_style;
-
-  priv->user_style = FALSE;
-  priv->rc_style = TRUE;
-
-  if (gtk_widget_has_screen (widget))
-    new_style = gtk_rc_get_style (widget);
-  if (!new_style)
-    new_style = gtk_widget_get_default_style ();
+      g_signal_emit (widget,
+                     widget_signals[STYLE_SET],
+                     0, NULL);
 
-  if (initial_emission || new_style != priv->style)
-    gtk_widget_set_style_internal (widget, new_style, initial_emission);
+      g_object_unref (style);
+    }
 }
 
 /**
@@ -7790,13 +7765,6 @@ gtk_widget_modify_style (GtkWidget      *widget,
 			   quark_rc_style,
 			   gtk_rc_style_copy (style),
 			   (GDestroyNotify) g_object_unref);
-
-  /* note that "style" may be invalid here if it was the old
-   * modifier style and the only reference was our own.
-   */
-
-  if (widget->priv->rc_style)
-    gtk_widget_reset_rc_style (widget);
 }
 
 /**
@@ -7888,11 +7856,6 @@ modifier_style_changed (GtkModifierStyle *style,
 
   context = gtk_widget_get_style_context (widget);
   gtk_style_context_invalidate (context);
-
-  g_signal_emit (widget,
-                 widget_signals[STYLE_SET],
-                 0,
-                 widget->priv->style);
 }
 
 static GtkModifierStyle *
@@ -8347,59 +8310,6 @@ static void
 gtk_widget_real_style_set (GtkWidget *widget,
                            GtkStyle  *previous_style)
 {
-  GtkWidgetPrivate *priv = widget->priv;
-
-  if (gtk_widget_get_realized (widget) &&
-      gtk_widget_get_has_window (widget))
-    gtk_style_set_background (priv->style, priv->window,
-                              gtk_widget_get_state (widget));
-}
-
-static void
-gtk_widget_set_style_internal (GtkWidget *widget,
-			       GtkStyle	 *style,
-			       gboolean   initial_emission)
-{
-  GtkWidgetPrivate *priv = widget->priv;
-
-  g_object_ref (widget);
-  g_object_freeze_notify (G_OBJECT (widget));
-
-  if (priv->style != style)
-    {
-      GtkStyle *previous_style;
-
-      if (gtk_widget_get_realized (widget))
-        gtk_style_detach (priv->style);
-
-      previous_style = priv->style;
-      priv->style = style;
-      g_object_ref (priv->style);
-
-      if (gtk_widget_get_realized (widget))
-	priv->style = gtk_style_attach (priv->style, priv->window);
-
-      gtk_widget_update_pango_context (widget);
-      g_signal_emit (widget,
-		     widget_signals[STYLE_SET],
-		     0,
-		     initial_emission ? NULL : previous_style);
-      g_object_unref (previous_style);
-
-      if (priv->anchored && !initial_emission)
-	gtk_widget_queue_resize (widget);
-    }
-  else if (initial_emission)
-    {
-      gtk_widget_update_pango_context (widget);
-      g_signal_emit (widget,
-		     widget_signals[STYLE_SET],
-		     0,
-		     NULL);
-    }
-  g_object_notify (G_OBJECT (widget), "style");
-  g_object_thaw_notify (G_OBJECT (widget));
-  g_object_unref (widget);
 }
 
 typedef struct {
@@ -8594,11 +8504,6 @@ _gtk_widget_propagate_screen_changed (GtkWidget    *widget,
 static void
 reset_style_recurse (GtkWidget *widget, gpointer data)
 {
-#if 0
-  if (widget->priv->rc_style)
-    gtk_widget_reset_rc_style (widget);
-#endif
-
   if (widget->priv->context)
     {
       _gtk_widget_update_path (widget);
@@ -13797,7 +13702,11 @@ style_context_changed (GtkStyleContext *context,
 {
   GtkWidget *widget = user_data;
 
+  gtk_widget_update_pango_context (widget);
   g_signal_emit (widget, widget_signals[STYLE_UPDATED], 0);
+
+  if (widget->priv->anchored)
+    gtk_widget_queue_resize (widget);
 }
 
 /**



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]