diff options
Diffstat (limited to 'src/fcdefault.c')
-rw-r--r-- | src/fcdefault.c | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/src/fcdefault.c b/src/fcdefault.c index a9a3b72..6995216 100644 --- a/src/fcdefault.c +++ b/src/fcdefault.c @@ -211,28 +211,73 @@ retry: return prgname; } +static FcChar8 *default_desktop_name; + +FcChar8 * +FcGetDesktopName (void) +{ + FcChar8 *desktop_name; +retry: + desktop_name = fc_atomic_ptr_get (&default_desktop_name); + if (!desktop_name) + { + char *s = getenv ("XDG_CURRENT_DESKTOP"); + + if (!s) + desktop_name = FcStrdup (""); + else + desktop_name = FcStrdup (s); + if (!desktop_name) + { + fprintf (stderr, "Fontconfig error: out of memory in %s\n", + __FUNCTION__); + return NULL; + } + + if (!fc_atomic_ptr_cmpexch(&default_desktop_name, NULL, desktop_name)) + { + free (desktop_name); + goto retry; + } + } + if (desktop_name && !desktop_name[0]) + return NULL; + + return desktop_name; +} + void FcDefaultFini (void) { FcChar8 *lang; FcStrSet *langs; FcChar8 *prgname; + FcChar8 *desktop; lang = fc_atomic_ptr_get (&default_lang); - if (lang && fc_atomic_ptr_cmpexch (&default_lang, lang, NULL)) { + if (lang && fc_atomic_ptr_cmpexch (&default_lang, lang, NULL)) + { free (lang); } langs = fc_atomic_ptr_get (&default_langs); - if (langs && fc_atomic_ptr_cmpexch (&default_langs, langs, NULL)) { + if (langs && fc_atomic_ptr_cmpexch (&default_langs, langs, NULL)) + { FcRefInit (&langs->ref, 1); FcStrSetDestroy (langs); } prgname = fc_atomic_ptr_get (&default_prgname); - if (prgname && fc_atomic_ptr_cmpexch (&default_prgname, prgname, NULL)) { + if (prgname && fc_atomic_ptr_cmpexch (&default_prgname, prgname, NULL)) + { free (prgname); } + + desktop = fc_atomic_ptr_get (&default_desktop_name); + if (desktop && fc_atomic_ptr_cmpexch(&default_desktop_name, desktop, NULL)) + { + free (desktop); + } } void @@ -336,6 +381,13 @@ FcDefaultSubstitute (FcPattern *pattern) FcPatternObjectAddString (pattern, FC_PRGNAME_OBJECT, prgname); } + if (FcPatternObjectGet (pattern, FC_DESKTOP_NAME_OBJECT, 0, &v) == FcResultNoMatch) + { + FcChar8 *desktop = FcGetDesktopName (); + if (desktop) + FcPatternObjectAddString (pattern, FC_DESKTOP_NAME_OBJECT, desktop); + } + if (!FcPatternFindObjectIter (pattern, &iter, FC_ORDER_OBJECT)) FcPatternObjectAddInteger (pattern, FC_ORDER_OBJECT, 0); } |