Index: gtk+/gtk/gtkiconfactory.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkiconfactory.c,v
retrieving revision 1.39
diff -u -r1.39 gtkiconfactory.c
--- gtk+/gtk/gtkiconfactory.c	18 Apr 2002 22:04:43 -0000	1.39
+++ gtk+/gtk/gtkiconfactory.c	30 May 2002 07:40:48 -0000
@@ -28,6 +28,7 @@
 #include "stock-icons/gtkstockpixbufs.h"
 #include "gtkstock.h"
 #include "gtkintl.h"
+#include "gtksettings.h"
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
@@ -825,14 +826,85 @@
 static gint      icon_sizes_allocated = 0;
 static gint      icon_sizes_used = 0;
 
+/**
+ * This method reads the gtk-icon-sizes property and
+ *    parses it to determine the default sizes to use for
+ *    gtk icons, both predefined named sizes, and new
+ *    named sizes.  If an icon size name does not appear
+ *    in the style property, the dimensions of that named
+ *    icon size are unchanged.
+ **/
+static void
+restyle_icon_dimensions_from_property (IconSize *sizes)
+{
+#define MAX_ICON_SIZES 24
+  gint i;
+  gint n = icon_sizes_used;
+  gchar *icon_size_prop = NULL;
+  gchar **size_strings;
+  GtkSettings *settings = gtk_settings_get_default ();
+  g_object_get (G_OBJECT (settings), "gtk-icon-sizes", &icon_size_prop, NULL);
+  if (icon_size_prop != NULL)
+    {
+      size_strings = g_strsplit (icon_size_prop, ":", MAX_ICON_SIZES);
+#undef MAX_ICON_SIZES  
+  /* parse by name */
+      i=0;
+      while (size_strings[i])
+        {
+	  gint j;
+	  gint k;
+	  gchar *name = NULL;
+	  gchar **substrings;
+	  substrings = g_strsplit (size_strings[i], " ", 2);
+	  j = 0;
+	  do
+	    {
+	      ++j;
+	      if (j == n) break;
+              if (!strncmp (sizes[j].name, "gtk-", 4))
+	        name = sizes[j].name+4;
+	      else
+	        name = sizes[j].name;
+	    } while (!name || strcmp (substrings[0], name)); 
+          if (j < n)
+            {
+	      gchar **istrings = g_strsplit (substrings[1], ",", 2);	    
+	      sizes[j].width = atoi (istrings [0]);	
+	      sizes[j].height = atoi (istrings [1]);
+	      g_message ("icon %s size set to %d\n", sizes[j].name,
+			 sizes[j].width);
+	      if (istrings[0]) g_free (istrings[0]);
+	      if (istrings[1]) g_free (istrings[1]);
+	      if (istrings) g_free (istrings);
+            }
+          k = 0;
+	  while (substrings[k])
+	    {
+              g_free (substrings[k]);
+	      ++k;
+	    }
+	  g_free (substrings);
+	  ++i;
+	}
+      i = 0;
+      while (size_strings[i])
+        {
+          g_free (size_strings[i]);
+	  ++i;
+	}
+      g_free (size_strings);
+      _gtk_icon_set_invalidate_caches ();
+    }
+}
+
 static void
 init_icon_sizes (void)
 {
   if (icon_sizes == NULL)
     {
-#define NUM_BUILTIN_SIZES 7
       gint i;
-
+#define NUM_BUILTIN_SIZES 7
       icon_aliases = g_hash_table_new (g_str_hash, g_str_equal);
       
       icon_sizes = g_new (IconSize, NUM_BUILTIN_SIZES);
@@ -890,8 +962,8 @@
           
           ++i;
         }
-      
 #undef NUM_BUILTIN_SIZES
+      restyle_icon_dimensions_from_property (icon_sizes);
     }
 }
 
Index: gtk+/gtk/gtkrc.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkrc.c,v
retrieving revision 1.124
diff -u -r1.124 gtkrc.c
--- gtk+/gtk/gtkrc.c	28 May 2002 22:23:35 -0000	1.124
+++ gtk+/gtk/gtkrc.c	30 May 2002 07:40:53 -0000
@@ -1688,7 +1688,6 @@
 	  const gchar *path;
           gchar *path_reversed;
 	  guint path_length;
-
 	  path = g_type_name (type);
 	  path_length = strlen (path);
 	  path_reversed = g_strdup (path);
Index: gtk+/gtk/gtksettings.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtksettings.c,v
retrieving revision 1.27
diff -u -r1.27 gtksettings.c
--- gtk+/gtk/gtksettings.c	29 Apr 2002 22:53:37 -0000	1.27
+++ gtk+/gtk/gtksettings.c	30 May 2002 07:40:54 -0000
@@ -31,7 +31,8 @@
   PROP_KEY_THEME_NAME,
   PROP_MENU_BAR_ACCEL,
   PROP_DND_DRAG_THRESHOLD,
-  PROP_FONT_NAME
+  PROP_FONT_NAME,
+  PROP_ICON_SIZES
 };
 
 
@@ -213,6 +214,15 @@
 								  G_PARAM_READWRITE),
                                              NULL);
   g_assert (result == PROP_FONT_NAME);
+ 
+  result = settings_install_property_parser (class,
+                                             g_param_spec_string ("gtk-icon-sizes",
+								   _("Icon Sized"),
+								   _("Size in pixels of Standard Icon Types (semicolon delimited list)"),
+								  "x",
+								  G_PARAM_READWRITE),
+                                             NULL);
+  g_assert (result == PROP_ICON_SIZES);
  
 }
 
Index: gtk+/gtk/gtkstyle.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkstyle.c,v
retrieving revision 1.117
diff -u -r1.117 gtkstyle.c
--- gtk+/gtk/gtkstyle.c	29 Apr 2002 22:53:37 -0000	1.117
+++ gtk+/gtk/gtkstyle.c	30 May 2002 07:40:59 -0000
@@ -1963,7 +1963,7 @@
       return NULL;
     }
 
-  /* If the size was wildcarded, and we're allowed to scale, then scale; otherwise,
+  /* If we're allowed to scale, then scale; otherwise,
    * leave it alone.
    */
   if (size != (GtkIconSize)-1 && gtk_icon_source_get_size_wildcarded (source))
