summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAkira TAGOH <akira@tagoh.org>2022-11-25 21:15:32 +0900
committerAkira TAGOH <akira@tagoh.org>2022-11-26 14:37:49 +0900
commit6715a14f138df01c11110488b7edbf514e4076b4 (patch)
tree0498006d172ceda759896d260a6c12d0428d9857 /src
parenteb0a199e0658d3ba64ff19072cb2ae39c5ca7c4c (diff)
downloadfontconfig-6715a14f138df01c11110488b7edbf514e4076b4.tar.gz
Add FC_DESKTOP_NAME property
To allow users to have desktop-specific matching rule.
Diffstat (limited to 'src')
-rw-r--r--src/fcdefault.c58
-rw-r--r--src/fcint.h7
-rw-r--r--src/fcobjs.h1
-rw-r--r--src/fcxml.c14
4 files changed, 68 insertions, 12 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);
}
diff --git a/src/fcint.h b/src/fcint.h
index c615b66..78cee54 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -199,7 +199,7 @@ typedef struct _FcValueList {
} FcValueList;
#define FcValueListNext(vl) FcPointerMember(vl,next,FcValueList)
-
+
typedef int FcObject;
/* The 1024 is to leave some room for future added internal objects, such
@@ -238,7 +238,7 @@ struct _FcPattern {
FcFontSetFonts(fs)[i], \
FcPattern) : \
fs->fonts[i])
-
+
typedef enum _FcOp {
FcOpInteger, FcOpDouble, FcOpString, FcOpMatrix, FcOpRange, FcOpBool, FcOpCharSet, FcOpLangSet,
FcOpNil,
@@ -909,6 +909,9 @@ FcGetDefaultLang (void);
FcPrivate FcChar8 *
FcGetPrgname (void);
+FcPrivate FcChar8 *
+FcGetDesktopName (void);
+
FcPrivate void
FcDefaultFini (void);
diff --git a/src/fcobjs.h b/src/fcobjs.h
index acc0471..1cd8ed3 100644
--- a/src/fcobjs.h
+++ b/src/fcobjs.h
@@ -74,4 +74,5 @@ FC_OBJECT (FONT_VARIATIONS, FcTypeString, NULL)
FC_OBJECT (VARIABLE, FcTypeBool, FcCompareBool)
FC_OBJECT (FONT_HAS_HINT, FcTypeBool, FcCompareBool)
FC_OBJECT (ORDER, FcTypeInteger, FcCompareNumber)
+FC_OBJECT (DESKTOP_NAME, FcTypeString, NULL)
/* ^-------------- Add new objects here. */
diff --git a/src/fcxml.c b/src/fcxml.c
index 82a46f2..74c892d 100644
--- a/src/fcxml.c
+++ b/src/fcxml.c
@@ -367,7 +367,7 @@ typedef enum _FcElement {
FcElementDescription,
FcElementRemapDir,
FcElementResetDirs,
-
+
FcElementRescan,
FcElementPrefer,
@@ -731,7 +731,7 @@ FcTypecheckExpr (FcConfigParse *parse, FcExpr *expr, FcType type)
if (o)
FcTypecheckValue (parse, o->type, type);
}
- else
+ else
FcConfigMessage (parse, FcSevereWarning,
"invalid constant used : %s",
expr->u.constant);
@@ -794,7 +794,7 @@ FcTestCreate (FcConfigParse *parse,
if (test)
{
const FcObjectType *o;
-
+
test->kind = kind;
test->qual = qual;
test->object = FcObjectFromName ((const char *) field);
@@ -1533,7 +1533,7 @@ FcStrtod (char *s, char **end)
{
char buf[128];
int slen = strlen (s);
-
+
if (slen + dlen > (int) sizeof (buf))
{
if (end)
@@ -3101,7 +3101,7 @@ FcParsePattern (FcConfigParse *parse)
FcConfigMessage (parse, FcSevereError, "out of memory");
return;
}
-
+
while ((vstack = FcVStackPeek (parse)))
{
switch ((int) vstack->tag) {
@@ -3176,7 +3176,7 @@ FcEndElement(void *userData, const XML_Char *name FC_UNUSED)
case FcElementRescan:
FcParseRescan (parse);
break;
-
+
case FcElementPrefer:
FcParseFamilies (parse, FcVStackPrefer);
break;
@@ -3512,7 +3512,7 @@ FcConfigParseAndLoadFromMemoryInternal (FcConfig *config,
XML_SetDoctypeDeclHandler (p, FcStartDoctypeDecl, FcEndDoctypeDecl);
XML_SetElementHandler (p, FcStartElement, FcEndElement);
XML_SetCharacterDataHandler (p, FcCharacterData);
-
+
#endif /* ENABLE_LIBXML2 */
#ifndef ENABLE_LIBXML2