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:
14
gtk/gtkrc.c
14
gtk/gtkrc.c
@@ -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:
|
||||
|
||||
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user