css: Move default font handling

The default font is no longer handled like a custom style sheet that
overrides everything, but as the initial value. This is the same
behavior as in web browsers.

And it allows the theme to actually use the 'font-family' and
'font-size' properties. Of course, a well behaved theme will respect the
setting as much as possible and for example use relative font sizes
(which aren't yet supported, but will be soon).
This commit is contained in:
Benjamin Otte 2012-12-01 01:49:06 +01:00
parent 3ff7f1fd43
commit 1dd3ee6b59
2 changed files with 62 additions and 74 deletions

View File

@ -19,7 +19,11 @@
#include "gtkcssinitialvalueprivate.h"
#include "gtkcssarrayvalueprivate.h"
#include "gtkcssnumbervalueprivate.h"
#include "gtkcssstringvalueprivate.h"
#include "gtkcssstylepropertyprivate.h"
#include "gtkstyleproviderprivate.h"
struct _GtkCssValue {
GTK_CSS_VALUE_BASE
@ -40,6 +44,64 @@ gtk_css_value_initial_compute (GtkCssValue *value,
GtkCssComputedValues *parent_values,
GtkCssDependencies *dependencies)
{
GtkSettings *settings;
switch (property_id)
{
case GTK_CSS_PROPERTY_FONT_FAMILY:
settings = _gtk_style_provider_private_get_settings (provider);
if (settings)
{
PangoFontDescription *description;
char *font_name;
GtkCssValue *value;
g_object_get (settings, "gtk-font-name", &font_name, NULL);
description = pango_font_description_from_string (font_name);
g_free (font_name);
if (description == NULL)
break;
if (pango_font_description_get_set_fields (description) & PANGO_FONT_MASK_FAMILY)
{
value = _gtk_css_array_value_new (_gtk_css_string_value_new (pango_font_description_get_family (description)));
pango_font_description_free (description);
return value;
}
pango_font_description_free (description);
}
break;
case GTK_CSS_PROPERTY_FONT_SIZE:
settings = _gtk_style_provider_private_get_settings (provider);
if (settings)
{
PangoFontDescription *description;
char *font_name;
GtkCssValue *value;
g_object_get (settings, "gtk-font-name", &font_name, NULL);
description = pango_font_description_from_string (font_name);
g_free (font_name);
if (description == NULL)
break;
if (pango_font_description_get_set_fields (description) & PANGO_FONT_MASK_SIZE)
{
value = _gtk_css_number_value_new ((double) pango_font_description_get_size (description) / PANGO_SCALE, GTK_CSS_PX);
pango_font_description_free (description);
return value;
}
pango_font_description_free (description);
}
break;
default:
break;
}
return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)),
property_id,
provider,

View File

@ -24,9 +24,6 @@
#include "gtksettings.h"
#include "gtkcssarrayvalueprivate.h"
#include "gtkcssnumbervalueprivate.h"
#include "gtkcssstringvalueprivate.h"
#include "gtkmodules.h"
#include "gtkmodulesprivate.h"
#include "gtksettingsprivate.h"
@ -117,8 +114,6 @@ struct _GtkSettingsPrivate
GdkScreen *screen;
GtkCssProvider *theme_provider;
GtkCssProvider *key_theme_provider;
GtkCssValue *default_font_family;
GtkCssValue *default_font_size;
};
typedef enum
@ -1414,41 +1409,6 @@ gtk_settings_class_init (GtkSettingsClass *class)
g_type_class_add_private (class, sizeof (GtkSettingsPrivate));
}
static void
settings_ensure_style (GtkSettings *settings)
{
GtkSettingsPrivate *priv = settings->priv;
PangoFontDescription *description;
gchar *font_name;
PangoFontMask mask;
if (priv->default_font_family)
return;
g_object_get (settings,
"gtk-font-name", &font_name,
NULL);
description = pango_font_description_from_string (font_name);
if (description)
mask = pango_font_description_get_set_fields (description);
else
mask = 0;
if (mask & PANGO_FONT_MASK_FAMILY)
priv->default_font_family = _gtk_css_array_value_new (_gtk_css_string_value_new (pango_font_description_get_family (description)));
else
priv->default_font_family = _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans"));
if (mask & PANGO_FONT_MASK_SIZE)
priv->default_font_size = _gtk_css_number_value_new ((double) pango_font_description_get_size (description) / PANGO_SCALE, GTK_CSS_PX);
else
priv->default_font_size = _gtk_css_number_value_new (10.0, GTK_CSS_PX);
pango_font_description_free (description);
g_free (font_name);
}
static void
gtk_settings_provider_iface_init (GtkStyleProviderIface *iface)
{
@ -1460,26 +1420,10 @@ gtk_settings_style_provider_get_settings (GtkStyleProviderPrivate *provider)
return GTK_SETTINGS (provider);
}
static void
gtk_settings_style_provider_lookup (GtkStyleProviderPrivate *provider,
const GtkCssMatcher *matcher,
GtkCssLookup *lookup)
{
GtkSettings *settings = GTK_SETTINGS (provider);
settings_ensure_style (settings);
if (_gtk_css_lookup_is_missing (lookup, GTK_CSS_PROPERTY_FONT_FAMILY))
_gtk_css_lookup_set (lookup, GTK_CSS_PROPERTY_FONT_FAMILY, NULL, settings->priv->default_font_family);
if (_gtk_css_lookup_is_missing (lookup, GTK_CSS_PROPERTY_FONT_SIZE))
_gtk_css_lookup_set (lookup, GTK_CSS_PROPERTY_FONT_SIZE, NULL, settings->priv->default_font_size);
}
static void
gtk_settings_provider_private_init (GtkStyleProviderPrivateInterface *iface)
{
iface->get_settings = gtk_settings_style_provider_get_settings;
iface->lookup = gtk_settings_style_provider_lookup;
}
static void
@ -1500,11 +1444,6 @@ gtk_settings_finalize (GObject *object)
settings_update_provider (priv->screen, &priv->theme_provider, NULL);
settings_update_provider (priv->screen, &priv->key_theme_provider, NULL);
if (priv->default_font_family)
_gtk_css_value_unref (priv->default_font_family);
if (priv->default_font_size)
_gtk_css_value_unref (priv->default_font_size);
G_OBJECT_CLASS (gtk_settings_parent_class)->finalize (object);
}
@ -1710,19 +1649,6 @@ gtk_settings_get_property (GObject *object,
static void
settings_invalidate_style (GtkSettings *settings)
{
GtkSettingsPrivate *priv = settings->priv;
if (priv->default_font_family)
{
_gtk_css_value_unref (priv->default_font_family);
priv->default_font_family = NULL;
}
if (priv->default_font_size)
{
_gtk_css_value_unref (priv->default_font_size);
priv->default_font_size = NULL;
}
_gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (settings));
}