Skip to content

Commit

Permalink
css: Move default font handling
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
Benjamin Otte committed Dec 1, 2012
1 parent 3ff7f1f commit 1dd3ee6
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 74 deletions.
62 changes: 62 additions & 0 deletions gtk/gtkcssinitialvalue.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand Down
74 changes: 0 additions & 74 deletions gtk/gtksettings.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
{
Expand All @@ -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
Expand All @@ -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);
}

Expand Down Expand Up @@ -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));
}

Expand Down

0 comments on commit 1dd3ee6

Please sign in to comment.