]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcssstyleproperty.c
Use gdk_threads_add_timeout to popup the selection window
[~andy/gtk] / gtk / gtkcssstyleproperty.c
index bd7d5a06cb3b119314412527c66250cd28a5ed60..0b7491524e421174e64c9185dfbc85e64e601ffb 100644 (file)
@@ -39,6 +39,7 @@ enum {
   PROP_0,
   PROP_ANIMATED,
   PROP_AFFECTS_SIZE,
+  PROP_AFFECTS_FONT,
   PROP_ID,
   PROP_INHERIT,
   PROP_INITIAL
@@ -47,6 +48,9 @@ enum {
 G_DEFINE_TYPE (GtkCssStyleProperty, _gtk_css_style_property, GTK_TYPE_STYLE_PROPERTY)
 
 static GtkBitmask *_properties_affecting_size = NULL;
+static GtkBitmask *_properties_affecting_font = NULL;
+
+static GtkCssStylePropertyClass *gtk_css_style_property_class = NULL;
 
 static void
 gtk_css_style_property_constructed (GObject *object)
@@ -60,6 +64,9 @@ gtk_css_style_property_constructed (GObject *object)
   if (property->affects_size)
     _properties_affecting_size = _gtk_bitmask_set (_properties_affecting_size, property->id, TRUE);
 
+  if (property->affects_font)
+    _properties_affecting_font = _gtk_bitmask_set (_properties_affecting_font, property->id, TRUE);
+
   G_OBJECT_CLASS (_gtk_css_style_property_parent_class)->constructed (object);
 }
 
@@ -79,6 +86,9 @@ gtk_css_style_property_set_property (GObject      *object,
     case PROP_AFFECTS_SIZE:
       property->affects_size = g_value_get_boolean (value);
       break;
+    case PROP_AFFECTS_FONT:
+      property->affects_font = g_value_get_boolean (value);
+      break;
     case PROP_INHERIT:
       property->inherit = g_value_get_boolean (value);
       break;
@@ -108,6 +118,9 @@ gtk_css_style_property_get_property (GObject    *object,
     case PROP_AFFECTS_SIZE:
       g_value_set_boolean (value, property->affects_size);
       break;
+    case PROP_AFFECTS_FONT:
+      g_value_set_boolean (value, property->affects_font);
+      break;
     case PROP_ID:
       g_value_set_boolean (value, property->id);
       break;
@@ -270,6 +283,13 @@ _gtk_css_style_property_class_init (GtkCssStylePropertyClass *klass)
                                                          P_("Set if the value affects the sizing of elements"),
                                                          TRUE,
                                                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property (object_class,
+                                   PROP_AFFECTS_FONT,
+                                   g_param_spec_boolean ("affects-font",
+                                                         P_("Affects font"),
+                                                         P_("Set if the value affects the font"),
+                                                         FALSE,
+                                                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
   g_object_class_install_property (object_class,
                                    PROP_ID,
                                    g_param_spec_uint ("id",
@@ -299,6 +319,9 @@ _gtk_css_style_property_class_init (GtkCssStylePropertyClass *klass)
   klass->style_properties = g_ptr_array_new ();
 
   _properties_affecting_size = _gtk_bitmask_new ();
+  _properties_affecting_font = _gtk_bitmask_new ();
+
+  gtk_css_style_property_class = klass;
 }
 
 static GtkCssValue *
@@ -326,17 +349,13 @@ _gtk_css_style_property_init (GtkCssStyleProperty *property)
 guint
 _gtk_css_style_property_get_n_properties (void)
 {
-  GtkCssStylePropertyClass *klass;
-
-  klass = g_type_class_peek (GTK_TYPE_CSS_STYLE_PROPERTY);
-  if (G_UNLIKELY (klass == NULL))
+  if (G_UNLIKELY (gtk_css_style_property_class == NULL))
     {
       _gtk_style_property_init_properties ();
-      klass = g_type_class_peek (GTK_TYPE_CSS_STYLE_PROPERTY);
-      g_assert (klass);
+      g_assert (gtk_css_style_property_class);
     }
 
-  return klass->style_properties->len;
+  return gtk_css_style_property_class->style_properties->len;
 }
 
 /**
@@ -352,18 +371,16 @@ _gtk_css_style_property_get_n_properties (void)
 GtkCssStyleProperty *
 _gtk_css_style_property_lookup_by_id (guint id)
 {
-  GtkCssStylePropertyClass *klass;
 
-  klass = g_type_class_peek (GTK_TYPE_CSS_STYLE_PROPERTY);
-  if (G_UNLIKELY (klass == NULL))
+  if (G_UNLIKELY (gtk_css_style_property_class == NULL))
     {
       _gtk_style_property_init_properties ();
-      klass = g_type_class_peek (GTK_TYPE_CSS_STYLE_PROPERTY);
-      g_assert (klass);
+      g_assert (gtk_css_style_property_class);
     }
-  g_return_val_if_fail (id < klass->style_properties->len, NULL);
 
-  return g_ptr_array_index (klass->style_properties, id);
+  g_return_val_if_fail (id < gtk_css_style_property_class->style_properties->len, NULL);
+
+  return g_ptr_array_index (gtk_css_style_property_class->style_properties, id);
 }
 
 /**
@@ -419,6 +436,25 @@ _gtk_css_style_property_affects_size (GtkCssStyleProperty *property)
 
   return property->affects_size;
 }
+
+/**
+ * _gtk_css_style_property_affects_font:
+ * @property: the property
+ *
+ * Queries if the given @property affects the default font. This is
+ * used for optimizations inside GTK, where clearing pango
+ * layouts can be avoided if the font doesn't change.
+ *
+ * Returns: %TRUE if the property affects the font.
+ **/
+gboolean
+_gtk_css_style_property_affects_font (GtkCssStyleProperty *property)
+{
+  g_return_val_if_fail (GTK_IS_CSS_STYLE_PROPERTY (property), FALSE);
+
+  return property->affects_font;
+}
+
 /**
  * _gtk_css_style_property_get_id:
  * @property: the property
@@ -459,3 +495,9 @@ _gtk_css_style_property_changes_affect_size (const GtkBitmask *changes)
 {
   return _gtk_bitmask_intersects (changes, _properties_affecting_size);
 }
+
+gboolean
+_gtk_css_style_property_changes_affect_font (const GtkBitmask *changes)
+{
+  return _gtk_bitmask_intersects (changes, _properties_affecting_font);
+}