Fix issues with symbolic colors in rc file parsing

Don't recreate the settings color hash every time, repopulate it
instead. This avoids invalidating the references held by RcContexts.
This commit is contained in:
Matthias Clasen
2009-10-25 23:47:59 -04:00
parent d56f5a843d
commit 90f7a1ccfd
2 changed files with 44 additions and 21 deletions

View File

@@ -659,11 +659,15 @@ gtk_rc_color_hash_changed (GtkSettings *settings,
GParamSpec *pspec,
GtkRcContext *context)
{
if (context->color_hash)
g_hash_table_unref (context->color_hash);
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);
}
@@ -3148,8 +3152,10 @@ gtk_rc_parse_style (GtkRcContext *context,
break;
case GTK_RC_TOKEN_COLOR:
if (our_hash == NULL)
gtk_rc_style_prepend_empty_color_hash (rc_style);
our_hash = rc_priv->color_hashes->data;
{
gtk_rc_style_prepend_empty_color_hash (rc_style);
our_hash = rc_priv->color_hashes->data;
}
token = gtk_rc_parse_logical_color (scanner, rc_style, our_hash);
break;
case G_TOKEN_IDENTIFIER:

View File

@@ -2262,6 +2262,9 @@ update_color_hash (ColorSchemeData *data,
gboolean changed = FALSE;
gint i;
GHashTable *old_hash;
GHashTableIter iter;
gchar *name;
GdkColor *color;
if ((str == NULL || *str == '\0') &&
(data->lastentry[source] == NULL || data->lastentry[source][0] == '\0'))
@@ -2295,9 +2298,23 @@ update_color_hash (ColorSchemeData *data,
return FALSE;
/* Rebuild the merged hash table. */
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);
if (data->color_hash)
{
old_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
(GDestroyNotify) gdk_color_free);
g_hash_table_iter_init (&iter, data->color_hash);
while (g_hash_table_iter_next (&iter, &name, &color))
{
g_hash_table_insert (old_hash, name, color);
g_hash_table_iter_steal (&iter);
}
}
else
{
old_hash = NULL;
}
for (i = 0; i <= GTK_SETTINGS_SOURCE_APPLICATION; i++)
{
if (data->tables[i])