From 7d4f371ee900e6388cc900a00095532172db5324 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 18 Aug 2011 15:33:39 +0100 Subject: [PATCH] settings: Add ClutterSettings:fontconfig-timestamp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The :fontconfig-timestamp is a write-only property that will get updated by the underlying platform whenever the fontconfig configuration has been changed — i.e. when the fontconfig caches should be rebuilt after the user has installed a new font. --- clutter/clutter-settings.c | 67 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/clutter/clutter-settings.c b/clutter/clutter-settings.c index f527b455a..403fbeaaf 100644 --- a/clutter/clutter-settings.c +++ b/clutter/clutter-settings.c @@ -23,6 +23,12 @@ #include "clutter-settings.h" +#ifdef HAVE_PANGO_FT2 +/* for pango_fc_font_map_cache_clear() */ +#define PANGO_ENABLE_BACKEND +#include +#endif /* HAVE_PANGO_FT2 */ + #include "clutter-debug.h" #include "clutter-private.h" @@ -61,6 +67,8 @@ struct _ClutterSettings gchar *xft_rgba; gint long_press_duration; + + guint last_fontconfig_timestamp; }; struct _ClutterSettingsClass @@ -89,6 +97,8 @@ enum PROP_LONG_PRESS_DURATION, + PROP_FONTCONFIG_TIMESTAMP, + PROP_LAST }; @@ -184,6 +194,37 @@ settings_update_resolution (ClutterSettings *self) g_signal_emit_by_name (self->backend, "resolution-changed"); } +static void +settings_update_fontmap (ClutterSettings *self, + guint stamp) +{ +#ifdef HAVE_PANGO_FT2 + CLUTTER_NOTE (BACKEND, "Update fontmaps (stamp: %d)", stamp); + + if (self->last_fontconfig_timestamp != stamp) + { + PangoFontMap *fontmap; + gboolean update_needed = FALSE; + + fontmap = clutter_get_font_map (); + + if (PANGO_IS_FC_FONT_MAP (fontmap) && + !FcConfigUptoDate (NULL)) + { + pango_fc_font_map_cache_clear (PANGO_FC_FONT_MAP (fontmap)); + + if (FcInitReinitialize ()) + update_needed = TRUE; + } + + self->last_fontconfig_timestamp = stamp; + + if (update_needed) + g_signal_emit_by_name (self->backend, "font-changed"); + } +#endif /* HAVE_PANGO_FT2 */ +} + static void clutter_settings_finalize (GObject *gobject) { @@ -259,6 +300,10 @@ clutter_settings_set_property (GObject *gobject, self->long_press_duration = g_value_get_int (value); break; + case PROP_FONTCONFIG_TIMESTAMP: + settings_update_fontmap (self, g_value_get_uint (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; @@ -322,11 +367,18 @@ clutter_settings_get_property (GObject *gobject, } static void -clutter_settings_notify (GObject *gobject, - GParamSpec *pspec) +clutter_settings_dispatch_properties_changed (GObject *gobject, + guint n_pspecs, + GParamSpec **pspecs) { ClutterSettings *self = CLUTTER_SETTINGS (gobject); + GObjectClass *klass; + /* chain up to emit ::notify */ + klass = G_OBJECT_CLASS (clutter_settings_parent_class); + klass->dispatch_properties_changed (gobject, n_pspecs, pspecs); + + /* emit settings-changed just once for multiple properties */ g_signal_emit_by_name (self->backend, "settings-changed"); } @@ -524,9 +576,18 @@ clutter_settings_class_init (ClutterSettingsClass *klass) 500, CLUTTER_PARAM_READWRITE); + obj_props[PROP_FONTCONFIG_TIMESTAMP] = + g_param_spec_uint ("fontconfig-timestamp", + P_("Fontconfig configuration timestamp"), + P_("Timestamp of the current fontconfig configuration"), + 0, G_MAXUINT, + 0, + CLUTTER_PARAM_WRITABLE); + gobject_class->set_property = clutter_settings_set_property; gobject_class->get_property = clutter_settings_get_property; - gobject_class->notify = clutter_settings_notify; + gobject_class->dispatch_properties_changed = + clutter_settings_dispatch_properties_changed; gobject_class->finalize = clutter_settings_finalize; g_object_class_install_properties (gobject_class, PROP_LAST, obj_props); }