From 13ae9aff44af0e194631392ca4e12332a80ee31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 2 Jun 2023 16:07:01 +0800 Subject: [PATCH] Terminal: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 6 +- .../terminalshell/terminalshell_linux.c | 2 +- .../terminalshell/terminalshell_windows.c | 2 +- src/fastfetch.c | 8 +- src/fastfetch.h | 5 +- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/terminal.c | 44 -------- src/modules/terminal/option.h | 13 +++ src/modules/terminal/terminal.c | 100 ++++++++++++++++++ src/modules/terminal/terminal.h | 15 +++ 14 files changed, 141 insertions(+), 61 deletions(-) delete mode 100644 src/modules/terminal.c create mode 100644 src/modules/terminal/option.h create mode 100644 src/modules/terminal/terminal.c create mode 100644 src/modules/terminal/terminal.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c85e70f42..0faf474aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -301,7 +301,7 @@ set(LIBFASTFETCH_SRC src/modules/sound/sound.c src/modules/swap/swap.c src/modules/media.c - src/modules/terminal.c + src/modules/terminal/terminal.c src/modules/terminalfont.c src/modules/theme.c src/modules/title/title.c diff --git a/src/common/init.c b/src/common/init.c index cb2352155..916e95de8 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -79,7 +79,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.icons); ffInitFontOptions(&instance->config.font); ffInitCursorOptions(&instance->config.cursor); - initModuleArg(&instance->config.terminal); + ffInitTerminalOptions(&instance->config.terminal); initModuleArg(&instance->config.terminalFont); ffInitCPUOptions(&instance->config.cpu); ffInitCPUUsageOptions(&instance->config.cpuUsage); @@ -133,8 +133,6 @@ static void defaultConfig(FFinstance* instance) ffStrbufInit(&instance->config.libwlanapi); ffStrbufInit(&instance->config.libnm); - instance->config.terminalVersion = true; - instance->config.publicIpTimeout = 0; ffStrbufInit(&instance->config.publicIpUrl); @@ -300,7 +298,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.icons); ffDestroyFontOptions(&instance->config.font); ffDestroyCursorOptions(&instance->config.cursor); - destroyModuleArg(&instance->config.terminal); + ffDestroyTerminalOptions(&instance->config.terminal); destroyModuleArg(&instance->config.terminalFont); ffDestroyCPUOptions(&instance->config.cpu); ffDestroyCPUUsageOptions(&instance->config.cpuUsage); diff --git a/src/detection/terminalshell/terminalshell_linux.c b/src/detection/terminalshell/terminalshell_linux.c index 931ffdee2..9bb488e0f 100644 --- a/src/detection/terminalshell/terminalshell_linux.c +++ b/src/detection/terminalshell/terminalshell_linux.c @@ -390,7 +390,7 @@ const FFTerminalShellResult* ffDetectTerminalShell(const FFinstance* instance) ffStrbufInit(&result.terminalVersion); - if(instance->config.terminalVersion) + if(instance->config.terminal.version) fftsGetTerminalVersion(&result.terminalProcessName, &result.terminalExe, &result.terminalVersion); ffThreadMutexUnlock(&mutex); diff --git a/src/detection/terminalshell/terminalshell_windows.c b/src/detection/terminalshell/terminalshell_windows.c index 6b5c9b9c1..a20cfc11a 100644 --- a/src/detection/terminalshell/terminalshell_windows.c +++ b/src/detection/terminalshell/terminalshell_windows.c @@ -351,7 +351,7 @@ const FFTerminalShellResult* ffDetectTerminalShell(const FFinstance* instance) getTerminalFromEnv(&result); ffStrbufInit(&result.terminalVersion); - if(instance->config.terminalVersion) + if(instance->config.terminal.version) fftsGetTerminalVersion(&result.terminalProcessName, &result.terminalExe, &result.terminalVersion); exit: diff --git a/src/fastfetch.c b/src/fastfetch.c index da2526d74..f0eda06af 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -997,7 +997,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con 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)) {} - else if(optionParseModuleArgs(key, value, "terminal", &instance->config.terminal)) {} + else if(ffParseTerminalCommandOptions(&instance->config.terminal, key, value)) {} else if(optionParseModuleArgs(key, value, "terminal-font", &instance->config.terminalFont)) {} else if(ffParseCPUCommandOptions(&instance->config.cpu, key, value)) {} else if(ffParseCPUUsageCommandOptions(&instance->config.cpuUsage, key, value)) {} @@ -1088,8 +1088,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Module options// ////////////////// - else if(strcasecmp(key, "--terminal-version") == 0) - instance->config.terminalVersion = optionParseBoolean(value); else if(strcasecmp(key, "--player-name") == 0) optionParseString(key, value, &instance->config.playerName); else if(strcasecmp(key, "--publicip-url") == 0) @@ -1210,8 +1208,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintFont(instance, &instance->config.font); 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, FF_TERMINAL_MODULE_NAME) == 0) + ffPrintTerminal(instance, &instance->config.terminal); else if(strcasecmp(line, "terminalfont") == 0) ffPrintTerminalFont(instance); else if(strcasecmp(line, FF_CPU_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 1a3498521..fa226c008 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -79,7 +79,7 @@ typedef struct FFconfig FFModuleArgs icons; FFFontOptions font; FFCursorOptions cursor; - FFModuleArgs terminal; + FFTerminalOptions terminal; FFModuleArgs terminalFont; FFCPUOptions cpu; FFCPUUsageOptions cpuUsage; @@ -132,8 +132,6 @@ typedef struct FFconfig FFstrbuf libwlanapi; FFstrbuf libnm; - bool terminalVersion; - FFstrbuf publicIpUrl; uint32_t publicIpTimeout; @@ -205,7 +203,6 @@ void ffPrintWM(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); -void ffPrintTerminal(FFinstance* instance); void ffPrintTerminalFont(FFinstance* instance); void ffPrintPowerAdapter(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 49b48fc71..94a16fa54 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -41,7 +41,7 @@ int main(int argc, char** argv) ffPrintIcons(&instance); ffPrintFont(&instance, &instance.config.font); ffPrintCursor(&instance, &instance.config.cursor); - ffPrintTerminal(&instance); + ffPrintTerminal(&instance, &instance.config.terminal); ffPrintTerminalFont(&instance); ffPrintCPU(&instance, &instance.config.cpu); ffPrintGPU(&instance, &instance.config.gpu); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 3b15bacd3..d9aaf2a85 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -117,6 +117,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'T': { return + tryModule(instance, type, module, FF_TERMINAL_MODULE_NAME, ffParseTerminalJsonObject) || tryModule(instance, type, module, FF_TITLE_MODULE_NAME, ffParseTitleJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 08c4a8598..090d45fcd 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -31,6 +31,7 @@ #include "modules/shell/shell.h" #include "modules/sound/sound.h" #include "modules/swap/swap.h" +#include "modules/terminal/terminal.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 522036be8..6a9690343 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -29,6 +29,7 @@ #include "modules/shell/option.h" #include "modules/sound/option.h" #include "modules/swap/option.h" +#include "modules/terminal/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" #include "modules/wifi/option.h" diff --git a/src/modules/terminal.c b/src/modules/terminal.c deleted file mode 100644 index 28e8d14a5..000000000 --- a/src/modules/terminal.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/terminalshell/terminalshell.h" - -#include - -#define FF_TERMINAL_MODULE_NAME "Terminal" -#define FF_TERMINAL_NUM_FORMAT_ARGS 10 - -void ffPrintTerminal(FFinstance* instance) -{ - const FFTerminalShellResult* result = ffDetectTerminalShell(instance); - - if(result->terminalProcessName.length == 0) - { - ffPrintError(instance, FF_TERMINAL_MODULE_NAME, 0, &instance->config.terminal, "Couldn't detect terminal"); - return; - } - - if(instance->config.terminal.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_TERMINAL_MODULE_NAME, 0, &instance->config.terminal.key); - - if(result->terminalVersion.length) - printf("%s %s\n", result->terminalPrettyName.chars, result->terminalVersion.chars); - else - ffStrbufPutTo(&result->terminalPrettyName, stdout); - } - else - { - ffPrintFormat(instance, FF_TERMINAL_MODULE_NAME, 0, &instance->config.terminal, FF_TERMINAL_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &result->terminalProcessName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->terminalExe}, - {FF_FORMAT_ARG_TYPE_STRING, result->terminalExeName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->shellProcessName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->shellExe}, - {FF_FORMAT_ARG_TYPE_STRING, result->shellExeName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->shellVersion}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->userShellExe}, - {FF_FORMAT_ARG_TYPE_STRING, result->userShellExeName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->userShellVersion} - }); - } -} diff --git a/src/modules/terminal/option.h b/src/modules/terminal/option.h new file mode 100644 index 000000000..46c9c96fa --- /dev/null +++ b/src/modules/terminal/option.h @@ -0,0 +1,13 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFTerminalOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + bool version; +} FFTerminalOptions; diff --git a/src/modules/terminal/terminal.c b/src/modules/terminal/terminal.c new file mode 100644 index 000000000..23c2f8460 --- /dev/null +++ b/src/modules/terminal/terminal.c @@ -0,0 +1,100 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/terminalshell/terminalshell.h" +#include "modules/terminal/terminal.h" + +#include + +#define FF_TERMINAL_NUM_FORMAT_ARGS 10 + +void ffPrintTerminal(FFinstance* instance, FFTerminalOptions* options) +{ + const FFTerminalShellResult* result = ffDetectTerminalShell(instance); + + if(result->terminalProcessName.length == 0) + { + ffPrintError(instance, FF_TERMINAL_MODULE_NAME, 0, &options->moduleArgs, "Couldn't detect terminal"); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_TERMINAL_MODULE_NAME, 0, &options->moduleArgs.key); + + if(result->terminalVersion.length) + printf("%s %s\n", result->terminalPrettyName.chars, result->terminalVersion.chars); + else + ffStrbufPutTo(&result->terminalPrettyName, stdout); + } + else + { + ffPrintFormat(instance, FF_TERMINAL_MODULE_NAME, 0, &options->moduleArgs, FF_TERMINAL_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &result->terminalProcessName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->terminalExe}, + {FF_FORMAT_ARG_TYPE_STRING, result->terminalExeName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->shellProcessName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->shellExe}, + {FF_FORMAT_ARG_TYPE_STRING, result->shellExeName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->shellVersion}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->userShellExe}, + {FF_FORMAT_ARG_TYPE_STRING, result->userShellExeName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->userShellVersion} + }); + } +} + +void ffInitTerminalOptions(FFTerminalOptions* options) +{ + options->moduleName = FF_TERMINAL_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + options->version = true; +} + +bool ffParseTerminalCommandOptions(FFTerminalOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_TERMINAL_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "version") == 0) + { + options->version = ffOptionParseBoolean(value); + return true; + } + + return false; +} + +void ffDestroyTerminalOptions(FFTerminalOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseTerminalJsonObject(FFinstance* instance, json_object* module) +{ + FFTerminalOptions __attribute__((__cleanup__(ffDestroyTerminalOptions))) options; + ffInitTerminalOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "version") == 0) + { + options.version = (bool) json_object_get_boolean(val); + continue; + } + + ffPrintError(instance, FF_TERMINAL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintTerminal(instance, &options); +} +#endif diff --git a/src/modules/terminal/terminal.h b/src/modules/terminal/terminal.h new file mode 100644 index 000000000..56a7dc0be --- /dev/null +++ b/src/modules/terminal/terminal.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_TERMINAL_MODULE_NAME "Terminal" + +void ffPrintTerminal(FFinstance* instance, FFTerminalOptions* options); +void ffInitTerminalOptions(FFTerminalOptions* options); +bool ffParseTerminalCommandOptions(FFTerminalOptions* options, const char* key, const char* value); +void ffDestroyTerminalOptions(FFTerminalOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseTerminalJsonObject(FFinstance* instance, json_object* module); +#endif