settings: Don't reload config for fontconfig if there's no fontmap

If anything in the system changes the config for fontconfig then an
XSetting will be set to record the last timestamp of the config file.
This is presumably so that applications can be notified that it has
changed and can reload the configuration. However once this setting is
set it will remain set for the lifetime of the X server. This causes
Clutter to handle the setting during the initialisation of the
backend. Previously this would cause problems because Clutter would
end up creating the default PangoFontMap before the backend has
created the CoglContext. The PangoFontMap would in turn cause the
default CoglContext to be created. Clutter will then later create its
own CoglContext which means there will be two and the first one will
be leaked. Cogl currently can't really cope with multiple contexts
being created so it falls apart.

This patch fixes it to skip reloading the config for fontconfig if
there isn't a default font map yet. The config will presumably
naturally be read with the latest values when it is finally created
anyway so it doesn't need to be read immediately.

https://bugzilla.gnome.org/show_bug.cgi?id=693696
This commit is contained in:
Neil Roberts 2013-02-13 14:58:55 +00:00
parent b248941af5
commit 4b92d656c2

View File

@ -216,18 +216,26 @@ settings_update_fontmap (ClutterSettings *self,
if (self->last_fontconfig_timestamp != stamp)
{
PangoFontMap *fontmap;
ClutterMainContext *context;
gboolean update_needed = FALSE;
fontmap = clutter_get_font_map ();
context = _clutter_context_get_default ();
if (PANGO_IS_FC_FONT_MAP (fontmap) &&
!FcConfigUptoDate (NULL))
/* If there is no font map yet then we don't need to do anything
* because the config for fontconfig will be read when it is
* created */
if (context->font_map)
{
pango_fc_font_map_cache_clear (PANGO_FC_FONT_MAP (fontmap));
PangoFontMap *fontmap = PANGO_FONT_MAP (context->font_map);
if (FcInitReinitialize ())
update_needed = TRUE;
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;