From 225bcbe89a105b8960cbfdb230a5764aa3ca1f8b Mon Sep 17 00:00:00 2001 From: Linus Dierheimer Date: Fri, 14 May 2021 12:43:54 +0200 Subject: [PATCH] Mate support --- src/common/detectGTK.c | 6 ++++++ src/common/detectPlasma.c | 7 +++++++ src/common/detectWMDE.c | 42 ++++++++++++++++++++++++++++++++++++++- src/modules/wmtheme.c | 23 +++++++++++++++++---- 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/common/detectGTK.c b/src/common/detectGTK.c index be9096d59..8e356a2dd 100644 --- a/src/common/detectGTK.c +++ b/src/common/detectGTK.c @@ -52,6 +52,12 @@ static void detectGTKFromDConf(FFinstance* instance, FFGTKResult* result) iconsName = ffSettingsGet(instance, "/org/cinnamon/desktop/interface/icon-theme", "org.cinnamon.desktop.interface", NULL, "icon-theme", FF_VARIANT_TYPE_STRING).strValue; fontName = ffSettingsGet(instance, "/org/cinnamon/desktop/interface/font-name", "org.cinnamon.desktop.interface", NULL, "font-name", FF_VARIANT_TYPE_STRING).strValue; } + else if(ffStrbufIgnCaseCompS(&wmde->dePrettyName, "Mate") == 0) + { + themeName = ffSettingsGet(instance, "/org/mate/interface/gtk-theme", "org.mate.interface", NULL, "gtk-theme", FF_VARIANT_TYPE_STRING).strValue; + iconsName = ffSettingsGet(instance, "/org/mate/interface/icon-theme", "org.mate.interface", NULL, "icon-theme", FF_VARIANT_TYPE_STRING).strValue; + fontName = ffSettingsGet(instance, "/org/mate/interface/font-name", "org.mate.interface", NULL, "font-name", FF_VARIANT_TYPE_STRING).strValue; + } //Fallback + Gnome impl if(themeName == NULL) diff --git a/src/common/detectPlasma.c b/src/common/detectPlasma.c index 42a17b13f..b0ad9e5dd 100644 --- a/src/common/detectPlasma.c +++ b/src/common/detectPlasma.c @@ -78,6 +78,13 @@ const FFPlasmaResult* ffDetectPlasma(FFinstance* instance) ffStrbufInit(&result.icons); ffStrbufInit(&result.font); + const FFWMDEResult* wmde = ffDetectWMDE(instance); + if(ffStrbufIgnCaseCompS(&wmde->deProcessName, "plasmashell") != 0) + { + pthread_mutex_unlock(&mutex); + return &result; + } + bool foundAFile = false; //We need to do this because we use multiple threads on configDirs diff --git a/src/common/detectWMDE.c b/src/common/detectWMDE.c index f755c2442..6c1ffabfe 100644 --- a/src/common/detectWMDE.c +++ b/src/common/detectWMDE.c @@ -18,7 +18,8 @@ typedef enum DEHint FF_DE_HINT_PLASMA, FF_DE_HINT_GNOME, FF_DE_HINT_CINNAMON, - FF_DE_HINT_XFCE4 + FF_DE_HINT_XFCE4, + FF_DE_HINT_MATE } DEHint; typedef struct ProcData @@ -118,6 +119,11 @@ static bool applyPrettyNameIfWM(FFWMDEResult* result, const FFstrbuf* processNam ffStrbufSetS(&result->wmPrettyName, "Xfwm4"); *protocolHint = FF_PROTOCOL_HINT_X11; } + else if(ffStrbufIgnCaseCompS(processName, "Marco") == 0) + { + ffStrbufSetS(&result->wmPrettyName, "Marco"); + *protocolHint = FF_PROTOCOL_HINT_X11; + } else if(ffStrbufIgnCaseCompS(processName, "gnome-session-binary") == 0) ffStrbufSetS(&result->wmPrettyName, "Mutter"); else if(ffStrbufIgnCaseCompS(processName, "cinnamon-session") == 0) @@ -142,6 +148,8 @@ static bool applyDEHintIfDE(const FFstrbuf* processName, DEHint* deHint) *deHint = FF_DE_HINT_CINNAMON; else if(ffStrbufIgnCaseCompS(processName, "xfce4-session") == 0) *deHint = FF_DE_HINT_XFCE4; + else if(ffStrbufIgnCaseCompS(processName, "mate-session") == 0) + *deHint = FF_DE_HINT_MATE; return *deHint != FF_DE_HINT_UNKNOWN; } @@ -221,6 +229,34 @@ static void getCinnamon(FFWMDEResult* result) ffParsePropFile("/usr/share/applications/cinnamon.desktop", "X-GNOME-Bugzilla-Version=", &result->deVersion); } +static void getMate(FFinstance* instance, FFWMDEResult* result) +{ + ffStrbufSetS(&result->deProcessName, "mate-session"); + ffStrbufSetS(&result->dePrettyName, "MATE"); + + //I parse the file 3 times by purpose, because the properties are not guaranteed to be in order + ffParsePropFile("/usr/share/mate-about/mate-version.xml", "", &result->deVersion); + ffStrbufSubstrBeforeFirstC(&result->deVersion, '<'); + ffStrbufAppendC(&result->deVersion, '.'); + ffParsePropFile("/usr/share/mate-about/mate-version.xml", "", &result->deVersion); + ffStrbufSubstrBeforeFirstC(&result->deVersion, '<'); + ffStrbufAppendC(&result->deVersion, '.'); + ffParsePropFile("/usr/share/mate-about/mate-version.xml", "", &result->deVersion); + ffStrbufSubstrBeforeFirstC(&result->deVersion, '<'); + + if(result->deVersion.length == 0 && instance->config.allowSlowOperations) + { + ffProcessAppendStdOut(&result->deVersion, (char* const[]){ + "mate-session", + "--version", + NULL + }); + + ffStrbufSubstrAfterFirstC(&result->deVersion, ' '); + ffStrbufTrim(&result->deVersion, ' '); + } +} + static void getXFCE4(FFinstance* instance, FFWMDEResult* result) { ffStrbufSetS(&result->deProcessName, "xfce4-session"); @@ -257,6 +293,8 @@ static inline void getDEFromHint(FFinstance* instance, FFWMDEResult* result, Pro getCinnamon(result); else if(procData->deHint == FF_DE_HINT_XFCE4) getXFCE4(instance, result); + else if(procData->deHint == FF_DE_HINT_MATE) + getMate(instance, result); } static inline void getDE(FFinstance* instance, FFWMDEResult* result, ProcData* procData) @@ -280,6 +318,8 @@ static inline void getDE(FFinstance* instance, FFWMDEResult* result, ProcData* p getCinnamon(result); else if(strcasecmp(result->sessionDesktop, "XFCE") == 0 || strcasecmp(result->sessionDesktop, "X-XFCE") == 0 || strcasecmp(result->sessionDesktop, "XFCE4") == 0 || strcasecmp(result->sessionDesktop, "X-XFCE4") == 0) getXFCE4(instance, result); + else if(strcasecmp(result->sessionDesktop, "MATE") == 0 || strcasecmp(result->sessionDesktop, "X-MATE") == 0) + getMate(instance, result); else { ffStrbufSetS(&result->deProcessName, result->sessionDesktop); diff --git a/src/modules/wmtheme.c b/src/modules/wmtheme.c index 085d06683..4746f64bd 100644 --- a/src/modules/wmtheme.c +++ b/src/modules/wmtheme.c @@ -37,7 +37,7 @@ static void printWMThemeFromConfigFile(FFinstance* instance, const char* configF if(defaultValue == NULL) { - ffPrintError(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmThemeKey, &instance->config.wmThemeFormat, FF_WMTHEME_NUM_FORMAT_ARGS, "Couldn't find theme in %s", configFile); + ffPrintError(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmThemeKey, &instance->config.wmThemeFormat, FF_WMTHEME_NUM_FORMAT_ARGS, "Couldn't find WM theme in %s", configFile); return; } @@ -49,14 +49,27 @@ static void printWMThemeFromConfigFile(FFinstance* instance, const char* configF ffStrbufDestroy(&theme); } +static void printWMThemeFromSettings(FFinstance* instance, const char* dconfKey, const char* gsettingsSchemaName, const char* gsettingsPath, const char* gsettingsKey) +{ + const char* theme = ffSettingsGet(instance, dconfKey, gsettingsSchemaName, gsettingsPath, gsettingsKey, FF_VARIANT_TYPE_STRING).strValue; + + if(theme == NULL || *theme == '\0') + { + ffPrintError(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmThemeKey, &instance->config.wmThemeFormat, FF_WMTHEME_NUM_FORMAT_ARGS, "Couldn't find WM theme in DConf or GSettings"); + return; + } + + printWMTheme(instance, theme); +} + static void printMutter(FFinstance* instance) { const char* theme = ffSettingsGet(instance, "/org/gnome/shell/extensions/user-theme/name", "org.gnome.shell.extensions.user-theme", NULL, "name", FF_VARIANT_TYPE_STRING).strValue; - if(theme == NULL) + if(theme == NULL || *theme == '\0') theme = ffSettingsGet(instance, "/org/gnome/desktop/wm/preferences/theme", "org.gnome.desktop.wm.preferences", NULL, "theme", FF_VARIANT_TYPE_STRING).strValue; - if(theme == NULL) + if(theme == NULL || *theme == '\0') { ffPrintError(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmThemeKey, &instance->config.wmThemeFormat, FF_WMTHEME_NUM_FORMAT_ARGS, "Couldn't found mutter theme in GSettings / DConf"); return; @@ -190,8 +203,10 @@ void ffPrintWMTheme(FFinstance* instance) printMutter(instance); else if(ffStrbufIgnCaseCompS(&result->wmPrettyName, "Muffin") == 0) printMuffin(instance); + else if(ffStrbufIgnCaseCompS(&result->wmPrettyName, "Marco") == 0) + printWMThemeFromSettings(instance, "/org/mate/Marco/general/theme", "org.mate.Marco.general", NULL, "theme"); else if(ffStrbufIgnCaseCompS(&result->wmPrettyName, "Openbox") == 0) printOpenbox(instance, &result->dePrettyName); else - ffPrintError(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmThemeKey, &instance->config.wmThemeFormat, FF_WMTHEME_NUM_FORMAT_ARGS, "Unknown WM: %s", result->dePrettyName.chars); + ffPrintError(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmThemeKey, &instance->config.wmThemeFormat, FF_WMTHEME_NUM_FORMAT_ARGS, "Unknown WM: %s", result->wmPrettyName.chars); }