From e3ec136cad51d9fdf4ad74cb0b64917c69771ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 9 Jun 2023 08:48:46 +0800 Subject: [PATCH] Theme: 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 | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/theme.c | 30 ------------ src/modules/theme/option.h | 11 +++++ src/modules/theme/theme.c | 72 +++++++++++++++++++++++++++++ src/modules/theme/theme.h | 15 ++++++ 12 files changed, 109 insertions(+), 39 deletions(-) delete mode 100644 src/modules/theme.c create mode 100644 src/modules/theme/option.h create mode 100644 src/modules/theme/theme.c create mode 100644 src/modules/theme/theme.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 83e9d6d53..5cf008a8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -303,7 +303,7 @@ set(LIBFASTFETCH_SRC src/modules/media/media.c src/modules/terminal/terminal.c src/modules/terminalfont/terminalfont.c - src/modules/theme.c + src/modules/theme/theme.c src/modules/title/title.c src/modules/uptime/uptime.c src/modules/users/users.c diff --git a/src/common/init.c b/src/common/init.c index 1437bf584..7497b979d 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -74,7 +74,7 @@ static void defaultConfig(FFinstance* instance) ffInitDEOptions(&instance->config.de); ffInitWMOptions(&instance->config.wm); ffInitWMThemeOptions(&instance->config.wmTheme); - initModuleArg(&instance->config.theme); + ffInitThemeOptions(&instance->config.theme); ffInitIconsOptions(&instance->config.icons); ffInitFontOptions(&instance->config.font); ffInitCursorOptions(&instance->config.cursor); @@ -285,7 +285,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyDEOptions(&instance->config.de); ffDestroyWMOptions(&instance->config.wm); ffDestroyWMThemeOptions(&instance->config.wmTheme); - destroyModuleArg(&instance->config.theme); + ffDestroyThemeOptions(&instance->config.theme); ffDestroyIconsOptions(&instance->config.icons); ffDestroyFontOptions(&instance->config.font); ffDestroyCursorOptions(&instance->config.cursor); diff --git a/src/fastfetch.c b/src/fastfetch.c index e52b6693b..a59ff5468 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -992,7 +992,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseWifiCommandOptions(&instance->config.wifi, key, value)) {} else if(ffParseWMCommandOptions(&instance->config.wm, key, value)) {} else if(ffParseWMThemeCommandOptions(&instance->config.wmTheme, key, value)) {} - else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} + else if(ffParseThemeCommandOptions(&instance->config.theme, key, value)) {} else if(ffParseIconsCommandOptions(&instance->config.icons, key, value)) {} else if(ffParseWallpaperCommandOptions(&instance->config.wallpaper, key, value)) {} else if(ffParseFontCommandOptions(&instance->config.font, key, value)) {} @@ -1176,8 +1176,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintDE(instance, &instance->config.de); else if(strcasecmp(line, FF_WM_MODULE_NAME) == 0) ffPrintWM(instance, &instance->config.wm); - else if(strcasecmp(line, "theme") == 0) - ffPrintTheme(instance); + else if(strcasecmp(line, FF_THEME_MODULE_NAME) == 0) + ffPrintTheme(instance, &instance->config.theme); else if(strcasecmp(line, FF_WMTHEME_MODULE_NAME) == 0) ffPrintWMTheme(instance, &instance->config.wmTheme); else if(strcasecmp(line, FF_ICONS_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 1818934b6..557e2121a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -66,7 +66,7 @@ typedef struct FFconfig FFWifiOptions wifi; FFWMOptions wm; FFWMThemeOptions wmTheme; - FFModuleArgs theme; + FFThemeOptions theme; FFIconsOptions icons; FFFontOptions font; FFCursorOptions cursor; @@ -176,6 +176,5 @@ void ffLogoBuiltinListAutocompletion(); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); -void ffPrintTheme(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index ffa0a9040..0aad4532c 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -37,7 +37,7 @@ int main(int argc, char** argv) ffPrintDE(&instance, &instance.config.de); ffPrintWM(&instance, &instance.config.wm); ffPrintWMTheme(&instance, &instance.config.wmTheme); - ffPrintTheme(&instance); + ffPrintTheme(&instance, &instance.config.theme); ffPrintIcons(&instance, &instance.config.icons); ffPrintFont(&instance, &instance.config.font); ffPrintCursor(&instance, &instance.config.cursor); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index ba297c633..aca52158d 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -133,6 +133,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o tryModule(instance, type, module, FF_TERMINAL_MODULE_NAME, ffParseTerminalJsonObject) || tryModule(instance, type, module, FF_TERMINALFONT_MODULE_NAME, ffParseTerminalFontJsonObject) || tryModule(instance, type, module, FF_TITLE_MODULE_NAME, ffParseTitleJsonObject) || + tryModule(instance, type, module, FF_THEME_MODULE_NAME, ffParseThemeJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index c4b8af7b3..3c9b98c3c 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -41,6 +41,7 @@ #include "modules/swap/swap.h" #include "modules/terminal/terminal.h" #include "modules/terminalfont/terminalfont.h" +#include "modules/theme/theme.h" #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" #include "modules/uptime/uptime.h" diff --git a/src/modules/options.h b/src/modules/options.h index 159f41e10..392a6f1fa 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -39,6 +39,7 @@ #include "modules/swap/option.h" #include "modules/terminal/option.h" #include "modules/terminalfont/option.h" +#include "modules/theme/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" #include "modules/users/option.h" diff --git a/src/modules/theme.c b/src/modules/theme.c deleted file mode 100644 index b89f093d4..000000000 --- a/src/modules/theme.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/theme/theme.h" - -#define FF_THEME_MODULE_NAME "Theme" -#define FF_THEME_NUM_FORMAT_ARGS 1 - -void ffPrintTheme(FFinstance* instance) -{ - FF_STRBUF_AUTO_DESTROY theme; - ffStrbufInit(&theme); - const char* error = ffDetectTheme(instance, &theme); - if (error) - { - ffPrintError(instance, FF_THEME_MODULE_NAME, 0, &instance->config.theme, "%s", error); - return; - } - - if(instance->config.theme.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_THEME_MODULE_NAME, 0, &instance->config.theme.key); - ffStrbufPutTo(&theme, stdout); - } - else - { - ffPrintFormat(instance, FF_THEME_MODULE_NAME, 0, &instance->config.theme, FF_THEME_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &theme} - }); - } -} diff --git a/src/modules/theme/option.h b/src/modules/theme/option.h new file mode 100644 index 000000000..f322c3a62 --- /dev/null +++ b/src/modules/theme/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 FFThemeOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFThemeOptions; diff --git a/src/modules/theme/theme.c b/src/modules/theme/theme.c new file mode 100644 index 000000000..bb348e10e --- /dev/null +++ b/src/modules/theme/theme.c @@ -0,0 +1,72 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/theme/theme.h" +#include "modules/theme/theme.h" + +#define FF_THEME_NUM_FORMAT_ARGS 1 + +void ffPrintTheme(FFinstance* instance, FFThemeOptions* options) +{ + FF_STRBUF_AUTO_DESTROY theme = ffStrbufCreate(); + const char* error = ffDetectTheme(instance, &theme); + + if(error) + { + ffPrintError(instance, FF_THEME_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_THEME_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&theme, stdout); + } + else + { + ffPrintFormat(instance, FF_THEME_MODULE_NAME, 0, &options->moduleArgs, FF_THEME_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &theme} + }); + } +} + +void ffInitThemeOptions(FFThemeOptions* options) +{ + options->moduleName = FF_THEME_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseThemeCommandOptions(FFThemeOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_THEME_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyThemeOptions(FFThemeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseThemeJsonObject(FFinstance* instance, json_object* module) +{ + FFThemeOptions __attribute__((__cleanup__(ffDestroyThemeOptions))) options; + ffInitThemeOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_THEME_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintTheme(instance, &options); +} +#endif diff --git a/src/modules/theme/theme.h b/src/modules/theme/theme.h new file mode 100644 index 000000000..3c13ca467 --- /dev/null +++ b/src/modules/theme/theme.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_THEME_MODULE_NAME "Theme" + +void ffPrintTheme(FFinstance* instance, FFThemeOptions* options); +void ffInitThemeOptions(FFThemeOptions* options); +bool ffParseThemeCommandOptions(FFThemeOptions* options, const char* key, const char* value); +void ffDestroyThemeOptions(FFThemeOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseThemeJsonObject(FFinstance* instance, json_object* module); +#endif