From da5da85c0725fd1c709fa58242f8fffa1edf6a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 9 Mar 2023 18:11:03 +0800 Subject: [PATCH] Title: init support of JSON config --- CMakeLists.txt | 2 +- src/common/config.c | 1 + src/common/init.c | 5 +- src/fastfetch.c | 4 +- src/fastfetch.h | 5 +- src/flashfetch.c | 2 +- src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/separator/separator.c | 13 +++-- src/modules/title.c | 30 ---------- src/modules/title/option.h | 12 ++++ src/modules/title/title.c | 95 +++++++++++++++++++++++++++++++ src/modules/title/title.h | 14 +++++ 13 files changed, 141 insertions(+), 44 deletions(-) delete mode 100644 src/modules/title.c create mode 100644 src/modules/title/option.h create mode 100644 src/modules/title/title.c create mode 100644 src/modules/title/title.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b2fc440..99ae9e3e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -304,7 +304,7 @@ set(LIBFASTFETCH_SRC src/modules/terminalfont.c src/modules/theme.c src/modules/time.c - src/modules/title.c + src/modules/title/title.c src/modules/uptime.c src/modules/users.c src/modules/vulkan.c diff --git a/src/common/config.c b/src/common/config.c index aff9e73c..2b9f9045 100644 --- a/src/common/config.c +++ b/src/common/config.c @@ -11,6 +11,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) { return + ffParseTitleJsonObject(instance, type, data, module) || ffParseBatteryJsonObject(instance, type, data, module) || ffParseCommandJsonObject(instance, type, data, module) || ffParseOSJsonObject(instance, type, data, module) || diff --git a/src/common/init.c b/src/common/init.c index 012b7e78..b27c17a1 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -22,6 +22,7 @@ static void initState(FFstate* state) state->logoWidth = 0; state->logoHeight = 0; state->keysHeight = 0; + state->titleLength = 0; ffPlatformInit(&state->platform); } @@ -71,6 +72,7 @@ static void defaultConfig(FFinstance* instance) instance->config.multithreading = true; instance->config.stat = false; + ffInitTitleOptions(&instance->config.title); ffInitOSOptions(&instance->config.os); initModuleArg(&instance->config.host); initModuleArg(&instance->config.bios); @@ -157,8 +159,6 @@ static void defaultConfig(FFinstance* instance) instance->config.shellVersion = true; instance->config.terminalVersion = true; - instance->config.titleFQDN = false; - ffStrbufInitA(&instance->config.diskFolders, 0); instance->config.diskShowTypes = FF_DISK_TYPE_REGULAR_BIT | FF_DISK_TYPE_EXTERNAL_BIT; @@ -318,6 +318,7 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.colorTitle); ffStrbufDestroy(&instance->config.keyValueSeparator); + ffDestroyTitleOptions(&instance->config.title); ffDestroyOSOptions(&instance->config.os); destroyModuleArg(&instance->config.host); destroyModuleArg(&instance->config.bios); diff --git a/src/fastfetch.c b/src/fastfetch.c index 935200ea..bfff141e 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1258,8 +1258,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con instance->config.gpuHideIntegrated = optionParseBoolean(value); else if(strcasecmp(key, "--gpu-hide-discrete") == 0) instance->config.gpuHideDiscrete = optionParseBoolean(value); - else if(strcasecmp(key, "--title-fqdn") == 0) - instance->config.titleFQDN = optionParseBoolean(value); else if(strcasecmp(key, "--shell-version") == 0) instance->config.shellVersion = optionParseBoolean(value); else if(strcasecmp(key, "--terminal-version") == 0) @@ -1395,7 +1393,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char if(strcasecmp(line, "break") == 0) ffPrintBreak(instance); else if(strcasecmp(line, "title") == 0) - ffPrintTitle(instance); + ffPrintTitle(instance, &instance->config.title); else if(strcasecmp(line, "separator") == 0) ffPrintSeparator(instance, &instance->config.separator); else if(strcasecmp(line, "os") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 7123082a..805a9b46 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -133,6 +133,7 @@ typedef struct FFconfig bool multithreading; bool stat; + FFTitleOptions title; FFOSOptions os; FFModuleArgs host; FFModuleArgs bios; @@ -216,8 +217,6 @@ typedef struct FFconfig bool gpuHideIntegrated; bool gpuHideDiscrete; - bool titleFQDN; - bool shellVersion; bool terminalVersion; @@ -251,6 +250,7 @@ typedef struct FFstate uint32_t logoWidth; uint32_t logoHeight; uint32_t keysHeight; + uint32_t titleLength; FFPlatform platform; } FFstate; @@ -300,7 +300,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintCustom(FFinstance* instance, const char* key, const char* value); void ffPrintBreak(FFinstance* instance); -void ffPrintTitle(FFinstance* instance); void ffPrintHost(FFinstance* instance); void ffPrintBios(FFinstance* instance); void ffPrintBoard(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 48a0e0c9..6b961e04 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -20,7 +20,7 @@ int main(int argc, char** argv) ffStart(&instance); //Printing - ffPrintTitle(&instance); + ffPrintTitle(&instance, &instance.config.title); ffPrintSeparator(&instance, &instance.config.separator); ffPrintOS(&instance, &instance.config.os); ffPrintHost(&instance); diff --git a/src/modules/modules.h b/src/modules/modules.h index ee76d794..f407e92d 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -6,3 +6,4 @@ #include "modules/battery/battery.h" #include "modules/command/command.h" #include "modules/separator/separator.h" +#include "modules/title/title.h" diff --git a/src/modules/options.h b/src/modules/options.h index 7e25edd1..faf05280 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -6,3 +6,4 @@ #include "modules/os/option.h" #include "modules/command/option.h" #include "modules/separator/option.h" +#include "modules/title/option.h" diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index a25c0402..1c6b92bc 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -6,10 +6,15 @@ void ffPrintSeparator(FFinstance* instance, FFSeparatorOptions* options) { - uint32_t titleLength = instance->state.platform.userName.length + 1 + (instance->config.titleFQDN ? - instance->state.platform.domainName.length : - instance->state.platform.hostName.length - ); + uint32_t titleLength = instance->state.titleLength; + if (titleLength == 0) + { + // Title was not printed, should we support this case? + titleLength = instance->state.platform.userName.length + 1 + (instance->config.title.fdqn ? + instance->state.platform.domainName.length : + instance->state.platform.hostName.length + ); + } ffLogoPrintLine(instance); diff --git a/src/modules/title.c b/src/modules/title.c deleted file mode 100644 index 4e509fbe..00000000 --- a/src/modules/title.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "util/textModifier.h" - -static inline void printTitlePart(FFinstance* instance, const FFstrbuf* content) -{ - if(!instance->config.pipe) - { - fputs(FASTFETCH_TEXT_MODIFIER_BOLT, stdout); - ffPrintColor(&instance->config.colorTitle); - } - - ffStrbufWriteTo(content, stdout); - - if(!instance->config.pipe) - fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout); -} - -void ffPrintTitle(FFinstance* instance) -{ - ffLogoPrintLine(instance); - - printTitlePart(instance, &instance->state.platform.userName); - putchar('@'); - printTitlePart(instance, instance->config.titleFQDN ? - &instance->state.platform.domainName : - &instance->state.platform.hostName - ); - putchar('\n'); -} diff --git a/src/modules/title/option.h b/src/modules/title/option.h new file mode 100644 index 00000000..1faa59ea --- /dev/null +++ b/src/modules/title/option.h @@ -0,0 +1,12 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFTitleOptions +{ + const char* moduleName; + + bool fdqn; +} FFTitleOptions; diff --git a/src/modules/title/title.c b/src/modules/title/title.c new file mode 100644 index 00000000..3503d01b --- /dev/null +++ b/src/modules/title/title.c @@ -0,0 +1,95 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "util/textModifier.h" +#include "modules/title/title.h" + +#define FF_TITLE_MODULE_NAME "Title" + +static inline void printTitlePart(FFinstance* instance, const FFstrbuf* content) +{ + if(!instance->config.pipe) + { + fputs(FASTFETCH_TEXT_MODIFIER_BOLT, stdout); + ffPrintColor(&instance->config.colorTitle); + } + + ffStrbufWriteTo(content, stdout); + + if(!instance->config.pipe) + fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout); +} + +void ffPrintTitle(FFinstance* instance, FFTitleOptions* options) +{ + ffLogoPrintLine(instance); + + printTitlePart(instance, &instance->state.platform.userName); + putchar('@'); + FFstrbuf* host = options->fdqn ? + &instance->state.platform.domainName : + &instance->state.platform.hostName; + printTitlePart(instance, host); + + instance->state.titleLength = instance->state.platform.userName.length + host->length + 1; + + putchar('\n'); +} + +void ffInitTitleOptions(FFTitleOptions* options) +{ + options->moduleName = FF_TITLE_MODULE_NAME; + options->fdqn = false; +} + +bool ffParseTitleCommandOptions(FFTitleOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_TITLE_MODULE_NAME); + if (!subKey) return false; + + if (strcasecmp(subKey, "fdqn") == 0) + { + options->fdqn = ffOptionParseBoolean(value); + return true; + } + + return false; +} + +void ffDestroyTitleOptions(FFTitleOptions* options) +{ + FF_UNUSED(options); +} + +#ifdef FF_HAVE_JSONC +bool ffParseTitleJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_TITLE_MODULE_NAME) != 0) + return false; + + FFTitleOptions __attribute__((__cleanup__(ffDestroyTitleOptions))) options; + ffInitTitleOptions(&options); + + if (module) + { + struct lh_entry* entry; + lh_foreach(data->ffjson_object_get_object(module), entry) + { + const char* key = (const char *)lh_entry_k(entry); + if (strcasecmp(key, "type") == 0) + continue; + json_object* val = (struct json_object *)lh_entry_v(entry); + + if (strcasecmp(key, "fdqn") == 0) + { + options.fdqn = data->ffjson_object_get_boolean(val); + continue; + } + + ffPrintErrorString(instance, FF_TITLE_MODULE_NAME, 0, NULL, NULL, "Unknown JSON key %s", key); + } + } + + ffPrintTitle(instance, &options); + return true; +} +#endif diff --git a/src/modules/title/title.h b/src/modules/title/title.h new file mode 100644 index 00000000..b361e72c --- /dev/null +++ b/src/modules/title/title.h @@ -0,0 +1,14 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/title/option.h" + +void ffPrintTitle(FFinstance* instance, FFTitleOptions* options); +void ffInitTitleOptions(FFTitleOptions* options); +bool ffParseTitleCommandOptions(FFTitleOptions* options, const char* key, const char* value); +void ffDestroyTitleOptions(FFTitleOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseTitleJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif