]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcsstypes.c
combobox: popdown the combobox when on 'grab-broken-event'
[~andy/gtk] / gtk / gtkcsstypes.c
index c454fea9fed27354c1f80c6388cc4ccad85b8b75..e67dceac56e5f9ca6edc4a640fd2b638a597e9f6 100644 (file)
 #include "config.h"
 
 #include "gtkcsstypesprivate.h"
-#include "gtkstylecontextprivate.h"
 
-#define DEFINE_BOXED_TYPE_WITH_COPY_FUNC(TypeName, type_name) \
-\
-static TypeName * \
-type_name ## _copy (const TypeName *foo) \
-{ \
-  return g_memdup (foo, sizeof (TypeName)); \
-} \
-\
-G_DEFINE_BOXED_TYPE (TypeName, type_name, type_name ## _copy, g_free)
+#include "gtkcssnumbervalueprivate.h"
+#include "gtkstylecontextprivate.h"
 
-DEFINE_BOXED_TYPE_WITH_COPY_FUNC (GtkCssBackgroundSize, _gtk_css_background_size)
-DEFINE_BOXED_TYPE_WITH_COPY_FUNC (GtkCssBorderCornerRadius, _gtk_css_border_corner_radius)
-DEFINE_BOXED_TYPE_WITH_COPY_FUNC (GtkCssBorderImageRepeat, _gtk_css_border_image_repeat)
-DEFINE_BOXED_TYPE_WITH_COPY_FUNC (GtkCssNumber, _gtk_css_number)
+typedef struct _GtkCssChangeTranslation GtkCssChangeTranslation;
+struct _GtkCssChangeTranslation {
+  GtkCssChange from;
+  GtkCssChange to;
+};
 
-void
-_gtk_css_number_init (GtkCssNumber *number,
-                      double        value,
-                      GtkCssUnit    unit)
+static GtkCssChange
+gtk_css_change_translate (GtkCssChange                   match,
+                         const GtkCssChangeTranslation *translations,
+                         guint                         n_translations)
 {
-  number->value = value;
-  number->unit = unit;
-}
+  GtkCssChange result = match;
+  guint i;
 
-gboolean
-_gtk_css_number_equal (const GtkCssNumber *one,
-                       const GtkCssNumber *two)
-{
-  return one->unit == two->unit &&
-         one->value == two->value;
-}
+  for (i = 0; i < n_translations; i++)
+    {
+      if (match & translations[i].from)
+        {
+          result &= ~translations[i].from;
+          result |= translations[i].to;
+        }
+    }
 
-double
-_gtk_css_number_get (const GtkCssNumber *number,
-                     double              one_hundred_percent)
-{
-  if (number->unit == GTK_CSS_PERCENT)
-    return number->value * one_hundred_percent * 0.01;
-  else
-    return number->value;
+  return result;
 }
 
-gboolean
-_gtk_css_number_compute (GtkCssNumber       *dest,
-                         const GtkCssNumber *src,
-                         GtkStyleContext    *context)
+GtkCssChange
+_gtk_css_change_for_sibling (GtkCssChange match)
 {
-  switch (src->unit)
-    {
-    default:
-      g_assert_not_reached();
-      /* fall through */
-    case GTK_CSS_PERCENT:
-    case GTK_CSS_NUMBER:
-    case GTK_CSS_PX:
-    case GTK_CSS_DEG:
-      dest->value = src->value;
-      dest->unit = src->unit;
-      break;
-    case GTK_CSS_PT:
-      dest->value = src->value * 96.0 / 72.0;
-      dest->unit = GTK_CSS_PX;
-      break;
-    case GTK_CSS_PC:
-      dest->value = src->value * 96.0 / 72.0 * 12.0;
-      dest->unit = GTK_CSS_PX;
-      break;
-    case GTK_CSS_IN:
-      dest->value = src->value * 96.0;
-      dest->unit = GTK_CSS_PX;
-      break;
-    case GTK_CSS_CM:
-      dest->value = src->value * 96.0 * 0.39370078740157477;
-      dest->unit = GTK_CSS_PX;
-      break;
-    case GTK_CSS_MM:
-      dest->value = src->value * 96.0 * 0.039370078740157477;
-      dest->unit = GTK_CSS_PX;
-      break;
-    case GTK_CSS_EM:
-      dest->value = src->value * _gtk_css_value_get_double (_gtk_style_context_peek_property (context, "font-size"));
-      dest->unit = GTK_CSS_PX;
-      break;
-    case GTK_CSS_EX:
-      /* for now we pretend ex is half of em */
-      dest->value = src->value * _gtk_css_value_get_double (_gtk_style_context_peek_property (context, "font-size"));
-      dest->unit = GTK_CSS_PX;
-      break;
-    case GTK_CSS_RAD:
-      dest->value = 360 * src->value / (2 * G_PI);
-      dest->unit = GTK_CSS_DEG;
-      break;
-    case GTK_CSS_GRAD:
-      dest->value = 360 * src->value / 400.0;
-      dest->unit = GTK_CSS_DEG;
-      break;
-    case GTK_CSS_TURN:
-      dest->value = 360 * src->value;
-      dest->unit = GTK_CSS_DEG;
-      break;
-    }
+  static const GtkCssChangeTranslation table[] = {
+    { GTK_CSS_CHANGE_CLASS, GTK_CSS_CHANGE_SIBLING_CLASS },
+    { GTK_CSS_CHANGE_NAME, GTK_CSS_CHANGE_SIBLING_NAME },
+    { GTK_CSS_CHANGE_POSITION, GTK_CSS_CHANGE_SIBLING_POSITION },
+    { GTK_CSS_CHANGE_STATE, GTK_CSS_CHANGE_SIBLING_STATE },
+    { GTK_CSS_CHANGE_SOURCE, 0 },
+    { GTK_CSS_CHANGE_ANIMATE, 0 }
+  };
 
-  return !_gtk_css_number_equal (src, dest);
+  return gtk_css_change_translate (match, table, G_N_ELEMENTS (table)); 
 }
 
-void
-_gtk_css_number_print (const GtkCssNumber *number,
-                       GString            *string)
+GtkCssChange
+_gtk_css_change_for_child (GtkCssChange match)
 {
-  char buf[G_ASCII_DTOSTR_BUF_SIZE];
-
-  const char *names[] = {
-    /* [GTK_CSS_NUMBER] = */ "",
-    /* [GTK_CSS_PERCENT] = */ "%",
-    /* [GTK_CSS_PX] = */ "px",
-    /* [GTK_CSS_PT] = */ "pt",
-    /* [GTK_CSS_EM] = */ "em",
-    /* [GTK_CSS_EX] = */ "ex",
-    /* [GTK_CSS_PC] = */ "pc",
-    /* [GTK_CSS_IN] = */ "in",
-    /* [GTK_CSS_CM] = */ "cm",
-    /* [GTK_CSS_MM] = */ "mm",
-    /* [GTK_CSS_RAD] = */ "rad",
-    /* [GTK_CSS_DEG] = */ "deg",
-    /* [GTK_CSS_GRAD] = */ "grad",
-    /* [GTK_CSS_TURN] = */ "turn",
+  static const GtkCssChangeTranslation table[] = {
+    { GTK_CSS_CHANGE_CLASS, GTK_CSS_CHANGE_PARENT_CLASS },
+    { GTK_CSS_CHANGE_NAME, GTK_CSS_CHANGE_PARENT_NAME },
+    { GTK_CSS_CHANGE_POSITION, GTK_CSS_CHANGE_PARENT_POSITION },
+    { GTK_CSS_CHANGE_STATE, GTK_CSS_CHANGE_PARENT_STATE },
+    { GTK_CSS_CHANGE_SIBLING_CLASS, GTK_CSS_CHANGE_PARENT_SIBLING_CLASS },
+    { GTK_CSS_CHANGE_SIBLING_NAME, GTK_CSS_CHANGE_PARENT_SIBLING_NAME },
+    { GTK_CSS_CHANGE_SIBLING_POSITION, GTK_CSS_CHANGE_PARENT_SIBLING_POSITION },
+    { GTK_CSS_CHANGE_SIBLING_STATE, GTK_CSS_CHANGE_PARENT_SIBLING_STATE },
+    { GTK_CSS_CHANGE_SOURCE, 0 },
+    { GTK_CSS_CHANGE_ANIMATE, 0 }
   };
 
-  g_return_if_fail (number != NULL);
-  g_return_if_fail (string != NULL);
+  return gtk_css_change_translate (match, table, G_N_ELEMENTS (table)); 
+}
 
-  g_ascii_dtostr (buf, sizeof (buf), number->value);
-  g_string_append (string, buf);
-  if (number->value != 0.0)
-    g_string_append (string, names[number->unit]);
+GtkCssDependencies
+_gtk_css_dependencies_union (GtkCssDependencies first,
+                             GtkCssDependencies second)
+{
+  return (first  & ~GTK_CSS_EQUALS_PARENT) | ((first  & GTK_CSS_EQUALS_PARENT) ? GTK_CSS_DEPENDS_ON_PARENT : 0)
+       | (second & ~GTK_CSS_EQUALS_PARENT) | ((second & GTK_CSS_EQUALS_PARENT) ? GTK_CSS_DEPENDS_ON_PARENT : 0);
 }
+