From fa28529308e4f85c3e33424a5e274e3acf29c023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 26 May 2023 14:32:27 +0800 Subject: [PATCH] Packages: 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/jsonconfig/jsonconfig.c | 6 +++ src/modules/modules.h | 3 +- src/modules/options.h | 1 + src/modules/packages/option.h | 11 ++++++ src/modules/{ => packages}/packages.c | 54 ++++++++++++++++++++++++--- src/modules/packages/packages.h | 16 ++++++++ 11 files changed, 92 insertions(+), 16 deletions(-) create mode 100644 src/modules/packages/option.h rename src/modules/{ => packages}/packages.c (65%) create mode 100644 src/modules/packages/packages.h diff --git a/CMakeLists.txt b/CMakeLists.txt index fd57c3ff3..f947d1c40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -290,7 +290,7 @@ set(LIBFASTFETCH_SRC src/modules/opencl.c src/modules/opengl.c src/modules/os/os.c - src/modules/packages.c + src/modules/packages/packages.c src/modules/player.c src/modules/poweradapter.c src/modules/processes.c diff --git a/src/common/init.c b/src/common/init.c index 3c17d8207..20b5f0945 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -69,7 +69,7 @@ static void defaultConfig(FFinstance* instance) ffInitKernelOptions(&instance->config.kernel); ffInitUptimeOptions(&instance->config.uptime); initModuleArg(&instance->config.processes); - initModuleArg(&instance->config.packages); + ffInitPackagesOptions(&instance->config.packages); initModuleArg(&instance->config.shell); ffInitDisplayOptions(&instance->config.display); initModuleArg(&instance->config.de); @@ -291,7 +291,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyKernelOptions(&instance->config.kernel); ffDestroyUptimeOptions(&instance->config.uptime); destroyModuleArg(&instance->config.processes); - destroyModuleArg(&instance->config.packages); + ffDestroyPackagesOptions(&instance->config.packages); destroyModuleArg(&instance->config.shell); ffDestroyDisplayOptions(&instance->config.display); destroyModuleArg(&instance->config.de); diff --git a/src/fastfetch.c b/src/fastfetch.c index 7701b57e1..46189fcb2 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -984,7 +984,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseKernelCommandOptions(&instance->config.kernel, key, value)) {} else if(ffParseUptimeCommandOptions(&instance->config.uptime, key, value)) {} else if(optionParseModuleArgs(key, value, "processes", &instance->config.processes)) {} - else if(optionParseModuleArgs(key, value, "packages", &instance->config.packages)) {} + else if(ffParsePackagesCommandOptions(&instance->config.packages, key, value)) {} else if(optionParseModuleArgs(key, value, "shell", &instance->config.shell)) {} else if(ffParseDisplayCommandOptions(&instance->config.display, key, value)) {} else if(ffParseBrightnessCommandOptions(&instance->config.brightness, key, value)) {} @@ -1190,8 +1190,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintProcesses(instance); else if(strcasecmp(line, FF_UPTIME_MODULE_NAME) == 0) ffPrintUptime(instance, &instance->config.uptime); - else if(strcasecmp(line, "packages") == 0) - ffPrintPackages(instance); + else if(strcasecmp(line, FF_PACKAGES_MODULE_NAME) == 0) + ffPrintPackages(instance, &instance->config.packages); else if(strcasecmp(line, "shell") == 0) ffPrintShell(instance); else if(strcasecmp(line, FF_DISPLAY_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index e1f394daf..94aa5d436 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -67,7 +67,7 @@ typedef struct FFconfig FFKernelOptions kernel; FFUptimeOptions uptime; FFModuleArgs processes; - FFModuleArgs packages; + FFPackagesOptions packages; FFModuleArgs shell; FFDisplayOptions display; FFModuleArgs de; @@ -201,7 +201,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); -void ffPrintPackages(FFinstance* instance); void ffPrintShell(FFinstance* instance); void ffPrintDesktopEnvironment(FFinstance* instance); void ffPrintWM(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 7d91d9eec..be0016643 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -30,7 +30,7 @@ int main(int argc, char** argv) ffPrintKernel(&instance, &instance.config.kernel); //ffPrintProcesses(&instance); ffPrintUptime(&instance, &instance.config.uptime); - ffPrintPackages(&instance); + ffPrintPackages(&instance, &instance.config.packages); ffPrintShell(&instance); ffPrintDisplay(&instance, &instance.config.display); // ffPrintBrightness(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 6bbb99c69..fdf5cdc18 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -100,6 +100,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'P': { + return + tryModule(instance, type, module, FF_PACKAGES_MODULE_NAME, ffParsePackagesJsonObject) || + false; + } + case 'S': { return tryModule(instance, type, module, FF_SEPARATOR_MODULE_NAME, ffParseSeparatorJsonObject) || diff --git a/src/modules/modules.h b/src/modules/modules.h index 7b1011537..3357c1f1d 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -2,7 +2,6 @@ // For "fastfetch.c" and "flashfetch.c" -#include "modules/os/os.h" #include "modules/battery/battery.h" #include "modules/bios/bios.h" #include "modules/bluetooth/bluetooth.h" @@ -26,6 +25,8 @@ #include "modules/locale/locale.h" #include "modules/localip/localip.h" #include "modules/memory/memory.h" +#include "modules/os/os.h" +#include "modules/packages/packages.h" #include "modules/separator/separator.h" #include "modules/sound/sound.h" #include "modules/swap/swap.h" diff --git a/src/modules/options.h b/src/modules/options.h index 117bdb6e4..fe13e1cc1 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -24,6 +24,7 @@ #include "modules/localip/option.h" #include "modules/memory/option.h" #include "modules/os/option.h" +#include "modules/packages/option.h" #include "modules/separator/option.h" #include "modules/sound/option.h" #include "modules/swap/option.h" diff --git a/src/modules/packages/option.h b/src/modules/packages/option.h new file mode 100644 index 000000000..e06b8403b --- /dev/null +++ b/src/modules/packages/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 FFPackagesOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFPackagesOptions; diff --git a/src/modules/packages.c b/src/modules/packages/packages.c similarity index 65% rename from src/modules/packages.c rename to src/modules/packages/packages.c index a869fa678..dfcaf8249 100644 --- a/src/modules/packages.c +++ b/src/modules/packages/packages.c @@ -1,24 +1,24 @@ #include "fastfetch.h" #include "common/printing.h" #include "detection/packages/packages.h" +#include "modules/packages/packages.h" -#define FF_PACKAGES_MODULE_NAME "Packages" #define FF_PACKAGES_NUM_FORMAT_ARGS 21 -void ffPrintPackages(FFinstance* instance) +void ffPrintPackages(FFinstance* instance, FFPackagesOptions* options) { const FFPackagesResult* counts = ffDetectPackages(instance); uint32_t all = counts->all; //Copy it, so we can substract from it in FF_PRINT_PACKAGE if(all == 0) { - ffPrintError(instance, FF_PACKAGES_MODULE_NAME, 0, &instance->config.packages, "No packages from known package managers found"); + ffPrintError(instance, FF_PACKAGES_MODULE_NAME, 0, &options->moduleArgs, "No packages from known package managers found"); return; } - if(instance->config.packages.outputFormat.length == 0) + if(options->moduleArgs.outputFormat.length == 0) { - ffPrintLogoAndKey(instance, FF_PACKAGES_MODULE_NAME, 0, &instance->config.packages.key); + ffPrintLogoAndKey(instance, FF_PACKAGES_MODULE_NAME, 0, &options->moduleArgs.key); #define FF_PRINT_PACKAGE_NAME(var, name) \ if(counts->var > 0) \ @@ -65,7 +65,7 @@ void ffPrintPackages(FFinstance* instance) } else { - ffPrintFormat(instance, FF_PACKAGES_MODULE_NAME, 0, &instance->config.packages, FF_PACKAGES_NUM_FORMAT_ARGS, (FFformatarg[]){ + ffPrintFormat(instance, FF_PACKAGES_MODULE_NAME, 0, &options->moduleArgs, FF_PACKAGES_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_UINT, &all}, {FF_FORMAT_ARG_TYPE_UINT, &counts->pacman}, {FF_FORMAT_ARG_TYPE_STRBUF, &counts->pacmanBranch}, @@ -90,3 +90,45 @@ void ffPrintPackages(FFinstance* instance) }); } } + +void ffInitPackagesOptions(FFPackagesOptions* options) +{ + options->moduleName = FF_PACKAGES_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParsePackagesCommandOptions(FFPackagesOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_PACKAGES_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyPackagesOptions(FFPackagesOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParsePackagesJsonObject(FFinstance* instance, json_object* module) +{ + FFPackagesOptions __attribute__((__cleanup__(ffDestroyPackagesOptions))) options; + ffInitPackagesOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_PACKAGES_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintPackages(instance, &options); +} +#endif diff --git a/src/modules/packages/packages.h b/src/modules/packages/packages.h new file mode 100644 index 000000000..5557da0b3 --- /dev/null +++ b/src/modules/packages/packages.h @@ -0,0 +1,16 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/packages/option.h" + +#define FF_PACKAGES_MODULE_NAME "Packages" + +void ffPrintPackages(FFinstance* instance, FFPackagesOptions* options); +void ffInitPackagesOptions(FFPackagesOptions* options); +bool ffParsePackagesCommandOptions(FFPackagesOptions* options, const char* key, const char* value); +void ffDestroyPackagesOptions(FFPackagesOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParsePackagesJsonObject(FFinstance* instance, json_object* module); +#endif