mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-19 18:00:09 +00:00
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:
parent
16482f20db
commit
d3e6cffff7
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:
|
||||
|
@ -2268,6 +2268,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'))
|
||||
@ -2301,9 +2304,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])
|
||||
|
Loading…
Reference in New Issue
Block a user