From a4c8b93a07645bb9648e414e86bede6de0c704e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 25 Apr 2023 19:57:27 +0800 Subject: [PATCH] Uptime: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/detection/uptime/uptime_linux.c | 2 +- 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/uptime.c | 79 ------------------ src/modules/uptime/option.h | 11 +++ src/modules/uptime/uptime.c | 121 ++++++++++++++++++++++++++++ src/modules/uptime/uptime.h | 16 ++++ 13 files changed, 165 insertions(+), 89 deletions(-) delete mode 100644 src/modules/uptime.c create mode 100644 src/modules/uptime/option.h create mode 100644 src/modules/uptime/uptime.c create mode 100644 src/modules/uptime/uptime.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 488ec3f18..f25f85132 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -305,7 +305,7 @@ set(LIBFASTFETCH_SRC src/modules/terminalfont.c src/modules/theme.c src/modules/title/title.c - src/modules/uptime.c + src/modules/uptime/uptime.c src/modules/users.c src/modules/vulkan.c src/modules/wallpaper.c diff --git a/src/common/init.c b/src/common/init.c index b6b8e6c61..5a1f57ce2 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -67,7 +67,7 @@ static void defaultConfig(FFinstance* instance) ffInitCommandOptions(&instance->config.command); ffInitCustomOptions(&instance->config.custom); ffInitKernelOptions(&instance->config.kernel); - initModuleArg(&instance->config.uptime); + ffInitUptimeOptions(&instance->config.uptime); initModuleArg(&instance->config.processes); initModuleArg(&instance->config.packages); initModuleArg(&instance->config.shell); @@ -289,7 +289,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyCommandOptions(&instance->config.command); ffDestroyCustomOptions(&instance->config.custom); ffDestroyKernelOptions(&instance->config.kernel); - destroyModuleArg(&instance->config.uptime); + ffDestroyUptimeOptions(&instance->config.uptime); destroyModuleArg(&instance->config.processes); destroyModuleArg(&instance->config.packages); destroyModuleArg(&instance->config.shell); diff --git a/src/detection/uptime/uptime_linux.c b/src/detection/uptime/uptime_linux.c index 6ba4a51a1..0339bc7e6 100644 --- a/src/detection/uptime/uptime_linux.c +++ b/src/detection/uptime/uptime_linux.c @@ -7,6 +7,6 @@ const char* ffDetectUptime(uint64_t* result) struct sysinfo info; if(sysinfo(&info) != 0) return "sysinfo() failed"; - *result = info.uptime; + *result = (uint64_t) info.uptime; return NULL; } diff --git a/src/fastfetch.c b/src/fastfetch.c index a3a36f7af..fc7066f1f 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -982,7 +982,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseCommandCommandOptions(&instance->config.command, key, value)) {} else if(ffParseCustomCommandOptions(&instance->config.custom, key, value)) {} else if(ffParseKernelCommandOptions(&instance->config.kernel, key, value)) {} - else if(optionParseModuleArgs(key, value, "uptime", &instance->config.uptime)) {} + 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(optionParseModuleArgs(key, value, "shell", &instance->config.shell)) {} @@ -1186,10 +1186,10 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintChassis(instance); else if(strcasecmp(line, FF_KERNEL_MODULE_NAME) == 0) ffPrintKernel(instance, &instance->config.kernel); - else if(strcasecmp(line, "uptime") == 0) - ffPrintUptime(instance); else if(strcasecmp(line, "processes") == 0) 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, "shell") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 1e6b9ee1e..8b6b374c2 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -65,7 +65,7 @@ typedef struct FFconfig FFModuleArgs chassis; FFCommandOptions command; FFKernelOptions kernel; - FFModuleArgs uptime; + FFUptimeOptions uptime; FFModuleArgs processes; FFModuleArgs packages; FFModuleArgs shell; @@ -200,7 +200,6 @@ void ffPrepareWeather(FFinstance* instance); //Printing void ffPrintChassis(FFinstance* instance); -void ffPrintUptime(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintPackages(FFinstance* instance); void ffPrintShell(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 451d72ace..a30b9c528 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -28,8 +28,8 @@ int main(int argc, char** argv) //ffPrintBoard(&instance, &instance.config.board); //ffPrintChassis(&instance); ffPrintKernel(&instance, &instance.config.kernel); - ffPrintUptime(&instance); //ffPrintProcesses(&instance); + ffPrintUptime(&instance, &instance.config.uptime); ffPrintPackages(&instance); ffPrintShell(&instance); ffPrintDisplay(&instance, &instance.config.display); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 5ae6eef1b..4029c0a7d 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -107,6 +107,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'U': { + return + tryModule(instance, type, module, FF_UPTIME_MODULE_NAME, ffParseUptimeJsonObject) || + false; + } + default: return false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index e2fff95f3..0736365c4 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -29,3 +29,4 @@ #include "modules/sound/sound.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 fc2b460a5..1947123e5 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -26,3 +26,4 @@ #include "modules/separator/option.h" #include "modules/sound/option.h" #include "modules/title/option.h" +#include "modules/uptime/option.h" diff --git a/src/modules/uptime.c b/src/modules/uptime.c deleted file mode 100644 index 6e1c81209..000000000 --- a/src/modules/uptime.c +++ /dev/null @@ -1,79 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/uptime/uptime.h" - -#define FF_UPTIME_MODULE_NAME "Uptime" -#define FF_UPTIME_NUM_FORMAT_ARGS 4 - -void ffPrintUptime(FFinstance* instance) -{ - uint64_t uptime; - - const char* error = ffDetectUptime(&uptime); - - if(error) - { - ffPrintError(instance, FF_UPTIME_MODULE_NAME, 0, &instance->config.uptime, "%s", error); - return; - } - - uint32_t days = (uint32_t) uptime / 86400; - uint32_t hours = (uint32_t) (uptime - (days * 86400)) / 3600; - uint32_t minutes = (uint32_t) (uptime - (days * 86400) - (hours * 3600)) / 60; - uint32_t seconds = (uint32_t) uptime - (days * 86400) - (hours * 3600) - (minutes * 60); - - if(instance->config.uptime.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_UPTIME_MODULE_NAME, 0, &instance->config.uptime.key); - - if(days == 0 && hours == 0 && minutes == 0) - { - printf("%u seconds\n", seconds); - return; - } - - if(days > 0) - { - printf("%u day", days); - - if(days > 1) - putchar('s'); - - if(days >= 100) - fputs("(!)", stdout); - - if(hours > 0 || minutes > 0) - fputs(", ", stdout); - } - - if(hours > 0) - { - printf("%u hour", hours); - - if(hours > 1) - putchar('s'); - - if(minutes > 0) - fputs(", ", stdout); - } - - if(minutes > 0) - { - printf("%u min", minutes); - - if(minutes > 1) - putchar('s'); - } - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_UPTIME_MODULE_NAME, 0, &instance->config.uptime, FF_UPTIME_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_UINT, &days}, - {FF_FORMAT_ARG_TYPE_UINT, &hours}, - {FF_FORMAT_ARG_TYPE_UINT, &minutes}, - {FF_FORMAT_ARG_TYPE_UINT, &seconds} - }); - } -} diff --git a/src/modules/uptime/option.h b/src/modules/uptime/option.h new file mode 100644 index 000000000..722d236d3 --- /dev/null +++ b/src/modules/uptime/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 FFUptimeOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFUptimeOptions; diff --git a/src/modules/uptime/uptime.c b/src/modules/uptime/uptime.c new file mode 100644 index 000000000..f7fd7959c --- /dev/null +++ b/src/modules/uptime/uptime.c @@ -0,0 +1,121 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/uptime/uptime.h" +#include "modules/uptime/uptime.h" + +#define FF_UPTIME_NUM_FORMAT_ARGS 4 + +void ffPrintUptime(FFinstance* instance, FFUptimeOptions* options) +{ + uint64_t uptime; + + const char* error = ffDetectUptime(&uptime); + + if(error) + { + ffPrintError(instance, FF_UPTIME_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + uint32_t days = (uint32_t) uptime / 86400; + uint32_t hours = (uint32_t) (uptime - (days * 86400)) / 3600; + uint32_t minutes = (uint32_t) (uptime - (days * 86400) - (hours * 3600)) / 60; + uint32_t seconds = (uint32_t) uptime - (days * 86400) - (hours * 3600) - (minutes * 60); + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_UPTIME_MODULE_NAME, 0, &options->moduleArgs.key); + + if(days == 0 && hours == 0 && minutes == 0) + { + printf("%u seconds\n", seconds); + return; + } + + if(days > 0) + { + printf("%u day", days); + + if(days > 1) + putchar('s'); + + if(days >= 100) + fputs("(!)", stdout); + + if(hours > 0 || minutes > 0) + fputs(", ", stdout); + } + + if(hours > 0) + { + printf("%u hour", hours); + + if(hours > 1) + putchar('s'); + + if(minutes > 0) + fputs(", ", stdout); + } + + if(minutes > 0) + { + printf("%u min", minutes); + + if(minutes > 1) + putchar('s'); + } + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_UPTIME_MODULE_NAME, 0, &options->moduleArgs, FF_UPTIME_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_UINT, &days}, + {FF_FORMAT_ARG_TYPE_UINT, &hours}, + {FF_FORMAT_ARG_TYPE_UINT, &minutes}, + {FF_FORMAT_ARG_TYPE_UINT, &seconds} + }); + } +} + +void ffInitUptimeOptions(FFUptimeOptions* options) +{ + options->moduleName = FF_UPTIME_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseUptimeCommandOptions(FFUptimeOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_UPTIME_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyUptimeOptions(FFUptimeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseUptimeJsonObject(FFinstance* instance, json_object* module) +{ + FFUptimeOptions __attribute__((__cleanup__(ffDestroyUptimeOptions))) options; + ffInitUptimeOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_UPTIME_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintUptime(instance, &options); +} +#endif diff --git a/src/modules/uptime/uptime.h b/src/modules/uptime/uptime.h new file mode 100644 index 000000000..35cc0365a --- /dev/null +++ b/src/modules/uptime/uptime.h @@ -0,0 +1,16 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/title/option.h" + +#define FF_UPTIME_MODULE_NAME "Uptime" + +void ffPrintUptime(FFinstance* instance, FFUptimeOptions* options); +void ffInitUptimeOptions(FFUptimeOptions* options); +bool ffParseUptimeCommandOptions(FFUptimeOptions* options, const char* key, const char* value); +void ffDestroyUptimeOptions(FFUptimeOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseUptimeJsonObject(FFinstance* instance, json_object* module); +#endif