From 2e6bb2a0c90ff87c240cc3d36cb4f276525dde1d Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 2 Jun 2011 02:31:44 +0200 Subject: [PATCH] Revert "css: Make font property a shorthand" The hack in gtk_style_context_get_font() was causing segfaults in combobox code. This is not acceptable and I'm not awake enough to fix it, so just reverting until it's fixed sanely is easiest. This reverts commit cf6bfbdb17412a48c72b53aa1ad6d141114c48bc. --- gtk/gtkcssparser.c | 5 +- gtk/gtkcssprovider.c | 30 ----- gtk/gtkstylecontext.c | 15 +-- gtk/gtkstyleproperty.c | 245 +---------------------------------------- 4 files changed, 9 insertions(+), 286 deletions(-) diff --git a/gtk/gtkcssparser.c b/gtk/gtkcssparser.c index 463baf90bd..3aab85e67a 100644 --- a/gtk/gtkcssparser.c +++ b/gtk/gtkcssparser.c @@ -386,10 +386,7 @@ _gtk_css_parser_read_string (GtkCssParser *parser) quote = *parser->data; if (quote != '"' && quote != '\'') - { - _gtk_css_parser_error (parser, "Expected a string."); - return NULL; - } + return NULL; parser->data++; str = g_string_new (NULL); diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 7cf3a4f710..2e50b0c715 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -647,36 +647,6 @@ * border-color * * - * font-family - * @family [, @family]* - * #gchararray - * font-family: Sans, Arial; - * - * - * font-style - * [normal|oblique|italic] - * #PANGO_TYPE_STYLE - * font-style: italic; - * - * - * font-variant - * [normal|small-caps] - * #PANGO_TYPE_VARIANT - * font-variant: normal; - * - * - * font-weight - * [normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900] - * #PANGO_TYPE_WEIGHT - * font-weight: bold; - * - * - * font-size - * Font size in point - * #gint - * font-size: 13; - * - * * font * @family [@style] [@size] * #PangoFontDescription diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index 031746b833..9810ddd28d 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -3562,7 +3562,7 @@ gtk_style_context_get_font (GtkStyleContext *context, { GtkStyleContextPrivate *priv; StyleData *data; - PangoFontDescription *description; + const GValue *value; g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL); @@ -3570,15 +3570,12 @@ gtk_style_context_get_font (GtkStyleContext *context, g_return_val_if_fail (priv->widget_path != NULL, NULL); data = style_data_lookup (context); - gtk_style_properties_get (data->store, state, "font", &description, NULL); - /* Yuck, fonts are created on-demand but we don't return a ref. - * Do bad things to achieve this requirement */ - g_object_set_data_full (G_OBJECT (data->store), - "last-gotten-font", - description, - (GDestroyNotify) pango_font_description_free); + value = _gtk_style_properties_peek_property (data->store, "font", state, NULL); - return description; + if (value) + return g_value_get_boxed (value); + + return NULL; } static void diff --git a/gtk/gtkstyleproperty.c b/gtk/gtkstyleproperty.c index 8115603494..7b4e092d38 100644 --- a/gtk/gtkstyleproperty.c +++ b/gtk/gtkstyleproperty.c @@ -22,7 +22,6 @@ #include "gtkstylepropertyprivate.h" #include -#include #include #include @@ -228,74 +227,6 @@ symbolic_color_value_print (const GValue *value, } } -static gboolean -font_family_parse (GtkCssParser *parser, - GFile *base, - GValue *value) -{ - GPtrArray *names; - char *name; - - /* We don't special case generic families. Pango should do - * that for us */ - - names = g_ptr_array_new (); - - do { - name = _gtk_css_parser_try_ident (parser, TRUE); - if (name) - { - GString *string = g_string_new (name); - g_free (name); - while ((name = _gtk_css_parser_try_ident (parser, TRUE))) - { - g_string_append_c (string, ' '); - g_string_append (string, name); - g_free (name); - } - name = g_string_free (string, FALSE); - } - else - { - name = _gtk_css_parser_read_string (parser); - if (name == NULL) - { - g_ptr_array_free (names, TRUE); - return FALSE; - } - } - - g_ptr_array_add (names, name); - } while (_gtk_css_parser_try (parser, ",", TRUE)); - - /* NULL-terminate array */ - g_ptr_array_add (names, NULL); - g_value_set_boxed (value, g_ptr_array_free (names, FALSE)); - return TRUE; -} - -static void -font_family_value_print (const GValue *value, - GString *string) -{ - const char **names = g_value_get_boxed (value); - - if (names == NULL || *names == NULL) - { - g_string_append (string, "none"); - return; - } - - string_append_string (string, *names); - names++; - while (*names) - { - g_string_append (string, ", "); - string_append_string (string, *names); - names++; - } -} - static gboolean font_description_value_parse (GtkCssParser *parser, GFile *base, @@ -1638,119 +1569,6 @@ pack_border_radius (GValue *value, g_free (top_left); } -static GParameter * -unpack_font_description (const GValue *value, - guint *n_params) -{ - GParameter *parameter = g_new0 (GParameter, 5); - PangoFontDescription *description; - PangoFontMask mask; - guint n; - - /* For backwards compat, we only unpack values that are indeed set. - * For strict CSS conformance we need to unpack all of them. - * Note that we do set all of them in the parse function, so it - * will not have effects when parsing CSS files. It will though - * for custom style providers. - */ - - description = g_value_get_boxed (value); - n = 0; - - if (description) - mask = pango_font_description_get_set_fields (description); - else - mask = 0; - - if (mask & PANGO_FONT_MASK_FAMILY) - { - GPtrArray *strv = g_ptr_array_new (); - - g_ptr_array_add (strv, g_strdup (pango_font_description_get_family (description))); - g_ptr_array_add (strv, NULL); - parameter[n].name = "font-family"; - g_value_init (¶meter[n].value, G_TYPE_STRV); - g_value_take_boxed (¶meter[n].value, - g_ptr_array_free (strv, FALSE)); - n++; - } - - if (mask & PANGO_FONT_MASK_STYLE) - { - parameter[n].name = "font-style"; - g_value_init (¶meter[n].value, PANGO_TYPE_STYLE); - g_value_set_enum (¶meter[n].value, - pango_font_description_get_style (description)); - n++; - } - - if (mask & PANGO_FONT_MASK_VARIANT) - { - parameter[n].name = "font-variant"; - g_value_init (¶meter[n].value, PANGO_TYPE_VARIANT); - g_value_set_enum (¶meter[n].value, - pango_font_description_get_variant (description)); - n++; - } - - if (mask & PANGO_FONT_MASK_WEIGHT) - { - parameter[n].name = "font-weight"; - g_value_init (¶meter[n].value, PANGO_TYPE_WEIGHT); - g_value_set_enum (¶meter[n].value, - pango_font_description_get_weight (description)); - n++; - } - - if (mask & PANGO_FONT_MASK_SIZE) - { - parameter[n].name = "font-size"; - g_value_init (¶meter[n].value, G_TYPE_DOUBLE); - g_value_set_double (¶meter[n].value, - (double) pango_font_description_get_size (description) / PANGO_SCALE); - n++; - } - - *n_params = n; - - return parameter; -} - -static void -pack_font_description (GValue *value, - GtkStyleProperties *props, - GtkStateFlags state) -{ - PangoFontDescription *description; - char **families; - PangoStyle style; - PangoVariant variant; - PangoWeight weight; - double size; - - gtk_style_properties_get (props, - state, - "font-family", &families, - "font-style", &style, - "font-variant", &variant, - "font-weight", &weight, - "font-size", &size, - NULL); - - description = pango_font_description_new (); - /* xxx: Can we set all the families here somehow? */ - if (families) - pango_font_description_set_family (description, families[0]); - pango_font_description_set_size (description, round (size * PANGO_SCALE)); - pango_font_description_set_style (description, style); - pango_font_description_set_variant (description, variant); - pango_font_description_set_weight (description, weight); - - g_free (families); - - g_value_take_boxed (value, description); -} - /*** API ***/ static void @@ -2127,73 +1945,14 @@ gtk_style_property_init (void) "Background color", GDK_TYPE_RGBA, 0)); - _gtk_style_property_register (g_param_spec_boxed ("font-family", - "Font family", - "Font family", - G_TYPE_STRV, 0), - GTK_STYLE_PROPERTY_INHERIT, - NULL, - NULL, - NULL, - font_family_parse, - font_family_value_print, - NULL); - _gtk_style_property_register (g_param_spec_enum ("font-style", - "Font style", - "Font style", - PANGO_TYPE_STYLE, - PANGO_STYLE_NORMAL, 0), - GTK_STYLE_PROPERTY_INHERIT, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL); - _gtk_style_property_register (g_param_spec_enum ("font-variant", - "Font variant", - "Font variant", - PANGO_TYPE_VARIANT, - PANGO_VARIANT_NORMAL, 0), - GTK_STYLE_PROPERTY_INHERIT, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL); - /* xxx: need to parse this properly, ie parse the numbers */ - _gtk_style_property_register (g_param_spec_enum ("font-weight", - "Font weight", - "Font weight", - PANGO_TYPE_WEIGHT, - PANGO_WEIGHT_NORMAL, 0), - GTK_STYLE_PROPERTY_INHERIT, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL); - _gtk_style_property_register (g_param_spec_double ("font-size", - "Font size", - "Font size", - 0, G_MAXDOUBLE, 0, 0), - GTK_STYLE_PROPERTY_INHERIT, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL); _gtk_style_property_register (g_param_spec_boxed ("font", "Font Description", "Font Description", PANGO_TYPE_FONT_DESCRIPTION, 0), GTK_STYLE_PROPERTY_INHERIT, NULL, - unpack_font_description, - pack_font_description, + NULL, + NULL, font_description_value_parse, font_description_value_print, NULL);