]> Pileus Git - ~andy/gtk/commitdiff
stylecontext: Update computed values when dependencies change
authorBenjamin Otte <otte@redhat.com>
Fri, 24 Aug 2012 16:17:52 +0000 (18:17 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 28 Aug 2012 13:42:24 +0000 (15:42 +0200)
This fixes the longstanding bug where GTK would not update styles when
parent styles would change.

https://bugzilla.gnome.org/show_bug.cgi?id=672046

gtk/gtkstylecontext.c

index e37edd5511732eaeda426be14f97bd1e19f536e1..7163b81d8ff3a59640889e27732f5a48d9ac555e 100644 (file)
@@ -2924,6 +2924,36 @@ gtk_style_context_clear_cache (GtkStyleContext *context)
   g_hash_table_remove_all (priv->style_data);
 }
 
+static void
+gtk_style_context_update_cache (GtkStyleContext  *context,
+                                const GtkBitmask *parent_changes)
+{
+  GtkStyleContextPrivate *priv;
+  GHashTableIter iter;
+  gpointer key, value;
+
+  priv = context->priv;
+
+  g_hash_table_remove_all (priv->style_data);
+
+  g_hash_table_iter_init (&iter, priv->style_data);
+  while (g_hash_table_iter_next (&iter, &key, &value))
+    {
+      GtkStyleInfo *info = key;
+      StyleData *data = value;
+      GtkBitmask *changes;
+
+      changes = _gtk_bitmask_copy (parent_changes);
+      changes = _gtk_bitmask_intersect (changes, data->store->depends_on_parent);
+      if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_COLOR))
+        changes = _gtk_bitmask_union (changes, data->store->depends_on_color);
+      if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_FONT_SIZE))
+        changes = _gtk_bitmask_union (changes, data->store->depends_on_font_size);
+
+      build_properties (context, data->store, info->state_flags, changes);
+    }
+}
+
 static void
 gtk_style_context_do_invalidate (GtkStyleContext *context)
 {
@@ -3113,9 +3143,14 @@ _gtk_style_context_validate (GtkStyleContext  *context,
       gtk_style_context_needs_full_revalidate (context, change))
     {
       if ((priv->relevant_changes & change) & ~GTK_STYLE_CONTEXT_CACHED_CHANGE)
-        gtk_style_context_clear_cache (context);
+        {
+          gtk_style_context_clear_cache (context);
+        }
       else
-        style_info_set_data (info, NULL);
+        {
+          gtk_style_context_update_cache (context, parent_changes);
+          style_info_set_data (info, NULL);
+        }
 
       if (current)
         {
@@ -3144,6 +3179,8 @@ _gtk_style_context_validate (GtkStyleContext  *context,
         changes = _gtk_bitmask_union (changes, current->store->depends_on_color);
       if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_FONT_SIZE))
         changes = _gtk_bitmask_union (changes, current->store->depends_on_font_size);
+
+      gtk_style_context_update_cache (context, parent_changes);
     }
 
   if (change & GTK_CSS_CHANGE_ANIMATE &&