diff -up gtk+-2.13.7/gtk/gtksettings.c.color-loop gtk+-2.13.7/gtk/gtksettings.c --- gtk+-2.13.7/gtk/gtksettings.c.color-loop 2008-08-25 09:16:09.000000000 -0400 +++ gtk+-2.13.7/gtk/gtksettings.c 2008-08-25 09:16:21.000000000 -0400 @@ -1892,14 +1892,13 @@ _gtk_settings_handle_event (GdkEventSett if (property_id == PROP_COLOR_SCHEME) { GValue value = { 0, }; - + g_value_init (&value, G_TYPE_STRING); if (!gdk_screen_get_setting (settings->screen, pspec->name, &value)) g_value_set_static_string (&value, ""); merge_color_scheme (settings, &value, GTK_SETTINGS_SOURCE_XSETTING); g_value_unset (&value); } - g_object_notify (G_OBJECT (settings), pspec->name); } } @@ -2258,6 +2257,7 @@ update_color_hash (ColorSchemeData *da { gboolean changed = FALSE; gint i; + GHashTable *old_hash; if ((str == NULL || *str == '\0') && (data->lastentry[source] == NULL || data->lastentry[source][0] == '\0')) @@ -2291,8 +2291,7 @@ update_color_hash (ColorSchemeData *da return FALSE; /* Rebuild the merged hash table. */ - if (data->color_hash) - g_hash_table_unref (data->color_hash); + old_hash = data->color_hash; data->color_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) gdk_color_free); for (i = 0; i <= GTK_SETTINGS_SOURCE_APPLICATION; i++) @@ -2302,7 +2301,35 @@ update_color_hash (ColorSchemeData *da data->color_hash); } - return TRUE; + if (old_hash) + { + /* now check if the merged hash has changed */ + changed = FALSE; + if (g_hash_table_size (old_hash) != g_hash_table_size (data->color_hash)) + changed = TRUE; + else + { + GHashTableIter iter; + gpointer key, value, new_value; + + g_hash_table_iter_init (&iter, old_hash); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + new_value = g_hash_table_lookup (data->color_hash, key); + if (!new_value || !gdk_color_equal (value, new_value)) + { + changed = TRUE; + break; + } + } + } + + g_hash_table_unref (old_hash); + } + else + changed = TRUE; + + return changed; } static void