From ec5ca08c807585a9230f83c95f7cca6b7065b142 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 15 Jan 2013 20:41:26 -0600 Subject: [PATCH] Bug 59379 - FC_PRGNAME Can be used for per-application configuration. --- configure.ac | 2 +- doc/fontconfig-devel.sgml | 3 +- doc/fontconfig-user.sgml | 1 + fontconfig/fontconfig.h | 1 + src/fccfg.c | 7 ++++ src/fcdefault.c | 85 ++++++++++++++++++++++++++++++++++++++- src/fcint.h | 3 ++ src/fcobjs.h | 1 + 8 files changed, 99 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 06ac8a2..a520ae7 100644 --- a/configure.ac +++ b/configure.ac @@ -141,7 +141,7 @@ AC_TYPE_PID_T # Checks for library functions. AC_FUNC_VPRINTF AC_FUNC_MMAP -AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp mkostemp _mktemp_s strchr strrchr strtol getopt getopt_long sysconf ftruncate chsize rand random lrand48 random_r rand_r regcomp regerror regexec regfree fstatvfs fstatfs lstat]) +AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp mkostemp _mktemp_s strchr strrchr strtol getopt getopt_long sysconf ftruncate chsize rand random lrand48 random_r rand_r regcomp regerror readlink regexec regfree fstatvfs fstatfs lstat]) dnl AC_CHECK_FUNCS doesn't check for header files. dnl posix_fadvise() may be not available in older libc. diff --git a/doc/fontconfig-devel.sgml b/doc/fontconfig-devel.sgml index b35ef9a..05c5c09 100644 --- a/doc/fontconfig-devel.sgml +++ b/doc/fontconfig-devel.sgml @@ -190,11 +190,12 @@ convenience for the application's rendering mechanism. the font embolden FC_EMBOLDEN Bool Rasterizer should synthetically embolden the font - fontfeatures FC_FONT_FEATURES String List of the feature tags in + fontfeatures FC_FONT_FEATURES String List of extra feature tags in OpenType to be enabled namelang FC_NAMELANG String Language name to be used for the default value of familylang, stylelang and fullnamelang + prgname FC_PRGNAME String Name of the running program diff --git a/doc/fontconfig-user.sgml b/doc/fontconfig-user.sgml index 068b1fc..90e246b 100644 --- a/doc/fontconfig-user.sgml +++ b/doc/fontconfig-user.sgml @@ -132,6 +132,7 @@ convenience for the applications' rendering mechanism. capability String List of layout capabilities in the font embolden Bool Rasterizer should synthetically embolden the font fontfeatures String List of the feature tags in OpenType to be enabled + prgname String String Name of the running program diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h index 3676fc1..dc2532f 100644 --- a/fontconfig/fontconfig.h +++ b/fontconfig/fontconfig.h @@ -114,6 +114,7 @@ typedef int FcBool; #define FC_LCD_FILTER "lcdfilter" /* Int */ #define FC_FONT_FEATURES "fontfeatures" /* String */ #define FC_NAMELANG "namelang" /* String RFC 3866 langs */ +#define FC_PRGNAME "prgname" /* String */ #define FC_CACHE_SUFFIX ".cache-" FC_CACHE_VERSION #define FC_DIR_CACHE_FILE "fonts.cache-" FC_CACHE_VERSION diff --git a/src/fccfg.c b/src/fccfg.c index 877a4f5..3e9fdab 100644 --- a/src/fccfg.c +++ b/src/fccfg.c @@ -1478,6 +1478,7 @@ FcConfigSubstituteWithPat (FcConfig *config, FcPattern *p_pat, FcMatchKind kind) { + FcValue v; FcSubst *s; FcSubState *st; int i; @@ -1513,6 +1514,12 @@ FcConfigSubstituteWithPat (FcConfig *config, } FcStrListDone (l); } + if (FcPatternObjectGet (p, FC_PRGNAME_OBJECT, 0, &v) == FcResultNoMatch) + { + FcChar8 *prgname = FcGetPrgname (); + if (prgname) + FcPatternObjectAddString (p, FC_PRGNAME_OBJECT, prgname); + } break; case FcMatchFont: s = config->substFont; diff --git a/src/fcdefault.c b/src/fcdefault.c index 6937994..aa47840 100644 --- a/src/fcdefault.c +++ b/src/fcdefault.c @@ -104,11 +104,81 @@ retry: return lang; } +static FcChar8 *default_prgname; + +FcChar8 * +FcGetPrgname (void) +{ + FcChar8 *prgname; +retry: + prgname = fc_atomic_ptr_get (&default_prgname); + if (!prgname) + { +#ifdef _WIN32 + char buf[MAX_PATH+1]; + + /* TODO This is ASCII-only; fix it. */ + if (GetModuleFileNameA (GetModuleHandle (NULL), buf, sizeof (buf) / sizeof (buf[0])) > 0) + { + char *p; + unsigned int len; + + p = strrchr (buf, '\\'); + if (p) + p++; + else + p = buf; + + len = strlen (p); + + if (len > 4 && 0 == strcmp (p + len - 4, ".exe")) + { + len -= 4; + buf[len] = '\0'; + } + + prgname = FcStrdup (p); + } +#else + char buf[8192]; + unsigned int len; + + len = readlink ("/proc/self/exe", buf, sizeof (buf) - 1); + if (len > 0) + { + char *p; + + p = strrchr (buf, '/'); + if (p) + p++; + else + p = buf; + + prgname = FcStrdup (p); + } +#endif + + if (!prgname) + prgname = FcStrdup (""); + + if (!fc_atomic_ptr_cmpexch (&default_prgname, NULL, prgname)) { + free (prgname); + goto retry; + } + } + + if (prgname && !prgname[0]) + return NULL; + + return prgname; +} + void FcDefaultFini (void) { FcChar8 *lang; FcStrSet *langs; + FcChar8 *prgname; lang = fc_atomic_ptr_get (&default_lang); if (lang && fc_atomic_ptr_cmpexch (&default_lang, lang, NULL)) { @@ -120,6 +190,11 @@ FcDefaultFini (void) FcRefInit (&langs->ref, 1); FcStrSetDestroy (langs); } + + prgname = fc_atomic_ptr_get (&default_prgname); + if (prgname && fc_atomic_ptr_cmpexch (&default_prgname, prgname, NULL)) { + free (prgname); + } } void @@ -195,7 +270,7 @@ FcDefaultSubstitute (FcPattern *pattern) * exact matched "en" has higher score than ll-cc. */ v2.type = FcTypeString; - v2.u.s = FcStrdup ("en-us"); + v2.u.s = (FcChar8 *) "en-us"; if (FcPatternObjectGet (pattern, FC_FAMILYLANG_OBJECT, 0, &v) == FcResultNoMatch) { FcPatternObjectAdd (pattern, FC_FAMILYLANG_OBJECT, namelang, FcTrue); @@ -211,7 +286,13 @@ FcDefaultSubstitute (FcPattern *pattern) FcPatternObjectAdd (pattern, FC_FULLNAMELANG_OBJECT, namelang, FcTrue); FcPatternObjectAddWithBinding (pattern, FC_FULLNAMELANG_OBJECT, v2, FcValueBindingWeak, FcTrue); } - FcFree (v2.u.s); + + if (FcPatternObjectGet (pattern, FC_PRGNAME_OBJECT, 0, &v) == FcResultNoMatch) + { + FcChar8 *prgname = FcGetPrgname (); + if (prgname) + FcPatternObjectAddString (pattern, FC_PRGNAME_OBJECT, prgname); + } } #define __fcdefault__ #include "fcaliastail.h" diff --git a/src/fcint.h b/src/fcint.h index 5129267..3cf526f 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -770,6 +770,9 @@ FcInitDebug (void); FcPrivate FcChar8 * FcGetDefaultLang (void); +FcPrivate FcChar8 * +FcGetPrgname (void); + FcPrivate void FcDefaultFini (void); diff --git a/src/fcobjs.h b/src/fcobjs.h index cbe0190..ad803eb 100644 --- a/src/fcobjs.h +++ b/src/fcobjs.h @@ -42,4 +42,5 @@ FC_OBJECT (DECORATIVE, FcTypeBool) FC_OBJECT (LCD_FILTER, FcTypeInteger) FC_OBJECT (NAMELANG, FcTypeString) FC_OBJECT (FONT_FEATURES, FcTypeString) +FC_OBJECT (PRGNAME, FcTypeString) /* ^-------------- Add new objects here. */