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 cf6bfbdb17.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -647,36 +647,6 @@
|
||||
* <entry>border-color</entry>
|
||||
* </row>
|
||||
* <row>
|
||||
* <entry>font-family</entry>
|
||||
* <entry>@family [, @family]*</entry>
|
||||
* <entry>#gchararray</entry>
|
||||
* <entry>font-family: Sans, Arial;</entry>
|
||||
* </row>
|
||||
* <row>
|
||||
* <entry>font-style</entry>
|
||||
* <entry>[normal|oblique|italic]</entry>
|
||||
* <entry>#PANGO_TYPE_STYLE</entry>
|
||||
* <entry>font-style: italic;</entry>
|
||||
* </row>
|
||||
* <row>
|
||||
* <entry>font-variant</entry>
|
||||
* <entry>[normal|small-caps]</entry>
|
||||
* <entry>#PANGO_TYPE_VARIANT</entry>
|
||||
* <entry>font-variant: normal;</entry>
|
||||
* </row>
|
||||
* <row>
|
||||
* <entry>font-weight</entry>
|
||||
* <entry>[normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900]</entry>
|
||||
* <entry>#PANGO_TYPE_WEIGHT</entry>
|
||||
* <entry>font-weight: bold;</entry>
|
||||
* </row>
|
||||
* <row>
|
||||
* <entry>font-size</entry>
|
||||
* <entry>Font size in point</entry>
|
||||
* <entry>#gint</entry>
|
||||
* <entry>font-size: 13;</entry>
|
||||
* </row>
|
||||
* <row>
|
||||
* <entry>font</entry>
|
||||
* <entry>@family [@style] [@size]</entry>
|
||||
* <entry>#PangoFontDescription</entry>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "gtkstylepropertyprivate.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user