From 8fa4d7ae6ef8d1c7b6f858d5563f3fba82ce2993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 24 Jul 2024 11:13:37 +0800 Subject: [PATCH] Fastfetch: add option `--key-type ` --- doc/json_schema.json | 11 +++++++++++ src/common/option.h | 6 +++--- src/common/printing.c | 41 +++++++++++++++++++++++++++-------------- src/data/help.json | 14 ++++++++++++++ src/options/display.c | 27 +++++++++++++++++++++++++++ src/options/display.h | 1 + 6 files changed, 83 insertions(+), 17 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index ca8d45690..64efcfe05 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -424,6 +424,17 @@ "minimum": 0, "default": 0 }, + "keyType": { + "type": "string", + "description": "Set the type of keys to display", + "enum": [ + "none", + "string", + "icon", + "botn" + ], + "default": "string" + }, "size": { "type": "object", "additionalProperties": false, diff --git a/src/common/option.h b/src/common/option.h index 1c4158f73..043990192 100644 --- a/src/common/option.h +++ b/src/common/option.h @@ -48,9 +48,9 @@ static inline void ffOptionInitModuleBaseInfo( typedef enum FFModuleKeyType { FF_MODULE_KEY_TYPE_NONE = 0, - FF_MODULE_KEY_TYPE_STRING = 0 << 1, - FF_MODULE_KEY_TYPE_KEY = 1 << 1, - FF_MODULE_KEY_TYPE_BOTH = FF_MODULE_KEY_TYPE_STRING | FF_MODULE_KEY_TYPE_KEY, + FF_MODULE_KEY_TYPE_STRING = 1 << 0, + FF_MODULE_KEY_TYPE_ICON = 1 << 1, + FF_MODULE_KEY_TYPE_BOTH = FF_MODULE_KEY_TYPE_STRING | FF_MODULE_KEY_TYPE_ICON, } FFModuleKeyType; typedef struct FFModuleArgs diff --git a/src/common/printing.c b/src/common/printing.c index 515556609..c597439f6 100644 --- a/src/common/printing.c +++ b/src/common/printing.c @@ -11,7 +11,7 @@ void ffPrintLogoAndKey(const char* moduleName, uint8_t moduleIndex, const FFModu return; //This is used as a magic value for hiding keys - if (!(moduleArgs && ffStrbufEqualS(&moduleArgs->key, " "))) + if (!(moduleArgs && ffStrbufEqualS(&moduleArgs->key, " ")) && instance.config.display.keyType != FF_MODULE_KEY_TYPE_NONE) { if(!instance.config.display.pipe) { @@ -25,22 +25,35 @@ void ffPrintLogoAndKey(const char* moduleName, uint8_t moduleIndex, const FFModu ffPrintColor(&instance.config.display.colorKeys); } - //NULL check is required for modules with custom keys, e.g. disk with the folder path - if((printType & FF_PRINT_TYPE_NO_CUSTOM_KEY) || !moduleArgs || moduleArgs->key.length == 0) + bool hasIcon = false; + if (instance.config.display.keyType & FF_MODULE_KEY_TYPE_ICON && moduleArgs && moduleArgs->icon.length > 0) { - fputs(moduleName, stdout); - - if(moduleIndex > 0) - printf(" %hhu", moduleIndex); + ffStrbufWriteTo(&moduleArgs->icon, stdout); + hasIcon = true; } - else + + if (instance.config.display.keyType & FF_MODULE_KEY_TYPE_STRING) { - FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate(); - FF_PARSE_FORMAT_STRING_CHECKED(&key, &moduleArgs->key, 2, ((FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_UINT8, &moduleIndex, "index"}, - {FF_FORMAT_ARG_TYPE_STRBUF, &moduleArgs->icon, "icon"}, - })); - ffStrbufWriteTo(&key, stdout); + if(hasIcon) + putchar(' '); + + //NULL check is required for modules with custom keys, e.g. disk with the folder path + if((printType & FF_PRINT_TYPE_NO_CUSTOM_KEY) || !moduleArgs || moduleArgs->key.length == 0) + { + fputs(moduleName, stdout); + + if(moduleIndex > 0) + printf(" %hhu", moduleIndex); + } + else + { + FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate(); + FF_PARSE_FORMAT_STRING_CHECKED(&key, &moduleArgs->key, 2, ((FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_UINT8, &moduleIndex, "index"}, + {FF_FORMAT_ARG_TYPE_STRBUF, &moduleArgs->icon, "icon"}, + })); + ffStrbufWriteTo(&key, stdout); + } } if(!instance.config.display.pipe) diff --git a/src/data/help.json b/src/data/help.json index d69c80d05..42452b867 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -505,6 +505,20 @@ "type": "num" } }, + { + "long": "key-type", + "desc": "Set the type of keys to display", + "arg": { + "type": "enum", + "enum": { + "none": "Disable keys", + "string": "Show string", + "icon": "Show icon", + "both": "Show both icon and string" + }, + "default": "string" + } + }, { "long": "bright-color", "desc": "Set if the keys, title and ASCII logo should be printed in bright color", diff --git a/src/options/display.c b/src/options/display.c index c29370864..112cc7e89 100644 --- a/src/options/display.c +++ b/src/options/display.c @@ -203,6 +203,19 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va options->noBuffer = yyjson_get_bool(val); else if (ffStrEqualsIgnCase(key, "keyWidth")) options->keyWidth = (uint32_t) yyjson_get_uint(val); + else if (ffStrEqualsIgnCase(key, "keyType")) + { + int value; + const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { + { "none", FF_MODULE_KEY_TYPE_NONE }, + { "string", FF_MODULE_KEY_TYPE_STRING }, + { "icon", FF_MODULE_KEY_TYPE_ICON }, + { "both", FF_MODULE_KEY_TYPE_BOTH }, + {} + }); + if (error) return error; + options->keyType = (uint8_t) value; + } else if (ffStrEqualsIgnCase(key, "constants")) { if (!yyjson_is_arr(val)) @@ -288,6 +301,16 @@ bool ffOptionsParseDisplayCommandLine(FFOptionsDisplay* options, const char* key } else if(ffStrEqualsIgnCase(key, "--key-width")) options->keyWidth = ffOptionParseUInt32(key, value); + else if(ffStrEqualsIgnCase(key, "--key-type")) + { + options->keyType = (FFModuleKeyType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { + { "none", FF_MODULE_KEY_TYPE_NONE }, + { "string", FF_MODULE_KEY_TYPE_STRING }, + { "icon", FF_MODULE_KEY_TYPE_ICON }, + { "both", FF_MODULE_KEY_TYPE_BOTH }, + {} + }); + } else if(ffStrEqualsIgnCase(key, "--bright-color")) options->brightColor = ffOptionParseBoolean(value); else if(ffStrEqualsIgnCase(key, "--binary-prefix")) @@ -425,6 +448,7 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) options->stat = false; options->noBuffer = false; options->keyWidth = 0; + options->keyType = FF_MODULE_KEY_TYPE_STRING; options->tempUnit = FF_TEMPERATURE_UNIT_CELSIUS; options->tempNdigits = 1; @@ -623,6 +647,9 @@ void ffOptionsGenerateDisplayJsonConfig(FFOptionsDisplay* options, yyjson_mut_do if (options->keyWidth != defaultOptions.keyWidth) yyjson_mut_obj_add_uint(doc, obj, "keyWidth", options->keyWidth); + if (options->keyType != defaultOptions.keyType) + yyjson_mut_obj_add_uint(doc, obj, "keyType", options->keyType); + { yyjson_mut_val* freq = yyjson_mut_obj(doc); if (options->freqNdigits != defaultOptions.freqNdigits) diff --git a/src/options/display.h b/src/options/display.h index 42e5c22ee..1d38f1449 100644 --- a/src/options/display.h +++ b/src/options/display.h @@ -53,6 +53,7 @@ typedef struct FFOptionsDisplay FFstrbuf percentColorRed; bool noBuffer; uint32_t keyWidth; + FFModuleKeyType keyType; int8_t freqNdigits; FFlist constants; // list of FFstrbuf } FFOptionsDisplay;