From 83dda3e8ab69fe82eec9e8bbbcba09414d66ec8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 20 Mar 2023 14:57:46 +0800 Subject: [PATCH] Cursor: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 6 +- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/cursor.c | 55 ----------------- src/modules/cursor/cursor.c | 93 +++++++++++++++++++++++++++++ src/modules/cursor/cursor.h | 15 +++++ src/modules/cursor/option.h | 11 ++++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 130 insertions(+), 64 deletions(-) delete mode 100644 src/modules/cursor.c create mode 100644 src/modules/cursor/cursor.c create mode 100644 src/modules/cursor/cursor.h create mode 100644 src/modules/cursor/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f9447715..bd9d2029b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -272,7 +272,7 @@ set(LIBFASTFETCH_SRC src/modules/colors/colors.c src/modules/cpu/cpu.c src/modules/cpuusage/cpuusage.c - src/modules/cursor.c + src/modules/cursor/cursor.c src/modules/custom.c src/modules/command/command.c src/modules/datetime/datetime.c diff --git a/src/common/init.c b/src/common/init.c index 7d9882192..05f6ebb92 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -77,7 +77,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.theme); initModuleArg(&instance->config.icons); initModuleArg(&instance->config.font); - initModuleArg(&instance->config.cursor); + ffInitCursorOptions(&instance->config.cursor); initModuleArg(&instance->config.terminal); initModuleArg(&instance->config.terminalFont); ffInitCPUOptions(&instance->config.cpu); @@ -312,7 +312,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.theme); destroyModuleArg(&instance->config.icons); destroyModuleArg(&instance->config.font); - destroyModuleArg(&instance->config.cursor); + ffDestroyCursorOptions(&instance->config.cursor); destroyModuleArg(&instance->config.terminal); destroyModuleArg(&instance->config.terminalFont); ffDestroyCPUOptions(&instance->config.cpu); diff --git a/src/fastfetch.c b/src/fastfetch.c index a93a8f486..ac1632f2f 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1030,7 +1030,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "icons", &instance->config.icons)) {} else if(optionParseModuleArgs(key, value, "wallpaper", &instance->config.wallpaper)) {} else if(optionParseModuleArgs(key, value, "font", &instance->config.font)) {} - else if(optionParseModuleArgs(key, value, "cursor", &instance->config.cursor)) {} + else if(ffParseCursorCommandOptions(&instance->config.cursor, key, value)) {} else if(optionParseModuleArgs(key, value, "terminal", &instance->config.terminal)) {} else if(optionParseModuleArgs(key, value, "terminal-font", &instance->config.terminalFont)) {} else if(ffParseCPUCommandOptions(&instance->config.cpu, key, value)) {} @@ -1292,8 +1292,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintWallpaper(instance); else if(strcasecmp(line, "font") == 0) ffPrintFont(instance); - else if(strcasecmp(line, "cursor") == 0) - ffPrintCursor(instance); + else if(strcasecmp(line, FF_CURSOR_MODULE_NAME) == 0) + ffPrintCursor(instance, &instance->config.cursor); else if(strcasecmp(line, "terminal") == 0) ffPrintTerminal(instance); else if(strcasecmp(line, "terminalfont") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index add99a4f5..bab35e820 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -113,7 +113,7 @@ typedef struct FFconfig FFModuleArgs theme; FFModuleArgs icons; FFModuleArgs font; - FFModuleArgs cursor; + FFCursorOptions cursor; FFModuleArgs terminal; FFModuleArgs terminalFont; FFCPUOptions cpu; @@ -260,7 +260,6 @@ void ffPrintTheme(FFinstance* instance); void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); void ffPrintFont(FFinstance* instance); -void ffPrintCursor(FFinstance* instance); void ffPrintTerminal(FFinstance* instance); void ffPrintTerminalFont(FFinstance* instance); void ffPrintGPU(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index fe269f1a7..b5020c6c7 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -40,7 +40,7 @@ int main(int argc, char** argv) ffPrintTheme(&instance); ffPrintIcons(&instance); ffPrintFont(&instance); - ffPrintCursor(&instance); + ffPrintCursor(&instance, &instance.config.cursor); ffPrintTerminal(&instance); ffPrintTerminalFont(&instance); ffPrintCPU(&instance, &instance.config.cpu); diff --git a/src/modules/cursor.c b/src/modules/cursor.c deleted file mode 100644 index a5ddc90be..000000000 --- a/src/modules/cursor.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "fastfetch.h" - -#include "common/printing.h" -#include "detection/cursor/cursor.h" - -#define FF_CURSOR_MODULE_NAME "Cursor" -#define FF_CURSOR_NUM_FORMAT_ARGS 2 - -static void printCursor(FFinstance* instance, FFCursorResult* cursor) -{ - ffStrbufRemoveIgnCaseEndS(&cursor->theme, "cursors"); - ffStrbufRemoveIgnCaseEndS(&cursor->theme, "cursor"); - ffStrbufTrimRight(&cursor->theme, '_'); - ffStrbufTrimRight(&cursor->theme, '-'); - if(cursor->theme.length == 0) - ffStrbufAppendS(&cursor->theme, "default"); - - if(instance->config.cursor.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_CURSOR_MODULE_NAME, 0, &instance->config.cursor.key); - ffStrbufWriteTo(&cursor->theme, stdout); - - if(cursor->size.length > 0) - printf(" (%spx)", cursor->size.chars); - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_CURSOR_MODULE_NAME, 0, &instance->config.cursor, FF_CURSOR_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &cursor->theme}, - {FF_FORMAT_ARG_TYPE_STRBUF, &cursor->size} - }); - } -} - - -void ffPrintCursor(FFinstance* instance) -{ - FFCursorResult result; - ffStrbufInit(&result.error); - ffStrbufInit(&result.theme); - ffStrbufInit(&result.size); - - ffDetectCursor(instance, &result); - - if(result.error.length) - ffPrintError(instance, FF_CURSOR_MODULE_NAME, 0, &instance->config.cursor, "%s", result.error.chars); - else - printCursor(instance, &result); - - ffStrbufDestroy(&result.error); - ffStrbufDestroy(&result.theme); - ffStrbufDestroy(&result.size); -} diff --git a/src/modules/cursor/cursor.c b/src/modules/cursor/cursor.c new file mode 100644 index 000000000..1845fac3b --- /dev/null +++ b/src/modules/cursor/cursor.c @@ -0,0 +1,93 @@ +#include "fastfetch.h" + +#include "common/printing.h" +#include "detection/cursor/cursor.h" +#include "modules/cursor/cursor.h" + +#define FF_CURSOR_NUM_FORMAT_ARGS 2 + +void ffPrintCursor(FFinstance* instance, FFCursorOptions* options) +{ + FFCursorResult result; + ffStrbufInit(&result.error); + ffStrbufInit(&result.theme); + ffStrbufInit(&result.size); + + ffDetectCursor(instance, &result); + + if(result.error.length) + ffPrintError(instance, FF_CURSOR_MODULE_NAME, 0, &options->moduleArgs, "%s", result.error.chars); + else + { + ffStrbufRemoveIgnCaseEndS(&result.theme, "cursors"); + ffStrbufRemoveIgnCaseEndS(&result.theme, "cursor"); + ffStrbufTrimRight(&result.theme, '_'); + ffStrbufTrimRight(&result.theme, '-'); + if(result.theme.length == 0) + ffStrbufAppendS(&result.theme, "default"); + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_CURSOR_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufWriteTo(&result.theme, stdout); + + if(result.size.length > 0) + printf(" (%spx)", result.size.chars); + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_CURSOR_MODULE_NAME, 0, &options->moduleArgs, FF_CURSOR_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &result.theme}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.size} + }); + } + } + + ffStrbufDestroy(&result.error); + ffStrbufDestroy(&result.theme); + ffStrbufDestroy(&result.size); +} + +void ffInitCursorOptions(FFCursorOptions* options) +{ + options->moduleName = FF_CURSOR_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseCursorCommandOptions(FFCursorOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_CURSOR_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyCursorOptions(FFCursorOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseCursorJsonObject(FFinstance* instance, json_object* module) +{ + FFCursorOptions __attribute__((__cleanup__(ffDestroyCursorOptions))) options; + ffInitCursorOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_CURSOR_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintCursor(instance, &options); +} +#endif diff --git a/src/modules/cursor/cursor.h b/src/modules/cursor/cursor.h new file mode 100644 index 000000000..913e0668e --- /dev/null +++ b/src/modules/cursor/cursor.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_CURSOR_MODULE_NAME "Cursor" + +void ffPrintCursor(FFinstance* instance, FFCursorOptions* options); +void ffInitCursorOptions(FFCursorOptions* options); +bool ffParseCursorCommandOptions(FFCursorOptions* options, const char* key, const char* value); +void ffDestroyCursorOptions(FFCursorOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseCursorJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/cursor/option.h b/src/modules/cursor/option.h new file mode 100644 index 000000000..9a648c844 --- /dev/null +++ b/src/modules/cursor/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 FFCursorOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFCursorOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index c96147171..c287f5222 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -43,6 +43,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o tryModule(instance, type, module, FF_CPUUSAGE_MODULE_NAME, ffParseCPUUsageJsonObject) || tryModule(instance, type, module, FF_COMMAND_MODULE_NAME, ffParseCommandJsonObject) || tryModule(instance, type, module, FF_COLORS_MODULE_NAME, ffParseColorsJsonObject) || + tryModule(instance, type, module, FF_CURSOR_MODULE_NAME, ffParseCursorJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index ade634349..7b5325717 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -13,6 +13,7 @@ #include "modules/cpuusage/cpuusage.h" #include "modules/command/command.h" #include "modules/colors/colors.h" +#include "modules/cursor/cursor.h" #include "modules/datetime/datetime.h" #include "modules/display/display.h" #include "modules/host/host.h" diff --git a/src/modules/options.h b/src/modules/options.h index 6bd874fc3..9f72b93b8 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -9,6 +9,7 @@ #include "modules/brightness/option.h" #include "modules/cpu/option.h" #include "modules/cpuusage/option.h" +#include "modules/cursor/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" #include "modules/display/option.h"