diff --git a/CMakeLists.txt b/CMakeLists.txt index 342f305f2..255eefbb0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -281,7 +281,7 @@ set(LIBFASTFETCH_SRC src/modules/font/font.c src/modules/gpu/gpu.c src/modules/host/host.c - src/modules/icons.c + src/modules/icons/icons.c src/modules/gamepad/gamepad.c src/modules/kernel/kernel.c src/modules/locale/locale.c diff --git a/src/common/init.c b/src/common/init.c index c73d7dfb5..926f779ce 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -76,7 +76,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.wm); ffInitWMThemeOptions(&instance->config.wmTheme); initModuleArg(&instance->config.theme); - initModuleArg(&instance->config.icons); + ffInitIconsOptions(&instance->config.icons); ffInitFontOptions(&instance->config.font); ffInitCursorOptions(&instance->config.cursor); ffInitTerminalOptions(&instance->config.terminal); @@ -295,7 +295,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.wm); ffDestroyWMThemeOptions(&instance->config.wmTheme); destroyModuleArg(&instance->config.theme); - destroyModuleArg(&instance->config.icons); + ffDestroyIconsOptions(&instance->config.icons); ffDestroyFontOptions(&instance->config.font); ffDestroyCursorOptions(&instance->config.cursor); ffDestroyTerminalOptions(&instance->config.terminal); diff --git a/src/fastfetch.c b/src/fastfetch.c index 94b530a4a..78787d5c5 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -993,7 +993,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "wm", &instance->config.wm)) {} 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(ffParseIconsCommandOptions(&instance->config.icons, key, value)) {} else if(optionParseModuleArgs(key, value, "wallpaper", &instance->config.wallpaper)) {} else if(ffParseFontCommandOptions(&instance->config.font, key, value)) {} else if(ffParseCursorCommandOptions(&instance->config.cursor, key, value)) {} @@ -1200,8 +1200,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintTheme(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, FF_ICONS_MODULE_NAME) == 0) + ffPrintIcons(instance, &instance->config.icons); else if(strcasecmp(line, "wallpaper") == 0) ffPrintWallpaper(instance); else if(strcasecmp(line, FF_FONT_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 27f68e15a..28201a36e 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -76,7 +76,7 @@ typedef struct FFconfig FFModuleArgs wm; FFWMThemeOptions wmTheme; FFModuleArgs theme; - FFModuleArgs icons; + FFIconsOptions icons; FFFontOptions font; FFCursorOptions cursor; FFTerminalOptions terminal; @@ -201,7 +201,6 @@ void ffPrintProcesses(FFinstance* instance); void ffPrintDesktopEnvironment(FFinstance* instance); void ffPrintWM(FFinstance* instance); void ffPrintTheme(FFinstance* instance); -void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index cc5579d8f..f676da276 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -38,7 +38,7 @@ int main(int argc, char** argv) ffPrintWM(&instance); ffPrintWMTheme(&instance, &instance.config.wmTheme); ffPrintTheme(&instance); - ffPrintIcons(&instance); + ffPrintIcons(&instance, &instance.config.icons); ffPrintFont(&instance, &instance.config.font); ffPrintCursor(&instance, &instance.config.cursor); ffPrintTerminal(&instance, &instance.config.terminal); diff --git a/src/modules/icons.c b/src/modules/icons.c deleted file mode 100644 index 02bc10368..000000000 --- a/src/modules/icons.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/icons/icons.h" - -#define FF_ICONS_MODULE_NAME "Icons" -#define FF_ICONS_NUM_FORMAT_ARGS 1 - -void ffPrintIcons(FFinstance* instance) -{ - FF_STRBUF_AUTO_DESTROY icons = ffStrbufCreate(); - const char* error = ffDetectIcons(instance, &icons); - - if(error) - { - ffPrintError(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons, "%s", error); - return; - } - - if(instance->config.icons.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons.key); - ffStrbufPutTo(&icons, stdout); - } - else - { - ffPrintFormat(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons, FF_ICONS_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &icons} - }); - } -} diff --git a/src/modules/icons/icons.c b/src/modules/icons/icons.c new file mode 100644 index 000000000..e6ebbb8e2 --- /dev/null +++ b/src/modules/icons/icons.c @@ -0,0 +1,72 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/icons/icons.h" +#include "modules/icons/icons.h" + +#define FF_ICONS_NUM_FORMAT_ARGS 1 + +void ffPrintIcons(FFinstance* instance, FFIconsOptions* options) +{ + FF_STRBUF_AUTO_DESTROY icons = ffStrbufCreate(); + const char* error = ffDetectIcons(instance, &icons); + + if(error) + { + ffPrintError(instance, FF_ICONS_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_ICONS_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&icons, stdout); + } + else + { + ffPrintFormat(instance, FF_ICONS_MODULE_NAME, 0, &options->moduleArgs, FF_ICONS_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &icons} + }); + } +} + +void ffInitIconsOptions(FFIconsOptions* options) +{ + options->moduleName = FF_ICONS_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseIconsCommandOptions(FFIconsOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_ICONS_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyIconsOptions(FFIconsOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseIconsJsonObject(FFinstance* instance, json_object* module) +{ + FFIconsOptions __attribute__((__cleanup__(ffDestroyIconsOptions))) options; + ffInitIconsOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_ICONS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintIcons(instance, &options); +} +#endif diff --git a/src/modules/icons/icons.h b/src/modules/icons/icons.h new file mode 100644 index 000000000..780f9c352 --- /dev/null +++ b/src/modules/icons/icons.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_ICONS_MODULE_NAME "Icons" + +void ffPrintIcons(FFinstance* instance, FFIconsOptions* options); +void ffInitIconsOptions(FFIconsOptions* options); +bool ffParseIconsCommandOptions(FFIconsOptions* options, const char* key, const char* value); +void ffDestroyIconsOptions(FFIconsOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseIconsJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/icons/option.h b/src/modules/icons/option.h new file mode 100644 index 000000000..fc6427aa4 --- /dev/null +++ b/src/modules/icons/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 FFIconsOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFIconsOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index de9ea27e6..334bdb17d 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -75,6 +75,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'I': { + return + tryModule(instance, type, module, FF_ICONS_MODULE_NAME, ffParseIconsJsonObject) || + false; + } + case 'K': { return tryModule(instance, type, module, FF_KERNEL_MODULE_NAME, ffParseKernelJsonObject) || diff --git a/src/modules/modules.h b/src/modules/modules.h index 1df0a9293..ef6750ecd 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -21,6 +21,7 @@ #include "modules/gamepad/gamepad.h" #include "modules/gpu/gpu.h" #include "modules/host/host.h" +#include "modules/icons/icons.h" #include "modules/kernel/kernel.h" #include "modules/locale/locale.h" #include "modules/localip/localip.h" diff --git a/src/modules/options.h b/src/modules/options.h index f89032fa5..06f7bffc5 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -19,6 +19,7 @@ #include "modules/host/option.h" #include "modules/gamepad/option.h" #include "modules/gpu/option.h" +#include "modules/icons/option.h" #include "modules/kernel/option.h" #include "modules/locale/option.h" #include "modules/localip/option.h"