From 31241b64d89bbb987044c57f1ee9f37cff792223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 28 Apr 2023 19:11:55 +0800 Subject: [PATCH] WMTheme: add JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 6 +-- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 6 +++ src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/wmtheme.c | 29 ------------ src/modules/wmtheme/option.h | 11 +++++ src/modules/wmtheme/wmtheme.c | 72 +++++++++++++++++++++++++++++ src/modules/wmtheme/wmtheme.h | 16 +++++++ 12 files changed, 115 insertions(+), 38 deletions(-) delete mode 100644 src/modules/wmtheme.c create mode 100644 src/modules/wmtheme/option.h create mode 100644 src/modules/wmtheme/wmtheme.c create mode 100644 src/modules/wmtheme/wmtheme.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f25f85132..c6367dd45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,7 +312,7 @@ set(LIBFASTFETCH_SRC src/modules/weather.c src/modules/wifi.c src/modules/wm.c - src/modules/wmtheme.c + src/modules/wmtheme/wmtheme.c src/modules/jsonconfig/jsonconfig.c src/util/FFlist.c src/util/FFstrbuf.c diff --git a/src/common/init.c b/src/common/init.c index 5a1f57ce2..b09f7bc05 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -74,7 +74,7 @@ static void defaultConfig(FFinstance* instance) ffInitDisplayOptions(&instance->config.display); initModuleArg(&instance->config.de); initModuleArg(&instance->config.wm); - initModuleArg(&instance->config.wmTheme); + ffInitWMThemeOptions(&instance->config.wmTheme); initModuleArg(&instance->config.theme); initModuleArg(&instance->config.icons); ffInitFontOptions(&instance->config.font); @@ -296,7 +296,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyDisplayOptions(&instance->config.display); destroyModuleArg(&instance->config.de); destroyModuleArg(&instance->config.wm); - destroyModuleArg(&instance->config.wmTheme); + ffDestroyWMThemeOptions(&instance->config.wmTheme); destroyModuleArg(&instance->config.theme); destroyModuleArg(&instance->config.icons); ffDestroyFontOptions(&instance->config.font); diff --git a/src/fastfetch.c b/src/fastfetch.c index fc7066f1f..3500d9553 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -991,7 +991,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "de", &instance->config.de)) {} else if(optionParseModuleArgs(key, value, "wifi", &instance->config.wifi)) {} else if(optionParseModuleArgs(key, value, "wm", &instance->config.wm)) {} - else if(optionParseModuleArgs(key, value, "wm-theme", &instance->config.wmTheme)) {} + else if(ffParseWMThemeCommandOptions(&instance->config.wmTheme, key, value)) {} else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} else if(optionParseModuleArgs(key, value, "icons", &instance->config.icons)) {} else if(optionParseModuleArgs(key, value, "wallpaper", &instance->config.wallpaper)) {} @@ -1202,8 +1202,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintWM(instance); else if(strcasecmp(line, "theme") == 0) ffPrintTheme(instance); - else if(strcasecmp(line, "wmtheme") == 0) - ffPrintWMTheme(instance); + else if(strcasecmp(line, FF_WMTHEME_MODULE_NAME) == 0) + ffPrintWMTheme(instance, &instance->config.wmTheme); else if(strcasecmp(line, "icons") == 0) ffPrintIcons(instance); else if(strcasecmp(line, "wallpaper") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 482526e29..2ba69c847 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -74,7 +74,7 @@ typedef struct FFconfig FFModuleArgs wallpaper; FFModuleArgs wifi; FFModuleArgs wm; - FFModuleArgs wmTheme; + FFWMThemeOptions wmTheme; FFModuleArgs theme; FFModuleArgs icons; FFFontOptions font; @@ -205,7 +205,6 @@ void ffPrintPackages(FFinstance* instance); void ffPrintShell(FFinstance* instance); void ffPrintDesktopEnvironment(FFinstance* instance); void ffPrintWM(FFinstance* instance); -void ffPrintWMTheme(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index a30b9c528..5a72a214a 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -36,7 +36,7 @@ int main(int argc, char** argv) // ffPrintBrightness(&instance); ffPrintDesktopEnvironment(&instance); ffPrintWM(&instance); - ffPrintWMTheme(&instance); + ffPrintWMTheme(&instance, &instance.config.wmTheme); ffPrintTheme(&instance); ffPrintIcons(&instance); ffPrintFont(&instance, &instance.config.font); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 4029c0a7d..b03fe7dca 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -113,6 +113,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'W': { + return + tryModule(instance, type, module, FF_WMTHEME_MODULE_NAME, ffParseWMThemeJsonObject) || + false; + } + default: return false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 0736365c4..07180f83b 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -30,3 +30,4 @@ #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" #include "modules/uptime/uptime.h" +#include "modules/wmtheme/wmtheme.h" diff --git a/src/modules/options.h b/src/modules/options.h index 1947123e5..4bd339b16 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -27,3 +27,4 @@ #include "modules/sound/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" +#include "modules/wmtheme/option.h" diff --git a/src/modules/wmtheme.c b/src/modules/wmtheme.c deleted file mode 100644 index 91e46911c..000000000 --- a/src/modules/wmtheme.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/wmtheme/wmtheme.h" - -#define FF_WMTHEME_MODULE_NAME "WM Theme" -#define FF_WMTHEME_NUM_FORMAT_ARGS 1 - -void ffPrintWMTheme(FFinstance* instance) -{ - FF_STRBUF_AUTO_DESTROY themeOrError = ffStrbufCreate(); - if(ffDetectWmTheme(instance, &themeOrError)) - { - if(instance->config.wmTheme.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmTheme.key); - puts(themeOrError.chars); - } - else - { - ffPrintFormat(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmTheme, FF_WMTHEME_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &themeOrError} - }); - } - } - else - { - ffPrintError(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmTheme, "%*s", themeOrError.length, themeOrError.chars); - } -} diff --git a/src/modules/wmtheme/option.h b/src/modules/wmtheme/option.h new file mode 100644 index 000000000..11b14458b --- /dev/null +++ b/src/modules/wmtheme/option.h @@ -0,0 +1,11 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFWMThemeOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFWMThemeOptions; diff --git a/src/modules/wmtheme/wmtheme.c b/src/modules/wmtheme/wmtheme.c new file mode 100644 index 000000000..4a2ffbcd2 --- /dev/null +++ b/src/modules/wmtheme/wmtheme.c @@ -0,0 +1,72 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/wmtheme/wmtheme.h" +#include "modules/wmtheme/wmtheme.h" + +#define FF_WMTHEME_DISPLAY_NAME "WM Theme" +#define FF_WMTHEME_NUM_FORMAT_ARGS 1 + +void ffPrintWMTheme(FFinstance* instance, FFWMThemeOptions* options) +{ + FF_STRBUF_AUTO_DESTROY themeOrError = ffStrbufCreate(); + if(ffDetectWmTheme(instance, &themeOrError)) + { + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_WMTHEME_DISPLAY_NAME, 0, &options->moduleArgs.key); + puts(themeOrError.chars); + } + else + { + ffPrintFormat(instance, FF_WMTHEME_DISPLAY_NAME, 0, &options->moduleArgs, FF_WMTHEME_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &themeOrError} + }); + } + } + else + { + ffPrintError(instance, FF_WMTHEME_DISPLAY_NAME, 0, &options->moduleArgs, "%*s", themeOrError.length, themeOrError.chars); + } +} + +void ffInitWMThemeOptions(FFWMThemeOptions* options) +{ + options->moduleName = FF_WMTHEME_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseWMThemeCommandOptions(FFWMThemeOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_WMTHEME_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyWMThemeOptions(FFWMThemeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseWMThemeJsonObject(FFinstance* instance, json_object* module) +{ + FFWMThemeOptions __attribute__((__cleanup__(ffDestroyWMThemeOptions))) options; + ffInitWMThemeOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_WMTHEME_DISPLAY_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintWMTheme(instance, &options); +} +#endif diff --git a/src/modules/wmtheme/wmtheme.h b/src/modules/wmtheme/wmtheme.h new file mode 100644 index 000000000..c1f95312d --- /dev/null +++ b/src/modules/wmtheme/wmtheme.h @@ -0,0 +1,16 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/wmtheme/option.h" + +#define FF_WMTHEME_MODULE_NAME "WMTheme" + +void ffPrintWMTheme(FFinstance* instance, FFWMThemeOptions* options); +void ffInitWMThemeOptions(FFWMThemeOptions* options); +bool ffParseWMThemeCommandOptions(FFWMThemeOptions* options, const char* key, const char* value); +void ffDestroyWMThemeOptions(FFWMThemeOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseWMThemeJsonObject(FFinstance* instance, json_object* module); +#endif