[gtk+] css: Move special case code for border widths



commit 25271fe781df135b72c9e95a6551d6f4017d9c1b
Author: Benjamin Otte <otte redhat com>
Date:   Mon Oct 1 18:21:30 2012 +0200

    css: Move special case code for border widths
    
    We need to store the border widths independant of them being set to 0 by
    border styles, because otherwise we'd need to track that dependency and
    recompute on changes, and I don't want to add more entries to
    GtkCssDependencies just for this special case.
    
    By moving the code that does the setting to 0 from the compute stage to
    the query stage, we can achieve this.
    
    Now we need to just be aware that the actual value stored is not set to
    0 when we use gtk_css_computed_values_get_value().

 gtk/gtkcssnumbervalue.c   |   34 ------------------------
 gtk/gtkcssstyleproperty.c |   62 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+), 34 deletions(-)
---
diff --git a/gtk/gtkcssnumbervalue.c b/gtk/gtkcssnumbervalue.c
index 58f4652..8d7eaa9 100644
--- a/gtk/gtkcssnumbervalue.c
+++ b/gtk/gtkcssnumbervalue.c
@@ -42,40 +42,6 @@ gtk_css_value_number_compute (GtkCssValue             *number,
                               GtkCssComputedValues    *parent_values,
                               GtkCssDependencies      *dependencies)
 {
-  GtkBorderStyle border_style;
-
-  /* I don't like this special case being here in this generic code path, but no idea where else to put it. */
-  switch (property_id)
-    {
-      case GTK_CSS_PROPERTY_BORDER_TOP_WIDTH:
-        border_style = _gtk_css_border_style_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_BORDER_TOP_STYLE));
-        if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
-          return _gtk_css_number_value_new (0, GTK_CSS_PX);
-        break;
-      case GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH:
-        border_style = _gtk_css_border_style_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE));
-        if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
-          return _gtk_css_number_value_new (0, GTK_CSS_PX);
-        break;
-      case GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH:
-        border_style = _gtk_css_border_style_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE));
-        if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
-          return _gtk_css_number_value_new (0, GTK_CSS_PX);
-        break;
-      case GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH:
-        border_style = _gtk_css_border_style_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_BORDER_LEFT_STYLE));
-        if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
-          return _gtk_css_number_value_new (0, GTK_CSS_PX);
-        break;
-      case GTK_CSS_PROPERTY_OUTLINE_WIDTH:
-        border_style = _gtk_css_border_style_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_OUTLINE_STYLE));
-        if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
-          return _gtk_css_number_value_new (0, GTK_CSS_PX);
-        break;
-      default:
-        break;
-    }
-
   switch (number->unit)
     {
     default:
diff --git a/gtk/gtkcssstyleproperty.c b/gtk/gtkcssstyleproperty.c
index 98e137d..7bb1e68 100644
--- a/gtk/gtkcssstyleproperty.c
+++ b/gtk/gtkcssstyleproperty.c
@@ -21,6 +21,7 @@
 
 #include "gtkcssstylepropertyprivate.h"
 
+#include "gtkcssenumvalueprivate.h"
 #include "gtkcssinheritvalueprivate.h"
 #include "gtkcssinitialvalueprivate.h"
 #include "gtkcssstylefuncsprivate.h"
@@ -129,6 +130,63 @@ _gtk_css_style_property_assign (GtkStyleProperty   *property,
   _gtk_css_value_unref (css_value);
 }
 
+static gboolean
+_gtk_css_style_property_query_special_case (GtkCssStyleProperty *property,
+                                            GValue              *value,
+                                            GtkStyleQueryFunc    query_func,
+                                            gpointer             query_data)
+{
+  GtkBorderStyle border_style;
+
+  switch (property->id)
+    {
+      case GTK_CSS_PROPERTY_BORDER_TOP_WIDTH:
+        border_style = _gtk_css_border_style_value_get (query_func (GTK_CSS_PROPERTY_BORDER_TOP_STYLE, query_data));
+        if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
+          {
+            g_value_init (value, G_TYPE_INT);
+            return TRUE;
+          }
+        break;
+      case GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH:
+        border_style = _gtk_css_border_style_value_get (query_func (GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE, query_data));
+        if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
+          {
+            g_value_init (value, G_TYPE_INT);
+            return TRUE;
+          }
+        break;
+      case GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH:
+        border_style = _gtk_css_border_style_value_get (query_func (GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE, query_data));
+        if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
+          {
+            g_value_init (value, G_TYPE_INT);
+            return TRUE;
+          }
+        break;
+      case GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH:
+        border_style = _gtk_css_border_style_value_get (query_func (GTK_CSS_PROPERTY_BORDER_LEFT_STYLE, query_data));
+        if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
+          {
+            g_value_init (value, G_TYPE_INT);
+            return TRUE;
+          }
+        break;
+      case GTK_CSS_PROPERTY_OUTLINE_WIDTH:
+        border_style = _gtk_css_border_style_value_get (query_func (GTK_CSS_PROPERTY_OUTLINE_STYLE, query_data));
+        if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
+          {
+            g_value_init (value, G_TYPE_INT);
+            return TRUE;
+          }
+        break;
+      default:
+        break;
+    }
+
+  return FALSE;
+}
+
 static void
 _gtk_css_style_property_query (GtkStyleProperty   *property,
                                GValue             *value,
@@ -138,6 +196,10 @@ _gtk_css_style_property_query (GtkStyleProperty   *property,
   GtkCssStyleProperty *style_property = GTK_CSS_STYLE_PROPERTY (property);
   GtkCssValue *css_value;
   
+  /* I don't like this special case being here in this generic code path, but no idea where else to put it. */
+  if (_gtk_css_style_property_query_special_case (style_property, value, query_func, query_data))
+    return;
+
   css_value = (* query_func) (GTK_CSS_STYLE_PROPERTY (property)->id, query_data);
   if (css_value == NULL)
     css_value =_gtk_css_style_property_get_initial_value (style_property);



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