stylecontext: NMake safe to call into during lookup
When resolving a lookup, we may want to query the current style context, as in the next patch. This works now.
This commit is contained in:
		@ -107,29 +107,28 @@ _gtk_css_lookup_set (GtkCssLookup  *lookup,
 | 
			
		||||
 * _gtk_css_lookup_resolve:
 | 
			
		||||
 * @lookup: the lookup
 | 
			
		||||
 * @context: the context the values are resolved for
 | 
			
		||||
 * @props: a new #GtkStyleProperties to be filled with the new properties
 | 
			
		||||
 *
 | 
			
		||||
 * Resolves the current lookup into a styleproperties object. This is done
 | 
			
		||||
 * by converting from the "winning declaration" to the "computed value".
 | 
			
		||||
 *
 | 
			
		||||
 * XXX: This bypasses the notion of "specified value". If this ever becomes
 | 
			
		||||
 * an issue, go fix it.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: a new #GtkStyleProperties
 | 
			
		||||
 **/
 | 
			
		||||
GtkStyleProperties *
 | 
			
		||||
void
 | 
			
		||||
_gtk_css_lookup_resolve (GtkCssLookup       *lookup,
 | 
			
		||||
                         GtkStyleContext *context)
 | 
			
		||||
                         GtkStyleContext    *context,
 | 
			
		||||
                         GtkStyleProperties *props)
 | 
			
		||||
{
 | 
			
		||||
  GtkStyleProperties *props;
 | 
			
		||||
  GtkStyleContext *parent;
 | 
			
		||||
  guint i, n;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (lookup != NULL, NULL);
 | 
			
		||||
  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
 | 
			
		||||
  g_return_if_fail (lookup != NULL);
 | 
			
		||||
  g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
 | 
			
		||||
  g_return_if_fail (GTK_IS_STYLE_PROPERTIES (props));
 | 
			
		||||
 | 
			
		||||
  parent = gtk_style_context_get_parent (context);
 | 
			
		||||
  n = _gtk_css_style_property_get_n_properties ();
 | 
			
		||||
  props = gtk_style_properties_new ();
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < n; i++)
 | 
			
		||||
    {
 | 
			
		||||
@ -219,6 +218,4 @@ _gtk_css_lookup_resolve (GtkCssLookup    *lookup,
 | 
			
		||||
                                                      &value);
 | 
			
		||||
      g_value_unset (&value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return props;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -41,8 +41,9 @@ void                    _gtk_css_lookup_set                     (GtkCssLookup
 | 
			
		||||
                                                                 guint               id,
 | 
			
		||||
                                                                 GtkCssSection      *section,
 | 
			
		||||
                                                                 const GValue       *value);
 | 
			
		||||
GtkStyleProperties *    _gtk_css_lookup_resolve                 (GtkCssLookup       *lookup,
 | 
			
		||||
                                                                 GtkStyleContext    *context);
 | 
			
		||||
void                    _gtk_css_lookup_resolve                 (GtkCssLookup       *lookup,
 | 
			
		||||
                                                                 GtkStyleContext    *context,
 | 
			
		||||
                                                                 GtkStyleProperties *props);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
@ -987,10 +987,11 @@ build_properties (GtkStyleContext *context,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  style_data->store = _gtk_css_lookup_resolve (lookup, context);
 | 
			
		||||
  style_data->store = gtk_style_properties_new ();
 | 
			
		||||
  _gtk_style_properties_set_color_lookup_func (style_data->store,
 | 
			
		||||
                                               gtk_style_context_color_lookup_func,
 | 
			
		||||
                                               context);
 | 
			
		||||
  _gtk_css_lookup_resolve (lookup, context, style_data->store);
 | 
			
		||||
  _gtk_css_lookup_free (lookup);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1091,44 +1092,40 @@ style_data_lookup (GtkStyleContext *context,
 | 
			
		||||
      gtk_style_context_set_state (context, state);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  data = g_hash_table_lookup (priv->style_data, priv->info_stack->data);
 | 
			
		||||
  priv->current_data = g_hash_table_lookup (priv->style_data, priv->info_stack->data);
 | 
			
		||||
  priv->current_state = state;
 | 
			
		||||
 | 
			
		||||
  if (!data)
 | 
			
		||||
  if (!priv->current_data)
 | 
			
		||||
    {
 | 
			
		||||
      GtkWidgetPath *path;
 | 
			
		||||
 | 
			
		||||
      data = style_data_new ();
 | 
			
		||||
      path = create_query_path (context);
 | 
			
		||||
 | 
			
		||||
      build_properties (context, data, path, state);
 | 
			
		||||
      build_icon_factories (context, data, path);
 | 
			
		||||
 | 
			
		||||
      priv->current_data = style_data_new ();
 | 
			
		||||
      g_hash_table_insert (priv->style_data,
 | 
			
		||||
                           style_info_copy (priv->info_stack->data),
 | 
			
		||||
                           data);
 | 
			
		||||
                           priv->current_data);
 | 
			
		||||
 | 
			
		||||
      path = create_query_path (context);
 | 
			
		||||
 | 
			
		||||
      build_properties (context, priv->current_data, path, state);
 | 
			
		||||
      build_icon_factories (context, priv->current_data, path);
 | 
			
		||||
 | 
			
		||||
      gtk_widget_path_free (path);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (G_UNLIKELY (state_mismatch))
 | 
			
		||||
    {
 | 
			
		||||
      gtk_style_context_restore (context);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
  data = priv->current_data;
 | 
			
		||||
 | 
			
		||||
  if (priv->theming_engine)
 | 
			
		||||
    g_object_unref (priv->theming_engine);
 | 
			
		||||
 | 
			
		||||
      gtk_style_properties_get (data->store, 0,
 | 
			
		||||
  gtk_style_properties_get (priv->current_data->store, 0,
 | 
			
		||||
                            "engine", &priv->theming_engine,
 | 
			
		||||
                            NULL);
 | 
			
		||||
 | 
			
		||||
  if (!priv->theming_engine)
 | 
			
		||||
    priv->theming_engine = g_object_ref (gtk_theming_engine_load (NULL));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->current_data = data;
 | 
			
		||||
  priv->current_state = state;
 | 
			
		||||
  if (G_UNLIKELY (state_mismatch))
 | 
			
		||||
    gtk_style_context_restore (context);
 | 
			
		||||
 | 
			
		||||
  return data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user