fcinit.c revision 6338c9e2
12c393a42Smrg/* 2a6844aabSmrg * fontconfig/src/fcinit.c 32c393a42Smrg * 42c393a42Smrg * Copyright © 2001 Keith Packard 52c393a42Smrg * 62c393a42Smrg * Permission to use, copy, modify, distribute, and sell this software and its 72c393a42Smrg * documentation for any purpose is hereby granted without fee, provided that 82c393a42Smrg * the above copyright notice appear in all copies and that both that 92c393a42Smrg * copyright notice and this permission notice appear in supporting 10ca08ab68Smrg * documentation, and that the name of the author(s) not be used in 112c393a42Smrg * advertising or publicity pertaining to distribution of the software without 12ca08ab68Smrg * specific, written prior permission. The authors make no 132c393a42Smrg * representations about the suitability of this software for any purpose. It 142c393a42Smrg * is provided "as is" without express or implied warranty. 152c393a42Smrg * 16a6844aabSmrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 172c393a42Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 18a6844aabSmrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR 192c393a42Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 202c393a42Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 212c393a42Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 222c393a42Smrg * PERFORMANCE OF THIS SOFTWARE. 232c393a42Smrg */ 242c393a42Smrg 252c393a42Smrg#include "fcint.h" 262c393a42Smrg#include <stdlib.h> 272c393a42Smrg 28c9710b42Smrg#if defined(FC_ATOMIC_INT_NIL) 296338c9e2Sriastradh#warning Could not find any system to define atomic_int macros, library may NOT be thread-safe. 30c9710b42Smrg#endif 31c9710b42Smrg#if defined(FC_MUTEX_IMPL_NIL) 326338c9e2Sriastradh#warning Could not find any system to define mutex macros, library may NOT be thread-safe. 33c9710b42Smrg#endif 34c9710b42Smrg#if defined(FC_ATOMIC_INT_NIL) || defined(FC_MUTEX_IMPL_NIL) 356338c9e2Sriastradh#warning To suppress these warnings, define FC_NO_MT. 36c9710b42Smrg#endif 37c9710b42Smrg 382c393a42Smrgstatic FcConfig * 392c393a42SmrgFcInitFallbackConfig (void) 402c393a42Smrg{ 412c393a42Smrg FcConfig *config; 422c393a42Smrg 432c393a42Smrg config = FcConfigCreate (); 442c393a42Smrg if (!config) 452c393a42Smrg goto bail0; 462c393a42Smrg if (!FcConfigAddDir (config, (FcChar8 *) FC_DEFAULT_FONTS)) 472c393a42Smrg goto bail1; 482c393a42Smrg if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR)) 492c393a42Smrg goto bail1; 502c393a42Smrg return config; 512c393a42Smrg 522c393a42Smrgbail1: 532c393a42Smrg FcConfigDestroy (config); 542c393a42Smrgbail0: 552c393a42Smrg return 0; 562c393a42Smrg} 572c393a42Smrg 582c393a42Smrgint 592c393a42SmrgFcGetVersion (void) 602c393a42Smrg{ 612c393a42Smrg return FC_VERSION; 622c393a42Smrg} 632c393a42Smrg 642c393a42Smrg/* 652c393a42Smrg * Load the configuration files 662c393a42Smrg */ 672c393a42SmrgFcConfig * 68c9710b42SmrgFcInitLoadOwnConfig (FcConfig *config) 692c393a42Smrg{ 70c9710b42Smrg if (!config) 71c9710b42Smrg { 72c9710b42Smrg config = FcConfigCreate (); 73c9710b42Smrg if (!config) 74c9710b42Smrg return NULL; 75c9710b42Smrg } 76ca08ab68Smrg 772c393a42Smrg FcInitDebug (); 78ca08ab68Smrg 792c393a42Smrg if (!FcConfigParseAndLoad (config, 0, FcTrue)) 802c393a42Smrg { 812c393a42Smrg FcConfigDestroy (config); 822c393a42Smrg return FcInitFallbackConfig (); 832c393a42Smrg } 84ca08ab68Smrg 852c393a42Smrg if (config->cacheDirs && config->cacheDirs->num == 0) 862c393a42Smrg { 87c9710b42Smrg FcChar8 *prefix, *p; 88ca08ab68Smrg size_t plen; 89ca08ab68Smrg 902c393a42Smrg fprintf (stderr, 912c393a42Smrg "Fontconfig warning: no <cachedir> elements found. Check configuration.\n"); 922c393a42Smrg fprintf (stderr, 932c393a42Smrg "Fontconfig warning: adding <cachedir>%s</cachedir>\n", 942c393a42Smrg FC_CACHEDIR); 95ca08ab68Smrg prefix = FcConfigXdgCacheHome (); 96ca08ab68Smrg if (!prefix) 97ca08ab68Smrg goto bail; 98c9710b42Smrg plen = strlen ((const char *)prefix); 99c9710b42Smrg p = realloc (prefix, plen + 12); 100c9710b42Smrg if (!p) 101ca08ab68Smrg goto bail; 102c9710b42Smrg prefix = p; 103ca08ab68Smrg memcpy (&prefix[plen], FC_DIR_SEPARATOR_S "fontconfig", 11); 104ca08ab68Smrg prefix[plen + 11] = 0; 1052c393a42Smrg fprintf (stderr, 106ca08ab68Smrg "Fontconfig warning: adding <cachedir prefix=\"xdg\">fontconfig</cachedir>\n"); 107ca08ab68Smrg 1082c393a42Smrg if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) || 109ca08ab68Smrg !FcConfigAddCacheDir (config, (FcChar8 *) prefix)) 1102c393a42Smrg { 111ca08ab68Smrg bail: 1122c393a42Smrg fprintf (stderr, 1132c393a42Smrg "Fontconfig error: out of memory"); 114c9710b42Smrg if (prefix) 115c9710b42Smrg FcStrFree (prefix); 1162c393a42Smrg FcConfigDestroy (config); 1172c393a42Smrg return FcInitFallbackConfig (); 1182c393a42Smrg } 119c9710b42Smrg FcStrFree (prefix); 1202c393a42Smrg } 1212c393a42Smrg 1222c393a42Smrg return config; 1232c393a42Smrg} 1242c393a42Smrg 125c9710b42SmrgFcConfig * 126c9710b42SmrgFcInitLoadConfig (void) 127c9710b42Smrg{ 128c9710b42Smrg return FcInitLoadOwnConfig (NULL); 129c9710b42Smrg} 130c9710b42Smrg 1312c393a42Smrg/* 1322c393a42Smrg * Load the configuration files and scan for available fonts 1332c393a42Smrg */ 1342c393a42SmrgFcConfig * 135c9710b42SmrgFcInitLoadOwnConfigAndFonts (FcConfig *config) 1362c393a42Smrg{ 137c9710b42Smrg config = FcInitLoadOwnConfig (config); 1382c393a42Smrg if (!config) 1392c393a42Smrg return 0; 1402c393a42Smrg if (!FcConfigBuildFonts (config)) 1412c393a42Smrg { 1422c393a42Smrg FcConfigDestroy (config); 1432c393a42Smrg return 0; 1442c393a42Smrg } 1452c393a42Smrg return config; 1462c393a42Smrg} 1472c393a42Smrg 148c9710b42SmrgFcConfig * 149c9710b42SmrgFcInitLoadConfigAndFonts (void) 150c9710b42Smrg{ 151c9710b42Smrg return FcInitLoadOwnConfigAndFonts (NULL); 152c9710b42Smrg} 153c9710b42Smrg 1542c393a42Smrg/* 1552c393a42Smrg * Initialize the default library configuration 1562c393a42Smrg */ 1572c393a42SmrgFcBool 1582c393a42SmrgFcInit (void) 1592c393a42Smrg{ 160c9710b42Smrg return FcConfigInit (); 1612c393a42Smrg} 1622c393a42Smrg 1632c393a42Smrg/* 1642c393a42Smrg * Free all library-allocated data structures. 1652c393a42Smrg */ 1662c393a42Smrgvoid 1672c393a42SmrgFcFini (void) 1682c393a42Smrg{ 169c9710b42Smrg FcConfigFini (); 1702c393a42Smrg FcCacheFini (); 171c9710b42Smrg FcDefaultFini (); 1722c393a42Smrg} 1732c393a42Smrg 1742c393a42Smrg/* 1752c393a42Smrg * Reread the configuration and available font lists 1762c393a42Smrg */ 1772c393a42SmrgFcBool 1782c393a42SmrgFcInitReinitialize (void) 1792c393a42Smrg{ 1802c393a42Smrg FcConfig *config; 1812c393a42Smrg 1822c393a42Smrg config = FcInitLoadConfigAndFonts (); 1832c393a42Smrg if (!config) 1842c393a42Smrg return FcFalse; 185c9710b42Smrg return FcConfigSetCurrent (config); 1862c393a42Smrg} 1872c393a42Smrg 1882c393a42SmrgFcBool 1892c393a42SmrgFcInitBringUptoDate (void) 1902c393a42Smrg{ 1912c393a42Smrg FcConfig *config = FcConfigGetCurrent (); 1922c393a42Smrg time_t now; 1932c393a42Smrg 1942c393a42Smrg /* 1952c393a42Smrg * rescanInterval == 0 disables automatic up to date 1962c393a42Smrg */ 1972c393a42Smrg if (config->rescanInterval == 0) 1982c393a42Smrg return FcTrue; 1992c393a42Smrg /* 2002c393a42Smrg * Check no more often than rescanInterval seconds 2012c393a42Smrg */ 2022c393a42Smrg now = time (0); 2032c393a42Smrg if (config->rescanTime + config->rescanInterval - now > 0) 2042c393a42Smrg return FcTrue; 2052c393a42Smrg /* 2062c393a42Smrg * If up to date, don't reload configuration 2072c393a42Smrg */ 2082c393a42Smrg if (FcConfigUptoDate (0)) 2092c393a42Smrg return FcTrue; 2102c393a42Smrg return FcInitReinitialize (); 2112c393a42Smrg} 2122c393a42Smrg 2132c393a42Smrg#define __fcinit__ 2142c393a42Smrg#include "fcaliastail.h" 2152c393a42Smrg#undef __fcinit__ 216