[gtk+/win32-theme: 2/6] Add GtkStylePropertyContext and use it in when getting style properties



commit 2bf9625594650d7824efcff0d3c0e6c0237dc833
Author: Alexander Larsson <alexl redhat com>
Date:   Tue Nov 15 16:56:59 2011 +0100

    Add GtkStylePropertyContext and use it in when getting style properties
    
    At the toplevel we have _gtk_theming_engine_get, which lets us pass
    in a property context with (atm) the size to get the property for.
    Then there is a lot of plumbing to push this down into the lower
    layers of the style property code until finally hitting
    the property resolvers.
    
    I need this because I will be adding a property resolver for win32
    theme parts, and they render differently depending on the size
    (i.e. they don't scale linearly). The idea is that the code
    to get the background properties will pass in the final size
    and we will resolve the theme part specification to that particular
    size.
    
    If the old non-context calls are used we just hardcode a size
    of 100x100.

 gtk/gtkborderimage.c            |   16 +++---
 gtk/gtkborderimageprivate.h     |    4 +-
 gtk/gtkstylecontext.c           |   18 +++++++
 gtk/gtkstylecontextprivate.h    |   10 ++++
 gtk/gtkstyleproperties.c        |  105 ++++++++++++++++++++++++++++-----------
 gtk/gtkstylepropertiesprivate.h |   17 ++++++
 gtk/gtkstyleproperty.c          |   22 ++++++---
 gtk/gtkstylepropertyprivate.h   |    8 ++-
 gtk/gtkthemingengine.c          |   19 +++++++
 gtk/gtkthemingengineprivate.h   |    7 +++
 10 files changed, 179 insertions(+), 47 deletions(-)
---
diff --git a/gtk/gtkborderimage.c b/gtk/gtkborderimage.c
index dd82591..48d690d 100644
--- a/gtk/gtkborderimage.c
+++ b/gtk/gtkborderimage.c
@@ -27,6 +27,7 @@
 #include <math.h>
 
 #include "gtkborderimageprivate.h"
+#include "gtkstylepropertiesprivate.h"
 
 /* this is in case round() is not provided by the compiler, 
  * such as in the case of C89 compilers, like MSVC
@@ -194,19 +195,20 @@ _gtk_border_image_unpack (const GValue *value,
 void
 _gtk_border_image_pack (GValue             *value,
                         GtkStyleProperties *props,
-                        GtkStateFlags       state)
+                        GtkStateFlags       state,
+			GtkStylePropertyContext *context)
 {
   GtkBorderImage *image;
   cairo_pattern_t *source;
   GtkBorder *slice, *width;
   GtkCssBorderImageRepeat *repeat;
 
-  gtk_style_properties_get (props, state,
-                            "border-image-source", &source,
-                            "border-image-slice", &slice,
-                            "border-image-repeat", &repeat,
-                            "border-image-width", &width,
-                            NULL);
+  _gtk_style_properties_get (props, state, context,
+			     "border-image-source", &source,
+			     "border-image-slice", &slice,
+			     "border-image-repeat", &repeat,
+			     "border-image-width", &width,
+			     NULL);
 
   if (source == NULL)
     {
diff --git a/gtk/gtkborderimageprivate.h b/gtk/gtkborderimageprivate.h
index 563ce29..ee4975f 100644
--- a/gtk/gtkborderimageprivate.h
+++ b/gtk/gtkborderimageprivate.h
@@ -29,6 +29,7 @@
 #include "gtkstyleproperties.h"
 #include "gtkthemingengine.h"
 #include "gtkcsstypesprivate.h"
+#include "gtkstylecontextprivate.h"
 
 G_BEGIN_DECLS
 
@@ -63,7 +64,8 @@ GParameter *      _gtk_border_image_unpack           (const GValue         *valu
                                                       guint                *n_params);
 void              _gtk_border_image_pack             (GValue               *value,
                                                       GtkStyleProperties   *props,
-                                                      GtkStateFlags         state);
+                                                      GtkStateFlags         state,
+						      GtkStylePropertyContext *context);
 
 G_END_DECLS
 
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index e67c4cc..b2993ec 100644
--- a/gtk/gtkstylecontext.c
+++ b/gtk/gtkstylecontext.c
@@ -1367,6 +1367,24 @@ gtk_style_context_get_property (GtkStyleContext *context,
   gtk_style_properties_get_property (data->store, property, state, value);
 }
 
+void
+_gtk_style_context_get_valist (GtkStyleContext *context,
+			       GtkStateFlags    state,
+			       GtkStylePropertyContext *property_context,
+			       va_list          args)
+{
+  GtkStyleContextPrivate *priv;
+  StyleData *data;
+
+  g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
+
+  priv = context->priv;
+  g_return_if_fail (priv->widget_path != NULL);
+
+  data = style_data_lookup (context);
+  _gtk_style_properties_get_valist (data->store, state, property_context, args);
+}
+
 /**
  * gtk_style_context_get_valist:
  * @context: a #GtkStyleContext
diff --git a/gtk/gtkstylecontextprivate.h b/gtk/gtkstylecontextprivate.h
index 57db77e..9796baf 100644
--- a/gtk/gtkstylecontextprivate.h
+++ b/gtk/gtkstylecontextprivate.h
@@ -24,7 +24,17 @@
 
 G_BEGIN_DECLS
 
-
+typedef struct _GtkStylePropertyContext GtkStylePropertyContext;
+struct _GtkStylePropertyContext
+{
+  int width;
+  int height;
+};
+
+void           _gtk_style_context_get_valist (GtkStyleContext *context,
+					      GtkStateFlags    state,
+					      GtkStylePropertyContext *property_context,
+					      va_list          args);
 const GValue * _gtk_style_context_peek_style_property        (GtkStyleContext *context,
                                                               GType            widget_type,
                                                               GtkStateFlags    state,
diff --git a/gtk/gtkstyleproperties.c b/gtk/gtkstyleproperties.c
index f3946f8..3a6b4b4 100644
--- a/gtk/gtkstyleproperties.c
+++ b/gtk/gtkstyleproperties.c
@@ -640,6 +640,7 @@ const GValue *
 _gtk_style_properties_peek_property (GtkStyleProperties      *props,
                                      const gchar             *prop_name,
                                      GtkStateFlags            state,
+				     GtkStylePropertyContext *context,
                                      const GtkStyleProperty **property)
 {
   GtkStylePropertiesPrivate *priv;
@@ -670,30 +671,17 @@ _gtk_style_properties_peek_property (GtkStyleProperties      *props,
   if (val == NULL)
     return NULL;
   
-  _gtk_style_property_resolve (node, props, state, val);
+  _gtk_style_property_resolve (node, props, state, context, val);
 
   return val;
 }
 
-/**
- * gtk_style_properties_get_property:
- * @props: a #GtkStyleProperties
- * @property: style property name
- * @state: state to retrieve the property value for
- * @value: (out) (transfer full):  return location for the style property value.
- *
- * Gets a style property from @props for the given state. When done with @value,
- * g_value_unset() needs to be called to free any allocated memory.
- *
- * Returns: %TRUE if the property exists in @props, %FALSE otherwise
- *
- * Since: 3.0
- **/
 gboolean
-gtk_style_properties_get_property (GtkStyleProperties *props,
-                                   const gchar        *property,
-                                   GtkStateFlags       state,
-                                   GValue             *value)
+_gtk_style_properties_get_property (GtkStyleProperties *props,
+				    const gchar        *property,
+				    GtkStateFlags       state,
+				    GtkStylePropertyContext *context,
+				    GValue             *value)
 {
   const GtkStyleProperty *node;
   const GValue *val;
@@ -702,7 +690,7 @@ gtk_style_properties_get_property (GtkStyleProperties *props,
   g_return_val_if_fail (property != NULL, FALSE);
   g_return_val_if_fail (value != NULL, FALSE);
 
-  val = _gtk_style_properties_peek_property (props, property, state, &node);
+  val = _gtk_style_properties_peek_property (props, property, state, context, &node);
 
   if (!node)
     return FALSE;
@@ -712,7 +700,7 @@ gtk_style_properties_get_property (GtkStyleProperties *props,
   if (val)
     g_value_copy (val, value);
   else if (_gtk_style_property_is_shorthand (node))
-    _gtk_style_property_pack (node, props, state, value);
+    _gtk_style_property_pack (node, props, state, context, value);
   else
     _gtk_style_property_default_value (node, props, state, value);
 
@@ -720,19 +708,41 @@ gtk_style_properties_get_property (GtkStyleProperties *props,
 }
 
 /**
- * gtk_style_properties_get_valist:
+ * gtk_style_properties_get_property:
  * @props: a #GtkStyleProperties
- * @state: state to retrieve the property values for
- * @args: va_list of property name/return location pairs, followed by %NULL
+ * @property: style property name
+ * @state: state to retrieve the property value for
+ * @value: (out) (transfer full):  return location for the style property value.
  *
- * Retrieves several style property values from @props for a given state.
+ * Gets a style property from @props for the given state. When done with @value,
+ * g_value_unset() needs to be called to free any allocated memory.
+ *
+ * Returns: %TRUE if the property exists in @props, %FALSE otherwise
  *
  * Since: 3.0
  **/
+gboolean
+gtk_style_properties_get_property (GtkStyleProperties *props,
+                                   const gchar        *property,
+                                   GtkStateFlags       state,
+                                   GValue             *value)
+{
+  GtkStylePropertyContext context = { 100, 100};
+
+  g_return_val_if_fail (GTK_IS_STYLE_PROPERTIES (props), FALSE);
+  g_return_val_if_fail (property != NULL, FALSE);
+  g_return_val_if_fail (value != NULL, FALSE);
+
+  return _gtk_style_properties_get_property (props,
+					     property,
+					     state, &context, value);
+}
+
 void
-gtk_style_properties_get_valist (GtkStyleProperties *props,
-                                 GtkStateFlags       state,
-                                 va_list             args)
+_gtk_style_properties_get_valist (GtkStyleProperties *props,
+				  GtkStateFlags       state,
+				  GtkStylePropertyContext *context,
+				  va_list             args)
 {
   const gchar *property_name;
 
@@ -746,7 +756,7 @@ gtk_style_properties_get_valist (GtkStyleProperties *props,
       gchar *error = NULL;
       const GValue *val;
 
-      val = _gtk_style_properties_peek_property (props, property_name, state, &node);
+      val = _gtk_style_properties_peek_property (props, property_name, state, context, &node);
       if (!node)
         break;
 
@@ -759,7 +769,7 @@ gtk_style_properties_get_valist (GtkStyleProperties *props,
           GValue packed = G_VALUE_INIT;
 
           g_value_init (&packed, node->pspec->value_type);
-          _gtk_style_property_pack (node, props, state, &packed);
+          _gtk_style_property_pack (node, props, state, context, &packed);
           G_VALUE_LCOPY (&packed, args, 0, &error);
           g_value_unset (&packed);
         }
@@ -785,6 +795,41 @@ gtk_style_properties_get_valist (GtkStyleProperties *props,
 }
 
 /**
+ * gtk_style_properties_get_valist:
+ * @props: a #GtkStyleProperties
+ * @state: state to retrieve the property values for
+ * @args: va_list of property name/return location pairs, followed by %NULL
+ *
+ * Retrieves several style property values from @props for a given state.
+ *
+ * Since: 3.0
+ **/
+void
+gtk_style_properties_get_valist (GtkStyleProperties *props,
+                                 GtkStateFlags       state,
+                                 va_list             args)
+{
+  GtkStylePropertyContext context = { 100, 100};
+  
+  return _gtk_style_properties_get_valist (props, state, &context, args);
+}
+
+void
+_gtk_style_properties_get (GtkStyleProperties *props,
+			   GtkStateFlags       state,
+			   GtkStylePropertyContext *context,
+			   ...)
+{
+  va_list args;
+
+  g_return_if_fail (GTK_IS_STYLE_PROPERTIES (props));
+
+  va_start (args, context);
+  _gtk_style_properties_get_valist (props, state, context, args);
+  va_end (args);
+}
+
+/**
  * gtk_style_properties_get:
  * @props: a #GtkStyleProperties
  * @state: state to retrieve the property values for
diff --git a/gtk/gtkstylepropertiesprivate.h b/gtk/gtkstylepropertiesprivate.h
index bbb5d81..628fd50 100644
--- a/gtk/gtkstylepropertiesprivate.h
+++ b/gtk/gtkstylepropertiesprivate.h
@@ -22,13 +22,30 @@
 
 #include "gtkstyleproperties.h"
 #include "gtkstylepropertyprivate.h"
+#include "gtkstylecontextprivate.h"
 
 G_BEGIN_DECLS
 
 const GValue * _gtk_style_properties_peek_property            (GtkStyleProperties      *props,
                                                                const gchar             *prop_name,
                                                                GtkStateFlags            state,
+							       GtkStylePropertyContext *context,
                                                                const GtkStyleProperty **property);
+void           _gtk_style_properties_get                      (GtkStyleProperties      *props,
+							       GtkStateFlags            state,
+							       GtkStylePropertyContext *context,
+							       ...);
+void           _gtk_style_properties_get_valist               (GtkStyleProperties      *props,
+							       GtkStateFlags            state,
+							       GtkStylePropertyContext *context,
+							       va_list                  args);
+
+const GValue * _gtk_style_properties_resolve_property         (GtkStyleProperties      *props,
+							       const gchar             *prop_name,
+							       GtkStateFlags            state,
+							       const GtkStyleProperty **property,
+							       GtkStylePropertyContext *context,
+							       GValue                  *value);
 
 void           _gtk_style_properties_set_property_by_property (GtkStyleProperties      *props,
                                                                const GtkStyleProperty  *property,
diff --git a/gtk/gtkstyleproperty.c b/gtk/gtkstyleproperty.c
index 99b804f..2ece9b6 100644
--- a/gtk/gtkstyleproperty.c
+++ b/gtk/gtkstyleproperty.c
@@ -1855,7 +1855,8 @@ unpack_border_width (const GValue *value,
 static void
 pack_border_width (GValue             *value,
                    GtkStyleProperties *props,
-                   GtkStateFlags       state)
+                   GtkStateFlags       state,
+		   GtkStylePropertyContext *context)
 {
   pack_border (value, props, state,
                "border-top-width", "border-left-width",
@@ -1874,7 +1875,8 @@ unpack_padding (const GValue *value,
 static void
 pack_padding (GValue             *value,
               GtkStyleProperties *props,
-              GtkStateFlags       state)
+              GtkStateFlags       state,
+	      GtkStylePropertyContext *context)
 {
   pack_border (value, props, state,
                "padding-top", "padding-left",
@@ -1893,7 +1895,8 @@ unpack_margin (const GValue *value,
 static void
 pack_margin (GValue             *value,
              GtkStyleProperties *props,
-             GtkStateFlags       state)
+             GtkStateFlags       state,
+	     GtkStylePropertyContext *context)
 {
   pack_border (value, props, state,
                "margin-top", "margin-left",
@@ -1935,7 +1938,8 @@ unpack_border_radius (const GValue *value,
 static void
 pack_border_radius (GValue             *value,
                     GtkStyleProperties *props,
-                    GtkStateFlags       state)
+                    GtkStateFlags       state,
+		    GtkStylePropertyContext *context)
 {
   GtkCssBorderCornerRadius *top_left;
 
@@ -2035,7 +2039,8 @@ unpack_font_description (const GValue *value,
 static void
 pack_font_description (GValue             *value,
                        GtkStyleProperties *props,
-                       GtkStateFlags       state)
+                       GtkStateFlags       state,
+		       GtkStylePropertyContext *context)
 {
   PangoFontDescription *description;
   char **families;
@@ -2113,7 +2118,8 @@ unpack_border_color (const GValue *value,
 static void
 pack_border_color (GValue             *value,
                    GtkStyleProperties *props,
-                   GtkStateFlags       state)
+                   GtkStateFlags       state,
+		   GtkStylePropertyContext *context)
 {
   /* NB: We are a color property, so we have to resolve to a color here.
    * So we just resolve to a color. We pick one and stick to it.
@@ -2512,6 +2518,7 @@ void
 _gtk_style_property_resolve (const GtkStyleProperty *property,
                              GtkStyleProperties     *props,
                              GtkStateFlags           state,
+			     GtkStylePropertyContext *context,
                              GValue                 *val)
 {
   if (G_VALUE_TYPE (val) == GTK_TYPE_SYMBOLIC_COLOR)
@@ -2579,6 +2586,7 @@ void
 _gtk_style_property_pack (const GtkStyleProperty *property,
                           GtkStyleProperties     *props,
                           GtkStateFlags           state,
+			  GtkStylePropertyContext *context,
                           GValue                 *value)
 {
   g_return_if_fail (property != NULL);
@@ -2586,7 +2594,7 @@ _gtk_style_property_pack (const GtkStyleProperty *property,
   g_return_if_fail (GTK_IS_STYLE_PROPERTIES (props));
   g_return_if_fail (G_IS_VALUE (value));
 
-  property->pack_func (value, props, state);
+  property->pack_func (value, props, state, context);
 }
 
 static void
diff --git a/gtk/gtkstylepropertyprivate.h b/gtk/gtkstylepropertyprivate.h
index aef18b8..07994d5 100644
--- a/gtk/gtkstylepropertyprivate.h
+++ b/gtk/gtkstylepropertyprivate.h
@@ -21,6 +21,7 @@
 #define __GTK_STYLEPROPERTY_PRIVATE_H__
 
 #include "gtkcssparserprivate.h"
+#include "gtkstylecontextprivate.h"
 
 G_BEGIN_DECLS
 
@@ -33,7 +34,8 @@ typedef GParameter *     (* GtkStyleUnpackFunc)            (const GValue
                                                             guint                  *n_params);
 typedef void             (* GtkStylePackFunc)              (GValue                 *value,
                                                             GtkStyleProperties     *props,
-                                                            GtkStateFlags           state);
+                                                            GtkStateFlags           state,
+							    GtkStylePropertyContext *context);
 typedef gboolean         (* GtkStyleParseFunc)             (GtkCssParser           *parser,
                                                             GFile                  *base,
                                                             GValue                 *value);
@@ -82,7 +84,8 @@ void                     _gtk_style_property_default_value (const GtkStyleProper
 void                     _gtk_style_property_resolve       (const GtkStyleProperty *property,
                                                             GtkStyleProperties     *properties,
                                                             GtkStateFlags           state,
-                                                            GValue                 *value);
+							    GtkStylePropertyContext *context,
+                                                            GValue                 *orig_value);
 
 gboolean                 _gtk_style_property_is_shorthand  (const GtkStyleProperty *property);
 GParameter *             _gtk_style_property_unpack        (const GtkStyleProperty *property,
@@ -91,6 +94,7 @@ GParameter *             _gtk_style_property_unpack        (const GtkStyleProper
 void                     _gtk_style_property_pack          (const GtkStyleProperty *property,
                                                             GtkStyleProperties     *props,
                                                             GtkStateFlags           state,
+							    GtkStylePropertyContext *context,
                                                             GValue                 *value);
 
 gboolean                 _gtk_style_property_parse_value   (const GtkStyleProperty *property,
diff --git a/gtk/gtkthemingengine.c b/gtk/gtkthemingengine.c
index f068c3d..81430d5 100644
--- a/gtk/gtkthemingengine.c
+++ b/gtk/gtkthemingengine.c
@@ -450,6 +450,25 @@ gtk_theming_engine_get_valist (GtkThemingEngine *engine,
   gtk_style_context_get_valist (priv->context, state, args);
 }
 
+void
+_gtk_theming_engine_get (GtkThemingEngine *engine,
+			 GtkStateFlags     state,
+			 GtkStylePropertyContext *property_context,
+			 ...)
+{
+  GtkThemingEnginePrivate *priv;
+  va_list args;
+
+  g_return_if_fail (GTK_IS_THEMING_ENGINE (engine));
+
+  priv = engine->priv;
+
+  va_start (args, property_context);
+  _gtk_style_context_get_valist (priv->context, state, property_context, args);
+  va_end (args);
+}
+
+
 /**
  * gtk_theming_engine_get:
  * @engine: a #GtkThemingEngine
diff --git a/gtk/gtkthemingengineprivate.h b/gtk/gtkthemingengineprivate.h
index caf189e..5191fa0 100644
--- a/gtk/gtkthemingengineprivate.h
+++ b/gtk/gtkthemingengineprivate.h
@@ -21,6 +21,13 @@
 #define __GTK_THEMING_ENGINE_PRIVATE_H__
 
 #include <gdk/gdk.h>
+#include "gtkstylecontextprivate.h"
+
+void _gtk_theming_engine_get          (GtkThemingEngine *engine,
+				       GtkStateFlags     state,
+				       GtkStylePropertyContext *property_context,
+                                      ...) G_GNUC_NULL_TERMINATED;
+
 
 void _gtk_theming_engine_paint_spinner (cairo_t *cr,
                                         gdouble  radius,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]