From de2a3466016499179c3c96619395313e6fbc1ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 25 Mar 2023 14:46:47 +0800 Subject: [PATCH 01/71] Revert "Deps: revert changes of JSON parse library" This reverts commit ccb0f853db6974212776f4654893b240d95b71ac. --- .github/workflows/push.yml | 12 +- CHANGELOG.md | 3 + CMakeLists.txt | 8 +- README.md | 6 +- src/common/init.c | 8 +- src/data/config_user.txt | 2 +- src/data/help.txt | 2 +- src/detection/terminalfont/terminalfont.c | 142 ++++++++++++---------- src/fastfetch.c | 4 +- src/fastfetch.h | 2 +- 10 files changed, 101 insertions(+), 88 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 26b197503..cb4355dc6 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -21,7 +21,7 @@ jobs: uses: actions/checkout@v3 - name: install required packages - run: sudo apt-get update && sudo apt-get install -y libpci-dev libvulkan-dev libwayland-dev libxrandr-dev libxcb-randr0-dev libdconf-dev libdbus-1-dev libmagickcore-dev libxfconf-0-dev libsqlite3-dev rpm librpm-dev libzstd-dev libegl-dev libglx-dev libosmesa6-dev ocl-icd-opencl-dev libnm-dev libpulse-dev libcjson-dev + run: sudo apt-get update && sudo apt-get install -y libpci-dev libvulkan-dev libwayland-dev libxrandr-dev libxcb-randr0-dev libdconf-dev libdbus-1-dev libmagickcore-dev libxfconf-0-dev libsqlite3-dev rpm librpm-dev libzstd-dev libegl-dev libglx-dev libosmesa6-dev ocl-icd-opencl-dev libnm-dev libpulse-dev libjson-c-dev - name: configure project env: @@ -53,7 +53,7 @@ jobs: uses: actions/checkout@v3 - name: install required packages - run: sudo apt-get update && sudo apt-get install -y libpci-dev libvulkan-dev libwayland-dev libxrandr-dev libxcb-randr0-dev libdconf-dev libdbus-1-dev libmagickcore-dev libxfconf-0-dev libsqlite3-dev rpm librpm-dev libzstd-dev libegl-dev libglx-dev libosmesa6-dev ocl-icd-opencl-dev libnm-dev libpulse-dev libcjson-dev + run: sudo apt-get update && sudo apt-get install -y libpci-dev libvulkan-dev libwayland-dev libxrandr-dev libxcb-randr0-dev libdconf-dev libdbus-1-dev libmagickcore-dev libxfconf-0-dev libsqlite3-dev rpm librpm-dev libzstd-dev libegl-dev libglx-dev libosmesa6-dev ocl-icd-opencl-dev libnm-dev libpulse-dev libjson-c-dev - name: Initialize CodeQL uses: github/codeql-action/init@v2 @@ -183,7 +183,7 @@ jobs: with: msystem: CLANG64 update: true - install: git zip mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-vulkan-loader mingw-w64-clang-x86_64-opencl-icd mingw-w64-clang-x86_64-cjson + install: git zip mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-vulkan-loader mingw-w64-clang-x86_64-opencl-icd mingw-w64-clang-x86_64-json-c - name: print msys version run: uname -a @@ -203,7 +203,7 @@ jobs: uses: github/codeql-action/analyze@v2 - name: copy necessary dlls - run: cp /clang64/bin/{libcjson,OpenCL,vulkan-1}.dll . + run: cp /clang64/bin/{libjson-c*,OpenCL,vulkan-1}.dll . - name: list features run: ./fastfetch --list-features @@ -244,7 +244,7 @@ jobs: with: msystem: CLANG32 update: true - install: git zip mingw-w64-clang-i686-cmake mingw-w64-clang-i686-clang mingw-w64-clang-i686-vulkan-loader mingw-w64-clang-i686-opencl-icd mingw-w64-clang-i686-cjson + install: git zip mingw-w64-clang-i686-cmake mingw-w64-clang-i686-clang mingw-w64-clang-i686-vulkan-loader mingw-w64-clang-i686-opencl-icd mingw-w64-clang-i686-json-c - name: print msys version run: uname -a @@ -264,7 +264,7 @@ jobs: uses: github/codeql-action/analyze@v2 - name: copy necessary dlls - run: cp /clang32/bin/{libcjson,OpenCL,vulkan-1}.dll . + run: cp /clang32/bin/{libjson-c*,OpenCL,vulkan-1}.dll . - name: run fastfetch run: time ./fastfetch --disable-linewrap false --hide-cursor false --show-errors true --load-config presets/all diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b99eba1f..fb38752aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,9 @@ Bugfixes: * Don't exit if libpci is failed to init (GPU, Linux, #433) * Names of most well-known gamepads are correctly printed instead of `Wireless Controller` on Windows +Changes: +* Use json-c to parse JSON strings for comments support, instead of using unmaintained cJSON + Logo: * Small update for nobara logo (#435, @regulargvy13) diff --git a/CMakeLists.txt b/CMakeLists.txt index a5ae85629..df1a1da32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,7 +70,7 @@ cmake_dependent_option(ENABLE_OPENCL "Enable opencl" ON "LINUX OR BSD OR WIN32" cmake_dependent_option(ENABLE_LIBNM "Enable libnm" ON "LINUX" OFF) cmake_dependent_option(ENABLE_FREETYPE "Enable freetype" ON "ANDROID" OFF) cmake_dependent_option(ENABLE_PULSE "Enable pulse" ON "LINUX OR BSD" OFF) -cmake_dependent_option(ENABLE_LIBCJSON "Enable libcjson" ON "LINUX OR WIN32" OFF) +cmake_dependent_option(ENABLE_JSONC "Enable json-c" ON "LINUX OR WIN32" OFF) cmake_dependent_option(ENABLE_THREADS "Enable multithreading" ON "Threads_FOUND" OFF) cmake_dependent_option(ENABLE_BUFFER "Enable stdout buffer" ON "LINUX OR APPLE OR BSD OR WIN32 OR ANDROID" OFF) @@ -700,9 +700,9 @@ ff_lib_enable(PULSE "libpulse" "Pulse" ) -ff_lib_enable(LIBCJSON - "libcjson" - "CJson" +ff_lib_enable(JSONC + "json-c" + "json-c" ) if(ENABLE_THREADS) diff --git a/README.md b/README.md index ef9536c06..a5a153ee8 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ The following libraries are used if present at runtime: * [`libXFConf`](https://gitlab.xfce.org/xfce/xfconf): Needed for XFWM theme and XFCE Terminal font. * [`libsqlite3`](https://www.sqlite.org/index.html): Needed for pkg & rpm package count. * [`librpm`](http://rpm.org/): Slower fallback for rpm package count. Needed on openSUSE. -* [`libcJSON`](https://github.com/DaveGamble/cJSON): Needed for Windows Terminal font ( WSL ). +* [`json-c`](https://github.com/json-c/json-c): Needed for Windows Terminal font ( WSL ). * [`libnm`](https://networkmanager.dev/docs/libnm/latest/): Used for Wifi detection. * [`libpulse`](https://freedesktop.org/software/pulseaudio/doxygen/): Used for Sound detection. @@ -71,7 +71,7 @@ For the image logo, iTerm with iterm image protocol should work. Apple Terminal ### Windows * [`wlanapi`](https://learn.microsoft.com/en-us/windows/win32/api/wlanapi/): A system dll which isn't supported by Windows Server by default. Used for Wifi info detection. -* [`libcJSON`](https://github.com/DaveGamble/cJSON): Used for Windows Terminal font detection. [`cjson`](https://github.com/msys2/MINGW-packages/tree/master/mingw-w64-cjson) +* [`json-c`](https://github.com/json-c/json-c): Used for Windows Terminal font detection. [`json-c`](https://github.com/msys2/MINGW-packages/tree/master/mingw-w64-json-c) * [`libvulkan`](https://www.vulkan.org/): Vulkan module. Usually has been provided by GPU drivers. [`vulkan-loader`](https://github.com/msys2/MINGW-packages/tree/master/mingw-w64-vulkan-loader) [`vulkan-headers`](https://github.com/msys2/MINGW-packages/tree/master/mingw-w64-vulkan-headers) * [`libOpenCL`](https://www.khronos.org/opencl/): OpenCL module. [`opencl-icd`](https://github.com/msys2/MINGW-packages/tree/master/mingw-w64-opencl-icd) @@ -138,7 +138,7 @@ Currently GCC or clang is required (MSVC is not supported). MSYS2 with CLANG64 s 1. Open `MSYS2 / CLANG64` (not `MSYS2 / MSYS`, which targets cygwin C runtime) 1. Install dependencies ```bash -pacman -Syu mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-pkgconf mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-cjson mingw-w64-clang-x86_64-vulkan-loader mingw-w64-clang-x86_64-opencl-icd +pacman -Syu mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-pkgconf mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-json-c mingw-w64-clang-x86_64-vulkan-loader mingw-w64-clang-x86_64-opencl-icd ``` Follow the building instructions of Linux next. diff --git a/src/common/init.c b/src/common/init.c index 372b2dd8f..5f6ee43db 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -137,7 +137,7 @@ static void defaultConfig(FFinstance* instance) ffStrbufInitA(&instance->config.libGLX, 0); ffStrbufInitA(&instance->config.libOSMesa, 0); ffStrbufInitA(&instance->config.libOpenCL, 0); - ffStrbufInitA(&instance->config.libcJSON, 0); + ffStrbufInitA(&instance->config.libJSONC, 0); ffStrbufInitA(&instance->config.libfreetype, 0); ffStrbufInit(&instance->config.libPulse); ffStrbufInit(&instance->config.libwlanapi); @@ -400,7 +400,7 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.libGLX); ffStrbufDestroy(&instance->config.libOSMesa); ffStrbufDestroy(&instance->config.libOpenCL); - ffStrbufDestroy(&instance->config.libcJSON); + ffStrbufDestroy(&instance->config.libJSONC); ffStrbufDestroy(&instance->config.libfreetype); ffStrbufDestroy(&instance->config.libPulse); ffStrbufDestroy(&instance->config.libwlanapi); @@ -505,8 +505,8 @@ void ffListFeatures() #ifdef FF_HAVE_OPENCL "opencl\n" #endif - #ifdef FF_HAVE_LIBCJSON - "libcjson\n" + #ifdef FF_HAVE_LIBJSONC + "json-c\n" #endif #ifdef FF_HAVE_FREETYPE "freetype\n" diff --git a/src/data/config_user.txt b/src/data/config_user.txt index 0ade6d30b..a0b91d92f 100644 --- a/src/data/config_user.txt +++ b/src/data/config_user.txt @@ -456,6 +456,6 @@ #--lib-glx /usr/lib/libGLX.so #--lib-osmesa /usr/lib/libOSMesa.so #--lib-opencl /usr/lib/libOpenCL.so -#--lib-cjson /usr/lib/libcjson.so +#--lib-jsonc /usr/lib/libjson-c.so #--lib-freetype /data/data/com.termux/files/usr/lib #--lib-pulse /usr/lib/libpulse.so diff --git a/src/data/help.txt b/src/data/help.txt index 83428e0da..30fedcdfd 100644 --- a/src/data/help.txt +++ b/src/data/help.txt @@ -97,7 +97,7 @@ Library options: Set the path of a library to load --lib-glx --lib-osmesa --lib-opencl - --lib-cjson + --lib-jsonc --lib-pulse --lib-freetype diff --git a/src/detection/terminalfont/terminalfont.c b/src/detection/terminalfont/terminalfont.c index 1c2a4be9b..d9693f637 100644 --- a/src/detection/terminalfont/terminalfont.c +++ b/src/detection/terminalfont/terminalfont.c @@ -67,110 +67,115 @@ FF_MAYBE_UNUSED static void detectTTY(FFTerminalFontResult* terminalFont) #if defined(_WIN32) || defined(__linux__) -#ifdef FF_HAVE_LIBCJSON +#ifdef FF_HAVE_JSONC #include "common/library.h" #include "common/processing.h" -#include #include +#include -typedef struct CJSONData +typedef struct JSONCData { - FF_LIBRARY_SYMBOL(cJSON_Parse) - FF_LIBRARY_SYMBOL(cJSON_IsObject) - FF_LIBRARY_SYMBOL(cJSON_GetObjectItemCaseSensitive) - FF_LIBRARY_SYMBOL(cJSON_IsString) - FF_LIBRARY_SYMBOL(cJSON_GetStringValue) - FF_LIBRARY_SYMBOL(cJSON_IsNumber) - FF_LIBRARY_SYMBOL(cJSON_GetNumberValue) - FF_LIBRARY_SYMBOL(cJSON_IsArray) - FF_LIBRARY_SYMBOL(cJSON_Delete) + FF_LIBRARY_SYMBOL(json_tokener_parse) + FF_LIBRARY_SYMBOL(json_object_get_array) + FF_LIBRARY_SYMBOL(json_object_is_type) + FF_LIBRARY_SYMBOL(json_object_get_double) + FF_LIBRARY_SYMBOL(json_object_get_string_len) + FF_LIBRARY_SYMBOL(json_object_get_string) + FF_LIBRARY_SYMBOL(json_object_object_get) + FF_LIBRARY_SYMBOL(json_object_put) - cJSON* root; -} CJSONData; + json_object* root; +} JSONCData; -static const char* detectWTProfile(CJSONData* cjsonData, cJSON* profile, FFstrbuf* name, double* size) +static const char* detectWTProfile(JSONCData* data, json_object* profile, FFstrbuf* name, double* size) { - if(!cjsonData->ffcJSON_IsObject(profile)) - return "cJSON_IsObject(profile) returns false"; + json_object* font = data->ffjson_object_object_get(profile, "font"); + if (!font) + return "json_object_object_get(profile, \"font\"); failed"; - cJSON* font = cjsonData->ffcJSON_GetObjectItemCaseSensitive(profile, "font"); - if(!cjsonData->ffcJSON_IsObject(font)) - return "cJSON_IsObject(font) returns false"; + if (!data->ffjson_object_is_type(font, json_type_object)) + return "json_object_is_type(font, json_type_object) returns false"; - if(name->length == 0) + if (name->length == 0) { - cJSON* pface = cjsonData->ffcJSON_GetObjectItemCaseSensitive(font, "face"); - if(cjsonData->ffcJSON_IsString(pface)) - ffStrbufAppendS(name, cjsonData->ffcJSON_GetStringValue(pface)); + json_object* pface = data->ffjson_object_object_get(font, "face"); + if(data->ffjson_object_is_type(pface, json_type_string)) + ffStrbufAppendNS(name, (uint32_t) data->ffjson_object_get_string_len(pface), data->ffjson_object_get_string(pface)); } - if(*size < 0) + + if (*size < 0) { - cJSON* psize = cjsonData->ffcJSON_GetObjectItemCaseSensitive(font, "size"); - if(cjsonData->ffcJSON_IsNumber(psize)) - *size = cjsonData->ffcJSON_GetNumberValue(psize); + json_object* psize = data->ffjson_object_object_get(font, "size"); + if (data->ffjson_object_is_type(psize, json_type_int) || data->ffjson_object_is_type(psize, json_type_double)) + *size = data->ffjson_object_get_double(psize); } return NULL; } -static inline void wrapCjsonFree(CJSONData* data) +static inline void wrapJsoncFree(JSONCData* data) { assert(data); if (data->root) - data->ffcJSON_Delete(data->root); + data->ffjson_object_put(data->root); } static const char* detectFromWTImpl(const FFinstance* instance, FFstrbuf* content, FFstrbuf* name, double* size) { - FF_LIBRARY_LOAD(libcjson, &instance->config.libcJSON, "dlopen libcjson" FF_LIBRARY_EXTENSION " failed", "libcjson"FF_LIBRARY_EXTENSION, 1) - CJSONData __attribute__((__cleanup__(wrapCjsonFree))) cjsonData = {}; // Make sure cjsonData is destroyed before libcjson is dlclosed - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE2(libcjson, cjsonData, cJSON_Parse, cJSON_Parse@4) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE2(libcjson, cjsonData, cJSON_IsObject, cJSON_IsObject@4) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE2(libcjson, cjsonData, cJSON_GetObjectItemCaseSensitive, cJSON_GetObjectItemCaseSensitive@8) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE2(libcjson, cjsonData, cJSON_IsString, cJSON_IsString@4) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE2(libcjson, cjsonData, cJSON_GetStringValue, cJSON_GetStringValue@4) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE2(libcjson, cjsonData, cJSON_IsNumber, cJSON_IsNumber@4) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE2(libcjson, cjsonData, cJSON_GetNumberValue, cJSON_GetNumberValue@4) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE2(libcjson, cjsonData, cJSON_IsArray, cJSON_IsArray@4) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE2(libcjson, cjsonData, cJSON_Delete, cJSON_Delete@4) + FF_LIBRARY_LOAD(libjsonc, &instance->config.libJSONC, "dlopen libjson-c" FF_LIBRARY_EXTENSION" failed", + #ifdef _WIN32 + "libjson-c-5" FF_LIBRARY_EXTENSION, -1 + #else + "libjson-c" FF_LIBRARY_EXTENSION, 5 + #endif + ) + JSONCData __attribute__((__cleanup__(wrapJsoncFree))) data = {}; + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_tokener_parse) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_is_type) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_array) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_double) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string_len) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_object_get) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_put) - cJSON* root = cjsonData.root = cjsonData.ffcJSON_Parse(content->chars); - if(!cjsonData.ffcJSON_IsObject(root)) - return "cJSON_Parse() failed"; + data.root = data.ffjson_tokener_parse(content->chars); + if (!data.root) + return "Failed to parse WT JSON config file"; - cJSON* profiles = cjsonData.ffcJSON_GetObjectItemCaseSensitive(root, "profiles"); - if(!cjsonData.ffcJSON_IsObject(profiles)) - return "cJSON_GetObjectItemCaseSensitive(root, \"profiles\") failed"; + json_object* profiles = data.ffjson_object_object_get(data.root, "profiles"); + if (!profiles) + return "json_object_object_get(root, \"profiles\") failed"; FF_STRBUF_AUTO_DESTROY wtProfileId; ffStrbufInitS(&wtProfileId, getenv("WT_PROFILE_ID")); ffStrbufTrim(&wtProfileId, '\''); - if(wtProfileId.length > 0) + if (wtProfileId.length > 0) { - cJSON* list = cjsonData.ffcJSON_GetObjectItemCaseSensitive(profiles, "list"); - if(cjsonData.ffcJSON_IsArray(list)) + array_list* list = data.ffjson_object_get_array(data.ffjson_object_object_get(profiles, "list")); + if (list) { - cJSON* profile; - cJSON_ArrayForEach(profile, list) + for (size_t idx = 0; idx < list->length; ++idx) { - if(!cjsonData.ffcJSON_IsObject(profile)) + json_object* profile = (json_object*) list->array[idx]; + json_object* guid = data.ffjson_object_object_get(profile, "guid"); + + if (!data.ffjson_object_is_type(guid, json_type_string)) continue; - cJSON* guid = cjsonData.ffcJSON_GetObjectItemCaseSensitive(profile, "guid"); - if(!cjsonData.ffcJSON_IsString(guid)) - continue; - if(ffStrbufCompS(&wtProfileId, cjsonData.ffcJSON_GetStringValue(guid)) == 0) + + if(ffStrbufEqualS(&wtProfileId, data.ffjson_object_get_string(guid))) { - detectWTProfile(&cjsonData, profile, name, size); + detectWTProfile(&data, profile, name, size); break; } } } } - cJSON* defaults = cjsonData.ffcJSON_GetObjectItemCaseSensitive(profiles, "defaults"); - if(defaults) - detectWTProfile(&cjsonData, defaults, name, size); + json_object* defaults = data.ffjson_object_object_get(profiles, "defaults"); + if (defaults) + detectWTProfile(&data, defaults, name, size); if(name->length == 0) ffStrbufSetS(name, "Cascadia Mono"); @@ -188,7 +193,7 @@ static const char* detectFromWTImpl(const FFinstance* instance, FFstrbuf* conten static void detectFromWindowsTeriminal(const FFinstance* instance, const FFstrbuf* terminalExe, FFTerminalFontResult* terminalFont) { //https://learn.microsoft.com/en-us/windows/terminal/install#settings-json-file - FF_STRBUF_AUTO_DESTROY json; + FFstrbuf json; ffStrbufInit(&json); const char* error = NULL; @@ -249,19 +254,22 @@ static void detectFromWindowsTeriminal(const FFinstance* instance, const FFstrbu if(error) { ffStrbufAppendS(&terminalFont->error, error); + ffStrbufDestroy(&json); return; } ffStrbufTrimRight(&json, '\n'); if(json.length == 0) { ffStrbufAppendS(&terminalFont->error, "Cannot find file \"settings.json\""); + ffStrbufDestroy(&json); return; } - FF_STRBUF_AUTO_DESTROY name; + FFstrbuf name; ffStrbufInit(&name); double size = -1; error = detectFromWTImpl(instance, &json, &name, &size); + ffStrbufDestroy(&json); if(error) ffStrbufAppendS(&terminalFont->error, error); @@ -271,17 +279,19 @@ static void detectFromWindowsTeriminal(const FFinstance* instance, const FFstrbu snprintf(sizeStr, sizeof(sizeStr), "%g", size); ffFontInitValues(&terminalFont->font, name.chars, sizeStr); } + + ffStrbufDestroy(&name); } -#else //FF_HAVE_CJSON +#else //FF_HAVE_JSONC static void detectFromWindowsTeriminal(const FFinstance* instance, const FFstrbuf* terminalExe, FFTerminalFontResult* terminalFont) { FF_UNUSED(instance, terminalExe, terminalFont); - ffStrbufAppendS(&terminalFont->error, "Fastfetch was built without libcJSON support"); + ffStrbufAppendS(&terminalFont->error, "Fastfetch was built without json-c support"); } -#endif //FF_HAVE_CJSON +#endif //FF_HAVE_JSONC #endif //defined(_WIN32) || defined(__linux__) diff --git a/src/fastfetch.c b/src/fastfetch.c index 63480f514..fd60176b8 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1226,8 +1226,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseString(key, value, &instance->config.libOSMesa); else if(strcasecmp(subkey, "-opencl") == 0) optionParseString(key, value, &instance->config.libOpenCL); - else if(strcasecmp(subkey, "-cjson") == 0) - optionParseString(key, value, &instance->config.libcJSON); + else if(strcasecmp(subkey, "-jsonc") == 0) + optionParseString(key, value, &instance->config.libJSONC); else if(strcasecmp(subkey, "-wlanapi") == 0) optionParseString(key, value, &instance->config.libwlanapi); else if(strcasecmp(key, "-pulse") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 8c1114cef..407c34f20 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -206,7 +206,7 @@ typedef struct FFconfig FFstrbuf libGLX; FFstrbuf libOSMesa; FFstrbuf libOpenCL; - FFstrbuf libcJSON; + FFstrbuf libJSONC; FFstrbuf libfreetype; FFstrbuf libPulse; FFstrbuf libwlanapi; From 6cb073e6a5e824c1723e703918e4152293c8db12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 7 Mar 2023 14:56:13 +0800 Subject: [PATCH 02/71] OS: major code refactoring Split `fastfetch.h` to make it possible to print OS module with different options --- CMakeLists.txt | 3 +- src/common/init.c | 9 ++- src/common/option.c | 120 ++++++++++++++++++++++++++++++++++++ src/common/option.h | 18 ++++++ src/detection/os/os_linux.c | 4 +- src/fastfetch.c | 8 +-- src/fastfetch.h | 14 +---- src/flashfetch.c | 4 +- src/modules/os/option.h | 15 +++++ src/modules/{ => os}/os.c | 48 +++++++++++++-- src/modules/os/os.h | 9 +++ 11 files changed, 223 insertions(+), 29 deletions(-) create mode 100644 src/common/option.c create mode 100644 src/common/option.h create mode 100644 src/modules/os/option.h rename src/modules/{ => os}/os.c (74%) create mode 100644 src/modules/os/os.h diff --git a/CMakeLists.txt b/CMakeLists.txt index df1a1da32..2ffb5de72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -232,6 +232,7 @@ set(LIBFASTFETCH_SRC src/common/format.c src/common/init.c src/common/library.c + src/common/option.c src/common/parsing.c src/common/printing.c src/common/properties.c @@ -286,7 +287,7 @@ set(LIBFASTFETCH_SRC src/modules/memory.c src/modules/opencl.c src/modules/opengl.c - src/modules/os.c + src/modules/os/os.c src/modules/packages.c src/modules/player.c src/modules/poweradapter.c diff --git a/src/common/init.c b/src/common/init.c index 5f6ee43db..fd67ee70c 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -15,6 +15,8 @@ #include #endif +#include "modules/os/os.h" + static void initState(FFstate* state) { state->logoWidth = 0; @@ -69,7 +71,7 @@ static void defaultConfig(FFinstance* instance) instance->config.multithreading = true; instance->config.stat = false; - initModuleArg(&instance->config.os); + ffInitOSOptions(&instance->config.os); initModuleArg(&instance->config.host); initModuleArg(&instance->config.bios); initModuleArg(&instance->config.board); @@ -180,8 +182,6 @@ static void defaultConfig(FFinstance* instance) instance->config.weatherTimeout = 0; ffStrbufInitS(&instance->config.weatherOutputFormat, "%t+-+%C+(%l)"); - ffStrbufInitA(&instance->config.osFile, 0); - ffStrbufInitA(&instance->config.playerName, 0); instance->config.percentType = 1; @@ -333,7 +333,7 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.colorTitle); ffStrbufDestroy(&instance->config.separator); - destroyModuleArg(&instance->config.os); + ffDestroyOSOptions(&instance->config.os); destroyModuleArg(&instance->config.host); destroyModuleArg(&instance->config.bios); destroyModuleArg(&instance->config.board); @@ -412,7 +412,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.localIpNamePrefix); ffStrbufDestroy(&instance->config.publicIpUrl); ffStrbufDestroy(&instance->config.weatherOutputFormat); - ffStrbufDestroy(&instance->config.osFile); ffStrbufDestroy(&instance->config.playerName); ffStrbufDestroy(&instance->config.commandShell); diff --git a/src/common/option.c b/src/common/option.c new file mode 100644 index 000000000..08c990632 --- /dev/null +++ b/src/common/option.c @@ -0,0 +1,120 @@ +#include "common/option.h" +#include "util/stringUtils.h" + +// Return start position of the inner key if the argument key belongs to the module specified, NULL otherwise +const char* ffOptionTestPrefix(const char* argumentKey, const char* moduleName) +{ + const char* subKey = argumentKey; + if(!(subKey[0] == '-' && subKey[1] == '-')) + return NULL; + + subKey += 2; + uint32_t moduleNameLen = (uint32_t)strlen(moduleName); + if(strncasecmp(subKey, moduleName, moduleNameLen) != 0) + return NULL; + + subKey += moduleNameLen; + if(subKey[0] != '-') + return NULL; + + subKey += 1; + + return subKey; +} + +bool ffOptionParseModuleArgs(const char* argumentKey, const char* subKey, const char* value, FFModuleArgs* result) +{ + if(strcasecmp(subKey, "key") == 0) + { + ffOptionParseString(argumentKey, value, &result->key); + return true; + } + else if(strcasecmp(subKey, "format") == 0) + { + ffOptionParseString(argumentKey, value, &result->outputFormat); + return true; + } + else if(strcasecmp(subKey, "error") == 0) + { + ffOptionParseString(argumentKey, value, &result->errorFormat); + return true; + } + return false; +} + +void ffOptionParseString(const char* argumentKey, const char* value, FFstrbuf* buffer) +{ + if(value == NULL) + { + fprintf(stderr, "Error: usage: %s \n", argumentKey); + exit(477); + } + + ffStrbufSetS(buffer, value); +} + +uint32_t ffOptionParseUInt32(const char* argumentKey, const char* value) +{ + if(value == NULL) + { + fprintf(stderr, "Error: usage: %s \n", argumentKey); + exit(480); + } + + char* end; + uint32_t num = (uint32_t) strtoul(value, &end, 10); + if(*end != '\0') + { + fprintf(stderr, "Error: usage: %s \n", argumentKey); + exit(479); + } + + return num; +} + +void ffOptionParseEnum(const char* argumentKey, const char* requestedKey, void* result, ...) +{ + if(requestedKey == NULL) + { + fprintf(stderr, "Error: usage: %s \n", argumentKey); + exit(476); + } + + va_list args; + va_start(args, result); + + while(true) + { + const char* key = va_arg(args, const char*); + if(key == NULL) + break; + + int value = va_arg(args, int); //C standard guarantees that enumeration constants are presented as ints + + if(strcasecmp(requestedKey, key) == 0) + { + *(int*)result = value; + va_end(args); + return; + } + } + + va_end(args); + + fprintf(stderr, "Error: unknown %s value: %s\n", argumentKey, requestedKey); + exit(478); +} + +void ffOptionInitModuleArg(FFModuleArgs* args) +{ + ffStrbufInit(&args->key); + ffStrbufInit(&args->outputFormat); + ffStrbufInit(&args->errorFormat); +} + +void ffOptionDestroyModuleArg(FFModuleArgs* args) +{ + ffStrbufDestroy(&args->key); + ffStrbufDestroy(&args->outputFormat); + ffStrbufDestroy(&args->errorFormat); +} diff --git a/src/common/option.h b/src/common/option.h new file mode 100644 index 000000000..339a44009 --- /dev/null +++ b/src/common/option.h @@ -0,0 +1,18 @@ +#pragma once + +#include "util/FFstrbuf.h" + +typedef struct FFModuleArgs +{ + FFstrbuf key; + FFstrbuf outputFormat; + FFstrbuf errorFormat; +} FFModuleArgs; + +const char* ffOptionTestPrefix(const char* argumentKey, const char* moduleName); +bool ffOptionParseModuleArgs(const char* argumentKey, const char* pkey, const char* value, FFModuleArgs* result); +void ffOptionParseString(const char* argumentKey, const char* value, FFstrbuf* buffer); +uint32_t ffOptionParseUInt32(const char* argumentKey, const char* value); +void ffOptionParseEnum(const char* argumentKey, const char* requestedKey, void* result, ...); +void ffOptionInitModuleArg(FFModuleArgs* args); +void ffOptionDestroyModuleArg(FFModuleArgs* args); diff --git a/src/detection/os/os_linux.c b/src/detection/os/os_linux.c index 063e8455b..a9db735db 100644 --- a/src/detection/os/os_linux.c +++ b/src/detection/os/os_linux.c @@ -96,9 +96,9 @@ static void getUbuntuFlavour(FFOSResult* result) static void detectOS(FFOSResult* os, const FFinstance* instance) { - if(instance->config.osFile.length > 0) + if(instance->config.os.file.length > 0) { - parseFile(instance->config.osFile.chars, os); + parseFile(instance->config.os.file.chars, os); return; } diff --git a/src/fastfetch.c b/src/fastfetch.c index fd60176b8..e6da44aad 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -17,6 +17,8 @@ #pragma GCC diagnostic ignored "-Wsign-conversion" +#include "modules/os/os.h" + typedef struct CustomValue { bool printKey; @@ -1129,7 +1131,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Module args options// /////////////////////// - else if(optionParseModuleArgs(key, value, "os", &instance->config.os)) {} + else if(ffParseOSCommandOptions(&instance->config.os, key, value)) {} else if(optionParseModuleArgs(key, value, "host", &instance->config.host)) {} else if(optionParseModuleArgs(key, value, "bios", &instance->config.bios)) {} else if(optionParseModuleArgs(key, value, "board", &instance->config.board)) {} @@ -1311,8 +1313,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_COMPACT_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_COMPACT_BIT); else if(strcasecmp(key, "--localip-name-prefix") == 0) optionParseString(key, value, &instance->config.localIpNamePrefix); - else if(strcasecmp(key, "--os-file") == 0) - optionParseString(key, value, &instance->config.osFile); else if(strcasecmp(key, "--player-name") == 0) optionParseString(key, value, &instance->config.playerName); else if(strcasecmp(key, "--publicip-url") == 0) @@ -1415,7 +1415,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "separator") == 0) ffPrintSeparator(instance); else if(strcasecmp(line, "os") == 0) - ffPrintOS(instance); + ffPrintOS(instance, &instance->config.os); else if(strcasecmp(line, "host") == 0) ffPrintHost(instance); else if(strcasecmp(line, "bios") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 407c34f20..3125cc0b4 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -18,6 +18,8 @@ static inline void ffUnused(int dummy, ...) { (void) dummy; } #define FASTFETCH_LOGO_MAX_COLORS 9 //two digits would make parsing much more complicated (index 1 - 9) +#include "modules/os/option.h" + typedef enum FFLogoType { FF_LOGO_TYPE_AUTO, //if something is given, first try builtin, then file. Otherwise detect logo @@ -80,13 +82,6 @@ typedef enum FFGLType FF_GL_TYPE_OSMESA } FFGLType; -typedef struct FFModuleArgs -{ - FFstrbuf key; - FFstrbuf outputFormat; - FFstrbuf errorFormat; -} FFModuleArgs; - typedef enum FFLocalIpType { FF_LOCALIP_TYPE_NONE, @@ -138,7 +133,7 @@ typedef struct FFconfig bool multithreading; bool stat; - FFModuleArgs os; + FFOSOptions os; FFModuleArgs host; FFModuleArgs bios; FFModuleArgs board; @@ -249,8 +244,6 @@ typedef struct FFconfig FFSoundType soundType; - FFstrbuf osFile; - FFstrbuf playerName; uint32_t percentType; @@ -316,7 +309,6 @@ void ffPrintCustom(FFinstance* instance, const char* key, const char* value); void ffPrintBreak(FFinstance* instance); void ffPrintTitle(FFinstance* instance); void ffPrintSeparator(FFinstance* instance); -void ffPrintOS(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 8737c8fcf..447cdd269 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -1,5 +1,7 @@ #include "fastfetch.h" +#include "modules/os/os.h" + int main(int argc, char** argv) { //Disable compiler warnings @@ -20,7 +22,7 @@ int main(int argc, char** argv) //Printing ffPrintTitle(&instance); ffPrintSeparator(&instance); - ffPrintOS(&instance); + ffPrintOS(&instance, &instance.config.os); ffPrintHost(&instance); //ffPrintBios(&instance); //ffPrintBoard(&instance); diff --git a/src/modules/os/option.h b/src/modules/os/option.h new file mode 100644 index 000000000..7d6b4d082 --- /dev/null +++ b/src/modules/os/option.h @@ -0,0 +1,15 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFOSOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + #if defined(__linux__) || defined(__FreeBSD__) + FFstrbuf file; + #endif +} FFOSOptions; diff --git a/src/modules/os.c b/src/modules/os/os.c similarity index 74% rename from src/modules/os.c rename to src/modules/os/os.c index 140cfdbbe..f202e6e4e 100644 --- a/src/modules/os.c +++ b/src/modules/os/os.c @@ -1,6 +1,8 @@ #include "fastfetch.h" #include "common/printing.h" +#include "common/option.h" #include "detection/os/os.h" +#include "modules/os/os.h" #include @@ -94,17 +96,17 @@ static void buildOutputNixOS(const FFinstance* instance, const FFOSResult* os, F } } -void ffPrintOS(FFinstance* instance) +void ffPrintOS(FFinstance* instance, FFOSOptions* options) { const FFOSResult* os = ffDetectOS(instance); if(os->name.length == 0 && os->prettyName.length == 0 && os->id.length == 0) { - ffPrintError(instance, FF_OS_MODULE_NAME, 0, &instance->config.os, "Could not detect OS"); + ffPrintError(instance, FF_OS_MODULE_NAME, 0, &options->moduleArgs, "Could not detect OS"); return; } - if(instance->config.os.outputFormat.length == 0) + if(options->moduleArgs.outputFormat.length == 0) { FFstrbuf result; ffStrbufInit(&result); @@ -114,13 +116,13 @@ void ffPrintOS(FFinstance* instance) else buildOutputDefault(instance, os, &result); - ffPrintLogoAndKey(instance, FF_OS_MODULE_NAME, 0, &instance->config.os.key); + ffPrintLogoAndKey(instance, FF_OS_MODULE_NAME, 0, &options->moduleArgs.key); ffStrbufPutTo(&result, stdout); ffStrbufDestroy(&result); } else { - ffPrintFormat(instance, FF_OS_MODULE_NAME, 0, &instance->config.os, FF_OS_NUM_FORMAT_ARGS, (FFformatarg[]){ + ffPrintFormat(instance, FF_OS_MODULE_NAME, 0, &options->moduleArgs, FF_OS_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemName}, {FF_FORMAT_ARG_TYPE_STRBUF, &os->name}, {FF_FORMAT_ARG_TYPE_STRBUF, &os->prettyName}, @@ -136,3 +138,39 @@ void ffPrintOS(FFinstance* instance) }); } } + +void ffInitOSOptions(FFOSOptions* options) +{ + options->moduleName = FF_OS_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + #if defined(__linux__) || defined(__FreeBSD__) + ffStrbufInit(&options->file); + #endif +} + +bool ffParseOSCommandOptions(FFOSOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_OS_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + #if defined(__linux__) || defined(__FreeBSD__) + if (strcasecmp(subKey, "file") == 0) + { + ffOptionParseString(key, value, &options->file); + return true; + } + #endif + + return false; +} + +void ffDestroyOSOptions(FFOSOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + #if defined(__linux__) || defined(__FreeBSD__) + ffStrbufDestroy(&options->file); + #endif +} diff --git a/src/modules/os/os.h b/src/modules/os/os.h new file mode 100644 index 000000000..bf6572291 --- /dev/null +++ b/src/modules/os/os.h @@ -0,0 +1,9 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/os/option.h" + +void ffPrintOS(FFinstance* instance, FFOSOptions* options); +void ffInitOSOptions(FFOSOptions* options); +bool ffParseOSCommandOptions(FFOSOptions* options, const char* key, const char* value); +void ffDestroyOSOptions(FFOSOptions* options); From 4e3e469ba877248f623b065cf0851ffde41c7be2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 7 Mar 2023 16:13:53 +0800 Subject: [PATCH 03/71] Battery: major code refactoring ditto --- CMakeLists.txt | 2 +- src/common/init.c | 10 ++--- src/common/option.c | 11 +++++ src/common/option.h | 1 + src/detection/battery/battery_android.c | 4 +- src/detection/battery/battery_apple.c | 4 +- src/detection/battery/battery_linux.c | 7 +-- src/detection/battery/battery_windows.c | 2 +- src/fastfetch.c | 9 ++-- src/fastfetch.h | 8 +--- src/flashfetch.c | 4 +- src/modules/{ => battery}/battery.c | 60 +++++++++++++++++++++---- src/modules/battery/battery.h | 10 +++++ src/modules/battery/option.h | 17 +++++++ src/modules/modules.h | 6 +++ src/modules/options.h | 6 +++ 16 files changed, 122 insertions(+), 39 deletions(-) rename src/modules/{ => battery}/battery.c (63%) create mode 100644 src/modules/battery/battery.h create mode 100644 src/modules/battery/option.h create mode 100644 src/modules/modules.h create mode 100644 src/modules/options.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ffb5de72..d8cb8ffc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -259,7 +259,7 @@ set(LIBFASTFETCH_SRC src/logo/image/im7.c src/logo/image/image.c src/logo/logo.c - src/modules/battery.c + src/modules/battery/battery.c src/modules/bios.c src/modules/bluetooth.c src/modules/board.c diff --git a/src/common/init.c b/src/common/init.c index fd67ee70c..54a9e128b 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -15,7 +15,7 @@ #include #endif -#include "modules/os/os.h" +#include "modules/modules.h" static void initState(FFstate* state) { @@ -98,7 +98,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.memory); initModuleArg(&instance->config.swap); initModuleArg(&instance->config.disk); - initModuleArg(&instance->config.battery); + ffInitBatteryOptions(&instance->config.battery); initModuleArg(&instance->config.powerAdapter); initModuleArg(&instance->config.locale); initModuleArg(&instance->config.localIP); @@ -148,7 +148,6 @@ static void defaultConfig(FFinstance* instance) instance->config.cpuTemp = false; instance->config.gpuTemp = false; instance->config.gpuForceVulkan = false; - instance->config.batteryTemp = false; instance->config.gpuHideIntegrated = false; instance->config.gpuHideDiscrete = false; @@ -169,8 +168,6 @@ static void defaultConfig(FFinstance* instance) instance->config.soundType = FF_SOUND_TYPE_MAIN; - ffStrbufInitA(&instance->config.batteryDir, 0); - ffStrbufInitA(&instance->config.separatorString, 0); instance->config.localIpShowType = FF_LOCALIP_TYPE_IPV4_BIT; @@ -359,7 +356,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.memory); destroyModuleArg(&instance->config.swap); destroyModuleArg(&instance->config.disk); - destroyModuleArg(&instance->config.battery); + ffDestroyBatteryOptions(&instance->config.battery); destroyModuleArg(&instance->config.powerAdapter); destroyModuleArg(&instance->config.locale); destroyModuleArg(&instance->config.localIP); @@ -407,7 +404,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.libnm); ffStrbufDestroy(&instance->config.diskFolders); - ffStrbufDestroy(&instance->config.batteryDir); ffStrbufDestroy(&instance->config.separatorString); ffStrbufDestroy(&instance->config.localIpNamePrefix); ffStrbufDestroy(&instance->config.publicIpUrl); diff --git a/src/common/option.c b/src/common/option.c index 08c990632..81e54c532 100644 --- a/src/common/option.c +++ b/src/common/option.c @@ -105,6 +105,17 @@ void ffOptionParseEnum(const char* argumentKey, const char* requestedKey, void* exit(478); } +bool ffOptionParseBoolean(const char* str) +{ + return ( + !ffStrSet(str) || + strcasecmp(str, "true") == 0 || + strcasecmp(str, "yes") == 0 || + strcasecmp(str, "on") == 0 || + strcasecmp(str, "1") == 0 + ); +} + void ffOptionInitModuleArg(FFModuleArgs* args) { ffStrbufInit(&args->key); diff --git a/src/common/option.h b/src/common/option.h index 339a44009..b24c278b8 100644 --- a/src/common/option.h +++ b/src/common/option.h @@ -14,5 +14,6 @@ bool ffOptionParseModuleArgs(const char* argumentKey, const char* pkey, const ch void ffOptionParseString(const char* argumentKey, const char* value, FFstrbuf* buffer); uint32_t ffOptionParseUInt32(const char* argumentKey, const char* value); void ffOptionParseEnum(const char* argumentKey, const char* requestedKey, void* result, ...); +bool ffOptionParseBoolean(const char* str); void ffOptionInitModuleArg(FFModuleArgs* args); void ffOptionDestroyModuleArg(FFModuleArgs* args); diff --git a/src/detection/battery/battery_android.c b/src/detection/battery/battery_android.c index 1a783e595..1bcb48db7 100644 --- a/src/detection/battery/battery_android.c +++ b/src/detection/battery/battery_android.c @@ -7,7 +7,7 @@ #define FF_TERMUX_API_PATH FASTFETCH_TARGET_DIR_ROOT "/libexec/termux-api" #define FF_TERMUX_API_PARAM "BatteryStatus" -const char* ffDetectBatteryImpl(FF_MAYBE_UNUSED FFinstance* instance, FFlist* results) +const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) { FF_STRBUF_AUTO_DESTROY buffer; ffStrbufInit(&buffer); @@ -35,7 +35,7 @@ const char* ffDetectBatteryImpl(FF_MAYBE_UNUSED FFinstance* instance, FFlist* re ffStrbufClear(&battery->status); } - if(instance->config.batteryTemp) + if(instance->config.battery.temp) { if(ffParsePropLines(buffer.chars, "\"temperature\": ", &battery->status)) { diff --git a/src/detection/battery/battery_apple.c b/src/detection/battery/battery_apple.c index 7244a89a1..8a4214180 100644 --- a/src/detection/battery/battery_apple.c +++ b/src/detection/battery/battery_apple.c @@ -30,8 +30,6 @@ static double detectBatteryTemp() const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) { - FF_UNUSED(instance); - CFMutableDictionaryRef matchDict = IOServiceMatching("AppleSmartBattery"); if (matchDict == NULL) return "IOServiceMatching(\"AppleSmartBattery\") failed"; @@ -93,7 +91,7 @@ const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) else ffStrbufAppendS(&battery->status, ""); - if(instance->config.batteryTemp) + if(instance->config.battery.temp) battery->temperature = detectBatteryTemp(); else battery->temperature = FF_BATTERY_TEMP_UNSET; diff --git a/src/detection/battery/battery_linux.c b/src/detection/battery/battery_linux.c index b78a6cf7f..7ae4a3639 100644 --- a/src/detection/battery/battery_linux.c +++ b/src/detection/battery/battery_linux.c @@ -74,12 +74,13 @@ static void parseBattery(FFstrbuf* dir, FFlist* results) result->temperature = FF_BATTERY_TEMP_UNSET; } -const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) { +const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) +{ FFstrbuf baseDir; ffStrbufInitA(&baseDir, 64); - if(instance->config.batteryDir.length > 0) + if(instance->config.battery.dir.length > 0) { - ffStrbufAppend(&baseDir, &instance->config.batteryDir); + ffStrbufAppend(&baseDir, &instance->config.battery.dir); ffStrbufEnsureEndsWithC(&baseDir, '/'); } else diff --git a/src/detection/battery/battery_windows.c b/src/detection/battery/battery_windows.c index fc89a335a..9268362fd 100644 --- a/src/detection/battery/battery_windows.c +++ b/src/detection/battery/battery_windows.c @@ -111,7 +111,7 @@ const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) } battery->temperature = 0.0/0.0; - if(instance->config.batteryTemp) + if(instance->config.battery.temp) { bqi.InformationLevel = BatteryTemperature; ULONG temp; diff --git a/src/fastfetch.c b/src/fastfetch.c index e6da44aad..7050a61df 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -18,6 +18,7 @@ #pragma GCC diagnostic ignored "-Wsign-conversion" #include "modules/os/os.h" +#include "modules/modules.h" typedef struct CustomValue { @@ -1160,7 +1161,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "memory", &instance->config.memory)) {} else if(optionParseModuleArgs(key, value, "swap", &instance->config.swap)) {} else if(optionParseModuleArgs(key, value, "disk", &instance->config.disk)) {} - else if(optionParseModuleArgs(key, value, "battery", &instance->config.battery)) {} + else if(ffParseBatteryCommandOptions(&instance->config.battery, key, value)) {} else if(optionParseModuleArgs(key, value, "poweradapter", &instance->config.powerAdapter)) {} else if(optionParseModuleArgs(key, value, "locale", &instance->config.locale)) {} else if(optionParseModuleArgs(key, value, "localip", &instance->config.localIP)) {} @@ -1250,8 +1251,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con instance->config.gpuTemp = optionParseBoolean(value); else if(strcasecmp(key, "--gpu-force-vulkan") == 0) instance->config.gpuForceVulkan = optionParseBoolean(value); - else if(strcasecmp(key, "--battery-temp") == 0) - instance->config.batteryTemp = optionParseBoolean(value); else if(strcasecmp(key, "--gpu-hide-integrated") == 0) instance->config.gpuHideIntegrated = optionParseBoolean(value); else if(strcasecmp(key, "--gpu-hide-discrete") == 0) @@ -1297,8 +1296,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con NULL ); } - else if(strcasecmp(key, "--battery-dir") == 0) - optionParseString(key, value, &instance->config.batteryDir); else if(strcasecmp(key, "--separator-string") == 0) optionParseString(key, value, &instance->config.separatorString); else if(strcasecmp(key, "--localip-show-ipv4") == 0) @@ -1471,7 +1468,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "disk") == 0) ffPrintDisk(instance); else if(strcasecmp(line, "battery") == 0) - ffPrintBattery(instance); + ffPrintBattery(instance, &instance->config.battery); else if(strcasecmp(line, "poweradapter") == 0) ffPrintPowerAdapter(instance); else if(strcasecmp(line, "locale") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 3125cc0b4..a58cea0ae 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -18,7 +18,7 @@ static inline void ffUnused(int dummy, ...) { (void) dummy; } #define FASTFETCH_LOGO_MAX_COLORS 9 //two digits would make parsing much more complicated (index 1 - 9) -#include "modules/os/option.h" +#include "modules/options.h" typedef enum FFLogoType { @@ -162,7 +162,7 @@ typedef struct FFconfig FFModuleArgs memory; FFModuleArgs swap; FFModuleArgs disk; - FFModuleArgs battery; + FFBatteryOptions battery; FFModuleArgs powerAdapter; FFModuleArgs locale; FFModuleArgs localIP; @@ -210,7 +210,6 @@ typedef struct FFconfig bool cpuTemp; bool gpuTemp; bool gpuForceVulkan; - bool batteryTemp; bool gpuHideIntegrated; bool gpuHideDiscrete; @@ -229,8 +228,6 @@ typedef struct FFconfig bool bluetoothShowDisconnected; - FFstrbuf batteryDir; - FFstrbuf separatorString; FFstrbuf localIpNamePrefix; @@ -336,7 +333,6 @@ void ffPrintGPU(FFinstance* instance); void ffPrintMemory(FFinstance* instance); void ffPrintSwap(FFinstance* instance); void ffPrintDisk(FFinstance* instance); -void ffPrintBattery(FFinstance* instance); void ffPrintPowerAdapter(FFinstance* instance); void ffPrintLocale(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 447cdd269..e6bdba2bd 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -1,6 +1,6 @@ #include "fastfetch.h" -#include "modules/os/os.h" +#include "modules/modules.h" int main(int argc, char** argv) { @@ -48,7 +48,7 @@ int main(int argc, char** argv) ffPrintMemory(&instance); //ffPrintSwap(&instance); ffPrintDisk(&instance); - ffPrintBattery(&instance); + ffPrintBattery(&instance, &instance.config.battery); ffPrintPowerAdapter(&instance); //ffPrintPlayer(&instance); //ffPrintMedia(&instance); diff --git a/src/modules/battery.c b/src/modules/battery/battery.c similarity index 63% rename from src/modules/battery.c rename to src/modules/battery/battery.c index 6bafb0ee7..4ba93c49d 100644 --- a/src/modules/battery.c +++ b/src/modules/battery/battery.c @@ -2,15 +2,16 @@ #include "common/printing.h" #include "common/bar.h" #include "detection/battery/battery.h" +#include "modules/battery/battery.h" #define FF_BATTERY_MODULE_NAME "Battery" #define FF_BATTERY_NUM_FORMAT_ARGS 5 -static void printBattery(FFinstance* instance, BatteryResult* result, uint8_t index) +static void printBattery(FFinstance* instance, FFBatteryOptions* options, BatteryResult* result, uint8_t index) { - if(instance->config.battery.outputFormat.length == 0) + if(instance->config.battery.moduleArgs.outputFormat.length == 0) { - ffPrintLogoAndKey(instance, FF_BATTERY_MODULE_NAME, index, &instance->config.battery.key); + ffPrintLogoAndKey(instance, FF_BATTERY_MODULE_NAME, index, &options->moduleArgs.key); bool showStatus = !(instance->config.percentType & FF_PERCENTAGE_TYPE_HIDE_OTHERS_BIT) && @@ -62,7 +63,7 @@ static void printBattery(FFinstance* instance, BatteryResult* result, uint8_t in } else { - ffPrintFormat(instance, FF_BATTERY_MODULE_NAME, index, &instance->config.battery, FF_BATTERY_NUM_FORMAT_ARGS, (FFformatarg[]){ + ffPrintFormat(instance, FF_BATTERY_MODULE_NAME, index, &options->moduleArgs, FF_BATTERY_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &result->manufacturer}, {FF_FORMAT_ARG_TYPE_STRBUF, &result->modelName}, {FF_FORMAT_ARG_TYPE_STRBUF, &result->technology}, @@ -73,7 +74,7 @@ static void printBattery(FFinstance* instance, BatteryResult* result, uint8_t in } } -void ffPrintBattery(FFinstance* instance) +void ffPrintBattery(FFinstance* instance, FFBatteryOptions* options) { FFlist results; ffListInitA(&results, sizeof(BatteryResult), 0); @@ -82,14 +83,14 @@ void ffPrintBattery(FFinstance* instance) if (error) { - ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &instance->config.battery, "%s", error); + ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &options->moduleArgs, "%s", error); } else { for(uint8_t i = 0; i < (uint8_t) results.length; i++) { BatteryResult* result = ffListGet(&results, i); - printBattery(instance, result, i); + printBattery(instance, options, result, i); ffStrbufDestroy(&result->manufacturer); ffStrbufDestroy(&result->modelName); @@ -97,8 +98,51 @@ void ffPrintBattery(FFinstance* instance) ffStrbufDestroy(&result->status); } if(results.length == 0) - ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &instance->config.battery, "No batteries found"); + ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &options->moduleArgs, "No batteries found"); } ffListDestroy(&results); } + +void ffInitBatteryOptions(FFBatteryOptions* options) +{ + options->moduleName = FF_BATTERY_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + options->temp = false; + + #ifdef __linux__ + ffStrbufInit(&options->dir); + #endif +} + +bool ffParseBatteryCommandOptions(FFBatteryOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_BATTERY_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "temp") == 0) + { + options->temp = ffOptionParseBoolean(value); + return true; + } + + #ifdef __linux__ + if (strcasecmp(subKey, "dir") == 0) + { + ffOptionParseString(key, value, &options->dir); + return true; + } + #endif + + return false; +} + +void ffDestroyBatteryOptions(FFBatteryOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + #ifdef __linux__ + ffStrbufDestroy(&options->dir); + #endif +} diff --git a/src/modules/battery/battery.h b/src/modules/battery/battery.h new file mode 100644 index 000000000..c6eb2951f --- /dev/null +++ b/src/modules/battery/battery.h @@ -0,0 +1,10 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/battery/option.h" + +void ffPrintBattery(FFinstance* instance, FFBatteryOptions* options); + +void ffInitBatteryOptions(FFBatteryOptions* options); +bool ffParseBatteryCommandOptions(FFBatteryOptions* options, const char* key, const char* value); +void ffDestroyBatteryOptions(FFBatteryOptions* options); diff --git a/src/modules/battery/option.h b/src/modules/battery/option.h new file mode 100644 index 000000000..73632b9c6 --- /dev/null +++ b/src/modules/battery/option.h @@ -0,0 +1,17 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFBatteryOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + bool temp; + + #ifdef __linux__ + FFstrbuf dir; + #endif +} FFBatteryOptions; diff --git a/src/modules/modules.h b/src/modules/modules.h new file mode 100644 index 000000000..eb72482af --- /dev/null +++ b/src/modules/modules.h @@ -0,0 +1,6 @@ +#pragma once + +// For "fastfetch.c" and "flashfetch.c" + +#include "modules/os/os.h" +#include "modules/battery/battery.h" diff --git a/src/modules/options.h b/src/modules/options.h new file mode 100644 index 000000000..8d22da1d1 --- /dev/null +++ b/src/modules/options.h @@ -0,0 +1,6 @@ +#pragma once + +// For "fastfetch.h" + +#include "modules/battery/option.h" +#include "modules/os/option.h" From cbaeed7e8ea984fa87cca883a835c0c848eff67e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 7 Mar 2023 19:27:49 +0800 Subject: [PATCH 04/71] Command: major code refactoring ditto; and multi-command support was removed in favor of JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 22 +-------- src/fastfetch.c | 17 +------ src/fastfetch.h | 6 +-- src/modules/command.c | 67 --------------------------- src/modules/command/command.c | 85 +++++++++++++++++++++++++++++++++++ src/modules/command/command.h | 9 ++++ src/modules/command/option.h | 14 ++++++ src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/os/os.c | 3 +- 11 files changed, 117 insertions(+), 110 deletions(-) delete mode 100644 src/modules/command.c create mode 100644 src/modules/command/command.c create mode 100644 src/modules/command/command.h create mode 100644 src/modules/command/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d8cb8ffc1..b6b9dee1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -271,7 +271,7 @@ set(LIBFASTFETCH_SRC src/modules/cpuUsage.c src/modules/cursor.c src/modules/custom.c - src/modules/command.c + src/modules/command/command.c src/modules/date.c src/modules/datetime.c src/modules/de.c diff --git a/src/common/init.c b/src/common/init.c index 54a9e128b..dbe5899f8 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -77,6 +77,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.board); initModuleArg(&instance->config.brightness); initModuleArg(&instance->config.chassis); + ffInitCommandOptions(&instance->config.command); initModuleArg(&instance->config.kernel); initModuleArg(&instance->config.uptime); initModuleArg(&instance->config.processes); @@ -182,18 +183,6 @@ static void defaultConfig(FFinstance* instance) ffStrbufInitA(&instance->config.playerName, 0); instance->config.percentType = 1; - - ffStrbufInitS(&instance->config.commandShell, - #ifdef _WIN32 - "cmd" - #elif defined(__FreeBSD__) - "csh" - #else - "bash" - #endif - ); - ffListInit(&instance->config.commandKeys, sizeof(FFstrbuf)); - ffListInit(&instance->config.commandTexts, sizeof(FFstrbuf)); } void ffInitInstance(FFinstance* instance) @@ -335,6 +324,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.bios); destroyModuleArg(&instance->config.board); destroyModuleArg(&instance->config.chassis); + ffDestroyCommandOptions(&instance->config.command); destroyModuleArg(&instance->config.kernel); destroyModuleArg(&instance->config.uptime); destroyModuleArg(&instance->config.processes); @@ -409,14 +399,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.publicIpUrl); ffStrbufDestroy(&instance->config.weatherOutputFormat); ffStrbufDestroy(&instance->config.playerName); - - ffStrbufDestroy(&instance->config.commandShell); - FF_LIST_FOR_EACH(FFstrbuf, item, instance->config.commandKeys) - ffStrbufDestroy(item); - ffListDestroy(&instance->config.commandKeys); - FF_LIST_FOR_EACH(FFstrbuf, item, instance->config.commandTexts) - ffStrbufDestroy(item); - ffListDestroy(&instance->config.commandTexts); } static void destroyState(FFinstance* instance) diff --git a/src/fastfetch.c b/src/fastfetch.c index 7050a61df..a838592ff 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1137,6 +1137,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "bios", &instance->config.bios)) {} else if(optionParseModuleArgs(key, value, "board", &instance->config.board)) {} else if(optionParseModuleArgs(key, value, "chassis", &instance->config.chassis)) {} + else if(ffParseCommandCommandOptions(&instance->config.command, key, value)) {} else if(optionParseModuleArgs(key, value, "kernel", &instance->config.kernel)) {} else if(optionParseModuleArgs(key, value, "uptime", &instance->config.uptime)) {} else if(optionParseModuleArgs(key, value, "processes", &instance->config.processes)) {} @@ -1332,20 +1333,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con } else if(strcasecmp(key, "--percent-type") == 0) instance->config.percentType = optionParseUInt32(key, value); - else if(strcasecmp(key, "--command-shell") == 0) - optionParseString(key, value, &instance->config.commandShell); - else if(strcasecmp(key, "--command-key") == 0) - { - FFstrbuf* result = (FFstrbuf*) ffListAdd(&instance->config.commandKeys); - ffStrbufInit(result); - optionParseString(key, value, result); - } - else if(strcasecmp(key, "--command-text") == 0) - { - FFstrbuf* result = (FFstrbuf*) ffListAdd(&instance->config.commandTexts); - ffStrbufInit(result); - optionParseString(key, value, result); - } ////////////////// //Unknown option// @@ -1502,7 +1489,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "users") == 0) ffPrintUsers(instance); else if(strcasecmp(line, "command") == 0) - ffPrintCommand(instance); + ffPrintCommand(instance, &instance->config.command); else if(strcasecmp(line, "bluetooth") == 0) ffPrintBluetooth(instance); else if(strcasecmp(line, "sound") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index a58cea0ae..c0d76d313 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -139,6 +139,7 @@ typedef struct FFconfig FFModuleArgs board; FFModuleArgs brightness; FFModuleArgs chassis; + FFCommandOptions command; FFModuleArgs kernel; FFModuleArgs uptime; FFModuleArgs processes; @@ -244,10 +245,6 @@ typedef struct FFconfig FFstrbuf playerName; uint32_t percentType; - - FFstrbuf commandShell; - FFlist commandKeys; - FFlist commandTexts; } FFconfig; typedef struct FFstate @@ -349,7 +346,6 @@ void ffPrintVulkan(FFinstance* instance); void ffPrintOpenGL(FFinstance* instance); void ffPrintOpenCL(FFinstance* instance); void ffPrintUsers(FFinstance* instance); -void ffPrintCommand(FFinstance* instance); void ffPrintBluetooth(FFinstance* instance); void ffPrintSound(FFinstance* instance); void ffPrintGamepad(FFinstance* instance); diff --git a/src/modules/command.c b/src/modules/command.c deleted file mode 100644 index 1b767013b..000000000 --- a/src/modules/command.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "fastfetch.h" - -#include "common/printing.h" -#include "common/processing.h" -#include "util/textModifier.h" - -#define FF_COMMAND_MODULE_NAME "Command" - -static void printError(FFinstance* instance, const char* key, const char* error) -{ - ffPrintLogoAndKey(instance, key, 0, NULL); - - if(instance->config.pipe) - fputs(FASTFETCH_TEXT_MODIFIER_ERROR, stdout); - - fputs(error, stdout); - - if(!instance->config.pipe) - fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout); - - putchar('\n'); -} - -void ffPrintCommand(FFinstance* instance) -{ - FF_STRBUF_AUTO_DESTROY key; - ffStrbufInit(&key); - - if(!ffListShift(&instance->config.commandKeys, &key)) - ffStrbufInitS(&key, FF_COMMAND_MODULE_NAME); - - FF_STRBUF_AUTO_DESTROY text; - ffStrbufInit(&text); - if(!ffListShift(&instance->config.commandTexts, &text)) - { - printError(instance, key.chars, "No command text left"); - return; - } - - FF_STRBUF_AUTO_DESTROY result; - ffStrbufInit(&result); - const char* error = ffProcessAppendStdOut(&result, (char* const[]){ - instance->config.commandShell.chars, - #ifdef _WIN32 - "/c", - #else - "-c", - #endif - text.chars, - NULL - }); - - if(error) - { - printError(instance, key.chars, error); - return; - } - - if(!result.length) - { - printError(instance, key.chars, "No result printed"); - return; - } - - ffPrintLogoAndKey(instance, key.chars, 0, NULL); - puts(result.chars); -} diff --git a/src/modules/command/command.c b/src/modules/command/command.c new file mode 100644 index 000000000..c523095e2 --- /dev/null +++ b/src/modules/command/command.c @@ -0,0 +1,85 @@ +#include "fastfetch.h" + +#include "common/printing.h" +#include "common/processing.h" +#include "modules/command/command.h" + +#define FF_COMMAND_MODULE_NAME "Command" + +void ffPrintCommand(FFinstance* instance, FFCommandOptions* options) +{ + FF_STRBUF_AUTO_DESTROY result; + ffStrbufInit(&result); + const char* error = ffProcessAppendStdOut(&result, (char* const[]){ + options->shell.chars, + #ifdef _WIN32 + "/c", + #else + "-c", + #endif + options->text.chars, + NULL + }); + + if(error) + { + ffPrintError(instance, FF_COMMAND_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(!result.length) + { + ffPrintError(instance, FF_COMMAND_MODULE_NAME, 0, &options->moduleArgs, "No result printed"); + return; + } + + ffPrintLogoAndKey(instance, FF_COMMAND_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&result, stdout); +} + +void ffInitCommandOptions(FFCommandOptions* options) +{ + options->moduleName = FF_COMMAND_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + ffStrbufInitS(&options->shell, + #ifdef _WIN32 + "cmd" + #elif defined(__FreeBSD__) + "csh" + #else + "bash" + #endif + ); + + ffStrbufInit(&options->text); +} + +bool ffParseCommandCommandOptions(FFCommandOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_COMMAND_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if(strcasecmp(subKey, "shell") == 0) + { + ffOptionParseString(key, value, &options->shell); + return true; + } + + if(strcasecmp(subKey, "text") == 0) + { + ffOptionParseString(key, value, &options->text); + return true; + } + + return false; +} + +void ffDestroyCommandOptions(FFCommandOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + ffStrbufDestroy(&options->shell); + ffStrbufDestroy(&options->text); +} diff --git a/src/modules/command/command.h b/src/modules/command/command.h new file mode 100644 index 000000000..069e423e4 --- /dev/null +++ b/src/modules/command/command.h @@ -0,0 +1,9 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/command/option.h" + +void ffPrintCommand(FFinstance* instance, FFCommandOptions* options); +void ffInitCommandOptions(FFCommandOptions* options); +bool ffParseCommandCommandOptions(FFCommandOptions* options, const char* key, const char* value); +void ffDestroyCommandOptions(FFCommandOptions* options); diff --git a/src/modules/command/option.h b/src/modules/command/option.h new file mode 100644 index 000000000..41d3408a4 --- /dev/null +++ b/src/modules/command/option.h @@ -0,0 +1,14 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFCommandOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFstrbuf shell; + FFstrbuf text; +} FFCommandOptions; diff --git a/src/modules/modules.h b/src/modules/modules.h index eb72482af..7afac8950 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -4,3 +4,4 @@ #include "modules/os/os.h" #include "modules/battery/battery.h" +#include "modules/command/command.h" diff --git a/src/modules/options.h b/src/modules/options.h index 8d22da1d1..61a78b57b 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -4,3 +4,4 @@ #include "modules/battery/option.h" #include "modules/os/option.h" +#include "modules/command/option.h" diff --git a/src/modules/os/os.c b/src/modules/os/os.c index f202e6e4e..767e57166 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -108,7 +108,7 @@ void ffPrintOS(FFinstance* instance, FFOSOptions* options) if(options->moduleArgs.outputFormat.length == 0) { - FFstrbuf result; + FF_STRBUF_AUTO_DESTROY result; ffStrbufInit(&result); if(ffStrbufIgnCaseCompS(&os->id, "nixos") == 0) @@ -118,7 +118,6 @@ void ffPrintOS(FFinstance* instance, FFOSOptions* options) ffPrintLogoAndKey(instance, FF_OS_MODULE_NAME, 0, &options->moduleArgs.key); ffStrbufPutTo(&result, stdout); - ffStrbufDestroy(&result); } else { From 790ca460d4c501ac2aab7dd969fe8689fdfe8ba6 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 16:01:18 +0800 Subject: [PATCH 05/71] Battery: init support of JSON config --- CMakeLists.txt | 3 +- src/common/config.c | 132 ++++++++++++++++++++++++++++++++++ src/common/config.h | 29 ++++++++ src/fastfetch.c | 58 ++++++++------- src/modules/battery/battery.c | 45 ++++++++++++ src/modules/battery/battery.h | 5 ++ 6 files changed, 246 insertions(+), 26 deletions(-) create mode 100644 src/common/config.c create mode 100644 src/common/config.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b6b9dee1e..bd302d562 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,7 +70,7 @@ cmake_dependent_option(ENABLE_OPENCL "Enable opencl" ON "LINUX OR BSD OR WIN32" cmake_dependent_option(ENABLE_LIBNM "Enable libnm" ON "LINUX" OFF) cmake_dependent_option(ENABLE_FREETYPE "Enable freetype" ON "ANDROID" OFF) cmake_dependent_option(ENABLE_PULSE "Enable pulse" ON "LINUX OR BSD" OFF) -cmake_dependent_option(ENABLE_JSONC "Enable json-c" ON "LINUX OR WIN32" OFF) +cmake_dependent_option(ENABLE_JSONC "Enable json-c" ON "LINUX OR APPLE OR BSD OR WIN32 OR ANDROID" OFF) cmake_dependent_option(ENABLE_THREADS "Enable multithreading" ON "Threads_FOUND" OFF) cmake_dependent_option(ENABLE_BUFFER "Enable stdout buffer" ON "LINUX OR APPLE OR BSD OR WIN32 OR ANDROID" OFF) @@ -228,6 +228,7 @@ configure_file(src/fastfetch_config.h.in fastfetch_config.h) set(LIBFASTFETCH_SRC src/common/bar.c + src/common/config.c src/common/font.c src/common/format.c src/common/init.c diff --git a/src/common/config.c b/src/common/config.c new file mode 100644 index 000000000..75af071c8 --- /dev/null +++ b/src/common/config.c @@ -0,0 +1,132 @@ +#include "fastfetch.h" +#include "common/config.h" + +#ifdef FF_HAVE_JSONC + +#include "common/io/io.h" +#include "modules/modules.h" + +#include + +static inline void wrapJsoncFree(JSONCData* data) +{ + assert(data); + if (data->root) + data->ffjson_object_put(data->root); +} + +static const char* parseModules(FFinstance* instance, JSONCData* data, json_object* modules) +{ + array_list* list = data->ffjson_object_get_array(modules); + if (!list) return "modules must be an array of strings or objects"; + + for (size_t idx = 0; idx < list->length; ++idx) + { + json_object* module = (json_object*) list->array[idx]; + const char* type = NULL; + if (data->ffjson_object_is_type(module, json_type_string)) + { + type = data->ffjson_object_get_string(module); + module = NULL; + } + else if (data->ffjson_object_is_type(module, json_type_object)) + { + type = data->ffjson_object_get_string(data->ffjson_object_object_get(module, "type")); + if (!type) return "module object must contain a type key"; + } + else + return "modules must be an array of strings or objects"; + + if(!ffParseBatteryJsonObject(instance, type, data, module)) + return "Unknown module type"; + } + + return NULL; +} + +const char* ffJsonConfigParse(FFinstance* instance) +{ + FF_LIBRARY_LOAD(libjsonc, &instance->config.libJSONC, "dlopen libjson-c" FF_LIBRARY_EXTENSION" failed", + #ifdef _WIN32 + "libjson-c-5" FF_LIBRARY_EXTENSION, -1 + #else + "libjson-c" FF_LIBRARY_EXTENSION, 5 + #endif + ) + JSONCData __attribute__((__cleanup__(wrapJsoncFree))) data = {}; + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_tokener_parse) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_is_type) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_array) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_boolean) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_double) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string_len) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_object) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_object_get) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_put) + + FF_STRBUF_AUTO_DESTROY content; + ffStrbufInit(&content); + FF_LIST_FOR_EACH(FFstrbuf, filename, instance->state.platform.configDirs) + { + uint32_t oldLength = filename->length; + ffStrbufAppendS(filename, "fastfetch/config.json"); + bool success = ffAppendFileBuffer(filename->chars, &content); + ffStrbufSubstrBefore(filename, oldLength); + if (success) break; + } + + data.root = data.ffjson_tokener_parse(content.chars); + if (!data.root) + return "Failed to parse JSON config file"; + + lh_table* rootObject = data.ffjson_object_get_object(data.root); + if (!rootObject) + return "Invalid JSON config format. Root value must be an object"; + + struct lh_entry* entry; + lh_foreach(rootObject, entry) + { + const char* key = (const char *)lh_entry_k(entry); + json_object* val = (struct json_object *)lh_entry_v(entry); + + if (strcmp(key, "modules") == 0) + { + const char* error = parseModules(instance, &data, val); + if (error) return error; + } + else + return "Unknown JSON config key in root object"; + } + + return NULL; +} + +bool ffJsonConfigParseModuleArgs(JSONCData* data, const char* key, json_object* val, FFModuleArgs* moduleArgs) +{ + if(strcasecmp(key, "key") == 0) + { + ffStrbufSetNS(&moduleArgs->key, (uint32_t) data->ffjson_object_get_string_len(val), data->ffjson_object_get_string(val)); + return true; + } + else if(strcasecmp(key, "format") == 0) + { + ffStrbufSetNS(&moduleArgs->outputFormat, (uint32_t) data->ffjson_object_get_string_len(val), data->ffjson_object_get_string(val)); + return true; + } + else if(strcasecmp(key, "error") == 0) + { + ffStrbufSetNS(&moduleArgs->errorFormat, (uint32_t) data->ffjson_object_get_string_len(val), data->ffjson_object_get_string(val)); + return true; + } + return false; +} + +#else + +const char* ffParseJsonConfig(FF_MAYBE_UNUSED FFinstance* instance) +{ + return "Fastfetch was compiled without json-c support"; +} + +#endif diff --git a/src/common/config.h b/src/common/config.h new file mode 100644 index 000000000..23e597af4 --- /dev/null +++ b/src/common/config.h @@ -0,0 +1,29 @@ +#pragma once + +#ifdef FF_HAVE_JSONC + +#include + +#include "common/library.h" + +typedef struct JSONCData +{ + FF_LIBRARY_SYMBOL(json_tokener_parse) + FF_LIBRARY_SYMBOL(json_object_is_type) + FF_LIBRARY_SYMBOL(json_object_get_array) + FF_LIBRARY_SYMBOL(json_object_get_boolean) + FF_LIBRARY_SYMBOL(json_object_get_double) + FF_LIBRARY_SYMBOL(json_object_get_string_len) + FF_LIBRARY_SYMBOL(json_object_get_string) + FF_LIBRARY_SYMBOL(json_object_get_object) + FF_LIBRARY_SYMBOL(json_object_object_get) + FF_LIBRARY_SYMBOL(json_object_put) + + json_object* root; +} JSONCData; + +bool ffJsonConfigParseModuleArgs(JSONCData* data, const char* key, json_object* val, FFModuleArgs* moduleArgs); + +#endif + +const char* ffJsonConfigParse(FFinstance* instance); diff --git a/src/fastfetch.c b/src/fastfetch.c index a838592ff..ade8d4d35 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -18,6 +18,7 @@ #pragma GCC diagnostic ignored "-Wsign-conversion" #include "modules/os/os.h" +#include "common/config.h" #include "modules/modules.h" typedef struct CustomValue @@ -1537,34 +1538,41 @@ int main(int argc, const char** argv) fflush(stdout); #endif - //Parse the structure and call the modules - uint32_t startIndex = 0; - while (startIndex < data.structure.length) + if (ffStrbufIgnCaseEqualS(&data.structure, "Config")) { - uint32_t colonIndex = ffStrbufNextIndexC(&data.structure, startIndex, ':'); - data.structure.chars[colonIndex] = '\0'; - - uint64_t ms = 0; - if(__builtin_expect(instance.config.stat, false)) - ms = ffTimeGetTick(); - - parseStructureCommand(&instance, &data, data.structure.chars + startIndex); - - if(__builtin_expect(instance.config.stat, false)) + ffJsonConfigParse(&instance); + } + else + { + //Parse the structure and call the modules + uint32_t startIndex = 0; + while (startIndex < data.structure.length) { - char str[32]; - int len = snprintf(str, sizeof str, "%" PRIu64 "ms", ffTimeGetTick() - ms); - if(instance.config.pipe) - puts(str); - else - printf("\033[s\033[1A\033[9999999C\033[%dD%s\033[u", len, str); // Save; Up 1; Right 9999999; Left ; Print ; Load + uint32_t colonIndex = ffStrbufNextIndexC(&data.structure, startIndex, ':'); + data.structure.chars[colonIndex] = '\0'; + + uint64_t ms = 0; + if(__builtin_expect(instance.config.stat, false)) + ms = ffTimeGetTick(); + + parseStructureCommand(&instance, &data, data.structure.chars + startIndex); + + if(__builtin_expect(instance.config.stat, false)) + { + char str[32]; + int len = snprintf(str, sizeof str, "%" PRIu64 "ms", ffTimeGetTick() - ms); + if(instance.config.pipe) + puts(str); + else + printf("\033[s\033[1A\033[9999999C\033[%dD%s\033[u", len, str); // Save; Up 1; Right 9999999; Left ; Print ; Load + } + + #if defined(_WIN32) && defined(FF_ENABLE_BUFFER) + fflush(stdout); + #endif + + startIndex = colonIndex + 1; } - - #if defined(_WIN32) && defined(FF_ENABLE_BUFFER) - fflush(stdout); - #endif - - startIndex = colonIndex + 1; } ffFinish(&instance); diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index 4ba93c49d..f76f67797 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -146,3 +146,48 @@ void ffDestroyBatteryOptions(FFBatteryOptions* options) ffStrbufDestroy(&options->dir); #endif } + +#ifdef FF_HAVE_JSONC +bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_BATTERY_MODULE_NAME) != 0) + return false; + + FFBatteryOptions __attribute__((__cleanup__(ffDestroyBatteryOptions))) options; + ffInitBatteryOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + #ifdef __linux__ + if (strcasecmp(key, "dir") == 0) + { + ffStrbufSetS(&options.dir, data->ffjson_object_get_string(val)); + continue; + } + #endif + + if (strcasecmp(key, "temp") == 0) + { + options.temp = (bool) data->ffjson_object_get_boolean(val); + continue; + } + + ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintBattery(instance, &options); + return true; +} +#endif diff --git a/src/modules/battery/battery.h b/src/modules/battery/battery.h index c6eb2951f..14d31c3f0 100644 --- a/src/modules/battery/battery.h +++ b/src/modules/battery/battery.h @@ -8,3 +8,8 @@ void ffPrintBattery(FFinstance* instance, FFBatteryOptions* options); void ffInitBatteryOptions(FFBatteryOptions* options); bool ffParseBatteryCommandOptions(FFBatteryOptions* options, const char* key, const char* value); void ffDestroyBatteryOptions(FFBatteryOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif From d4549d68499260452c8df8c7f14056d575db823a 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 16:10:46 +0800 Subject: [PATCH 06/71] Command: init support of JSON config --- src/common/config.c | 1 + src/modules/command/command.c | 43 +++++++++++++++++++++++++++++++++++ src/modules/command/command.h | 5 ++++ 3 files changed, 49 insertions(+) diff --git a/src/common/config.c b/src/common/config.c index 75af071c8..09f7d5073 100644 --- a/src/common/config.c +++ b/src/common/config.c @@ -38,6 +38,7 @@ static const char* parseModules(FFinstance* instance, JSONCData* data, json_obje return "modules must be an array of strings or objects"; if(!ffParseBatteryJsonObject(instance, type, data, module)) + if(!ffParseCommandJsonObject(instance, type, data, module)) return "Unknown module type"; } diff --git a/src/modules/command/command.c b/src/modules/command/command.c index c523095e2..43143fb5f 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -83,3 +83,46 @@ void ffDestroyCommandOptions(FFCommandOptions* options) ffStrbufDestroy(&options->shell); ffStrbufDestroy(&options->text); } + +#ifdef FF_HAVE_JSONC +bool ffParseCommandJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_COMMAND_MODULE_NAME) != 0) + return false; + + FFCommandOptions __attribute__((__cleanup__(ffDestroyCommandOptions))) options; + ffInitCommandOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "shell") == 0) + { + ffStrbufSetS(&options.shell, data->ffjson_object_get_string(val)); + continue; + } + + if (strcasecmp(key, "text") == 0) + { + ffStrbufSetS(&options.text, data->ffjson_object_get_string(val)); + continue; + } + + ffPrintError(instance, FF_COMMAND_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintCommand(instance, &options); + return true; +} +#endif diff --git a/src/modules/command/command.h b/src/modules/command/command.h index 069e423e4..adbf29d04 100644 --- a/src/modules/command/command.h +++ b/src/modules/command/command.h @@ -7,3 +7,8 @@ void ffPrintCommand(FFinstance* instance, FFCommandOptions* options); void ffInitCommandOptions(FFCommandOptions* options); bool ffParseCommandCommandOptions(FFCommandOptions* options, const char* key, const char* value); void ffDestroyCommandOptions(FFCommandOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseCommandJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif From 161c4ac028e99bbd0e62261fb92a49f8851dec4c 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 16:14:08 +0800 Subject: [PATCH 07/71] OS: init support of JSON config --- src/common/config.c | 1 + src/modules/os/os.c | 39 +++++++++++++++++++++++++++++++++++++++ src/modules/os/os.h | 5 +++++ 3 files changed, 45 insertions(+) diff --git a/src/common/config.c b/src/common/config.c index 09f7d5073..bfa2e5c43 100644 --- a/src/common/config.c +++ b/src/common/config.c @@ -39,6 +39,7 @@ static const char* parseModules(FFinstance* instance, JSONCData* data, json_obje if(!ffParseBatteryJsonObject(instance, type, data, module)) if(!ffParseCommandJsonObject(instance, type, data, module)) + if(!ffParseOSJsonObject(instance, type, data, module)) return "Unknown module type"; } diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 767e57166..e87488ded 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -173,3 +173,42 @@ void ffDestroyOSOptions(FFOSOptions* options) ffStrbufDestroy(&options->file); #endif } + +#ifdef FF_HAVE_JSONC +bool ffParseOSJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_OS_MODULE_NAME) != 0) + return false; + + FFOSOptions __attribute__((__cleanup__(ffDestroyOSOptions))) options; + ffInitOSOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + #if defined(__linux__) || defined(__FreeBSD__) + if (strcasecmp(key, "file") == 0) + { + ffStrbufSetS(&options.file, data->ffjson_object_get_string(val)); + continue; + } + #endif + + ffPrintError(instance, FF_OS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintOS(instance, &options); + return true; +} +#endif diff --git a/src/modules/os/os.h b/src/modules/os/os.h index bf6572291..9d66a32d4 100644 --- a/src/modules/os/os.h +++ b/src/modules/os/os.h @@ -7,3 +7,8 @@ void ffPrintOS(FFinstance* instance, FFOSOptions* options); void ffInitOSOptions(FFOSOptions* options); bool ffParseOSCommandOptions(FFOSOptions* options, const char* key, const char* value); void ffDestroyOSOptions(FFOSOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseOSJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif From 4cf130bd07b4d31d1329d518dfdae8740b288cbf 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 16:43:43 +0800 Subject: [PATCH 08/71] Fastfetch: rename FFinstance::`separator` to `keyValueSeparator`, because it's conflicted against Separator module --- src/common/init.c | 6 +++--- src/common/printing.c | 2 +- src/fastfetch.c | 2 +- src/fastfetch.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/common/init.c b/src/common/init.c index dbe5899f8..fb49c41e9 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -56,8 +56,8 @@ static void defaultConfig(FFinstance* instance) ffStrbufInit(&instance->config.colorKeys); ffStrbufInit(&instance->config.colorTitle); - ffStrbufInit(&instance->config.separator); - ffStrbufAppendS(&instance->config.separator, ": "); + ffStrbufInit(&instance->config.keyValueSeparator); + ffStrbufAppendS(&instance->config.keyValueSeparator, ": "); instance->config.showErrors = false; instance->config.recache = false; @@ -317,7 +317,7 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.logo.colors[i]); ffStrbufDestroy(&instance->config.colorKeys); ffStrbufDestroy(&instance->config.colorTitle); - ffStrbufDestroy(&instance->config.separator); + ffStrbufDestroy(&instance->config.keyValueSeparator); ffDestroyOSOptions(&instance->config.os); destroyModuleArg(&instance->config.host); diff --git a/src/common/printing.c b/src/common/printing.c index f33d5cf33..95350e09e 100644 --- a/src/common/printing.c +++ b/src/common/printing.c @@ -38,7 +38,7 @@ void ffPrintLogoAndKey(FFinstance* instance, const char* moduleName, uint8_t mod if(!instance->config.pipe) fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout); - ffStrbufWriteTo(&instance->config.separator, stdout); + ffStrbufWriteTo(&instance->config.keyValueSeparator, stdout); if(!instance->config.pipe) fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout); diff --git a/src/fastfetch.c b/src/fastfetch.c index ade8d4d35..081b9470a 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1105,7 +1105,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(strcasecmp(key, "-s") == 0 || strcasecmp(key, "--structure") == 0) optionParseString(key, value, &data->structure); else if(strcasecmp(key, "--separator") == 0) - optionParseString(key, value, &instance->config.separator); + optionParseString(key, value, &instance->config.keyValueSeparator); else if(strcasecmp(key, "--color-keys") == 0) optionParseColor(key, value, &instance->config.colorKeys); else if(strcasecmp(key, "--color-title") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index c0d76d313..d20827315 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -119,7 +119,7 @@ typedef struct FFconfig FFstrbuf colorKeys; FFstrbuf colorTitle; - FFstrbuf separator; + FFstrbuf keyValueSeparator; bool showErrors; bool recache; From 0ab2eda0aef406c4eca88c6feca157fcd7b2a31c 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 17:00:37 +0800 Subject: [PATCH 09/71] Separator: init support of JSON config --- CMakeLists.txt | 2 +- src/common/config.c | 14 +++-- src/common/init.c | 5 +- src/fastfetch.c | 5 +- src/fastfetch.h | 4 +- src/flashfetch.c | 2 +- src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/separator.c | 29 ---------- src/modules/separator/option.h | 12 +++++ src/modules/separator/separator.c | 90 +++++++++++++++++++++++++++++++ src/modules/separator/separator.h | 14 +++++ 12 files changed, 136 insertions(+), 43 deletions(-) delete mode 100644 src/modules/separator.c create mode 100644 src/modules/separator/option.h create mode 100644 src/modules/separator/separator.c create mode 100644 src/modules/separator/separator.h diff --git a/CMakeLists.txt b/CMakeLists.txt index bd302d562..1b2fc440f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -295,7 +295,7 @@ set(LIBFASTFETCH_SRC src/modules/processes.c src/modules/publicip.c src/modules/display.c - src/modules/separator.c + src/modules/separator/separator.c src/modules/shell.c src/modules/sound.c src/modules/swap.c diff --git a/src/common/config.c b/src/common/config.c index bfa2e5c43..aff9e73c3 100644 --- a/src/common/config.c +++ b/src/common/config.c @@ -8,6 +8,16 @@ #include +static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + return + ffParseBatteryJsonObject(instance, type, data, module) || + ffParseCommandJsonObject(instance, type, data, module) || + ffParseOSJsonObject(instance, type, data, module) || + ffParseSeparatorJsonObject(instance, type, data, module) || + false; +} + static inline void wrapJsoncFree(JSONCData* data) { assert(data); @@ -37,9 +47,7 @@ static const char* parseModules(FFinstance* instance, JSONCData* data, json_obje else return "modules must be an array of strings or objects"; - if(!ffParseBatteryJsonObject(instance, type, data, module)) - if(!ffParseCommandJsonObject(instance, type, data, module)) - if(!ffParseOSJsonObject(instance, type, data, module)) + if(!parseModuleJsonObject(instance, type, data, module)) return "Unknown module type"; } diff --git a/src/common/init.c b/src/common/init.c index fb49c41e9..012b7e788 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -118,6 +118,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.users); initModuleArg(&instance->config.bluetooth); initModuleArg(&instance->config.sound); + ffInitSeparatorOptions(&instance->config.separator); initModuleArg(&instance->config.gamepad); ffStrbufInitA(&instance->config.libPCI, 0); @@ -169,8 +170,6 @@ static void defaultConfig(FFinstance* instance) instance->config.soundType = FF_SOUND_TYPE_MAIN; - ffStrbufInitA(&instance->config.separatorString, 0); - instance->config.localIpShowType = FF_LOCALIP_TYPE_IPV4_BIT; ffStrbufInit(&instance->config.localIpNamePrefix); @@ -364,6 +363,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.openCL); destroyModuleArg(&instance->config.users); destroyModuleArg(&instance->config.bluetooth); + ffDestroySeparatorOptions(&instance->config.separator); destroyModuleArg(&instance->config.sound); destroyModuleArg(&instance->config.gamepad); @@ -394,7 +394,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.libnm); ffStrbufDestroy(&instance->config.diskFolders); - ffStrbufDestroy(&instance->config.separatorString); ffStrbufDestroy(&instance->config.localIpNamePrefix); ffStrbufDestroy(&instance->config.publicIpUrl); ffStrbufDestroy(&instance->config.weatherOutputFormat); diff --git a/src/fastfetch.c b/src/fastfetch.c index 081b9470a..935200ea8 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1179,6 +1179,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "opencl", &instance->config.openCL)) {} else if(optionParseModuleArgs(key, value, "users", &instance->config.users)) {} else if(optionParseModuleArgs(key, value, "bluetooth", &instance->config.bluetooth)) {} + else if(ffParseSeparatorCommandOptions(&instance->config.separator, key, value)) {} else if(optionParseModuleArgs(key, value, "sound", &instance->config.sound)) {} else if(optionParseModuleArgs(key, value, "gamepad", &instance->config.gamepad)) {} @@ -1298,8 +1299,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con NULL ); } - else if(strcasecmp(key, "--separator-string") == 0) - optionParseString(key, value, &instance->config.separatorString); else if(strcasecmp(key, "--localip-show-ipv4") == 0) optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_IPV4_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_IPV4_BIT); else if(strcasecmp(key, "--localip-show-ipv6") == 0) @@ -1398,7 +1397,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "title") == 0) ffPrintTitle(instance); else if(strcasecmp(line, "separator") == 0) - ffPrintSeparator(instance); + ffPrintSeparator(instance, &instance->config.separator); else if(strcasecmp(line, "os") == 0) ffPrintOS(instance, &instance->config.os); else if(strcasecmp(line, "host") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index d20827315..7123082a9 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -179,6 +179,7 @@ typedef struct FFconfig FFModuleArgs openCL; FFModuleArgs users; FFModuleArgs bluetooth; + FFSeparatorOptions separator; FFModuleArgs sound; FFModuleArgs gamepad; @@ -229,8 +230,6 @@ typedef struct FFconfig bool bluetoothShowDisconnected; - FFstrbuf separatorString; - FFstrbuf localIpNamePrefix; FFLocalIpType localIpShowType; @@ -302,7 +301,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintCustom(FFinstance* instance, const char* key, const char* value); void ffPrintBreak(FFinstance* instance); void ffPrintTitle(FFinstance* instance); -void ffPrintSeparator(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 e6bdba2bd..48a0e0c94 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -21,7 +21,7 @@ int main(int argc, char** argv) //Printing ffPrintTitle(&instance); - ffPrintSeparator(&instance); + ffPrintSeparator(&instance, &instance.config.separator); ffPrintOS(&instance, &instance.config.os); ffPrintHost(&instance); //ffPrintBios(&instance); diff --git a/src/modules/modules.h b/src/modules/modules.h index 7afac8950..ee76d794c 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -5,3 +5,4 @@ #include "modules/os/os.h" #include "modules/battery/battery.h" #include "modules/command/command.h" +#include "modules/separator/separator.h" diff --git a/src/modules/options.h b/src/modules/options.h index 61a78b57b..7e25edd1b 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -5,3 +5,4 @@ #include "modules/battery/option.h" #include "modules/os/option.h" #include "modules/command/option.h" +#include "modules/separator/option.h" diff --git a/src/modules/separator.c b/src/modules/separator.c deleted file mode 100644 index 879bc5bb8..000000000 --- a/src/modules/separator.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" - -void ffPrintSeparator(FFinstance* instance) -{ - uint32_t titleLength = instance->state.platform.userName.length + 1 + (instance->config.titleFQDN ? - instance->state.platform.domainName.length : - instance->state.platform.hostName.length - ); - - ffLogoPrintLine(instance); - - if(instance->config.separatorString.length == 0) - { - for(uint32_t i = 0; i < titleLength; i++) - putchar('-'); - } - else - { - //Write the whole separator as often as it fits fully into titleLength - for(uint32_t i = 0; i < titleLength / instance->config.separatorString.length; i++) - ffStrbufWriteTo(&instance->config.separatorString, stdout); - - //Write as much of the separator as needed to fill titleLength - for(uint32_t i = 0; i < titleLength % instance->config.separatorString.length; i++) - putchar(instance->config.separatorString.chars[i]); - } - putchar('\n'); -} diff --git a/src/modules/separator/option.h b/src/modules/separator/option.h new file mode 100644 index 000000000..10f5effdf --- /dev/null +++ b/src/modules/separator/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 FFSeparatorOptions +{ + const char* moduleName; + + FFstrbuf string; +} FFSeparatorOptions; diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c new file mode 100644 index 000000000..a25c04021 --- /dev/null +++ b/src/modules/separator/separator.c @@ -0,0 +1,90 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "modules/separator/separator.h" + +#define FF_SEPARATOR_MODULE_NAME "Separator" + +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 + ); + + ffLogoPrintLine(instance); + + if(options->string.length == 0) + { + ffPrintCharTimes('-', titleLength); + } + else + { + //Write the whole separator as often as it fits fully into titleLength + for(uint32_t i = 0; i < titleLength / options->string.length; i++) + ffStrbufWriteTo(&options->string, stdout); + + //Write as much of the separator as needed to fill titleLength + for(uint32_t i = 0; i < titleLength % options->string.length; i++) + putchar(options->string.chars[i]); + } + putchar('\n'); +} + +void ffInitSeparatorOptions(FFSeparatorOptions* options) +{ + options->moduleName = FF_SEPARATOR_MODULE_NAME; + ffStrbufInit(&options->string); +} + +bool ffParseSeparatorCommandOptions(FFSeparatorOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_SEPARATOR_MODULE_NAME); + if (!subKey) return false; + + if (strcasecmp(subKey, "string") == 0) + { + ffOptionParseString(key, value, &options->string); + return true; + } + + return false; +} + +void ffDestroySeparatorOptions(FFSeparatorOptions* options) +{ + ffStrbufDestroy(&options->string); +} + +#ifdef FF_HAVE_JSONC +bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_SEPARATOR_MODULE_NAME) != 0) + return false; + + FFSeparatorOptions __attribute__((__cleanup__(ffDestroySeparatorOptions))) options; + ffInitSeparatorOptions(&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, "string") == 0) + { + ffStrbufSetS(&options.string, data->ffjson_object_get_string(val)); + continue; + } + + ffPrintErrorString(instance, FF_SEPARATOR_MODULE_NAME, 0, NULL, NULL, "Unknown JSON key %s", key); + } + } + + ffPrintSeparator(instance, &options); + return true; +} +#endif diff --git a/src/modules/separator/separator.h b/src/modules/separator/separator.h new file mode 100644 index 000000000..295afa215 --- /dev/null +++ b/src/modules/separator/separator.h @@ -0,0 +1,14 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/separator/option.h" + +void ffPrintSeparator(FFinstance* instance, FFSeparatorOptions* options); +void ffInitSeparatorOptions(FFSeparatorOptions* options); +bool ffParseSeparatorCommandOptions(FFSeparatorOptions* options, const char* key, const char* value); +void ffDestroySeparatorOptions(FFSeparatorOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif 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 10/71] 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 1b2fc440f..99ae9e3e4 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 aff9e73c3..2b9f9045c 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 012b7e788..b27c17a12 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 935200ea8..bfff141e9 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 7123082a9..805a9b46c 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 48a0e0c94..6b961e04a 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 ee76d794c..f407e92d2 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 7e25edd1b..faf052800 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 a25c04021..1c6b92bc9 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 4e509fbe5..000000000 --- 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 000000000..1faa59ea4 --- /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 000000000..3503d01b3 --- /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 000000000..b361e72c7 --- /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 From c5dcf522c408c1d7fb8e96d38bbaff99e3d63f32 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:57:57 +0800 Subject: [PATCH 11/71] JsonConfig: make it a special module --- CMakeLists.txt | 1 + src/common/config.c | 117 ------------------------- src/common/config.h | 2 - src/fastfetch.c | 59 ++++++------- src/modules/jsonconfig/jsonconfig.c | 131 ++++++++++++++++++++++++++++ src/modules/jsonconfig/jsonconfig.h | 5 ++ src/modules/modules.h | 1 + 7 files changed, 165 insertions(+), 151 deletions(-) create mode 100644 src/modules/jsonconfig/jsonconfig.c create mode 100644 src/modules/jsonconfig/jsonconfig.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 99ae9e3e4..5fac1e924 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -313,6 +313,7 @@ set(LIBFASTFETCH_SRC src/modules/wifi.c src/modules/wm.c src/modules/wmtheme.c + src/modules/jsonconfig/jsonconfig.c src/util/FFlist.c src/util/FFstrbuf.c src/util/FFvaluestore.c diff --git a/src/common/config.c b/src/common/config.c index 2b9f9045c..f7d124fce 100644 --- a/src/common/config.c +++ b/src/common/config.c @@ -3,116 +3,6 @@ #ifdef FF_HAVE_JSONC -#include "common/io/io.h" -#include "modules/modules.h" - -#include - -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) || - ffParseSeparatorJsonObject(instance, type, data, module) || - false; -} - -static inline void wrapJsoncFree(JSONCData* data) -{ - assert(data); - if (data->root) - data->ffjson_object_put(data->root); -} - -static const char* parseModules(FFinstance* instance, JSONCData* data, json_object* modules) -{ - array_list* list = data->ffjson_object_get_array(modules); - if (!list) return "modules must be an array of strings or objects"; - - for (size_t idx = 0; idx < list->length; ++idx) - { - json_object* module = (json_object*) list->array[idx]; - const char* type = NULL; - if (data->ffjson_object_is_type(module, json_type_string)) - { - type = data->ffjson_object_get_string(module); - module = NULL; - } - else if (data->ffjson_object_is_type(module, json_type_object)) - { - type = data->ffjson_object_get_string(data->ffjson_object_object_get(module, "type")); - if (!type) return "module object must contain a type key"; - } - else - return "modules must be an array of strings or objects"; - - if(!parseModuleJsonObject(instance, type, data, module)) - return "Unknown module type"; - } - - return NULL; -} - -const char* ffJsonConfigParse(FFinstance* instance) -{ - FF_LIBRARY_LOAD(libjsonc, &instance->config.libJSONC, "dlopen libjson-c" FF_LIBRARY_EXTENSION" failed", - #ifdef _WIN32 - "libjson-c-5" FF_LIBRARY_EXTENSION, -1 - #else - "libjson-c" FF_LIBRARY_EXTENSION, 5 - #endif - ) - JSONCData __attribute__((__cleanup__(wrapJsoncFree))) data = {}; - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_tokener_parse) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_is_type) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_array) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_boolean) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_double) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string_len) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_object) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_object_get) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_put) - - FF_STRBUF_AUTO_DESTROY content; - ffStrbufInit(&content); - FF_LIST_FOR_EACH(FFstrbuf, filename, instance->state.platform.configDirs) - { - uint32_t oldLength = filename->length; - ffStrbufAppendS(filename, "fastfetch/config.json"); - bool success = ffAppendFileBuffer(filename->chars, &content); - ffStrbufSubstrBefore(filename, oldLength); - if (success) break; - } - - data.root = data.ffjson_tokener_parse(content.chars); - if (!data.root) - return "Failed to parse JSON config file"; - - lh_table* rootObject = data.ffjson_object_get_object(data.root); - if (!rootObject) - return "Invalid JSON config format. Root value must be an object"; - - struct lh_entry* entry; - lh_foreach(rootObject, entry) - { - const char* key = (const char *)lh_entry_k(entry); - json_object* val = (struct json_object *)lh_entry_v(entry); - - if (strcmp(key, "modules") == 0) - { - const char* error = parseModules(instance, &data, val); - if (error) return error; - } - else - return "Unknown JSON config key in root object"; - } - - return NULL; -} - bool ffJsonConfigParseModuleArgs(JSONCData* data, const char* key, json_object* val, FFModuleArgs* moduleArgs) { if(strcasecmp(key, "key") == 0) @@ -133,11 +23,4 @@ bool ffJsonConfigParseModuleArgs(JSONCData* data, const char* key, json_object* return false; } -#else - -const char* ffParseJsonConfig(FF_MAYBE_UNUSED FFinstance* instance) -{ - return "Fastfetch was compiled without json-c support"; -} - #endif diff --git a/src/common/config.h b/src/common/config.h index 23e597af4..81dd9c011 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -25,5 +25,3 @@ typedef struct JSONCData bool ffJsonConfigParseModuleArgs(JSONCData* data, const char* key, json_object* val, FFModuleArgs* moduleArgs); #endif - -const char* ffJsonConfigParse(FFinstance* instance); diff --git a/src/fastfetch.c b/src/fastfetch.c index bfff141e9..a8fe3357e 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1494,6 +1494,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintSound(instance); else if(strcasecmp(line, "gamepad") == 0) ffPrintGamepad(instance); + else if(strcasecmp(line, "jsonconfig") == 0) + ffPrintJsonConfig(instance); else ffPrintErrorString(instance, line, 0, NULL, NULL, ""); } @@ -1535,41 +1537,34 @@ int main(int argc, const char** argv) fflush(stdout); #endif - if (ffStrbufIgnCaseEqualS(&data.structure, "Config")) + //Parse the structure and call the modules + uint32_t startIndex = 0; + while (startIndex < data.structure.length) { - ffJsonConfigParse(&instance); - } - else - { - //Parse the structure and call the modules - uint32_t startIndex = 0; - while (startIndex < data.structure.length) + uint32_t colonIndex = ffStrbufNextIndexC(&data.structure, startIndex, ':'); + data.structure.chars[colonIndex] = '\0'; + + uint64_t ms = 0; + if(__builtin_expect(instance.config.stat, false)) + ms = ffTimeGetTick(); + + parseStructureCommand(&instance, &data, data.structure.chars + startIndex); + + if(__builtin_expect(instance.config.stat, false)) { - uint32_t colonIndex = ffStrbufNextIndexC(&data.structure, startIndex, ':'); - data.structure.chars[colonIndex] = '\0'; - - uint64_t ms = 0; - if(__builtin_expect(instance.config.stat, false)) - ms = ffTimeGetTick(); - - parseStructureCommand(&instance, &data, data.structure.chars + startIndex); - - if(__builtin_expect(instance.config.stat, false)) - { - char str[32]; - int len = snprintf(str, sizeof str, "%" PRIu64 "ms", ffTimeGetTick() - ms); - if(instance.config.pipe) - puts(str); - else - printf("\033[s\033[1A\033[9999999C\033[%dD%s\033[u", len, str); // Save; Up 1; Right 9999999; Left ; Print ; Load - } - - #if defined(_WIN32) && defined(FF_ENABLE_BUFFER) - fflush(stdout); - #endif - - startIndex = colonIndex + 1; + char str[32]; + int len = snprintf(str, sizeof str, "%" PRIu64 "ms", ffTimeGetTick() - ms); + if(instance.config.pipe) + puts(str); + else + printf("\033[s\033[1A\033[9999999C\033[%dD%s\033[u", len, str); // Save; Up 1; Right 9999999; Left ; Print ; Load } + + #if defined(_WIN32) && defined(FF_ENABLE_BUFFER) + fflush(stdout); + #endif + + startIndex = colonIndex + 1; } ffFinish(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c new file mode 100644 index 000000000..893972315 --- /dev/null +++ b/src/modules/jsonconfig/jsonconfig.c @@ -0,0 +1,131 @@ +#include "modules/jsonconfig/jsonconfig.h" +#include "common/config.h" +#include "common/printing.h" + +#ifdef FF_HAVE_JSONC + +#include "common/io/io.h" +#include "modules/modules.h" + +#include + +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) || + ffParseSeparatorJsonObject(instance, type, data, module) || + false; +} + +static inline void wrapJsoncFree(JSONCData* data) +{ + assert(data); + if (data->root) + data->ffjson_object_put(data->root); +} + +static const char* parseModules(FFinstance* instance, JSONCData* data, json_object* modules) +{ + array_list* list = data->ffjson_object_get_array(modules); + if (!list) return "modules must be an array of strings or objects"; + + for (size_t idx = 0; idx < list->length; ++idx) + { + json_object* module = (json_object*) list->array[idx]; + const char* type = NULL; + if (data->ffjson_object_is_type(module, json_type_string)) + { + type = data->ffjson_object_get_string(module); + module = NULL; + } + else if (data->ffjson_object_is_type(module, json_type_object)) + { + type = data->ffjson_object_get_string(data->ffjson_object_object_get(module, "type")); + if (!type) return "module object must contain a type key"; + } + else + return "modules must be an array of strings or objects"; + + if(!parseModuleJsonObject(instance, type, data, module)) + return "Unknown module type"; + } + + return NULL; +} + +static const char* printJsonConfig(FFinstance* instance) +{ + FF_LIBRARY_LOAD(libjsonc, &instance->config.libJSONC, "dlopen libjson-c" FF_LIBRARY_EXTENSION" failed", + #ifdef _WIN32 + "libjson-c-5" FF_LIBRARY_EXTENSION, -1 + #else + "libjson-c" FF_LIBRARY_EXTENSION, 5 + #endif + ) + JSONCData __attribute__((__cleanup__(wrapJsoncFree))) data = {}; + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_tokener_parse) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_is_type) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_array) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_boolean) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_double) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string_len) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_object) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_object_get) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_put) + + FF_STRBUF_AUTO_DESTROY content; + ffStrbufInit(&content); + FF_LIST_FOR_EACH(FFstrbuf, filename, instance->state.platform.configDirs) + { + uint32_t oldLength = filename->length; + ffStrbufAppendS(filename, "fastfetch/config.json"); + bool success = ffAppendFileBuffer(filename->chars, &content); + ffStrbufSubstrBefore(filename, oldLength); + if (success) break; + } + + data.root = data.ffjson_tokener_parse(content.chars); + if (!data.root) + return "Failed to parse JSON config file"; + + lh_table* rootObject = data.ffjson_object_get_object(data.root); + if (!rootObject) + return "Invalid JSON config format. Root value must be an object"; + + struct lh_entry* entry; + lh_foreach(rootObject, entry) + { + const char* key = (const char *)lh_entry_k(entry); + json_object* val = (struct json_object *)lh_entry_v(entry); + + if (strcmp(key, "modules") == 0) + { + const char* error = parseModules(instance, &data, val); + if (error) return error; + } + else + return "Unknown JSON config key in root object"; + } + + return NULL; +} + +#else + +static const char* printJsonConfig(FF_MAYBE_UNUSED FFinstance* instance) +{ + return "Fastfetch was compiled without json-c support"; +} + +#endif + +void ffPrintJsonConfig(FFinstance* instance) +{ + const char* error = printJsonConfig(instance); + if (error) + ffPrintErrorString(instance, "JsonConfig", 0, NULL, NULL, "%s", error); +} diff --git a/src/modules/jsonconfig/jsonconfig.h b/src/modules/jsonconfig/jsonconfig.h new file mode 100644 index 000000000..a29f7bda5 --- /dev/null +++ b/src/modules/jsonconfig/jsonconfig.h @@ -0,0 +1,5 @@ +#pragma once + +#include "fastfetch.h" + +void ffPrintJsonConfig(FFinstance* instance); diff --git a/src/modules/modules.h b/src/modules/modules.h index f407e92d2..e2a2b672a 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -7,3 +7,4 @@ #include "modules/command/command.h" #include "modules/separator/separator.h" #include "modules/title/title.h" +#include "modules/jsonconfig/jsonconfig.h" From da81111575f9855e34294b73ebec1d95e4ffab36 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 19:38:03 +0800 Subject: [PATCH 12/71] DateTime: init support of JSON config Redundant modules `Date` and `Time` are removed --- CMakeLists.txt | 4 +- src/common/init.c | 8 +-- src/fastfetch.c | 10 +-- src/fastfetch.h | 7 +- src/modules/date.c | 20 ------ src/modules/datetime.c | 48 ------------- src/modules/datetime/datetime.c | 102 ++++++++++++++++++++++++++++ src/modules/datetime/datetime.h | 14 ++++ src/modules/datetime/option.h | 11 +++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 3 +- src/modules/time.c | 20 ------ 13 files changed, 138 insertions(+), 111 deletions(-) delete mode 100644 src/modules/date.c delete mode 100644 src/modules/datetime.c create mode 100644 src/modules/datetime/datetime.c create mode 100644 src/modules/datetime/datetime.h create mode 100644 src/modules/datetime/option.h delete mode 100644 src/modules/time.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 5fac1e924..19a202bed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -273,8 +273,7 @@ set(LIBFASTFETCH_SRC src/modules/cursor.c src/modules/custom.c src/modules/command/command.c - src/modules/date.c - src/modules/datetime.c + src/modules/datetime/datetime.c src/modules/de.c src/modules/disk.c src/modules/font.c @@ -303,7 +302,6 @@ set(LIBFASTFETCH_SRC src/modules/terminal.c src/modules/terminalfont.c src/modules/theme.c - src/modules/time.c src/modules/title/title.c src/modules/uptime.c src/modules/users.c diff --git a/src/common/init.c b/src/common/init.c index b27c17a12..39d840869 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -110,9 +110,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.wifi); initModuleArg(&instance->config.player); initModuleArg(&instance->config.media); - initModuleArg(&instance->config.dateTime); - initModuleArg(&instance->config.date); - initModuleArg(&instance->config.time); + ffInitDateTimeOptions(&instance->config.dateTime); initModuleArg(&instance->config.vulkan); initModuleArg(&instance->config.wallpaper); initModuleArg(&instance->config.openGL); @@ -356,9 +354,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.wifi); destroyModuleArg(&instance->config.player); destroyModuleArg(&instance->config.media); - destroyModuleArg(&instance->config.dateTime); - destroyModuleArg(&instance->config.date); - destroyModuleArg(&instance->config.time); + ffDestroyDateTimeOptions(&instance->config.dateTime); destroyModuleArg(&instance->config.vulkan); destroyModuleArg(&instance->config.openGL); destroyModuleArg(&instance->config.openCL); diff --git a/src/fastfetch.c b/src/fastfetch.c index a8fe3357e..23e06fa39 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1171,9 +1171,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {} else if(optionParseModuleArgs(key, value, "player", &instance->config.player)) {} else if(optionParseModuleArgs(key, value, "media", &instance->config.media)) {} - else if(optionParseModuleArgs(key, value, "datetime", &instance->config.dateTime)) {} - else if(optionParseModuleArgs(key, value, "date", &instance->config.date)) {} - else if(optionParseModuleArgs(key, value, "time", &instance->config.time)) {} + else if(ffParseDateTimeCommandOptions(&instance->config.dateTime, key, value)) {} else if(optionParseModuleArgs(key, value, "vulkan", &instance->config.vulkan)) {} else if(optionParseModuleArgs(key, value, "opengl", &instance->config.openGL)) {} else if(optionParseModuleArgs(key, value, "opencl", &instance->config.openCL)) {} @@ -1471,11 +1469,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "media") == 0) ffPrintMedia(instance); else if(strcasecmp(line, "datetime") == 0) - ffPrintDateTime(instance); - else if(strcasecmp(line, "date") == 0) - ffPrintDate(instance); - else if(strcasecmp(line, "time") == 0) - ffPrintTime(instance); + ffPrintDateTime(instance, &instance->config.dateTime); else if(strcasecmp(line, "colors") == 0) ffPrintColors(instance); else if(strcasecmp(line, "vulkan") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 805a9b46c..c889f8cf7 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -172,9 +172,7 @@ typedef struct FFconfig FFModuleArgs weather; FFModuleArgs player; FFModuleArgs media; - FFModuleArgs dateTime; - FFModuleArgs date; - FFModuleArgs time; + FFDateTimeOptions dateTime; FFModuleArgs vulkan; FFModuleArgs openGL; FFModuleArgs openCL; @@ -291,7 +289,6 @@ void ffLogoBuiltinListAutocompletion(); //Common -void ffPrintDateTimeFormat(FFinstance* instance, const char* moduleName, const FFModuleArgs* moduleArgs); void ffPrepareCPUUsage(); void ffPreparePublicIp(FFinstance* instance); void ffPrepareWeather(FFinstance* instance); @@ -331,7 +328,7 @@ void ffPrintPowerAdapter(FFinstance* instance); void ffPrintLocale(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); -void ffPrintDateTime(FFinstance* instance); +void ffPrintDateTime(FFinstance* instance, FFDateTimeOptions* options); void ffPrintDate(FFinstance* instance); void ffPrintTime(FFinstance* instance); void ffPrintLocalIp(FFinstance* instance); diff --git a/src/modules/date.c b/src/modules/date.c deleted file mode 100644 index a92209ed0..000000000 --- a/src/modules/date.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/datetime/datetime.h" - -#define FF_DATE_MODULE_NAME "Date" - -void ffPrintDate(FFinstance* instance) -{ - if(instance->config.date.outputFormat.length > 0) - { - ffPrintDateTimeFormat(instance, FF_DATE_MODULE_NAME, &instance->config.date); - return; - } - - const FFDateTimeResult* datetime = ffDetectDateTime(instance); - ffPrintLogoAndKey(instance, FF_DATE_MODULE_NAME, 0, &instance->config.date.key); - - //yyyy-mm-dd - printf("%u-%s-%u\n", datetime->year, datetime->monthPretty.chars, datetime->dayInMonth); -} diff --git a/src/modules/datetime.c b/src/modules/datetime.c deleted file mode 100644 index 968d17725..000000000 --- a/src/modules/datetime.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/datetime/datetime.h" - -#define FF_DATETIME_MODULE_NAME "Date & Time" -#define FF_DATETIME_NUM_FORMAT_ARGS 20 - -void ffPrintDateTimeFormat(FFinstance* instance, const char* moduleName, const FFModuleArgs* moduleArgs) -{ - const FFDateTimeResult* result = ffDetectDateTime(instance); - ffPrintFormat(instance, moduleName, 0, moduleArgs, FF_DATETIME_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_UINT16, &result->year}, - {FF_FORMAT_ARG_TYPE_UINT8, &result->yearShort}, - {FF_FORMAT_ARG_TYPE_UINT8, &result->month}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->monthPretty}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->monthName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->monthNameShort}, - {FF_FORMAT_ARG_TYPE_UINT8, &result->week}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->weekday}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->weekdayShort}, - {FF_FORMAT_ARG_TYPE_UINT16, &result->dayInYear}, - {FF_FORMAT_ARG_TYPE_UINT8, &result->dayInMonth}, - {FF_FORMAT_ARG_TYPE_UINT8, &result->dayInWeek}, - {FF_FORMAT_ARG_TYPE_UINT8, &result->hour}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->hourPretty}, - {FF_FORMAT_ARG_TYPE_UINT8, &result->hour12}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->hour12Pretty}, - {FF_FORMAT_ARG_TYPE_UINT8, &result->minute}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->minutePretty}, - {FF_FORMAT_ARG_TYPE_UINT8, &result->second}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->secondPretty} - }); -} - -void ffPrintDateTime(FFinstance* instance) -{ - if(instance->config.dateTime.outputFormat.length > 0) - { - ffPrintDateTimeFormat(instance, FF_DATETIME_MODULE_NAME, &instance->config.dateTime); - return; - } - - const FFDateTimeResult* datetime = ffDetectDateTime(instance); - ffPrintLogoAndKey(instance, FF_DATETIME_MODULE_NAME, 0, &instance->config.dateTime.key); - - //yyyy-MM-dd HH:mm:ss - printf("%u-%s-%02u %s:%s:%s\n", datetime->year, datetime->monthPretty.chars, datetime->dayInMonth, datetime->hourPretty.chars, datetime->minutePretty.chars, datetime->secondPretty.chars); -} diff --git a/src/modules/datetime/datetime.c b/src/modules/datetime/datetime.c new file mode 100644 index 000000000..40d09b851 --- /dev/null +++ b/src/modules/datetime/datetime.c @@ -0,0 +1,102 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/datetime/datetime.h" +#include "modules/datetime/datetime.h" + +#define FF_DATETIME_MODULE_NAME "DateTime" +#define FF_DATETIME_DISPLAY_NAME "Date & Time" +#define FF_DATETIME_NUM_FORMAT_ARGS 20 + +void ffPrintDateTimeFormat(FFinstance* instance, const char* moduleName, const FFModuleArgs* moduleArgs) +{ + const FFDateTimeResult* result = ffDetectDateTime(instance); + ffPrintFormat(instance, moduleName, 0, moduleArgs, FF_DATETIME_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_UINT16, &result->year}, // 1 + {FF_FORMAT_ARG_TYPE_UINT8, &result->yearShort}, // 2 + {FF_FORMAT_ARG_TYPE_UINT8, &result->month}, // 3 + {FF_FORMAT_ARG_TYPE_STRBUF, &result->monthPretty}, // 4 + {FF_FORMAT_ARG_TYPE_STRBUF, &result->monthName}, // 5 + {FF_FORMAT_ARG_TYPE_STRBUF, &result->monthNameShort}, // 6 + {FF_FORMAT_ARG_TYPE_UINT8, &result->week}, // 7 + {FF_FORMAT_ARG_TYPE_STRBUF, &result->weekday}, // 8 + {FF_FORMAT_ARG_TYPE_STRBUF, &result->weekdayShort}, // 9 + {FF_FORMAT_ARG_TYPE_UINT16, &result->dayInYear}, // 10 + {FF_FORMAT_ARG_TYPE_UINT8, &result->dayInMonth}, // 11 + {FF_FORMAT_ARG_TYPE_UINT8, &result->dayInWeek}, // 12 + {FF_FORMAT_ARG_TYPE_UINT8, &result->hour}, // 13 + {FF_FORMAT_ARG_TYPE_STRBUF, &result->hourPretty}, // 14 + {FF_FORMAT_ARG_TYPE_UINT8, &result->hour12}, // 15 + {FF_FORMAT_ARG_TYPE_STRBUF, &result->hour12Pretty}, // 16 + {FF_FORMAT_ARG_TYPE_UINT8, &result->minute}, // 17 + {FF_FORMAT_ARG_TYPE_STRBUF, &result->minutePretty}, // 18 + {FF_FORMAT_ARG_TYPE_UINT8, &result->second}, // 19 + {FF_FORMAT_ARG_TYPE_STRBUF, &result->secondPretty} // 20 + }); +} + +void ffPrintDateTime(FFinstance* instance, FFDateTimeOptions* options) +{ + if(options->moduleArgs.outputFormat.length > 0) + { + ffPrintDateTimeFormat(instance, FF_DATETIME_DISPLAY_NAME, &options->moduleArgs); + return; + } + + const FFDateTimeResult* datetime = ffDetectDateTime(instance); + ffPrintLogoAndKey(instance, FF_DATETIME_DISPLAY_NAME, 0, &options->moduleArgs.key); + + //yyyy-MM-dd HH:mm:ss + printf("%u-%s-%02u %s:%s:%s\n", datetime->year, datetime->monthPretty.chars, datetime->dayInMonth, datetime->hourPretty.chars, datetime->minutePretty.chars, datetime->secondPretty.chars); +} + +void ffInitDateTimeOptions(FFDateTimeOptions* options) +{ + options->moduleName = FF_DATETIME_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseDateTimeCommandOptions(FFDateTimeOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_DATETIME_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyDateTimeOptions(FFDateTimeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_DATETIME_MODULE_NAME) != 0) + return false; + + FFDateTimeOptions __attribute__((__cleanup__(ffDestroyDateTimeOptions))) options; + ffInitDateTimeOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_DATETIME_DISPLAY_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintDateTime(instance, &options); + return true; +} +#endif diff --git a/src/modules/datetime/datetime.h b/src/modules/datetime/datetime.h new file mode 100644 index 000000000..aba103d77 --- /dev/null +++ b/src/modules/datetime/datetime.h @@ -0,0 +1,14 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/datetime/option.h" + +void ffPrintDateTime(FFinstance* instance, FFDateTimeOptions* options); +void ffInitDateTimeOptions(FFDateTimeOptions* options); +bool ffParseDateTimeCommandOptions(FFDateTimeOptions* options, const char* key, const char* value); +void ffDestroyDateTimeOptions(FFDateTimeOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif diff --git a/src/modules/datetime/option.h b/src/modules/datetime/option.h new file mode 100644 index 000000000..1c32501e6 --- /dev/null +++ b/src/modules/datetime/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 FFDateTimeOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFDateTimeOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 893972315..2f0309d2a 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -15,6 +15,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, ffParseTitleJsonObject(instance, type, data, module) || ffParseBatteryJsonObject(instance, type, data, module) || ffParseCommandJsonObject(instance, type, data, module) || + ffParseDateTimeJsonObject(instance, type, data, module) || ffParseOSJsonObject(instance, type, data, module) || ffParseSeparatorJsonObject(instance, type, data, module) || false; diff --git a/src/modules/modules.h b/src/modules/modules.h index e2a2b672a..4bd1a79e3 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -5,6 +5,7 @@ #include "modules/os/os.h" #include "modules/battery/battery.h" #include "modules/command/command.h" +#include "modules/datetime/datetime.h" #include "modules/separator/separator.h" #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" diff --git a/src/modules/options.h b/src/modules/options.h index faf052800..157c34cb2 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -3,7 +3,8 @@ // For "fastfetch.h" #include "modules/battery/option.h" -#include "modules/os/option.h" #include "modules/command/option.h" +#include "modules/datetime/option.h" +#include "modules/os/option.h" #include "modules/separator/option.h" #include "modules/title/option.h" diff --git a/src/modules/time.c b/src/modules/time.c deleted file mode 100644 index 523e4fa19..000000000 --- a/src/modules/time.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/datetime/datetime.h" - -#define FF_TIME_MODULE_NAME "Time" - -void ffPrintTime(FFinstance* instance) -{ - if(instance->config.time.outputFormat.length > 0) - { - ffPrintDateTimeFormat(instance, FF_TIME_MODULE_NAME, &instance->config.time); - return; - } - - const FFDateTimeResult* datetime = ffDetectDateTime(instance); - ffPrintLogoAndKey(instance, FF_TIME_MODULE_NAME, 0, &instance->config.time.key); - - //hh:mm:ss - printf("%s:%s:%s\n", datetime->hourPretty.chars, datetime->minutePretty.chars, datetime->secondPretty.chars); -} From 04180a73893775d6e13a1f87cf8dbd9bd63badf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 10 Mar 2023 10:56:36 +0800 Subject: [PATCH 13/71] Display: init support of JSON config --- CMakeLists.txt | 2 +- src/common/config.c | 35 +++ src/common/config.h | 2 + src/common/init.c | 8 +- src/common/option.c | 23 +- src/common/option.h | 12 +- .../displayserver/displayserver_apple.c | 2 +- .../displayserver/displayserver_windows.c | 2 +- src/detection/displayserver/linux/wayland.c | 2 +- src/fastfetch.c | 16 +- src/fastfetch.h | 14 +- src/flashfetch.c | 2 +- src/modules/display.c | 108 --------- src/modules/display/display.c | 218 ++++++++++++++++++ src/modules/display/display.h | 14 ++ src/modules/display/option.h | 22 ++ src/modules/jsonconfig/jsonconfig.c | 2 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 19 files changed, 318 insertions(+), 168 deletions(-) delete mode 100644 src/modules/display.c create mode 100644 src/modules/display/display.c create mode 100644 src/modules/display/display.h create mode 100644 src/modules/display/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 19a202bed..2faf326fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -293,7 +293,7 @@ set(LIBFASTFETCH_SRC src/modules/poweradapter.c src/modules/processes.c src/modules/publicip.c - src/modules/display.c + src/modules/display/display.c src/modules/separator/separator.c src/modules/shell.c src/modules/sound.c diff --git a/src/common/config.c b/src/common/config.c index f7d124fce..c154583c9 100644 --- a/src/common/config.c +++ b/src/common/config.c @@ -23,4 +23,39 @@ bool ffJsonConfigParseModuleArgs(JSONCData* data, const char* key, json_object* return false; } +const char* ffJsonConfigParseEnum(JSONCData* data, json_object* val, int* result, FFKeyValuePair pairs[]) +{ + if (data->ffjson_object_is_type(val, json_type_int)) + { + int intVal = data->ffjson_object_get_int(val); + + for (const FFKeyValuePair* pPair = pairs; pPair->key; ++pPair) + { + if (intVal == pPair->value) + { + *result = pPair->value; + return NULL; + } + } + + return "Invalid enum integer"; + } + else if (data->ffjson_object_is_type(val, json_type_string)) + { + const char* strVal = data->ffjson_object_get_string(val); + for (const FFKeyValuePair* pPair = pairs; pPair->key; ++pPair) + { + if (strcasecmp(strVal, pPair->key) == 0) + { + *result = pPair->value; + return NULL; + } + } + + return "Invalid enum string"; + } + else + return "Invalid enum value type; must be a string or integer"; +} + #endif diff --git a/src/common/config.h b/src/common/config.h index 81dd9c011..d52b88440 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -13,6 +13,7 @@ typedef struct JSONCData FF_LIBRARY_SYMBOL(json_object_get_array) FF_LIBRARY_SYMBOL(json_object_get_boolean) FF_LIBRARY_SYMBOL(json_object_get_double) + FF_LIBRARY_SYMBOL(json_object_get_int) FF_LIBRARY_SYMBOL(json_object_get_string_len) FF_LIBRARY_SYMBOL(json_object_get_string) FF_LIBRARY_SYMBOL(json_object_get_object) @@ -23,5 +24,6 @@ typedef struct JSONCData } JSONCData; bool ffJsonConfigParseModuleArgs(JSONCData* data, const char* key, json_object* val, FFModuleArgs* moduleArgs); +const char* ffJsonConfigParseEnum(JSONCData* data, json_object* val, int* result, FFKeyValuePair pairs[]); #endif diff --git a/src/common/init.c b/src/common/init.c index 39d840869..950f30c1b 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -85,7 +85,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.processes); initModuleArg(&instance->config.packages); initModuleArg(&instance->config.shell); - initModuleArg(&instance->config.display); + ffInitDisplayOptions(&instance->config.display); initModuleArg(&instance->config.de); initModuleArg(&instance->config.wm); initModuleArg(&instance->config.wmTheme); @@ -160,10 +160,6 @@ static void defaultConfig(FFinstance* instance) ffStrbufInitA(&instance->config.diskFolders, 0); instance->config.diskShowTypes = FF_DISK_TYPE_REGULAR_BIT | FF_DISK_TYPE_EXTERNAL_BIT; - instance->config.displayCompactType = FF_DISPLAY_COMPACT_TYPE_NONE; - instance->config.displayDetectName = false; - instance->config.displayPreciseRefreshRate = false; - instance->config.bluetoothShowDisconnected = false; instance->config.soundType = FF_SOUND_TYPE_MAIN; @@ -328,7 +324,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.processes); destroyModuleArg(&instance->config.packages); destroyModuleArg(&instance->config.shell); - destroyModuleArg(&instance->config.display); + ffDestroyDisplayOptions(&instance->config.display); destroyModuleArg(&instance->config.de); destroyModuleArg(&instance->config.wm); destroyModuleArg(&instance->config.wmTheme); diff --git a/src/common/option.c b/src/common/option.c index 81e54c532..3f6c360e4 100644 --- a/src/common/option.c +++ b/src/common/option.c @@ -72,7 +72,7 @@ uint32_t ffOptionParseUInt32(const char* argumentKey, const char* value) return num; } -void ffOptionParseEnum(const char* argumentKey, const char* requestedKey, void* result, ...) +int ffOptionParseEnum(const char* argumentKey, const char* requestedKey, FFKeyValuePair pairs[]) { if(requestedKey == NULL) { @@ -80,27 +80,12 @@ void ffOptionParseEnum(const char* argumentKey, const char* requestedKey, void* exit(476); } - va_list args; - va_start(args, result); - - while(true) + for (const FFKeyValuePair* pPair = pairs; pPair->key; ++pPair) { - const char* key = va_arg(args, const char*); - if(key == NULL) - break; - - int value = va_arg(args, int); //C standard guarantees that enumeration constants are presented as ints - - if(strcasecmp(requestedKey, key) == 0) - { - *(int*)result = value; - va_end(args); - return; - } + if(strcasecmp(requestedKey, pPair->key) == 0) + return pPair->value; } - va_end(args); - fprintf(stderr, "Error: unknown %s value: %s\n", argumentKey, requestedKey); exit(478); } diff --git a/src/common/option.h b/src/common/option.h index b24c278b8..1c56de4d3 100644 --- a/src/common/option.h +++ b/src/common/option.h @@ -9,11 +9,17 @@ typedef struct FFModuleArgs FFstrbuf errorFormat; } FFModuleArgs; +typedef struct FFKeyValuePair +{ + const char* key; + int value; +} FFKeyValuePair; + const char* ffOptionTestPrefix(const char* argumentKey, const char* moduleName); bool ffOptionParseModuleArgs(const char* argumentKey, const char* pkey, const char* value, FFModuleArgs* result); void ffOptionParseString(const char* argumentKey, const char* value, FFstrbuf* buffer); -uint32_t ffOptionParseUInt32(const char* argumentKey, const char* value); -void ffOptionParseEnum(const char* argumentKey, const char* requestedKey, void* result, ...); -bool ffOptionParseBoolean(const char* str); +FF_C_NODISCARD uint32_t ffOptionParseUInt32(const char* argumentKey, const char* value); +FF_C_NODISCARD int ffOptionParseEnum(const char* argumentKey, const char* requestedKey, FFKeyValuePair pairs[]); +FF_C_NODISCARD bool ffOptionParseBoolean(const char* str); void ffOptionInitModuleArg(FFModuleArgs* args); void ffOptionDestroyModuleArg(FFModuleArgs* args); diff --git a/src/detection/displayserver/displayserver_apple.c b/src/detection/displayserver/displayserver_apple.c index f2d2447aa..05c017a49 100644 --- a/src/detection/displayserver/displayserver_apple.c +++ b/src/detection/displayserver/displayserver_apple.c @@ -121,5 +121,5 @@ void ffConnectDisplayServerImpl(FFDisplayServerResult* ds, const FFinstance* ins ffStrbufAppendS(&ds->dePrettyName, "Aqua"); ffListInitA(&ds->displays, sizeof(FFDisplayResult), 4); - detectDisplays(ds, instance->config.displayDetectName); + detectDisplays(ds, instance->config.display.detectName); } diff --git a/src/detection/displayserver/displayserver_windows.c b/src/detection/displayserver/displayserver_windows.c index 5d93746f5..1ee86ef5d 100644 --- a/src/detection/displayserver/displayserver_windows.c +++ b/src/detection/displayserver/displayserver_windows.c @@ -113,7 +113,7 @@ void ffConnectDisplayServerImpl(FFDisplayServerResult* ds, const FFinstance* ins ffStrbufInit(&ds->deVersion); ffListInit(&ds->displays, sizeof(FFDisplayResult)); - detectDisplays(ds, instance->config.displayDetectName); + detectDisplays(ds, instance->config.display.detectName); //https://github.com/hykilpikonna/hyfetch/blob/master/neofetch#L2067 const FFOSResult* os = ffDetectOS(instance); diff --git a/src/detection/displayserver/linux/wayland.c b/src/detection/displayserver/linux/wayland.c index 7e7f98fb5..d65fa70a5 100644 --- a/src/detection/displayserver/linux/wayland.c +++ b/src/detection/displayserver/linux/wayland.c @@ -225,7 +225,7 @@ bool detectWayland(const FFinstance* instance, FFDisplayServerResult* result) if(data.display == NULL) return false; - data.detectName = instance->config.displayDetectName; + data.detectName = instance->config.display.detectName; waylandDetectWM(ffwl_display_get_fd(data.display), result); diff --git a/src/fastfetch.c b/src/fastfetch.c index 23e06fa39..071e947a5 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1144,7 +1144,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con 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)) {} - else if(optionParseModuleArgs(key, value, "display", &instance->config.display)) {} + else if(ffParseDisplayCommandOptions(&instance->config.display, key, value)) {} else if(optionParseModuleArgs(key, value, "brightness", &instance->config.brightness)) {} else if(optionParseModuleArgs(key, value, "de", &instance->config.de)) {} else if(optionParseModuleArgs(key, value, "wifi", &instance->config.wifi)) {} @@ -1272,18 +1272,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_SUBVOLUME_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_SUBVOLUME_BIT); else if(strcasecmp(key, "--disk-show-unknown") == 0) optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_UNKNOWN_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_UNKNOWN_BIT); - else if(strcasecmp(key, "--display-compact-type") == 0) - { - optionParseEnum(key, value, &instance->config.displayCompactType, - "none", FF_DISPLAY_COMPACT_TYPE_NONE, - "original", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT, - "scaled", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT, - NULL); - } - else if(strcasecmp(key, "--display-precise-refresh-rate") == 0) - instance->config.displayPreciseRefreshRate = optionParseBoolean(value); - else if(strcasecmp(key, "--display-detect-name") == 0) - instance->config.displayDetectName = optionParseBoolean(value); else if(strcasecmp(key, "--bluetooth-show-disconnected") == 0) instance->config.bluetoothShowDisconnected = optionParseBoolean(value); else if(strcasecmp(key, "--sound-type") == 0) @@ -1417,7 +1405,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "shell") == 0) ffPrintShell(instance); else if(strcasecmp(line, "display") == 0) - ffPrintDisplay(instance); + ffPrintDisplay(instance, &instance->config.display); else if(strcasecmp(line, "desktopenvironment") == 0 || strcasecmp(line, "de") == 0) ffPrintDesktopEnvironment(instance); else if(strcasecmp(line, "windowmanager") == 0 || strcasecmp(line, "wm") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index c889f8cf7..7c1ecf1f2 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -43,13 +43,6 @@ typedef enum FFSoundType FF_SOUND_TYPE_ALL, } FFSoundType; -typedef enum FFDisplayCompactType -{ - FF_DISPLAY_COMPACT_TYPE_NONE = 0, - FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT = 1 << 0, - FF_DISPLAY_COMPACT_TYPE_SCALED_BIT = 1 << 1, -} FFDisplayCompactType; - typedef enum FFLocalIpCompactType { FF_LOCALIP_COMPACT_TYPE_NONE, @@ -146,7 +139,7 @@ typedef struct FFconfig FFModuleArgs processes; FFModuleArgs packages; FFModuleArgs shell; - FFModuleArgs display; + FFDisplayOptions display; FFModuleArgs de; FFModuleArgs wallpaper; FFModuleArgs wifi; @@ -221,10 +214,6 @@ typedef struct FFconfig FFstrbuf diskFolders; FFDiskType diskShowTypes; - FFDisplayCompactType displayCompactType; - bool displayDetectName; - bool displayPreciseRefreshRate; - bool bluetoothShowDisconnected; FFstrbuf localIpNamePrefix; @@ -306,7 +295,6 @@ void ffPrintUptime(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintPackages(FFinstance* instance); void ffPrintShell(FFinstance* instance); -void ffPrintDisplay(FFinstance* instance); void ffPrintBrightness(FFinstance* instance); void ffPrintDesktopEnvironment(FFinstance* instance); void ffPrintWM(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 6b961e04a..4ababc3a7 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -32,7 +32,7 @@ int main(int argc, char** argv) //ffPrintProcesses(&instance); ffPrintPackages(&instance); ffPrintShell(&instance); - ffPrintDisplay(&instance); + ffPrintDisplay(&instance, &instance.config.display); // ffPrintBrightness(&instance); ffPrintDesktopEnvironment(&instance); ffPrintWM(&instance); diff --git a/src/modules/display.c b/src/modules/display.c deleted file mode 100644 index f4dddbe1f..000000000 --- a/src/modules/display.c +++ /dev/null @@ -1,108 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/displayserver/displayserver.h" - -#define FF_DISPLAY_MODULE_NAME "Display" -#define FF_DISPLAY_NUM_FORMAT_ARGS 7 - -void ffPrintDisplay(FFinstance* instance) -{ - #ifdef __ANDROID__ - ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &instance->config.display, "Display detection is not supported on Android"); - return; - #endif - - const FFDisplayServerResult* dsResult = ffConnectDisplayServer(instance); - - if (instance->config.displayCompactType != FF_DISPLAY_COMPACT_TYPE_NONE) - { - ffPrintLogoAndKey(instance, FF_DISPLAY_MODULE_NAME, 0, &instance->config.display.key); - - int index = 0; - FF_LIST_FOR_EACH(FFDisplayResult, result, dsResult->displays) - { - if (instance->config.displayCompactType & FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT) - { - if (index++) putchar(' '); - printf("%ix%i", result->width, result->height); - } - if (instance->config.displayCompactType & FF_DISPLAY_COMPACT_TYPE_SCALED_BIT) - { - if (index++) putchar(' '); - printf("%ix%i", result->scaledWidth, result->scaledHeight); - } - ffStrbufDestroy(&result->name); - } - putchar('\n'); - return; - } - - FF_STRBUF_AUTO_DESTROY key; - ffStrbufInit(&key); - - for(uint32_t i = 0; i < dsResult->displays.length; i++) - { - FFDisplayResult* result = ffListGet(&dsResult->displays, i); - uint8_t moduleIndex = dsResult->displays.length == 1 ? 0 : (uint8_t) (i + 1); - const char* displayType = result->type == FF_DISPLAY_TYPE_UNKNOWN ? NULL : result->type == FF_DISPLAY_TYPE_BUILTIN ? "built-in" : "external"; - - if(instance->config.display.outputFormat.length == 0) - { - if(result->name.length || (moduleIndex > 0 && displayType)) - { - ffStrbufClear(&key); - if(instance->config.display.key.length == 0) - { - ffStrbufAppendF(&key, "%s (%s)", FF_DISPLAY_MODULE_NAME, result->name.length ? result->name.chars : displayType); - } - else - { - ffParseFormatString(&key, &instance->config.display.key, 1, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_UINT, &i}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->name}, - {FF_FORMAT_ARG_TYPE_STRING, displayType}, - }); - } - ffPrintLogoAndKey(instance, key.chars, 0, NULL); - } - else - { - ffPrintLogoAndKey(instance, FF_DISPLAY_MODULE_NAME, moduleIndex, &instance->config.display.key); - } - - printf("%ix%i", result->width, result->height); - - if(result->refreshRate > 0) - { - if(instance->config.displayPreciseRefreshRate) - printf(" @ %gHz", ((int) (result->refreshRate * 1000 + 0.5)) / 1000.0); - else - printf(" @ %iHz", (uint32_t) (result->refreshRate + 0.5)); - } - - if( - result->scaledWidth > 0 && result->scaledWidth != result->width && - result->scaledHeight > 0 && result->scaledHeight != result->height) - printf(" (as %ix%i)", result->scaledWidth, result->scaledHeight); - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_DISPLAY_MODULE_NAME, moduleIndex, &instance->config.display, FF_DISPLAY_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_UINT, &result->width}, - {FF_FORMAT_ARG_TYPE_UINT, &result->height}, - {FF_FORMAT_ARG_TYPE_DOUBLE, &result->refreshRate}, - {FF_FORMAT_ARG_TYPE_UINT, &result->scaledWidth}, - {FF_FORMAT_ARG_TYPE_UINT, &result->scaledHeight}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->name}, - {FF_FORMAT_ARG_TYPE_STRING, displayType}, - }); - } - - ffStrbufDestroy(&result->name); - } - - if(dsResult->displays.length == 0) - ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &instance->config.display, "Couldn't detect display"); -} diff --git a/src/modules/display/display.c b/src/modules/display/display.c new file mode 100644 index 000000000..72330878c --- /dev/null +++ b/src/modules/display/display.c @@ -0,0 +1,218 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/displayserver/displayserver.h" +#include "modules/display/display.h" + +#define FF_DISPLAY_MODULE_NAME "Display" +#define FF_DISPLAY_NUM_FORMAT_ARGS 7 + +void ffPrintDisplay(FFinstance* instance, FFDisplayOptions* options) +{ + #ifdef __ANDROID__ + ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &instance->config.display.moduleArgs, "Display detection is not supported on Android"); + return; + #endif + + const FFDisplayServerResult* dsResult = ffConnectDisplayServer(instance); + + if(dsResult->displays.length == 0) + { + ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &instance->config.display.moduleArgs, "Couldn't detect display"); + return; + } + + if (options->compactType != FF_DISPLAY_COMPACT_TYPE_NONE) + { + ffPrintLogoAndKey(instance, FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs.key); + + int index = 0; + FF_LIST_FOR_EACH(FFDisplayResult, result, dsResult->displays) + { + if (options->compactType & FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT) + { + if (index++) putchar(' '); + printf("%ix%i", result->width, result->height); + } + if (options->compactType & FF_DISPLAY_COMPACT_TYPE_SCALED_BIT) + { + if (index++) putchar(' '); + printf("%ix%i", result->scaledWidth, result->scaledHeight); + } + ffStrbufDestroy(&result->name); + } + putchar('\n'); + return; + } + + FF_STRBUF_AUTO_DESTROY key; + ffStrbufInit(&key); + + for(uint32_t i = 0; i < dsResult->displays.length; i++) + { + FFDisplayResult* result = ffListGet(&dsResult->displays, i); + uint8_t moduleIndex = dsResult->displays.length == 1 ? 0 : (uint8_t) (i + 1); + const char* displayType = result->type == FF_DISPLAY_TYPE_UNKNOWN ? NULL : result->type == FF_DISPLAY_TYPE_BUILTIN ? "built-in" : "external"; + + if(options->moduleArgs.outputFormat.length == 0) + { + if(result->name.length || (moduleIndex > 0 && displayType)) + { + ffStrbufClear(&key); + if(options->moduleArgs.key.length == 0) + { + ffStrbufAppendF(&key, "%s (%s)", FF_DISPLAY_MODULE_NAME, result->name.length ? result->name.chars : displayType); + } + else + { + ffParseFormatString(&key, &options->moduleArgs.key, 1, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_UINT, &i}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->name}, + {FF_FORMAT_ARG_TYPE_STRING, displayType}, + }); + } + ffPrintLogoAndKey(instance, key.chars, 0, NULL); + } + else + { + ffPrintLogoAndKey(instance, FF_DISPLAY_MODULE_NAME, moduleIndex, &options->moduleArgs.key); + } + + printf("%ix%i", result->width, result->height); + + if(result->refreshRate > 0) + { + if(options->preciseRefreshRate) + printf(" @ %gHz", ((int) (result->refreshRate * 1000 + 0.5)) / 1000.0); + else + printf(" @ %iHz", (uint32_t) (result->refreshRate + 0.5)); + } + + if( + result->scaledWidth > 0 && result->scaledWidth != result->width && + result->scaledHeight > 0 && result->scaledHeight != result->height) + printf(" (as %ix%i)", result->scaledWidth, result->scaledHeight); + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_DISPLAY_MODULE_NAME, moduleIndex, &options->moduleArgs, FF_DISPLAY_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_UINT, &result->width}, + {FF_FORMAT_ARG_TYPE_UINT, &result->height}, + {FF_FORMAT_ARG_TYPE_DOUBLE, &result->refreshRate}, + {FF_FORMAT_ARG_TYPE_UINT, &result->scaledWidth}, + {FF_FORMAT_ARG_TYPE_UINT, &result->scaledHeight}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->name}, + {FF_FORMAT_ARG_TYPE_STRING, displayType}, + }); + } + + ffStrbufDestroy(&result->name); + } +} + +void ffInitDisplayOptions(FFDisplayOptions* options) +{ + options->moduleName = FF_DISPLAY_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + options->compactType = FF_DISPLAY_COMPACT_TYPE_NONE; + options->detectName = false; + options->preciseRefreshRate = false; +} + +bool ffParseDisplayCommandOptions(FFDisplayOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_DISPLAY_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "compact-type") == 0) + { + options->compactType = (FFDisplayCompactType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { + { "none", FF_DISPLAY_COMPACT_TYPE_NONE }, + { "original", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT }, + { "scaled", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT }, + {}, + }); + return true; + } + + if (strcasecmp(subKey, "detect-name") == 0) + { + options->detectName = ffOptionParseBoolean(value); + return true; + } + + if (strcasecmp(subKey, "precise-refresh-rate") == 0) + { + options->preciseRefreshRate = ffOptionParseBoolean(value); + return true; + } + + return false; +} + +void ffDestroyDisplayOptions(FFDisplayOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_DISPLAY_MODULE_NAME) != 0) + return false; + + FFDisplayOptions __attribute__((__cleanup__(ffDestroyDisplayOptions))) options; + ffInitDisplayOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "compactType") == 0) + { + int value; + const char* error = ffJsonConfigParseEnum(data, val, &value, (FFKeyValuePair[]) { + { "none", FF_DISPLAY_COMPACT_TYPE_NONE }, + { "original", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT }, + { "scaled", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT }, + {}, + }); + if (error) + ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &options.moduleArgs, "Invalid %s value: %s", key, error); + else + options.compactType = (FFDisplayCompactType) value; + continue; + } + + if (strcasecmp(key, "detectName") == 0) + { + options.detectName = data->ffjson_object_get_boolean(val); + continue; + } + + if (strcasecmp(key, "preciseRefreshRate") == 0) + { + options.preciseRefreshRate = data->ffjson_object_get_boolean(val); + continue; + } + + ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintDisplay(instance, &options); + return true; +} +#endif diff --git a/src/modules/display/display.h b/src/modules/display/display.h new file mode 100644 index 000000000..7ee6d65d1 --- /dev/null +++ b/src/modules/display/display.h @@ -0,0 +1,14 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/display/option.h" + +void ffPrintDisplay(FFinstance* instance, FFDisplayOptions* options); +void ffInitDisplayOptions(FFDisplayOptions* options); +bool ffParseDisplayCommandOptions(FFDisplayOptions* options, const char* key, const char* value); +void ffDestroyDisplayOptions(FFDisplayOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif diff --git a/src/modules/display/option.h b/src/modules/display/option.h new file mode 100644 index 000000000..4e47b1bee --- /dev/null +++ b/src/modules/display/option.h @@ -0,0 +1,22 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef enum FFDisplayCompactType +{ + FF_DISPLAY_COMPACT_TYPE_NONE = 0, + FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT = 1 << 0, + FF_DISPLAY_COMPACT_TYPE_SCALED_BIT = 1 << 1, +} FFDisplayCompactType; + +typedef struct FFDisplayOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFDisplayCompactType compactType; + bool detectName; + bool preciseRefreshRate; +} FFDisplayOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 2f0309d2a..c7a4aec6f 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -16,6 +16,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, ffParseBatteryJsonObject(instance, type, data, module) || ffParseCommandJsonObject(instance, type, data, module) || ffParseDateTimeJsonObject(instance, type, data, module) || + ffParseDisplayJsonObject(instance, type, data, module) || ffParseOSJsonObject(instance, type, data, module) || ffParseSeparatorJsonObject(instance, type, data, module) || false; @@ -72,6 +73,7 @@ static const char* printJsonConfig(FFinstance* instance) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_array) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_boolean) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_double) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_int) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string_len) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_object) diff --git a/src/modules/modules.h b/src/modules/modules.h index 4bd1a79e3..5235729f4 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -6,6 +6,7 @@ #include "modules/battery/battery.h" #include "modules/command/command.h" #include "modules/datetime/datetime.h" +#include "modules/display/display.h" #include "modules/separator/separator.h" #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" diff --git a/src/modules/options.h b/src/modules/options.h index 157c34cb2..a929492cb 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -5,6 +5,7 @@ #include "modules/battery/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" +#include "modules/display/option.h" #include "modules/os/option.h" #include "modules/separator/option.h" #include "modules/title/option.h" From 9c066e94948b08a8a1f36502645c3379d1df168f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 10 Mar 2023 11:26:53 +0800 Subject: [PATCH 14/71] Host: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 4 +- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/host.c | 55 -------------- src/modules/host/host.c | 108 ++++++++++++++++++++++++++++ src/modules/host/host.h | 14 ++++ src/modules/host/option.h | 11 +++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 143 insertions(+), 63 deletions(-) delete mode 100644 src/modules/host.c create mode 100644 src/modules/host/host.c create mode 100644 src/modules/host/host.h create mode 100644 src/modules/host/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2faf326fe..60acb6ca4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,7 +278,7 @@ set(LIBFASTFETCH_SRC src/modules/disk.c src/modules/font.c src/modules/gpu.c - src/modules/host.c + src/modules/host/host.c src/modules/icons.c src/modules/gamepad.c src/modules/kernel.c diff --git a/src/common/init.c b/src/common/init.c index 950f30c1b..1441b84c8 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -74,7 +74,7 @@ static void defaultConfig(FFinstance* instance) ffInitTitleOptions(&instance->config.title); ffInitOSOptions(&instance->config.os); - initModuleArg(&instance->config.host); + ffInitHostOptions(&instance->config.host); initModuleArg(&instance->config.bios); initModuleArg(&instance->config.board); initModuleArg(&instance->config.brightness); @@ -314,7 +314,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyTitleOptions(&instance->config.title); ffDestroyOSOptions(&instance->config.os); - destroyModuleArg(&instance->config.host); + ffDestroyHostOptions(&instance->config.host); destroyModuleArg(&instance->config.bios); destroyModuleArg(&instance->config.board); destroyModuleArg(&instance->config.chassis); diff --git a/src/fastfetch.c b/src/fastfetch.c index 071e947a5..d6a31b5a4 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1134,7 +1134,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con /////////////////////// else if(ffParseOSCommandOptions(&instance->config.os, key, value)) {} - else if(optionParseModuleArgs(key, value, "host", &instance->config.host)) {} + else if(ffParseHostCommandOptions(&instance->config.host, key, value)) {} else if(optionParseModuleArgs(key, value, "bios", &instance->config.bios)) {} else if(optionParseModuleArgs(key, value, "board", &instance->config.board)) {} else if(optionParseModuleArgs(key, value, "chassis", &instance->config.chassis)) {} @@ -1385,7 +1385,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "os") == 0) ffPrintOS(instance, &instance->config.os); else if(strcasecmp(line, "host") == 0) - ffPrintHost(instance); + ffPrintHost(instance, &instance->config.host); else if(strcasecmp(line, "bios") == 0) ffPrintBios(instance); else if(strcasecmp(line, "board") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 7c1ecf1f2..3f405892b 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -128,7 +128,7 @@ typedef struct FFconfig FFTitleOptions title; FFOSOptions os; - FFModuleArgs host; + FFHostOptions host; FFModuleArgs bios; FFModuleArgs board; FFModuleArgs brightness; @@ -286,7 +286,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintCustom(FFinstance* instance, const char* key, const char* value); void ffPrintBreak(FFinstance* instance); -void ffPrintHost(FFinstance* instance); void ffPrintBios(FFinstance* instance); void ffPrintBoard(FFinstance* instance); void ffPrintChassis(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 4ababc3a7..8942113d9 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -23,7 +23,7 @@ int main(int argc, char** argv) ffPrintTitle(&instance, &instance.config.title); ffPrintSeparator(&instance, &instance.config.separator); ffPrintOS(&instance, &instance.config.os); - ffPrintHost(&instance); + ffPrintHost(&instance, &instance.config.host); //ffPrintBios(&instance); //ffPrintBoard(&instance); //ffPrintChassis(&instance); diff --git a/src/modules/host.c b/src/modules/host.c deleted file mode 100644 index 9fa3bafee..000000000 --- a/src/modules/host.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/host/host.h" - -#define FF_HOST_MODULE_NAME "Host" -#define FF_HOST_NUM_FORMAT_ARGS 5 - -void ffPrintHost(FFinstance* instance) -{ - const FFHostResult* host = ffDetectHost(); - - if(host->error.length > 0) - { - ffPrintError(instance, FF_HOST_MODULE_NAME, 0, &instance->config.host, "%*s", host->error.length, host->error.chars); - return; - } - - if(host->productFamily.length == 0 && host->productName.length == 0) - { - ffPrintError(instance, FF_HOST_MODULE_NAME, 0, &instance->config.host, "neither product_family nor product_name is set by O.E.M."); - return; - } - - if(instance->config.host.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_HOST_MODULE_NAME, 0, &instance->config.host.key); - - FFstrbuf output; - ffStrbufInit(&output); - - if(host->productName.length > 0) - ffStrbufAppend(&output, &host->productName); - else - ffStrbufAppend(&output, &host->productFamily); - - if(host->productVersion.length > 0 && !ffStrbufIgnCaseEqualS(&host->productVersion, "none")) - { - ffStrbufAppendF(&output, " (%s)", host->productVersion.chars); - } - - ffStrbufPutTo(&output, stdout); - - ffStrbufDestroy(&output); - } - else - { - ffPrintFormat(instance, FF_HOST_MODULE_NAME, 0, &instance->config.host, FF_HOST_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &host->productFamily}, - {FF_FORMAT_ARG_TYPE_STRBUF, &host->productName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &host->productVersion}, - {FF_FORMAT_ARG_TYPE_STRBUF, &host->productSku}, - {FF_FORMAT_ARG_TYPE_STRBUF, &host->sysVendor} - }); - } -} diff --git a/src/modules/host/host.c b/src/modules/host/host.c new file mode 100644 index 000000000..d4a498c13 --- /dev/null +++ b/src/modules/host/host.c @@ -0,0 +1,108 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/host/host.h" +#include "modules/host/host.h" + +#define FF_HOST_MODULE_NAME "Host" +#define FF_HOST_NUM_FORMAT_ARGS 5 + +void ffPrintHost(FFinstance* instance, FFHostOptions* options) +{ + const FFHostResult* host = ffDetectHost(); + + if(host->error.length > 0) + { + ffPrintError(instance, FF_HOST_MODULE_NAME, 0, &options->moduleArgs, "%*s", host->error.length, host->error.chars); + return; + } + + if(host->productFamily.length == 0 && host->productName.length == 0) + { + ffPrintError(instance, FF_HOST_MODULE_NAME, 0, &options->moduleArgs, "neither product_family nor product_name is set by O.E.M."); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_HOST_MODULE_NAME, 0, &options->moduleArgs.key); + + FFstrbuf output; + ffStrbufInit(&output); + + if(host->productName.length > 0) + ffStrbufAppend(&output, &host->productName); + else + ffStrbufAppend(&output, &host->productFamily); + + if(host->productVersion.length > 0 && !ffStrbufIgnCaseEqualS(&host->productVersion, "none")) + { + ffStrbufAppendF(&output, " (%s)", host->productVersion.chars); + } + + ffStrbufPutTo(&output, stdout); + + ffStrbufDestroy(&output); + } + else + { + ffPrintFormat(instance, FF_HOST_MODULE_NAME, 0, &options->moduleArgs, FF_HOST_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &host->productFamily}, + {FF_FORMAT_ARG_TYPE_STRBUF, &host->productName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &host->productVersion}, + {FF_FORMAT_ARG_TYPE_STRBUF, &host->productSku}, + {FF_FORMAT_ARG_TYPE_STRBUF, &host->sysVendor} + }); + } +} + +void ffInitHostOptions(FFHostOptions* options) +{ + options->moduleName = FF_HOST_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseHostCommandOptions(FFHostOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_HOST_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyHostOptions(FFHostOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +bool ffParseHostJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_HOST_MODULE_NAME) != 0) + return false; + + FFHostOptions __attribute__((__cleanup__(ffDestroyHostOptions))) options; + ffInitHostOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_HOST_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintHost(instance, &options); + return true; +} +#endif diff --git a/src/modules/host/host.h b/src/modules/host/host.h new file mode 100644 index 000000000..05b06d422 --- /dev/null +++ b/src/modules/host/host.h @@ -0,0 +1,14 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/host/option.h" + +void ffPrintHost(FFinstance* instance, FFHostOptions* options); +void ffInitHostOptions(FFHostOptions* options); +bool ffParseHostCommandOptions(FFHostOptions* options, const char* key, const char* value); +void ffDestroyHostOptions(FFHostOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseHostJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif diff --git a/src/modules/host/option.h b/src/modules/host/option.h new file mode 100644 index 000000000..59073e934 --- /dev/null +++ b/src/modules/host/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 FFHostOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFHostOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index c7a4aec6f..55d9df3b6 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -17,6 +17,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, ffParseCommandJsonObject(instance, type, data, module) || ffParseDateTimeJsonObject(instance, type, data, module) || ffParseDisplayJsonObject(instance, type, data, module) || + ffParseHostJsonObject(instance, type, data, module) || ffParseOSJsonObject(instance, type, data, module) || ffParseSeparatorJsonObject(instance, type, data, module) || false; diff --git a/src/modules/modules.h b/src/modules/modules.h index 5235729f4..4bbddcb83 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -7,6 +7,7 @@ #include "modules/command/command.h" #include "modules/datetime/datetime.h" #include "modules/display/display.h" +#include "modules/host/host.h" #include "modules/separator/separator.h" #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" diff --git a/src/modules/options.h b/src/modules/options.h index a929492cb..7a2509aa5 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -6,6 +6,7 @@ #include "modules/command/option.h" #include "modules/datetime/option.h" #include "modules/display/option.h" +#include "modules/host/option.h" #include "modules/os/option.h" #include "modules/separator/option.h" #include "modules/title/option.h" From 169785a8bb426dc9b672bdbb5f45a1bb8a4b3641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 10 Mar 2023 14:14:32 +0800 Subject: [PATCH 15/71] Kernel: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 4 +- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/kernel.c | 30 ----------- src/modules/kernel/kernel.c | 83 +++++++++++++++++++++++++++++ src/modules/kernel/kernel.h | 14 +++++ src/modules/kernel/option.h | 11 ++++ src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 118 insertions(+), 38 deletions(-) delete mode 100644 src/modules/kernel.c create mode 100644 src/modules/kernel/kernel.c create mode 100644 src/modules/kernel/kernel.h create mode 100644 src/modules/kernel/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 60acb6ca4..a3f582051 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -281,7 +281,7 @@ set(LIBFASTFETCH_SRC src/modules/host/host.c src/modules/icons.c src/modules/gamepad.c - src/modules/kernel.c + src/modules/kernel/kernel.c src/modules/locale.c src/modules/localip.c src/modules/memory.c diff --git a/src/common/init.c b/src/common/init.c index 1441b84c8..4dace7205 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -80,7 +80,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.brightness); initModuleArg(&instance->config.chassis); ffInitCommandOptions(&instance->config.command); - initModuleArg(&instance->config.kernel); + ffInitKernelOptions(&instance->config.kernel); initModuleArg(&instance->config.uptime); initModuleArg(&instance->config.processes); initModuleArg(&instance->config.packages); @@ -319,7 +319,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.board); destroyModuleArg(&instance->config.chassis); ffDestroyCommandOptions(&instance->config.command); - destroyModuleArg(&instance->config.kernel); + ffDestroyKernelOptions(&instance->config.kernel); destroyModuleArg(&instance->config.uptime); destroyModuleArg(&instance->config.processes); destroyModuleArg(&instance->config.packages); diff --git a/src/fastfetch.c b/src/fastfetch.c index d6a31b5a4..2c1582950 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1139,7 +1139,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "board", &instance->config.board)) {} else if(optionParseModuleArgs(key, value, "chassis", &instance->config.chassis)) {} else if(ffParseCommandCommandOptions(&instance->config.command, key, value)) {} - else if(optionParseModuleArgs(key, value, "kernel", &instance->config.kernel)) {} + else if(ffParseKernelCommandOptions(&instance->config.kernel, key, value)) {} else if(optionParseModuleArgs(key, value, "uptime", &instance->config.uptime)) {} else if(optionParseModuleArgs(key, value, "processes", &instance->config.processes)) {} else if(optionParseModuleArgs(key, value, "packages", &instance->config.packages)) {} @@ -1395,7 +1395,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "chassis") == 0) ffPrintChassis(instance); else if(strcasecmp(line, "kernel") == 0) - ffPrintKernel(instance); + ffPrintKernel(instance, &instance->config.kernel); else if(strcasecmp(line, "uptime") == 0) ffPrintUptime(instance); else if(strcasecmp(line, "processes") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 3f405892b..c91395b06 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -134,7 +134,7 @@ typedef struct FFconfig FFModuleArgs brightness; FFModuleArgs chassis; FFCommandOptions command; - FFModuleArgs kernel; + FFKernelOptions kernel; FFModuleArgs uptime; FFModuleArgs processes; FFModuleArgs packages; @@ -289,7 +289,6 @@ void ffPrintBreak(FFinstance* instance); void ffPrintBios(FFinstance* instance); void ffPrintBoard(FFinstance* instance); void ffPrintChassis(FFinstance* instance); -void ffPrintKernel(FFinstance* instance); void ffPrintUptime(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintPackages(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 8942113d9..034fea0ff 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -27,7 +27,7 @@ int main(int argc, char** argv) //ffPrintBios(&instance); //ffPrintBoard(&instance); //ffPrintChassis(&instance); - ffPrintKernel(&instance); + ffPrintKernel(&instance, &instance.config.kernel); ffPrintUptime(&instance); //ffPrintProcesses(&instance); ffPrintPackages(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 55d9df3b6..8b2876db3 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -18,6 +18,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, ffParseDateTimeJsonObject(instance, type, data, module) || ffParseDisplayJsonObject(instance, type, data, module) || ffParseHostJsonObject(instance, type, data, module) || + ffParseKernelJsonObject(instance, type, data, module) || ffParseOSJsonObject(instance, type, data, module) || ffParseSeparatorJsonObject(instance, type, data, module) || false; diff --git a/src/modules/kernel.c b/src/modules/kernel.c deleted file mode 100644 index bc1139833..000000000 --- a/src/modules/kernel.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" - -#define FF_KERNEL_MODULE_NAME "Kernel" -#define FF_KERNEL_NUM_FORMAT_ARGS 4 - -void ffPrintKernel(FFinstance* instance) -{ - if(instance->config.kernel.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_KERNEL_MODULE_NAME, 0, &instance->config.kernel.key); - ffStrbufWriteTo(&instance->state.platform.systemRelease, stdout); - - #ifdef _WIN32 - if(instance->state.platform.systemVersion.length > 0) - printf(" (%s)", instance->state.platform.systemVersion.chars); - #endif - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_KERNEL_MODULE_NAME, 0, &instance->config.kernel, FF_KERNEL_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemRelease}, - {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemVersion}, - {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemArchitecture} - }); - } -} diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c new file mode 100644 index 000000000..31f206581 --- /dev/null +++ b/src/modules/kernel/kernel.c @@ -0,0 +1,83 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "modules/kernel/kernel.h" + +#define FF_KERNEL_MODULE_NAME "Kernel" +#define FF_KERNEL_NUM_FORMAT_ARGS 4 + +void ffPrintKernel(FFinstance* instance, FFKernelOptions* options) +{ + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_KERNEL_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufWriteTo(&instance->state.platform.systemRelease, stdout); + + #ifdef _WIN32 + if(instance->state.platform.systemVersion.length > 0) + printf(" (%s)", instance->state.platform.systemVersion.chars); + #endif + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_KERNEL_MODULE_NAME, 0, &options->moduleArgs, FF_KERNEL_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemRelease}, + {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemVersion}, + {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemArchitecture} + }); + } +} + +void ffInitKernelOptions(FFKernelOptions* options) +{ + options->moduleName = FF_KERNEL_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseKernelCommandOptions(FFKernelOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_KERNEL_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyKernelOptions(FFKernelOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +bool ffParseKernelJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_KERNEL_MODULE_NAME) != 0) + return false; + + FFKernelOptions __attribute__((__cleanup__(ffDestroyKernelOptions))) options; + ffInitKernelOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_KERNEL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintKernel(instance, &options); + return true; +} +#endif diff --git a/src/modules/kernel/kernel.h b/src/modules/kernel/kernel.h new file mode 100644 index 000000000..7d3b55b35 --- /dev/null +++ b/src/modules/kernel/kernel.h @@ -0,0 +1,14 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/kernel/option.h" + +void ffPrintKernel(FFinstance* instance, FFKernelOptions* options); +void ffInitKernelOptions(FFKernelOptions* options); +bool ffParseKernelCommandOptions(FFKernelOptions* options, const char* key, const char* value); +void ffDestroyKernelOptions(FFKernelOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseKernelJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif diff --git a/src/modules/kernel/option.h b/src/modules/kernel/option.h new file mode 100644 index 000000000..434c3069d --- /dev/null +++ b/src/modules/kernel/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 FFKernelOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFKernelOptions; diff --git a/src/modules/modules.h b/src/modules/modules.h index 4bbddcb83..cbfdc0ca6 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -8,6 +8,7 @@ #include "modules/datetime/datetime.h" #include "modules/display/display.h" #include "modules/host/host.h" +#include "modules/kernel/kernel.h" #include "modules/separator/separator.h" #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" diff --git a/src/modules/options.h b/src/modules/options.h index 7a2509aa5..2bf008d66 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -7,6 +7,7 @@ #include "modules/datetime/option.h" #include "modules/display/option.h" #include "modules/host/option.h" +#include "modules/kernel/option.h" #include "modules/os/option.h" #include "modules/separator/option.h" #include "modules/title/option.h" From 0377793102e3cc78eb358859bd8988ea03e5e236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 10 Mar 2023 14:17:46 +0800 Subject: [PATCH 16/71] JsonConfig: use `.jsonc` as config file extension to prevent text editors from confusing --- src/modules/jsonconfig/jsonconfig.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 8b2876db3..e4037cc17 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -87,7 +87,7 @@ static const char* printJsonConfig(FFinstance* instance) FF_LIST_FOR_EACH(FFstrbuf, filename, instance->state.platform.configDirs) { uint32_t oldLength = filename->length; - ffStrbufAppendS(filename, "fastfetch/config.json"); + ffStrbufAppendS(filename, "fastfetch/config.jsonc"); bool success = ffAppendFileBuffer(filename->chars, &content); ffStrbufSubstrBefore(filename, oldLength); if (success) break; From 76da3d811c04dc25f9d2e140b948ef03bf9f3690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 10 Mar 2023 14:38:49 +0800 Subject: [PATCH 17/71] Modules: remove unnecessary `#include` --- src/modules/battery/battery.h | 1 - src/modules/command/command.h | 1 - src/modules/datetime/datetime.h | 1 - src/modules/display/display.h | 1 - src/modules/host/host.h | 1 - 5 files changed, 5 deletions(-) diff --git a/src/modules/battery/battery.h b/src/modules/battery/battery.h index 14d31c3f0..20d76a50b 100644 --- a/src/modules/battery/battery.h +++ b/src/modules/battery/battery.h @@ -1,7 +1,6 @@ #pragma once #include "fastfetch.h" -#include "modules/battery/option.h" void ffPrintBattery(FFinstance* instance, FFBatteryOptions* options); diff --git a/src/modules/command/command.h b/src/modules/command/command.h index adbf29d04..de894975b 100644 --- a/src/modules/command/command.h +++ b/src/modules/command/command.h @@ -1,7 +1,6 @@ #pragma once #include "fastfetch.h" -#include "modules/command/option.h" void ffPrintCommand(FFinstance* instance, FFCommandOptions* options); void ffInitCommandOptions(FFCommandOptions* options); diff --git a/src/modules/datetime/datetime.h b/src/modules/datetime/datetime.h index aba103d77..7536e3da7 100644 --- a/src/modules/datetime/datetime.h +++ b/src/modules/datetime/datetime.h @@ -1,7 +1,6 @@ #pragma once #include "fastfetch.h" -#include "modules/datetime/option.h" void ffPrintDateTime(FFinstance* instance, FFDateTimeOptions* options); void ffInitDateTimeOptions(FFDateTimeOptions* options); diff --git a/src/modules/display/display.h b/src/modules/display/display.h index 7ee6d65d1..bb09d0e5f 100644 --- a/src/modules/display/display.h +++ b/src/modules/display/display.h @@ -1,7 +1,6 @@ #pragma once #include "fastfetch.h" -#include "modules/display/option.h" void ffPrintDisplay(FFinstance* instance, FFDisplayOptions* options); void ffInitDisplayOptions(FFDisplayOptions* options); diff --git a/src/modules/host/host.h b/src/modules/host/host.h index 05b06d422..c2a0ca695 100644 --- a/src/modules/host/host.h +++ b/src/modules/host/host.h @@ -1,7 +1,6 @@ #pragma once #include "fastfetch.h" -#include "modules/host/option.h" void ffPrintHost(FFinstance* instance, FFHostOptions* options); void ffInitHostOptions(FFHostOptions* options); From ae08966d40c7c0e52ab4fe67d53bcb0465c24070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 10 Mar 2023 14:48:09 +0800 Subject: [PATCH 18/71] Bios: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 4 +- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/bios.c | 46 -------------- src/modules/bios/bios.c | 99 +++++++++++++++++++++++++++++ src/modules/bios/bios.h | 13 ++++ src/modules/bios/option.h | 11 ++++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 133 insertions(+), 54 deletions(-) delete mode 100644 src/modules/bios.c create mode 100644 src/modules/bios/bios.c create mode 100644 src/modules/bios/bios.h create mode 100644 src/modules/bios/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a3f582051..7663965af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -261,7 +261,7 @@ set(LIBFASTFETCH_SRC src/logo/image/image.c src/logo/logo.c src/modules/battery/battery.c - src/modules/bios.c + src/modules/bios/bios.c src/modules/bluetooth.c src/modules/board.c src/modules/brightness.c diff --git a/src/common/init.c b/src/common/init.c index 4dace7205..aa427b2d0 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -75,7 +75,7 @@ static void defaultConfig(FFinstance* instance) ffInitTitleOptions(&instance->config.title); ffInitOSOptions(&instance->config.os); ffInitHostOptions(&instance->config.host); - initModuleArg(&instance->config.bios); + ffInitBiosOptions(&instance->config.bios); initModuleArg(&instance->config.board); initModuleArg(&instance->config.brightness); initModuleArg(&instance->config.chassis); @@ -315,7 +315,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyTitleOptions(&instance->config.title); ffDestroyOSOptions(&instance->config.os); ffDestroyHostOptions(&instance->config.host); - destroyModuleArg(&instance->config.bios); + ffDestroyBiosOptions(&instance->config.bios); destroyModuleArg(&instance->config.board); destroyModuleArg(&instance->config.chassis); ffDestroyCommandOptions(&instance->config.command); diff --git a/src/fastfetch.c b/src/fastfetch.c index 2c1582950..bc6528567 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1135,7 +1135,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseOSCommandOptions(&instance->config.os, key, value)) {} else if(ffParseHostCommandOptions(&instance->config.host, key, value)) {} - else if(optionParseModuleArgs(key, value, "bios", &instance->config.bios)) {} + else if(ffParseBiosCommandOptions(&instance->config.bios, key, value)) {} else if(optionParseModuleArgs(key, value, "board", &instance->config.board)) {} else if(optionParseModuleArgs(key, value, "chassis", &instance->config.chassis)) {} else if(ffParseCommandCommandOptions(&instance->config.command, key, value)) {} @@ -1387,7 +1387,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "host") == 0) ffPrintHost(instance, &instance->config.host); else if(strcasecmp(line, "bios") == 0) - ffPrintBios(instance); + ffPrintBios(instance, &instance->config.bios); else if(strcasecmp(line, "board") == 0) ffPrintBoard(instance); else if(strcasecmp(line, "brightness") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index c91395b06..79dd8a0f3 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -129,7 +129,7 @@ typedef struct FFconfig FFTitleOptions title; FFOSOptions os; FFHostOptions host; - FFModuleArgs bios; + FFBiosOptions bios; FFModuleArgs board; FFModuleArgs brightness; FFModuleArgs chassis; @@ -286,7 +286,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintCustom(FFinstance* instance, const char* key, const char* value); void ffPrintBreak(FFinstance* instance); -void ffPrintBios(FFinstance* instance); void ffPrintBoard(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintUptime(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 034fea0ff..9c24a9ee8 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -24,7 +24,7 @@ int main(int argc, char** argv) ffPrintSeparator(&instance, &instance.config.separator); ffPrintOS(&instance, &instance.config.os); ffPrintHost(&instance, &instance.config.host); - //ffPrintBios(&instance); + //ffPrintBios(&instance, &instance.config.bios); //ffPrintBoard(&instance); //ffPrintChassis(&instance); ffPrintKernel(&instance, &instance.config.kernel); diff --git a/src/modules/bios.c b/src/modules/bios.c deleted file mode 100644 index 7b3853355..000000000 --- a/src/modules/bios.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/bios/bios.h" - -#define FF_BIOS_MODULE_NAME "Bios" -#define FF_BIOS_NUM_FORMAT_ARGS 4 - -void ffPrintBios(FFinstance* instance) -{ - FFBiosResult result; - ffDetectBios(&result); - - if(result.error.length > 0) - { - ffPrintError(instance, FF_BIOS_MODULE_NAME, 0, &instance->config.bios, "%*s", result.error.length, result.error.chars); - goto exit; - } - - if(result.biosRelease.length == 0) - { - ffPrintError(instance, FF_BIOS_MODULE_NAME, 0, &instance->config.bios, "bios_release is not set."); - goto exit; - } - - if(instance->config.bios.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_BIOS_MODULE_NAME, 0, &instance->config.bios.key); - puts(result.biosRelease.chars); - } - else - { - ffPrintFormat(instance, FF_BIOS_MODULE_NAME, 0, &instance->config.bios, FF_BIOS_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &result.biosDate}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.biosRelease}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.biosVendor}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.biosVersion}, - }); - } - -exit: - ffStrbufDestroy(&result.biosDate); - ffStrbufDestroy(&result.biosRelease); - ffStrbufDestroy(&result.biosVendor); - ffStrbufDestroy(&result.biosVersion); - ffStrbufDestroy(&result.error); -} diff --git a/src/modules/bios/bios.c b/src/modules/bios/bios.c new file mode 100644 index 000000000..718e404a9 --- /dev/null +++ b/src/modules/bios/bios.c @@ -0,0 +1,99 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/bios/bios.h" +#include "modules/bios/bios.h" + +#define FF_BIOS_MODULE_NAME "Bios" +#define FF_BIOS_NUM_FORMAT_ARGS 4 + +void ffPrintBios(FFinstance* instance, FFBiosOptions* options) +{ + FFBiosResult result; + ffDetectBios(&result); + + if(result.error.length > 0) + { + ffPrintError(instance, FF_BIOS_MODULE_NAME, 0, &options->moduleArgs, "%*s", result.error.length, result.error.chars); + goto exit; + } + + if(result.biosRelease.length == 0) + { + ffPrintError(instance, FF_BIOS_MODULE_NAME, 0, &options->moduleArgs, "bios_release is not set."); + goto exit; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_BIOS_MODULE_NAME, 0, &options->moduleArgs.key); + puts(result.biosRelease.chars); + } + else + { + ffPrintFormat(instance, FF_BIOS_MODULE_NAME, 0, &options->moduleArgs, FF_BIOS_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &result.biosDate}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.biosRelease}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.biosVendor}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.biosVersion}, + }); + } + +exit: + ffStrbufDestroy(&result.biosDate); + ffStrbufDestroy(&result.biosRelease); + ffStrbufDestroy(&result.biosVendor); + ffStrbufDestroy(&result.biosVersion); + ffStrbufDestroy(&result.error); +} + +void ffInitBiosOptions(FFBiosOptions* options) +{ + options->moduleName = FF_BIOS_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseBiosCommandOptions(FFBiosOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_BIOS_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyBiosOptions(FFBiosOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +bool ffParseBiosJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_BIOS_MODULE_NAME) != 0) + return false; + + FFBiosOptions __attribute__((__cleanup__(ffDestroyBiosOptions))) options; + ffInitBiosOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_BIOS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintBios(instance, &options); + return true; +} +#endif diff --git a/src/modules/bios/bios.h b/src/modules/bios/bios.h new file mode 100644 index 000000000..c751285c5 --- /dev/null +++ b/src/modules/bios/bios.h @@ -0,0 +1,13 @@ +#pragma once + +#include "fastfetch.h" + +void ffPrintBios(FFinstance* instance, FFBiosOptions* options); +void ffInitBiosOptions(FFBiosOptions* options); +bool ffParseBiosCommandOptions(FFBiosOptions* options, const char* key, const char* value); +void ffDestroyBiosOptions(FFBiosOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseBiosJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif diff --git a/src/modules/bios/option.h b/src/modules/bios/option.h new file mode 100644 index 000000000..6c0f67420 --- /dev/null +++ b/src/modules/bios/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 FFBiosOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFBiosOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index e4037cc17..bd062ae7d 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -14,6 +14,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, return ffParseTitleJsonObject(instance, type, data, module) || ffParseBatteryJsonObject(instance, type, data, module) || + ffParseBiosJsonObject(instance, type, data, module) || ffParseCommandJsonObject(instance, type, data, module) || ffParseDateTimeJsonObject(instance, type, data, module) || ffParseDisplayJsonObject(instance, type, data, module) || diff --git a/src/modules/modules.h b/src/modules/modules.h index cbfdc0ca6..be6bac672 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -4,6 +4,7 @@ #include "modules/os/os.h" #include "modules/battery/battery.h" +#include "modules/bios/bios.h" #include "modules/command/command.h" #include "modules/datetime/datetime.h" #include "modules/display/display.h" diff --git a/src/modules/options.h b/src/modules/options.h index 2bf008d66..1b7502204 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -3,6 +3,7 @@ // For "fastfetch.h" #include "modules/battery/option.h" +#include "modules/bios/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" #include "modules/display/option.h" From e812380f20b0c77e4aa444705c41bd2f82bf491d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 10 Mar 2023 17:49:03 +0800 Subject: [PATCH 19/71] Logo: move logo command line option parser to a separate file Prepare for JSON config support --- CMakeLists.txt | 1 + src/common/init.c | 25 +----- src/common/option.c | 38 +++++++++ src/common/option.h | 1 + src/fastfetch.c | 128 +------------------------------ src/fastfetch.h | 41 +--------- src/logo/logo.c | 90 +++++++++++++--------- src/logo/logo.h | 5 ++ src/logo/option.c | 183 ++++++++++++++++++++++++++++++++++++++++++++ src/logo/option.h | 41 ++++++++++ 10 files changed, 331 insertions(+), 222 deletions(-) create mode 100644 src/logo/option.c create mode 100644 src/logo/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7663965af..b3b487584 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -260,6 +260,7 @@ set(LIBFASTFETCH_SRC src/logo/image/im7.c src/logo/image/image.c src/logo/logo.c + src/logo/option.c src/modules/battery/battery.c src/modules/bios/bios.c src/modules/bluetooth.c diff --git a/src/common/init.c b/src/common/init.c index aa427b2d0..8d2e7a48f 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -3,6 +3,7 @@ #include "common/thread.h" #include "detection/displayserver/displayserver.h" #include "util/textModifier.h" +#include "logo/logo.h" #include #include @@ -36,23 +37,7 @@ static void initModuleArg(FFModuleArgs* args) static void defaultConfig(FFinstance* instance) { - ffStrbufInitA(&instance->config.logo.source, 0); - instance->config.logo.type = FF_LOGO_TYPE_AUTO; - for(uint8_t i = 0; i < (uint8_t) FASTFETCH_LOGO_MAX_COLORS; ++i) - ffStrbufInit(&instance->config.logo.colors[i]); - instance->config.logo.width = 0; - instance->config.logo.height = 0; //preserve aspect ratio - instance->config.logo.paddingTop = 0; - instance->config.logo.paddingLeft = 0; - instance->config.logo.paddingRight = 4; - instance->config.logo.printRemaining = true; - instance->config.logo.preserveAspectRadio = false; - - instance->config.logo.chafaFgOnly = false; - ffStrbufInitS(&instance->config.logo.chafaSymbols, "block+border+space-wide-inverted"); // Chafa default - instance->config.logo.chafaCanvasMode = UINT32_MAX; - instance->config.logo.chafaColorSpace = UINT32_MAX; - instance->config.logo.chafaDitherMode = UINT32_MAX; + ffInitLogoOptions(&instance->config.logo); ffStrbufInit(&instance->config.colorKeys); ffStrbufInit(&instance->config.colorTitle); @@ -304,10 +289,8 @@ static void destroyModuleArg(FFModuleArgs* args) static void destroyConfig(FFinstance* instance) { - ffStrbufDestroy(&instance->config.logo.source); - ffStrbufDestroy(&instance->config.logo.chafaSymbols); - for(uint8_t i = 0; i < (uint8_t) FASTFETCH_LOGO_MAX_COLORS; ++i) - ffStrbufDestroy(&instance->config.logo.colors[i]); + ffDestroyLogoOptions(&instance->config.logo); + ffStrbufDestroy(&instance->config.colorKeys); ffStrbufDestroy(&instance->config.colorTitle); ffStrbufDestroy(&instance->config.keyValueSeparator); diff --git a/src/common/option.c b/src/common/option.c index 3f6c360e4..e151788be 100644 --- a/src/common/option.c +++ b/src/common/option.c @@ -14,6 +14,10 @@ const char* ffOptionTestPrefix(const char* argumentKey, const char* moduleName) return NULL; subKey += moduleNameLen; + + if(subKey[0] == '\0') + return subKey; + if(subKey[0] != '-') return NULL; @@ -101,6 +105,40 @@ bool ffOptionParseBoolean(const char* str) ); } +void ffOptionParseColor(const char* key, const char* value, FFstrbuf* buffer) +{ + if(value == NULL) + { + fprintf(stderr, "Error: usage: %s \n", key); + exit(477); + } + ffStrbufEnsureFree(buffer, 63); + + while(*value != '\0') + { + #define FF_APPEND_COLOR_CODE_COND(prefix, code) \ + if(strncasecmp(value, #prefix, strlen(#prefix))) { ffStrbufAppendS(buffer, code); value += strlen(#prefix); } + + FF_APPEND_COLOR_CODE_COND(reset_, "0;") + else FF_APPEND_COLOR_CODE_COND(bright_, "1;") + else FF_APPEND_COLOR_CODE_COND(black, "30") + else FF_APPEND_COLOR_CODE_COND(red, "31") + else FF_APPEND_COLOR_CODE_COND(green, "32") + else FF_APPEND_COLOR_CODE_COND(yellow, "33") + else FF_APPEND_COLOR_CODE_COND(blue, "34") + else FF_APPEND_COLOR_CODE_COND(magenta, "35") + else FF_APPEND_COLOR_CODE_COND(cyan, "36") + else FF_APPEND_COLOR_CODE_COND(white, "37") + else + { + ffStrbufAppendC(buffer, *value); + ++value; + } + + #undef FF_APPEND_COLOR_CODE_COND + } +} + void ffOptionInitModuleArg(FFModuleArgs* args) { ffStrbufInit(&args->key); diff --git a/src/common/option.h b/src/common/option.h index 1c56de4d3..0c8d29b1b 100644 --- a/src/common/option.h +++ b/src/common/option.h @@ -21,5 +21,6 @@ void ffOptionParseString(const char* argumentKey, const char* value, FFstrbuf* b FF_C_NODISCARD uint32_t ffOptionParseUInt32(const char* argumentKey, const char* value); FF_C_NODISCARD int ffOptionParseEnum(const char* argumentKey, const char* requestedKey, FFKeyValuePair pairs[]); FF_C_NODISCARD bool ffOptionParseBoolean(const char* str); +void ffOptionParseColor(const char* key, const char* value, FFstrbuf* buffer); void ffOptionInitModuleArg(FFModuleArgs* args); void ffOptionDestroyModuleArg(FFModuleArgs* args); diff --git a/src/fastfetch.c b/src/fastfetch.c index bc6528567..eb9ab31c9 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -5,6 +5,7 @@ #include "common/time.h" #include "util/FFvaluestore.h" #include "util/stringUtils.h" +#include "logo/logo.h" #include #include @@ -965,132 +966,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Logo options// //////////////// - else if(strcasecmp(key, "-l") == 0 || strcasecmp(key, "--logo") == 0) - { - optionParseString(key, value, &instance->config.logo.source); - - //this is usally wanted when using the none logo - if(strcasecmp(value, "none") == 0) - { - instance->config.logo.paddingTop = 0; - instance->config.logo.paddingRight = 0; - instance->config.logo.paddingLeft = 0; - instance->config.logo.type = FF_LOGO_TYPE_NONE; - } - } - else if(startsWith(key, "--logo")) - { - const char* subkey = key + strlen("--logo"); - if(strcasecmp(subkey, "-type") == 0) - { - optionParseEnum(key, value, &instance->config.logo.type, - "auto", FF_LOGO_TYPE_AUTO, - "builtin", FF_LOGO_TYPE_BUILTIN, - "file", FF_LOGO_TYPE_FILE, - "file-raw", FF_LOGO_TYPE_FILE_RAW, - "data", FF_LOGO_TYPE_DATA, - "data-raw", FF_LOGO_TYPE_DATA_RAW, - "sixel", FF_LOGO_TYPE_IMAGE_SIXEL, - "kitty", FF_LOGO_TYPE_IMAGE_KITTY, - "iterm", FF_LOGO_TYPE_IMAGE_ITERM, - "chafa", FF_LOGO_TYPE_IMAGE_CHAFA, - "raw", FF_LOGO_TYPE_IMAGE_RAW, - "none", FF_LOGO_TYPE_NONE, - NULL - ); - } - else if(startsWith(subkey, "-color-") && key[13] != '\0' && key[14] == '\0') // matches "--logo-color-*" - { - //Map the number to an array index, so that '1' -> 0, '2' -> 1, etc. - int index = (int)key[13] - 49; - - //Match only --logo-color-[1-9] - if(index < 0 || index >= FASTFETCH_LOGO_MAX_COLORS) - { - fprintf(stderr, "Error: invalid --color-[1-9] index: %c\n", key[13]); - exit(472); - } - - optionParseColor(key, value, &instance->config.logo.colors[index]); - } - else if(strcasecmp(subkey, "-width") == 0) - instance->config.logo.width = optionParseUInt32(key, value); - else if(strcasecmp(subkey, "-height") == 0) - instance->config.logo.height = optionParseUInt32(key, value); - else if(strcasecmp(subkey, "-padding") == 0) - { - uint32_t padding = optionParseUInt32(key, value); - instance->config.logo.paddingLeft = padding; - instance->config.logo.paddingRight = padding; - } - else if(strcasecmp(subkey, "-padding-top") == 0) - instance->config.logo.paddingTop = optionParseUInt32(key, value); - else if(strcasecmp(subkey, "-padding-left") == 0) - instance->config.logo.paddingLeft = optionParseUInt32(key, value); - else if(strcasecmp(subkey, "-padding-right") == 0) - instance->config.logo.paddingRight = optionParseUInt32(key, value); - else if(strcasecmp(subkey, "-print-remaining") == 0) - instance->config.logo.printRemaining = optionParseBoolean(value); - else if(strcasecmp(subkey, "-preserve-aspect-radio") == 0) - instance->config.logo.preserveAspectRadio = optionParseBoolean(value); - else - goto error; - } - else if(strcasecmp(key, "--file") == 0) - { - optionParseString(key, value, &instance->config.logo.source); - instance->config.logo.type = FF_LOGO_TYPE_FILE; - } - else if(strcasecmp(key, "--file-raw") == 0) - { - optionParseString(key, value, &instance->config.logo.source); - instance->config.logo.type = FF_LOGO_TYPE_FILE_RAW; - } - else if(strcasecmp(key, "--data") == 0) - { - optionParseString(key, value, &instance->config.logo.source); - instance->config.logo.type = FF_LOGO_TYPE_DATA; - } - else if(strcasecmp(key, "--data-raw") == 0) - { - optionParseString(key, value, &instance->config.logo.source); - instance->config.logo.type = FF_LOGO_TYPE_DATA_RAW; - } - else if(strcasecmp(key, "--sixel") == 0) - { - optionParseString(key, value, &instance->config.logo.source); - instance->config.logo.type = FF_LOGO_TYPE_IMAGE_SIXEL; - } - else if(strcasecmp(key, "--kitty") == 0) - { - optionParseString(key, value, &instance->config.logo.source); - instance->config.logo.type = FF_LOGO_TYPE_IMAGE_KITTY; - } - else if(strcasecmp(key, "--chafa") == 0) - { - optionParseString(key, value, &instance->config.logo.source); - instance->config.logo.type = FF_LOGO_TYPE_IMAGE_CHAFA; - } - else if(strcasecmp(key, "--iterm") == 0) - { - optionParseString(key, value, &instance->config.logo.source); - instance->config.logo.type = FF_LOGO_TYPE_IMAGE_ITERM; - } - else if(strcasecmp(key, "--raw") == 0) - { - optionParseString(key, value, &instance->config.logo.source); - instance->config.logo.type = FF_LOGO_TYPE_IMAGE_RAW; - } - else if(strcasecmp(key, "--chafa-fg-only") == 0) - instance->config.logo.chafaFgOnly = optionParseBoolean(value); - else if(strcasecmp(key, "--chafa-symbols") == 0) - optionParseString(key, value, &instance->config.logo.chafaSymbols); - else if(strcasecmp(key, "--chafa-canvas-mode") == 0) - instance->config.logo.chafaCanvasMode = optionParseUInt32(key, value); - else if(strcasecmp(key, "--chafa-color-space") == 0) - instance->config.logo.chafaColorSpace = optionParseUInt32(key, value); - else if(strcasecmp(key, "--chafa-dither-mode") == 0) - instance->config.logo.chafaDitherMode = optionParseUInt32(key, value); + else if(ffParseLogoCommandOptions(&instance->config.logo, key, value)) {} /////////////////// //Display options// diff --git a/src/fastfetch.h b/src/fastfetch.h index 79dd8a0f3..3453f3bd5 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -16,25 +16,8 @@ static inline void ffUnused(int dummy, ...) { (void) dummy; } #define FF_UNUSED(...) ffUnused(0, __VA_ARGS__); #define FF_MAYBE_UNUSED __attribute__ ((__unused__)) -#define FASTFETCH_LOGO_MAX_COLORS 9 //two digits would make parsing much more complicated (index 1 - 9) - #include "modules/options.h" - -typedef enum FFLogoType -{ - FF_LOGO_TYPE_AUTO, //if something is given, first try builtin, then file. Otherwise detect logo - FF_LOGO_TYPE_BUILTIN, //builtin ascii art - FF_LOGO_TYPE_FILE, //text file, printed with color code replacement - FF_LOGO_TYPE_FILE_RAW, //text file, printed as is - FF_LOGO_TYPE_DATA, //text data, printed with color code replacement - FF_LOGO_TYPE_DATA_RAW, //text data, printed as is - FF_LOGO_TYPE_IMAGE_SIXEL, //image file, printed as sixel codes. - FF_LOGO_TYPE_IMAGE_KITTY, //image file, printed as kitty graphics protocol - FF_LOGO_TYPE_IMAGE_ITERM, //image file, printed as iterm graphics protocol - FF_LOGO_TYPE_IMAGE_CHAFA, //image file, printed as ascii art using libchafa - FF_LOGO_TYPE_IMAGE_RAW, //image file, printed as raw binary string - FF_LOGO_TYPE_NONE, //--logo none -} FFLogoType; +#include "logo/option.h" typedef enum FFSoundType { @@ -88,25 +71,7 @@ typedef enum FFLocalIpType typedef struct FFconfig { - struct - { - FFstrbuf source; - FFLogoType type; - FFstrbuf colors[FASTFETCH_LOGO_MAX_COLORS]; - uint32_t width; - uint32_t height; - uint32_t paddingTop; - uint32_t paddingLeft; - uint32_t paddingRight; - bool printRemaining; - bool preserveAspectRadio; - - bool chafaFgOnly; - FFstrbuf chafaSymbols; - uint32_t chafaCanvasMode; - uint32_t chafaColorSpace; - uint32_t chafaDitherMode; - } logo; + FFLogoOptions logo; //If one of those is empty, ffLogoPrint will set them FFstrbuf colorKeys; @@ -230,6 +195,8 @@ typedef struct FFconfig FFstrbuf playerName; uint32_t percentType; + + bool jsonConfig; } FFconfig; typedef struct FFstate diff --git a/src/logo/logo.c b/src/logo/logo.c index 43d39bc97..4b7fa2124 100644 --- a/src/logo/logo.c +++ b/src/logo/logo.c @@ -1,4 +1,4 @@ -#include "logo.h" +#include "logo/logo.h" #include "common/io/io.h" #include "common/printing.h" #include "detection/os/os.h" @@ -10,35 +10,38 @@ static void ffLogoPrintCharsRaw(FFinstance* instance, const char* data, size_t length) { + FFLogoOptions* options = &instance->config.logo; fputs(FASTFETCH_TEXT_MODIFIER_BOLT, stdout); - ffPrintCharTimes('\n', instance->config.logo.paddingTop); - ffPrintCharTimes(' ', instance->config.logo.paddingLeft); + ffPrintCharTimes('\n', options->paddingTop); + ffPrintCharTimes(' ', options->paddingLeft); fwrite(data, length, 1, stdout); - instance->state.logoHeight = instance->config.logo.paddingTop + instance->config.logo.height; - instance->state.logoWidth = instance->config.logo.paddingLeft + instance->config.logo.width + instance->config.logo.paddingRight; + instance->state.logoHeight = options->paddingTop + options->height; + instance->state.logoWidth = options->paddingLeft + options->width + options->paddingRight; printf("\033[9999999D\n\033[%uA", instance->state.logoHeight); } void ffLogoPrintChars(FFinstance* instance, const char* data, bool doColorReplacement) { + FFLogoOptions* options = &instance->config.logo; + uint32_t currentlineLength = 0; fputs(FASTFETCH_TEXT_MODIFIER_BOLT, stdout); - ffPrintCharTimes('\n', instance->config.logo.paddingTop); - ffPrintCharTimes(' ', instance->config.logo.paddingLeft); + ffPrintCharTimes('\n', options->paddingTop); + ffPrintCharTimes(' ', options->paddingLeft); - instance->state.logoHeight = instance->config.logo.paddingTop; + instance->state.logoHeight = options->paddingTop; //Use logoColor[0] as the default color if(doColorReplacement) - ffPrintColor(&instance->config.logo.colors[0]); + ffPrintColor(&options->colors[0]); while(*data != '\0') { //We are at the end of a line. Print paddings and update max line length if(*data == '\n' || (*data == '\r' && *(data + 1) == '\n')) { - ffPrintCharTimes(' ', instance->config.logo.paddingRight); + ffPrintCharTimes(' ', options->paddingRight); //We have \r\n, skip the \r if(*data == '\r') @@ -47,7 +50,7 @@ void ffLogoPrintChars(FFinstance* instance, const char* data, bool doColorReplac putchar('\n'); ++data; - ffPrintCharTimes(' ', instance->config.logo.paddingLeft); + ffPrintCharTimes(' ', options->paddingLeft); if(currentlineLength > instance->state.logoWidth) instance->state.logoWidth = currentlineLength; @@ -115,7 +118,7 @@ void ffLogoPrintChars(FFinstance* instance, const char* data, bool doColorReplac } else { - ffPrintColor(&instance->config.logo.colors[index]); + ffPrintColor(&options->colors[index]); ++data; continue; } @@ -148,14 +151,14 @@ void ffLogoPrintChars(FFinstance* instance, const char* data, bool doColorReplac } } - ffPrintCharTimes(' ', instance->config.logo.paddingRight); + ffPrintCharTimes(' ', options->paddingRight); fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout); //Happens if the last line is the longest if(currentlineLength > instance->state.logoWidth) instance->state.logoWidth = currentlineLength; - instance->state.logoWidth += instance->config.logo.paddingLeft + instance->config.logo.paddingRight; + instance->state.logoWidth += options->paddingLeft + options->paddingRight; //Go to the leftmost position fputs("\033[9999999D", stdout); @@ -241,11 +244,13 @@ static void logoPrintStruct(FFinstance* instance, const FFlogo* logo) { logoApplyColors(instance, logo); + FFLogoOptions* options = &instance->config.logo; + const char** colors = logo->builtinColors; for(int i = 0; *colors != NULL && i < FASTFETCH_LOGO_MAX_COLORS; i++, colors++) { - if(instance->config.logo.colors[i].length == 0) - ffStrbufAppendS(&instance->config.logo.colors[i], *colors); + if(options->colors[i].length == 0) + ffStrbufAppendS(&options->colors[i], *colors); } ffLogoPrintChars(instance, logo->data, true); @@ -281,17 +286,20 @@ static inline void logoPrintDetected(FFinstance* instance) } static bool logoPrintData(FFinstance* instance, bool doColorReplacement) { - if(instance->config.logo.source.length == 0) + FFLogoOptions* options = &instance->config.logo; + if(options->source.length == 0) return false; - ffLogoPrintChars(instance, instance->config.logo.source.chars, doColorReplacement); + ffLogoPrintChars(instance, options->source.chars, doColorReplacement); logoApplyColorsDetected(instance); return true; } static void updateLogoPath(FFinstance* instance) { - if(ffPathExists(instance->config.logo.source.chars, FF_PATHTYPE_FILE)) + FFLogoOptions* options = &instance->config.logo; + + if(ffPathExists(options->source.chars, FF_PATHTYPE_FILE)) return; FFstrbuf fullPath; @@ -302,11 +310,11 @@ static void updateLogoPath(FFinstance* instance) //We need to copy it, because multiple threads might be using dataDirs at the same time ffStrbufSet(&fullPath, dataDir); ffStrbufAppendS(&fullPath, "fastfetch/logos/"); - ffStrbufAppend(&fullPath, &instance->config.logo.source); + ffStrbufAppend(&fullPath, &options->source); if(ffPathExists(fullPath.chars, FF_PATHTYPE_FILE)) { - ffStrbufSet(&instance->config.logo.source, &fullPath); + ffStrbufSet(&options->source, &fullPath); break; } } @@ -316,10 +324,12 @@ static void updateLogoPath(FFinstance* instance) static bool logoPrintFileIfExists(FFinstance* instance, bool doColorReplacement, bool raw) { - FFstrbuf content; + FFLogoOptions* options = &instance->config.logo; + + FF_STRBUF_AUTO_DESTROY content; ffStrbufInit(&content); - if(!ffAppendFileBuffer(instance->config.logo.source.chars, &content)) + if(!ffAppendFileBuffer(options->source.chars, &content)) { ffStrbufDestroy(&content); fputs("Logo: Failed to load file content from logo source\n", stderr); @@ -331,7 +341,6 @@ static bool logoPrintFileIfExists(FFinstance* instance, bool doColorReplacement, ffLogoPrintCharsRaw(instance, content.chars, content.length); else ffLogoPrintChars(instance, content.chars, doColorReplacement); - ffStrbufDestroy(&content); return true; } @@ -346,32 +355,34 @@ static bool logoPrintImageIfExists(FFinstance* instance, FFLogoType logo, bool p static bool logoTryKnownType(FFinstance* instance) { - if(instance->config.logo.type == FF_LOGO_TYPE_NONE) + FFLogoOptions* options = &instance->config.logo; + + if(options->type == FF_LOGO_TYPE_NONE) { logoApplyColorsDetected(instance); return true; } - if(instance->config.logo.type == FF_LOGO_TYPE_BUILTIN) - return logoPrintBuiltinIfExists(instance, instance->config.logo.source.chars); + if(options->type == FF_LOGO_TYPE_BUILTIN) + return logoPrintBuiltinIfExists(instance, options->source.chars); - if(instance->config.logo.type == FF_LOGO_TYPE_DATA) + if(options->type == FF_LOGO_TYPE_DATA) return logoPrintData(instance, true); - if(instance->config.logo.type == FF_LOGO_TYPE_DATA_RAW) + if(options->type == FF_LOGO_TYPE_DATA_RAW) return logoPrintData(instance, false); updateLogoPath(instance); //We sure have a file, resolve relative paths - if(instance->config.logo.type == FF_LOGO_TYPE_FILE) + if(options->type == FF_LOGO_TYPE_FILE) return logoPrintFileIfExists(instance, true, false); - if(instance->config.logo.type == FF_LOGO_TYPE_FILE_RAW) + if(options->type == FF_LOGO_TYPE_FILE_RAW) return logoPrintFileIfExists(instance, false, false); - if(instance->config.logo.type == FF_LOGO_TYPE_IMAGE_RAW) + if(options->type == FF_LOGO_TYPE_IMAGE_RAW) { - if(instance->config.logo.width == 0 || instance->config.logo.height == 0) + if(options->width == 0 || options->height == 0) { fputs("both `--logo-width` and `--logo-height` must be specified\n", stderr); return false; @@ -380,7 +391,7 @@ static bool logoTryKnownType(FFinstance* instance) return logoPrintFileIfExists(instance, false, true); } - return logoPrintImageIfExists(instance, instance->config.logo.type, true); + return logoPrintImageIfExists(instance, options->type, true); } static void logoPrintKnownType(FFinstance* instance) @@ -401,22 +412,24 @@ void ffLogoPrint(FFinstance* instance) return; } + const FFLogoOptions* options = &instance->config.logo; + //If the source is not set, we can directly print the detected logo. - if(instance->config.logo.source.length == 0) + if(options->source.length == 0) { logoPrintDetected(instance); return; } //If the source and source type is set to something else than auto, always print with the set type. - if(instance->config.logo.source.length > 0 && instance->config.logo.type != FF_LOGO_TYPE_AUTO) + if(options->source.length > 0 && options->type != FF_LOGO_TYPE_AUTO) { logoPrintKnownType(instance); return; } //If source matches the name of a builtin logo, print it and return. - if(logoPrintBuiltinIfExists(instance, instance->config.logo.source.chars)) + if(logoPrintBuiltinIfExists(instance, options->source.chars)) return; //Make sure the logo path is set correctly. @@ -462,6 +475,7 @@ void ffLogoPrintRemaining(FFinstance* instance) void ffLogoBuiltinPrint(FFinstance* instance) { GetLogoMethod* methods = ffLogoBuiltinGetAll(); + FFLogoOptions* options = &instance->config.logo; while(*methods != NULL) { @@ -474,7 +488,7 @@ void ffLogoBuiltinPrint(FFinstance* instance) instance->state.logoHeight = 0; instance->state.keysHeight = 0; for(uint8_t i = 0; i < FASTFETCH_LOGO_MAX_COLORS; i++) - ffStrbufClear(&instance->config.logo.colors[i]); + ffStrbufClear(&options->colors[i]); puts("\n"); ++methods; diff --git a/src/logo/logo.h b/src/logo/logo.h index 0664f6f98..9d3878c66 100644 --- a/src/logo/logo.h +++ b/src/logo/logo.h @@ -26,4 +26,9 @@ GetLogoMethod* ffLogoBuiltinGetAll(); //image/image.c bool ffLogoPrintImageIfExists(FFinstance* instance, FFLogoType type, bool printError); +//option.c +void ffInitLogoOptions(FFLogoOptions* options); +bool ffParseLogoCommandOptions(FFLogoOptions* options, const char* key, const char* value); +void ffDestroyLogoOptions(FFLogoOptions* options); + #endif diff --git a/src/logo/option.c b/src/logo/option.c new file mode 100644 index 000000000..033885635 --- /dev/null +++ b/src/logo/option.c @@ -0,0 +1,183 @@ +#include "logo/logo.h" + +void ffInitLogoOptions(FFLogoOptions* options) +{ + ffStrbufInit(&options->source); + options->type = FF_LOGO_TYPE_AUTO; + for(uint8_t i = 0; i < (uint8_t) FASTFETCH_LOGO_MAX_COLORS; ++i) + ffStrbufInit(&options->colors[i]); + options->width = 0; + options->height = 0; //preserve aspect ratio + options->paddingTop = 0; + options->paddingLeft = 0; + options->paddingRight = 4; + options->printRemaining = true; + options->preserveAspectRadio = false; + + options->chafaFgOnly = false; + ffStrbufInitS(&options->chafaSymbols, "block+border+space-wide-inverted"); // Chafa default + options->chafaCanvasMode = UINT32_MAX; + options->chafaColorSpace = UINT32_MAX; + options->chafaDitherMode = UINT32_MAX; +} + +bool ffParseLogoCommandOptions(FFLogoOptions* options, const char* key, const char* value) +{ + if (strcasecmp(key, "-l") == 0) + goto logoType; + + const char* subKey = ffOptionTestPrefix(key, "logo"); + if(subKey) + { + if (subKey[0] == '\0') + { +logoType: + ffOptionParseString(key, value, &options->source); + + //this is usally wanted when using the none logo + if(strcasecmp(value, "none") == 0) + { + options->paddingTop = 0; + options->paddingRight = 0; + options->paddingLeft = 0; + options->type = FF_LOGO_TYPE_NONE; + } + } + else if(strcasecmp(subKey, "type") == 0) + { + options->type = (FFLogoType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { + { "auto", FF_LOGO_TYPE_AUTO }, + { "builtin", FF_LOGO_TYPE_BUILTIN }, + { "file", FF_LOGO_TYPE_FILE }, + { "file-raw", FF_LOGO_TYPE_FILE_RAW }, + { "data", FF_LOGO_TYPE_DATA }, + { "data-raw", FF_LOGO_TYPE_DATA_RAW }, + { "sixel", FF_LOGO_TYPE_IMAGE_SIXEL }, + { "kitty", FF_LOGO_TYPE_IMAGE_KITTY }, + { "iterm", FF_LOGO_TYPE_IMAGE_ITERM }, + { "chafa", FF_LOGO_TYPE_IMAGE_CHAFA }, + { "raw", FF_LOGO_TYPE_IMAGE_RAW }, + { "none", FF_LOGO_TYPE_NONE }, + {}, + }); + } + else if(strncasecmp(subKey, "color-", strlen("color-")) && key[13] != '\0' && key[14] == '\0') // matches "--logo-color-*" + { + //Map the number to an array index, so that '1' -> 0, '2' -> 1, etc. + int index = (int)key[13] - 49; + + //Match only --logo-color-[1-9] + if(index < 0 || index >= FASTFETCH_LOGO_MAX_COLORS) + { + fprintf(stderr, "Error: invalid --color-[1-9] index: %c\n", key[13]); + exit(472); + } + + ffOptionParseColor(key, value, &options->colors[index]); + } + else if(strcasecmp(subKey, "width") == 0) + options->width = ffOptionParseUInt32(key, value); + else if(strcasecmp(subKey, "height") == 0) + options->height = ffOptionParseUInt32(key, value); + else if(strcasecmp(subKey, "padding") == 0) + { + uint32_t padding = ffOptionParseUInt32(key, value); + options->paddingLeft = padding; + options->paddingRight = padding; + } + else if(strcasecmp(subKey, "padding-top") == 0) + options->paddingTop = ffOptionParseUInt32(key, value); + else if(strcasecmp(subKey, "padding-left") == 0) + options->paddingLeft = ffOptionParseUInt32(key, value); + else if(strcasecmp(subKey, "padding-right") == 0) + options->paddingRight = ffOptionParseUInt32(key, value); + else if(strcasecmp(subKey, "print-remaining") == 0) + options->printRemaining = ffOptionParseBoolean(value); + else if(strcasecmp(subKey, "preserve-aspect-radio") == 0) + options->preserveAspectRadio = ffOptionParseBoolean(value); + else + return false; + } + else if((subKey = ffOptionTestPrefix(key, "file"))) + { + if(subKey[0] == '\0') + { + ffOptionParseString(key, value, &options->source); + options->type = FF_LOGO_TYPE_FILE; + } + else if(strcasecmp(key, "raw") == 0) + { + ffOptionParseString(key, value, &options->source); + options->type = FF_LOGO_TYPE_FILE_RAW; + } + else + return false; + } + else if((subKey = ffOptionTestPrefix(key, "data"))) + { + if(subKey[0] == '\0') + { + ffOptionParseString(key, value, &options->source); + options->type = FF_LOGO_TYPE_DATA; + } + else if(strcasecmp(subKey, "raw") == 0) + { + ffOptionParseString(key, value, &options->source); + options->type = FF_LOGO_TYPE_DATA_RAW; + } + else + return false; + } + else if(strcasecmp(key, "--sixel") == 0) + { + ffOptionParseString(key, value, &options->source); + options->type = FF_LOGO_TYPE_IMAGE_SIXEL; + } + else if(strcasecmp(key, "--kitty") == 0) + { + ffOptionParseString(key, value, &options->source); + options->type = FF_LOGO_TYPE_IMAGE_KITTY; + } + else if(strcasecmp(key, "--iterm") == 0) + { + ffOptionParseString(key, value, &options->source); + options->type = FF_LOGO_TYPE_IMAGE_ITERM; + } + else if(strcasecmp(key, "--raw") == 0) + { + ffOptionParseString(key, value, &options->source); + options->type = FF_LOGO_TYPE_IMAGE_RAW; + } + else if((subKey = ffOptionTestPrefix(key, "chafa"))) + { + if(subKey[0] == '\0') + { + ffOptionParseString(key, value, &options->source); + options->type = FF_LOGO_TYPE_IMAGE_CHAFA; + } + else if(strcasecmp(subKey, "fg-only") == 0) + options->chafaFgOnly = ffOptionParseBoolean(value); + else if(strcasecmp(subKey, "symbols") == 0) + ffOptionParseString(key, value, &options->chafaSymbols); + else if(strcasecmp(subKey, "canvas-mode") == 0) + options->chafaCanvasMode = ffOptionParseUInt32(key, value); + else if(strcasecmp(subKey, "color-space") == 0) + options->chafaColorSpace = ffOptionParseUInt32(key, value); + else if(strcasecmp(subKey, "dither-mode") == 0) + options->chafaDitherMode = ffOptionParseUInt32(key, value); + else + return false; + } + else + return false; + + return true; +} + +void ffDestroyLogoOptions(FFLogoOptions* options) +{ + ffStrbufDestroy(&options->source); + ffStrbufDestroy(&options->chafaSymbols); + for(uint8_t i = 0; i < (uint8_t) FASTFETCH_LOGO_MAX_COLORS; ++i) + ffStrbufDestroy(&options->colors[i]); +} diff --git a/src/logo/option.h b/src/logo/option.h new file mode 100644 index 000000000..09f7822d1 --- /dev/null +++ b/src/logo/option.h @@ -0,0 +1,41 @@ +#pragma once + +#include "util/FFstrbuf.h" + +#define FASTFETCH_LOGO_MAX_COLORS 9 //two digits would make parsing much more complicated (index 1 - 9) + +typedef enum FFLogoType +{ + FF_LOGO_TYPE_AUTO, //if something is given, first try builtin, then file. Otherwise detect logo + FF_LOGO_TYPE_BUILTIN, //builtin ascii art + FF_LOGO_TYPE_FILE, //text file, printed with color code replacement + FF_LOGO_TYPE_FILE_RAW, //text file, printed as is + FF_LOGO_TYPE_DATA, //text data, printed with color code replacement + FF_LOGO_TYPE_DATA_RAW, //text data, printed as is + FF_LOGO_TYPE_IMAGE_SIXEL, //image file, printed as sixel codes. + FF_LOGO_TYPE_IMAGE_KITTY, //image file, printed as kitty graphics protocol + FF_LOGO_TYPE_IMAGE_ITERM, //image file, printed as iterm graphics protocol + FF_LOGO_TYPE_IMAGE_CHAFA, //image file, printed as ascii art using libchafa + FF_LOGO_TYPE_IMAGE_RAW, //image file, printed as raw binary string + FF_LOGO_TYPE_NONE, //--logo none +} FFLogoType; + +typedef struct FFLogoOptions +{ + FFstrbuf source; + FFLogoType type; + FFstrbuf colors[FASTFETCH_LOGO_MAX_COLORS]; + uint32_t width; + uint32_t height; + uint32_t paddingTop; + uint32_t paddingLeft; + uint32_t paddingRight; + bool printRemaining; + bool preserveAspectRadio; + + bool chafaFgOnly; + FFstrbuf chafaSymbols; + uint32_t chafaCanvasMode; + uint32_t chafaColorSpace; + uint32_t chafaDitherMode; +} FFLogoOptions; From fb2004a6f9222d6bb6e8338e6e3e62bf1371efd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 13 Mar 2023 17:36:48 +0800 Subject: [PATCH 20/71] Bluetooth: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 6 +- src/fastfetch.c | 6 +- src/fastfetch.h | 5 +- src/modules/bluetooth.c | 64 -------------- src/modules/bluetooth/bluetooth.c | 126 ++++++++++++++++++++++++++++ src/modules/bluetooth/bluetooth.h | 13 +++ src/modules/bluetooth/option.h | 13 +++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 11 files changed, 161 insertions(+), 77 deletions(-) delete mode 100644 src/modules/bluetooth.c create mode 100644 src/modules/bluetooth/bluetooth.c create mode 100644 src/modules/bluetooth/bluetooth.h create mode 100644 src/modules/bluetooth/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b3b487584..e58949ddc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -263,7 +263,7 @@ set(LIBFASTFETCH_SRC src/logo/option.c src/modules/battery/battery.c src/modules/bios/bios.c - src/modules/bluetooth.c + src/modules/bluetooth/bluetooth.c src/modules/board.c src/modules/brightness.c src/modules/break.c diff --git a/src/common/init.c b/src/common/init.c index 8d2e7a48f..62a877fba 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -101,7 +101,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.openGL); initModuleArg(&instance->config.openCL); initModuleArg(&instance->config.users); - initModuleArg(&instance->config.bluetooth); + ffInitBluetoothOptions(&instance->config.bluetooth); initModuleArg(&instance->config.sound); ffInitSeparatorOptions(&instance->config.separator); initModuleArg(&instance->config.gamepad); @@ -145,8 +145,6 @@ static void defaultConfig(FFinstance* instance) ffStrbufInitA(&instance->config.diskFolders, 0); instance->config.diskShowTypes = FF_DISK_TYPE_REGULAR_BIT | FF_DISK_TYPE_EXTERNAL_BIT; - instance->config.bluetoothShowDisconnected = false; - instance->config.soundType = FF_SOUND_TYPE_MAIN; instance->config.localIpShowType = FF_LOCALIP_TYPE_IPV4_BIT; @@ -338,7 +336,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.openGL); destroyModuleArg(&instance->config.openCL); destroyModuleArg(&instance->config.users); - destroyModuleArg(&instance->config.bluetooth); + ffDestroyBluetoothOptions(&instance->config.bluetooth); ffDestroySeparatorOptions(&instance->config.separator); destroyModuleArg(&instance->config.sound); destroyModuleArg(&instance->config.gamepad); diff --git a/src/fastfetch.c b/src/fastfetch.c index eb9ab31c9..89c54fbbb 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1052,7 +1052,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "opengl", &instance->config.openGL)) {} else if(optionParseModuleArgs(key, value, "opencl", &instance->config.openCL)) {} else if(optionParseModuleArgs(key, value, "users", &instance->config.users)) {} - else if(optionParseModuleArgs(key, value, "bluetooth", &instance->config.bluetooth)) {} + else if(ffParseBluetoothCommandOptions(&instance->config.bluetooth, key, value)) {} else if(ffParseSeparatorCommandOptions(&instance->config.separator, key, value)) {} else if(optionParseModuleArgs(key, value, "sound", &instance->config.sound)) {} else if(optionParseModuleArgs(key, value, "gamepad", &instance->config.gamepad)) {} @@ -1148,8 +1148,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_SUBVOLUME_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_SUBVOLUME_BIT); else if(strcasecmp(key, "--disk-show-unknown") == 0) optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_UNKNOWN_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_UNKNOWN_BIT); - else if(strcasecmp(key, "--bluetooth-show-disconnected") == 0) - instance->config.bluetoothShowDisconnected = optionParseBoolean(value); else if(strcasecmp(key, "--sound-type") == 0) { optionParseEnum(key, value, &instance->config.soundType, @@ -1347,7 +1345,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "command") == 0) ffPrintCommand(instance, &instance->config.command); else if(strcasecmp(line, "bluetooth") == 0) - ffPrintBluetooth(instance); + ffPrintBluetooth(instance, &instance->config.bluetooth); else if(strcasecmp(line, "sound") == 0) ffPrintSound(instance); else if(strcasecmp(line, "gamepad") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 3453f3bd5..8001cdf5d 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -135,7 +135,7 @@ typedef struct FFconfig FFModuleArgs openGL; FFModuleArgs openCL; FFModuleArgs users; - FFModuleArgs bluetooth; + FFBluetoothOptions bluetooth; FFSeparatorOptions separator; FFModuleArgs sound; FFModuleArgs gamepad; @@ -179,8 +179,6 @@ typedef struct FFconfig FFstrbuf diskFolders; FFDiskType diskShowTypes; - bool bluetoothShowDisconnected; - FFstrbuf localIpNamePrefix; FFLocalIpType localIpShowType; @@ -292,7 +290,6 @@ void ffPrintVulkan(FFinstance* instance); void ffPrintOpenGL(FFinstance* instance); void ffPrintOpenCL(FFinstance* instance); void ffPrintUsers(FFinstance* instance); -void ffPrintBluetooth(FFinstance* instance); void ffPrintSound(FFinstance* instance); void ffPrintGamepad(FFinstance* instance); diff --git a/src/modules/bluetooth.c b/src/modules/bluetooth.c deleted file mode 100644 index 6038acf01..000000000 --- a/src/modules/bluetooth.c +++ /dev/null @@ -1,64 +0,0 @@ -#include "common/printing.h" -#include "detection/bluetooth/bluetooth.h" - -#define FF_BLUETOOTH_MODULE_NAME "Bluetooth" -#define FF_BLUETOOTH_NUM_FORMAT_ARGS 4 - -static void printDevice(FFinstance* instance, const FFBluetoothDevice* device, uint8_t index) -{ - if(instance->config.bluetooth.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_BLUETOOTH_MODULE_NAME, index, &instance->config.bluetooth.key); - ffStrbufWriteTo(&device->name, stdout); - - if(device->battery > 0) - printf(" (%d%%)", device->battery); - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_BLUETOOTH_MODULE_NAME, index, &instance->config.bluetooth, FF_BLUETOOTH_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &device->name}, - {FF_FORMAT_ARG_TYPE_STRBUF, &device->address}, - {FF_FORMAT_ARG_TYPE_STRBUF, &device->type}, - {FF_FORMAT_ARG_TYPE_UINT8, &device->battery} - }); - } -} - -void ffPrintBluetooth(FFinstance* instance) -{ - const FFBluetoothResult* bluetooth = ffDetectBluetooth(instance); - - if(bluetooth->error.length > 0) - { - ffPrintError(instance, FF_BLUETOOTH_MODULE_NAME, 0, &instance->config.bluetooth, "%s", bluetooth->error.chars); - return; - } - - FFlist filtered; - ffListInit(&filtered, sizeof(FFBluetoothDevice*)); - - FF_LIST_FOR_EACH(FFBluetoothDevice, device, bluetooth->devices) - { - if(!device->connected && !instance->config.bluetoothShowDisconnected) - continue; - - *(FFBluetoothDevice**)ffListAdd(&filtered) = device; - } - - if(filtered.length == 0) - { - ffPrintError(instance, FF_BLUETOOTH_MODULE_NAME, 0, &instance->config.bluetooth, "No bluetooth devices found"); - return; - } - - for(uint32_t i = 0; i < filtered.length; i++) - { - uint8_t index = (uint8_t) (filtered.length == 1 ? 0 : i + 1); - printDevice(instance, *(FFBluetoothDevice**)ffListGet(&filtered, i), index); - } - - ffListDestroy(&filtered); -} diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c new file mode 100644 index 000000000..90d5c2f4d --- /dev/null +++ b/src/modules/bluetooth/bluetooth.c @@ -0,0 +1,126 @@ +#include "common/printing.h" +#include "detection/bluetooth/bluetooth.h" +#include "modules/bluetooth/bluetooth.h" + +#define FF_BLUETOOTH_MODULE_NAME "Bluetooth" +#define FF_BLUETOOTH_NUM_FORMAT_ARGS 4 + +static void printDevice(FFinstance* instance, FFBluetoothOptions* options, const FFBluetoothDevice* device, uint8_t index) +{ + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_BLUETOOTH_MODULE_NAME, index, &options->moduleArgs.key); + ffStrbufWriteTo(&device->name, stdout); + + if(device->battery > 0) + printf(" (%d%%)", device->battery); + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_BLUETOOTH_MODULE_NAME, index, &options->moduleArgs, FF_BLUETOOTH_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &device->name}, + {FF_FORMAT_ARG_TYPE_STRBUF, &device->address}, + {FF_FORMAT_ARG_TYPE_STRBUF, &device->type}, + {FF_FORMAT_ARG_TYPE_UINT8, &device->battery} + }); + } +} + +void ffPrintBluetooth(FFinstance* instance, FFBluetoothOptions* options) +{ + const FFBluetoothResult* bluetooth = ffDetectBluetooth(instance); + + if(bluetooth->error.length > 0) + { + ffPrintError(instance, FF_BLUETOOTH_MODULE_NAME, 0, &options->moduleArgs, "%s", bluetooth->error.chars); + return; + } + + FFlist filtered; + ffListInit(&filtered, sizeof(FFBluetoothDevice*)); + + FF_LIST_FOR_EACH(FFBluetoothDevice, device, bluetooth->devices) + { + if(!device->connected && !options->showDisconnected) + continue; + + *(FFBluetoothDevice**)ffListAdd(&filtered) = device; + } + + if(filtered.length == 0) + { + ffPrintError(instance, FF_BLUETOOTH_MODULE_NAME, 0, &options->moduleArgs, "No bluetooth devices found"); + return; + } + + for(uint32_t i = 0; i < filtered.length; i++) + { + uint8_t index = (uint8_t) (filtered.length == 1 ? 0 : i + 1); + printDevice(instance, options, *(FFBluetoothDevice**)ffListGet(&filtered, i), index); + } + + ffListDestroy(&filtered); +} + +void ffInitBluetoothOptions(FFBluetoothOptions* options) +{ + options->moduleName = FF_BLUETOOTH_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + options->showDisconnected = false; +} + +bool ffParseBluetoothCommandOptions(FFBluetoothOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_BLUETOOTH_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "show-disconnected") == 0) + options->showDisconnected = ffOptionParseBoolean(value); + return false; +} + +void ffDestroyBluetoothOptions(FFBluetoothOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_BLUETOOTH_MODULE_NAME) != 0) + return false; + + FFBluetoothOptions __attribute__((__cleanup__(ffDestroyBluetoothOptions))) options; + ffInitBluetoothOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "showConnected") == 0) + { + options.showDisconnected = data->ffjson_object_get_boolean(val); + continue; + } + + ffPrintError(instance, FF_BLUETOOTH_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintBluetooth(instance, &options); + return true; +} +#endif diff --git a/src/modules/bluetooth/bluetooth.h b/src/modules/bluetooth/bluetooth.h new file mode 100644 index 000000000..500d39290 --- /dev/null +++ b/src/modules/bluetooth/bluetooth.h @@ -0,0 +1,13 @@ +#pragma once + +#include "fastfetch.h" + +void ffPrintBluetooth(FFinstance* instance, FFBluetoothOptions* options); +void ffInitBluetoothOptions(FFBluetoothOptions* options); +bool ffParseBluetoothCommandOptions(FFBluetoothOptions* options, const char* key, const char* value); +void ffDestroyBluetoothOptions(FFBluetoothOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif diff --git a/src/modules/bluetooth/option.h b/src/modules/bluetooth/option.h new file mode 100644 index 000000000..b347dc466 --- /dev/null +++ b/src/modules/bluetooth/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 FFBluetoothOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + bool showDisconnected; +} FFBluetoothOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index bd062ae7d..bcfd07f7c 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -15,6 +15,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, ffParseTitleJsonObject(instance, type, data, module) || ffParseBatteryJsonObject(instance, type, data, module) || ffParseBiosJsonObject(instance, type, data, module) || + ffParseBluetoothJsonObject(instance, type, data, module) || ffParseCommandJsonObject(instance, type, data, module) || ffParseDateTimeJsonObject(instance, type, data, module) || ffParseDisplayJsonObject(instance, type, data, module) || diff --git a/src/modules/modules.h b/src/modules/modules.h index be6bac672..19a6414c7 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -5,6 +5,7 @@ #include "modules/os/os.h" #include "modules/battery/battery.h" #include "modules/bios/bios.h" +#include "modules/bluetooth/bluetooth.h" #include "modules/command/command.h" #include "modules/datetime/datetime.h" #include "modules/display/display.h" diff --git a/src/modules/options.h b/src/modules/options.h index 1b7502204..9f992996a 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -4,6 +4,7 @@ #include "modules/battery/option.h" #include "modules/bios/option.h" +#include "modules/bluetooth/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" #include "modules/display/option.h" From 5f3154acc6bee085f6af0deb7b7d424f74146e52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 13 Mar 2023 18:54:57 +0800 Subject: [PATCH 21/71] Board: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 4 +- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/board.c | 44 ------------- src/modules/board/board.c | 97 +++++++++++++++++++++++++++++ src/modules/board/board.h | 13 ++++ src/modules/board/option.h | 11 ++++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 131 insertions(+), 52 deletions(-) delete mode 100644 src/modules/board.c create mode 100644 src/modules/board/board.c create mode 100644 src/modules/board/board.h create mode 100644 src/modules/board/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e58949ddc..d423e07f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -264,7 +264,7 @@ set(LIBFASTFETCH_SRC src/modules/battery/battery.c src/modules/bios/bios.c src/modules/bluetooth/bluetooth.c - src/modules/board.c + src/modules/board/board.c src/modules/brightness.c src/modules/break.c src/modules/chassis.c diff --git a/src/common/init.c b/src/common/init.c index 62a877fba..0bfbeb164 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -61,7 +61,7 @@ static void defaultConfig(FFinstance* instance) ffInitOSOptions(&instance->config.os); ffInitHostOptions(&instance->config.host); ffInitBiosOptions(&instance->config.bios); - initModuleArg(&instance->config.board); + ffInitBoardOptions(&instance->config.board); initModuleArg(&instance->config.brightness); initModuleArg(&instance->config.chassis); ffInitCommandOptions(&instance->config.command); @@ -297,7 +297,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyOSOptions(&instance->config.os); ffDestroyHostOptions(&instance->config.host); ffDestroyBiosOptions(&instance->config.bios); - destroyModuleArg(&instance->config.board); + ffDestroyBoardOptions(&instance->config.board); destroyModuleArg(&instance->config.chassis); ffDestroyCommandOptions(&instance->config.command); ffDestroyKernelOptions(&instance->config.kernel); diff --git a/src/fastfetch.c b/src/fastfetch.c index 89c54fbbb..650a30923 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1012,7 +1012,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseOSCommandOptions(&instance->config.os, key, value)) {} else if(ffParseHostCommandOptions(&instance->config.host, key, value)) {} else if(ffParseBiosCommandOptions(&instance->config.bios, key, value)) {} - else if(optionParseModuleArgs(key, value, "board", &instance->config.board)) {} + else if(ffParseBoardCommandOptions(&instance->config.board, key, value)) {} else if(optionParseModuleArgs(key, value, "chassis", &instance->config.chassis)) {} else if(ffParseCommandCommandOptions(&instance->config.command, key, value)) {} else if(ffParseKernelCommandOptions(&instance->config.kernel, key, value)) {} @@ -1263,7 +1263,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "bios") == 0) ffPrintBios(instance, &instance->config.bios); else if(strcasecmp(line, "board") == 0) - ffPrintBoard(instance); + ffPrintBoard(instance, &instance->config.board); else if(strcasecmp(line, "brightness") == 0) ffPrintBrightness(instance); else if(strcasecmp(line, "chassis") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 8001cdf5d..bd6e4ee72 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -95,7 +95,7 @@ typedef struct FFconfig FFOSOptions os; FFHostOptions host; FFBiosOptions bios; - FFModuleArgs board; + FFBoardOptions board; FFModuleArgs brightness; FFModuleArgs chassis; FFCommandOptions command; @@ -251,7 +251,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintCustom(FFinstance* instance, const char* key, const char* value); void ffPrintBreak(FFinstance* instance); -void ffPrintBoard(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintUptime(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 9c24a9ee8..ef097343e 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -25,7 +25,7 @@ int main(int argc, char** argv) ffPrintOS(&instance, &instance.config.os); ffPrintHost(&instance, &instance.config.host); //ffPrintBios(&instance, &instance.config.bios); - //ffPrintBoard(&instance); + //ffPrintBoard(&instance, &instance.config.board); //ffPrintChassis(&instance); ffPrintKernel(&instance, &instance.config.kernel); ffPrintUptime(&instance); diff --git a/src/modules/board.c b/src/modules/board.c deleted file mode 100644 index 558653892..000000000 --- a/src/modules/board.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/board/board.h" - -#define FF_BOARD_MODULE_NAME "Board" -#define FF_BOARD_NUM_FORMAT_ARGS 3 - -void ffPrintBoard(FFinstance* instance) -{ - FFBoardResult result; - ffDetectBoard(&result); - - if(result.error.length > 0) - { - ffPrintError(instance, FF_BOARD_MODULE_NAME, 0, &instance->config.board, "%*s", result.error.length, result.error.chars); - goto exit; - } - - if(result.boardName.length == 0) - { - ffPrintError(instance, FF_BOARD_MODULE_NAME, 0, &instance->config.board, "board_name is not set."); - goto exit; - } - - if(instance->config.board.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_BOARD_MODULE_NAME, 0, &instance->config.board.key); - puts(result.boardName.chars); - } - else - { - ffPrintFormat(instance, FF_BOARD_MODULE_NAME, 0, &instance->config.board, FF_BOARD_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &result.boardName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.boardVendor}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.boardVersion}, - }); - } - -exit: - ffStrbufDestroy(&result.boardName); - ffStrbufDestroy(&result.boardVendor); - ffStrbufDestroy(&result.boardVersion); - ffStrbufDestroy(&result.error); -} diff --git a/src/modules/board/board.c b/src/modules/board/board.c new file mode 100644 index 000000000..6f41aa76e --- /dev/null +++ b/src/modules/board/board.c @@ -0,0 +1,97 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/board/board.h" +#include "modules/board/board.h" + +#define FF_BOARD_MODULE_NAME "Board" +#define FF_BOARD_NUM_FORMAT_ARGS 3 + +void ffPrintBoard(FFinstance* instance, FFBoardOptions* options) +{ + FFBoardResult result; + ffDetectBoard(&result); + + if(result.error.length > 0) + { + ffPrintError(instance, FF_BOARD_MODULE_NAME, 0, &options->moduleArgs, "%*s", result.error.length, result.error.chars); + goto exit; + } + + if(result.boardName.length == 0) + { + ffPrintError(instance, FF_BOARD_MODULE_NAME, 0, &options->moduleArgs, "board_name is not set."); + goto exit; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_BOARD_MODULE_NAME, 0, &options->moduleArgs.key); + puts(result.boardName.chars); + } + else + { + ffPrintFormat(instance, FF_BOARD_MODULE_NAME, 0, &options->moduleArgs, FF_BOARD_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &result.boardName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.boardVendor}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.boardVersion}, + }); + } + +exit: + ffStrbufDestroy(&result.boardName); + ffStrbufDestroy(&result.boardVendor); + ffStrbufDestroy(&result.boardVersion); + ffStrbufDestroy(&result.error); +} + +void ffInitBoardOptions(FFBoardOptions* options) +{ + options->moduleName = FF_BOARD_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseBoardCommandOptions(FFBoardOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_BOARD_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyBoardOptions(FFBoardOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +bool ffParseBoardJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_BOARD_MODULE_NAME) != 0) + return false; + + FFBoardOptions __attribute__((__cleanup__(ffDestroyBoardOptions))) options; + ffInitBoardOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_BOARD_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintBoard(instance, &options); + return true; +} +#endif diff --git a/src/modules/board/board.h b/src/modules/board/board.h new file mode 100644 index 000000000..2027baf4b --- /dev/null +++ b/src/modules/board/board.h @@ -0,0 +1,13 @@ +#pragma once + +#include "fastfetch.h" + +void ffPrintBoard(FFinstance* instance, FFBoardOptions* options); +void ffInitBoardOptions(FFBoardOptions* options); +bool ffParseBoardCommandOptions(FFBoardOptions* options, const char* key, const char* value); +void ffDestroyBoardOptions(FFBoardOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseBoardJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif diff --git a/src/modules/board/option.h b/src/modules/board/option.h new file mode 100644 index 000000000..582854d23 --- /dev/null +++ b/src/modules/board/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 FFBoardOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFBoardOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index bcfd07f7c..221c1050a 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -16,6 +16,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, ffParseBatteryJsonObject(instance, type, data, module) || ffParseBiosJsonObject(instance, type, data, module) || ffParseBluetoothJsonObject(instance, type, data, module) || + ffParseBoardJsonObject(instance, type, data, module) || ffParseCommandJsonObject(instance, type, data, module) || ffParseDateTimeJsonObject(instance, type, data, module) || ffParseDisplayJsonObject(instance, type, data, module) || diff --git a/src/modules/modules.h b/src/modules/modules.h index 19a6414c7..846b18b08 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -6,6 +6,7 @@ #include "modules/battery/battery.h" #include "modules/bios/bios.h" #include "modules/bluetooth/bluetooth.h" +#include "modules/board/board.h" #include "modules/command/command.h" #include "modules/datetime/datetime.h" #include "modules/display/display.h" diff --git a/src/modules/options.h b/src/modules/options.h index 9f992996a..3872909fb 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -5,6 +5,7 @@ #include "modules/battery/option.h" #include "modules/bios/option.h" #include "modules/bluetooth/option.h" +#include "modules/board/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" #include "modules/display/option.h" From 010330ac90aed80dbc60f6f1e0747d250e621cd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 13 Mar 2023 19:01:08 +0800 Subject: [PATCH 22/71] Break: support JSON config --- CMakeLists.txt | 2 +- src/fastfetch.h | 1 - src/modules/break.c | 8 -------- src/modules/break/break.c | 22 ++++++++++++++++++++++ src/modules/break/break.h | 10 ++++++++++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + 7 files changed, 35 insertions(+), 10 deletions(-) delete mode 100644 src/modules/break.c create mode 100644 src/modules/break/break.c create mode 100644 src/modules/break/break.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d423e07f6..920f98d72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -266,7 +266,7 @@ set(LIBFASTFETCH_SRC src/modules/bluetooth/bluetooth.c src/modules/board/board.c src/modules/brightness.c - src/modules/break.c + src/modules/break/break.c src/modules/chassis.c src/modules/colors.c src/modules/cpu.c diff --git a/src/fastfetch.h b/src/fastfetch.h index bd6e4ee72..16975ef34 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -250,7 +250,6 @@ void ffPrepareWeather(FFinstance* instance); //Printing void ffPrintCustom(FFinstance* instance, const char* key, const char* value); -void ffPrintBreak(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintUptime(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); diff --git a/src/modules/break.c b/src/modules/break.c deleted file mode 100644 index 45b09e5fd..000000000 --- a/src/modules/break.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" - -void ffPrintBreak(FFinstance* instance) -{ - ffLogoPrintLine(instance); - putchar('\n'); -} diff --git a/src/modules/break/break.c b/src/modules/break/break.c new file mode 100644 index 000000000..05587a6fd --- /dev/null +++ b/src/modules/break/break.c @@ -0,0 +1,22 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "modules/break/break.h" + +#define FF_BREAK_MODULE_NAME "Break" + +void ffPrintBreak(FFinstance* instance) +{ + ffLogoPrintLine(instance); + putchar('\n'); +} + +#ifdef FF_HAVE_JSONC +bool ffParseBreakJsonObject(FFinstance* instance, const char* type, FF_MAYBE_UNUSED JSONCData* data, FF_MAYBE_UNUSED json_object* module) +{ + if (strcasecmp(type, FF_BREAK_MODULE_NAME) != 0) + return false; + + ffPrintBreak(instance); + return true; +} +#endif diff --git a/src/modules/break/break.h b/src/modules/break/break.h new file mode 100644 index 000000000..81e40f5c8 --- /dev/null +++ b/src/modules/break/break.h @@ -0,0 +1,10 @@ +#pragma once + +#include "fastfetch.h" + +void ffPrintBreak(FFinstance* instance); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseBreakJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 221c1050a..30c0f2451 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -17,6 +17,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, ffParseBiosJsonObject(instance, type, data, module) || ffParseBluetoothJsonObject(instance, type, data, module) || ffParseBoardJsonObject(instance, type, data, module) || + ffParseBreakJsonObject(instance, type, data, module) || ffParseCommandJsonObject(instance, type, data, module) || ffParseDateTimeJsonObject(instance, type, data, module) || ffParseDisplayJsonObject(instance, type, data, module) || diff --git a/src/modules/modules.h b/src/modules/modules.h index 846b18b08..bd5a75acf 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -7,6 +7,7 @@ #include "modules/bios/bios.h" #include "modules/bluetooth/bluetooth.h" #include "modules/board/board.h" +#include "modules/break/break.h" #include "modules/command/command.h" #include "modules/datetime/datetime.h" #include "modules/display/display.h" From 5da3127344a17d771f3c0035d8e948579f0f2772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 14 Mar 2023 15:29:47 +0800 Subject: [PATCH 23/71] Brightness: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 3 +- src/fastfetch.c | 4 +- src/fastfetch.h | 3 +- src/modules/brightness.c | 58 --------------- src/modules/brightness/brightness.c | 111 ++++++++++++++++++++++++++++ src/modules/brightness/brightness.h | 13 ++++ src/modules/brightness/option.h | 11 +++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 11 files changed, 144 insertions(+), 64 deletions(-) delete mode 100644 src/modules/brightness.c create mode 100644 src/modules/brightness/brightness.c create mode 100644 src/modules/brightness/brightness.h create mode 100644 src/modules/brightness/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 920f98d72..e85996d78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -265,7 +265,7 @@ set(LIBFASTFETCH_SRC src/modules/bios/bios.c src/modules/bluetooth/bluetooth.c src/modules/board/board.c - src/modules/brightness.c + src/modules/brightness/brightness.c src/modules/break/break.c src/modules/chassis.c src/modules/colors.c diff --git a/src/common/init.c b/src/common/init.c index 0bfbeb164..a09e34fa8 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -62,7 +62,7 @@ static void defaultConfig(FFinstance* instance) ffInitHostOptions(&instance->config.host); ffInitBiosOptions(&instance->config.bios); ffInitBoardOptions(&instance->config.board); - initModuleArg(&instance->config.brightness); + ffInitBrightnessOptions(&instance->config.brightness); initModuleArg(&instance->config.chassis); ffInitCommandOptions(&instance->config.command); ffInitKernelOptions(&instance->config.kernel); @@ -298,6 +298,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyHostOptions(&instance->config.host); ffDestroyBiosOptions(&instance->config.bios); ffDestroyBoardOptions(&instance->config.board); + ffDestroyBrightnessOptions(&instance->config.brightness); destroyModuleArg(&instance->config.chassis); ffDestroyCommandOptions(&instance->config.command); ffDestroyKernelOptions(&instance->config.kernel); diff --git a/src/fastfetch.c b/src/fastfetch.c index 650a30923..6f28ca97c 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1021,7 +1021,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "packages", &instance->config.packages)) {} else if(optionParseModuleArgs(key, value, "shell", &instance->config.shell)) {} else if(ffParseDisplayCommandOptions(&instance->config.display, key, value)) {} - else if(optionParseModuleArgs(key, value, "brightness", &instance->config.brightness)) {} + else if(ffParseBrightnessCommandOptions(&instance->config.brightness, key, value)) {} else if(optionParseModuleArgs(key, value, "de", &instance->config.de)) {} else if(optionParseModuleArgs(key, value, "wifi", &instance->config.wifi)) {} else if(optionParseModuleArgs(key, value, "wm", &instance->config.wm)) {} @@ -1265,7 +1265,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "board") == 0) ffPrintBoard(instance, &instance->config.board); else if(strcasecmp(line, "brightness") == 0) - ffPrintBrightness(instance); + ffPrintBrightness(instance, &instance->config.brightness); else if(strcasecmp(line, "chassis") == 0) ffPrintChassis(instance); else if(strcasecmp(line, "kernel") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 16975ef34..3fe6d3f54 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -96,7 +96,7 @@ typedef struct FFconfig FFHostOptions host; FFBiosOptions bios; FFBoardOptions board; - FFModuleArgs brightness; + FFBrightnessOptions brightness; FFModuleArgs chassis; FFCommandOptions command; FFKernelOptions kernel; @@ -255,7 +255,6 @@ void ffPrintUptime(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintPackages(FFinstance* instance); void ffPrintShell(FFinstance* instance); -void ffPrintBrightness(FFinstance* instance); void ffPrintDesktopEnvironment(FFinstance* instance); void ffPrintWM(FFinstance* instance); void ffPrintWMTheme(FFinstance* instance); diff --git a/src/modules/brightness.c b/src/modules/brightness.c deleted file mode 100644 index 9c1cde499..000000000 --- a/src/modules/brightness.c +++ /dev/null @@ -1,58 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/brightness/brightness.h" - -#define FF_BRIGHTNESS_MODULE_NAME "Brightness" -#define FF_BRIGHTNESS_NUM_FORMAT_ARGS 2 - -void ffPrintBrightness(FFinstance* instance) -{ - FF_LIST_AUTO_DESTROY result; - ffListInit(&result, sizeof(FFBrightnessResult)); - const char* error = ffDetectBrightness(&result); - - if(error) - { - ffPrintError(instance, FF_BRIGHTNESS_MODULE_NAME, 0, &instance->config.brightness, "%s", error); - return; - } - - if(result.length == 0) - { - ffPrintError(instance, FF_BRIGHTNESS_MODULE_NAME, 0, &instance->config.brightness, "No result is detected."); - return; - } - - FF_STRBUF_AUTO_DESTROY key; - ffStrbufInit(&key); - - FF_LIST_FOR_EACH(FFBrightnessResult, item, result) - { - if(instance->config.brightness.key.length == 0) - { - ffStrbufAppendF(&key, "%s (%s)", FF_BRIGHTNESS_MODULE_NAME, item->name.chars); - } - else - { - ffParseFormatString(&key, &instance->config.brightness.key, 1, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &item->name} - }); - } - - if(instance->config.brightness.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, key.chars, 0, NULL); - printf("%.0f%%\n", item->value); - } - else - { - ffPrintFormatString(instance, key.chars, 0, NULL, &instance->config.brightness.outputFormat, FF_BRIGHTNESS_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &item->value}, - {FF_FORMAT_ARG_TYPE_FLOAT, &item->name} - }); - } - - ffStrbufClear(&key); - ffStrbufDestroy(&item->name); - } -} diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c new file mode 100644 index 000000000..fd85ea459 --- /dev/null +++ b/src/modules/brightness/brightness.c @@ -0,0 +1,111 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/brightness/brightness.h" +#include "modules/brightness/brightness.h" + +#define FF_BRIGHTNESS_MODULE_NAME "Brightness" +#define FF_BRIGHTNESS_NUM_FORMAT_ARGS 2 + +void ffPrintBrightness(FFinstance* instance, FFBrightnessOptions* options) +{ + FF_LIST_AUTO_DESTROY result; + ffListInit(&result, sizeof(FFBrightnessResult)); + const char* error = ffDetectBrightness(&result); + + if(error) + { + ffPrintError(instance, FF_BRIGHTNESS_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(result.length == 0) + { + ffPrintError(instance, FF_BRIGHTNESS_MODULE_NAME, 0, &options->moduleArgs, "No result is detected."); + return; + } + + FF_STRBUF_AUTO_DESTROY key; + ffStrbufInit(&key); + + FF_LIST_FOR_EACH(FFBrightnessResult, item, result) + { + if(options->moduleArgs.key.length == 0) + { + ffStrbufAppendF(&key, "%s (%s)", FF_BRIGHTNESS_MODULE_NAME, item->name.chars); + } + else + { + ffParseFormatString(&key, &options->moduleArgs.key, 1, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &item->name} + }); + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, key.chars, 0, NULL); + printf("%.0f%%\n", item->value); + } + else + { + ffPrintFormatString(instance, key.chars, 0, NULL, &options->moduleArgs.outputFormat, FF_BRIGHTNESS_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &item->value}, + {FF_FORMAT_ARG_TYPE_FLOAT, &item->name} + }); + } + + ffStrbufClear(&key); + ffStrbufDestroy(&item->name); + } +} + +void ffInitBrightnessOptions(FFBrightnessOptions* options) +{ + options->moduleName = FF_BRIGHTNESS_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseBrightnessCommandOptions(FFBrightnessOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_BRIGHTNESS_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyBrightnessOptions(FFBrightnessOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_BRIGHTNESS_MODULE_NAME) != 0) + return false; + + FFBrightnessOptions __attribute__((__cleanup__(ffDestroyBrightnessOptions))) options; + ffInitBrightnessOptions(&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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_BRIGHTNESS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintBrightness(instance, &options); + return true; +} +#endif diff --git a/src/modules/brightness/brightness.h b/src/modules/brightness/brightness.h new file mode 100644 index 000000000..5f32ddb6f --- /dev/null +++ b/src/modules/brightness/brightness.h @@ -0,0 +1,13 @@ +#pragma once + +#include "fastfetch.h" + +void ffPrintBrightness(FFinstance* instance, FFBrightnessOptions* options); +void ffInitBrightnessOptions(FFBrightnessOptions* options); +bool ffParseBrightnessCommandOptions(FFBrightnessOptions* options, const char* key, const char* value); +void ffDestroyBrightnessOptions(FFBrightnessOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif diff --git a/src/modules/brightness/option.h b/src/modules/brightness/option.h new file mode 100644 index 000000000..803ea4792 --- /dev/null +++ b/src/modules/brightness/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 FFBrightnessOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFBrightnessOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 30c0f2451..dd2d2d157 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -18,6 +18,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, ffParseBluetoothJsonObject(instance, type, data, module) || ffParseBoardJsonObject(instance, type, data, module) || ffParseBreakJsonObject(instance, type, data, module) || + ffParseBrightnessJsonObject(instance, type, data, module) || ffParseCommandJsonObject(instance, type, data, module) || ffParseDateTimeJsonObject(instance, type, data, module) || ffParseDisplayJsonObject(instance, type, data, module) || diff --git a/src/modules/modules.h b/src/modules/modules.h index bd5a75acf..46ab35e4a 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -6,6 +6,7 @@ #include "modules/battery/battery.h" #include "modules/bios/bios.h" #include "modules/bluetooth/bluetooth.h" +#include "modules/brightness/brightness.h" #include "modules/board/board.h" #include "modules/break/break.h" #include "modules/command/command.h" diff --git a/src/modules/options.h b/src/modules/options.h index 3872909fb..0777c7487 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -6,6 +6,7 @@ #include "modules/bios/option.h" #include "modules/bluetooth/option.h" #include "modules/board/option.h" +#include "modules/brightness/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" #include "modules/display/option.h" From 5f52c64d4d60aaa98cba09e1318e0b5868c1d0a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 15 Mar 2023 11:24:49 +0800 Subject: [PATCH 24/71] JsonConfig: code simplify --- src/common/config.h | 17 ++++++- src/common/library.h | 8 ++-- src/modules/battery/battery.c | 46 ++++++++---------- src/modules/bios/bios.c | 18 +++---- src/modules/bluetooth/bluetooth.c | 30 +++++------- src/modules/board/board.c | 18 +++---- src/modules/brightness/brightness.c | 18 +++---- src/modules/command/command.c | 42 +++++++--------- src/modules/datetime/datetime.c | 18 +++---- src/modules/display/display.c | 74 +++++++++++++---------------- src/modules/host/host.c | 18 +++---- src/modules/jsonconfig/jsonconfig.c | 50 +++++++++++-------- src/modules/kernel/kernel.c | 18 +++---- src/modules/os/os.c | 34 ++++++------- src/modules/separator/separator.c | 24 ++++------ src/modules/title/title.c | 24 ++++------ 16 files changed, 200 insertions(+), 257 deletions(-) diff --git a/src/common/config.h b/src/common/config.h index d52b88440..4254e2126 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -19,11 +19,24 @@ typedef struct JSONCData FF_LIBRARY_SYMBOL(json_object_get_object) FF_LIBRARY_SYMBOL(json_object_object_get) FF_LIBRARY_SYMBOL(json_object_put) - - json_object* root; } JSONCData; bool ffJsonConfigParseModuleArgs(JSONCData* data, const char* key, json_object* val, FFModuleArgs* moduleArgs); const char* ffJsonConfigParseEnum(JSONCData* data, json_object* val, int* result, FFKeyValuePair pairs[]); +// Modified from json_object_object_foreach +#define FF_JSON_OBJECT_OBJECT_FOREACH(data, obj, keyVar, valVar) \ + const char* keyVar = NULL; \ + json_object* valVar = NULL; \ + for (struct lh_entry* entry##keyVar = (obj) ? lh_table_head(data->ffjson_object_get_object(obj)) : NULL; \ + ({ \ + if (entry##keyVar) \ + { \ + keyVar = (const char*) lh_entry_k(entry##keyVar); \ + valVar = (json_object*) lh_entry_v(entry##keyVar); \ + }; \ + entry##keyVar; \ + }); \ + entry##keyVar = lh_entry_next(entry##keyVar)) + #endif diff --git a/src/common/library.h b/src/common/library.h index a0de3d621..3f4a8f237 100644 --- a/src/common/library.h +++ b/src/common/library.h @@ -62,16 +62,16 @@ static inline void ffLibraryUnload(void** handle) __typeof__(&symbolName) FF_LIBRARY_LOAD_SYMBOL_ADDRESS2(library, ff ## symbolName, symbolName, alternateName, "dlsym " #symbolName " failed"); #define FF_LIBRARY_LOAD_SYMBOL_VAR(library, varName, symbolName, returnValue) \ - FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, varName.ff ## symbolName, symbolName, returnValue); + FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName).ff ## symbolName, symbolName, returnValue); #define FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(library, varName, symbolName) \ - FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, varName.ff ## symbolName, symbolName, "dlsym " #symbolName " failed"); + FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName).ff ## symbolName, symbolName, "dlsym " #symbolName " failed"); #define FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE2(library, varName, symbolName, alternateName) \ - FF_LIBRARY_LOAD_SYMBOL_ADDRESS2(library, varName.ff ## symbolName, symbolName, alternateName, "dlsym " #symbolName " failed"); + FF_LIBRARY_LOAD_SYMBOL_ADDRESS2(library, (varName).ff ## symbolName, symbolName, alternateName, "dlsym " #symbolName " failed"); #define FF_LIBRARY_LOAD_SYMBOL_PTR(library, varName, symbolName, returnValue) \ - FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, varName->ff ## symbolName, symbolName, returnValue); + FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName)->ff ## symbolName, symbolName, returnValue); void* ffLibraryLoad(const FFstrbuf* userProvidedName, ...); diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index f76f67797..6bc094450 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -156,35 +156,29 @@ bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, JSONCData* FFBatteryOptions __attribute__((__cleanup__(ffDestroyBatteryOptions))) options; ffInitBatteryOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - struct lh_entry* entry; - lh_foreach(data->ffjson_object_get_object(module), entry) + if (strcasecmp(key, "type") == 0) + continue; + + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + #ifdef __linux__ + if (strcasecmp(key, "dir") == 0) { - 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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; - - #ifdef __linux__ - if (strcasecmp(key, "dir") == 0) - { - ffStrbufSetS(&options.dir, data->ffjson_object_get_string(val)); - continue; - } - #endif - - if (strcasecmp(key, "temp") == 0) - { - options.temp = (bool) data->ffjson_object_get_boolean(val); - continue; - } - - ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + ffStrbufSetS(&options.dir, data->ffjson_object_get_string(val)); + continue; } + #endif + + if (strcasecmp(key, "temp") == 0) + { + options.temp = (bool) data->ffjson_object_get_boolean(val); + continue; + } + + ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintBattery(instance, &options); diff --git a/src/modules/bios/bios.c b/src/modules/bios/bios.c index 718e404a9..87f68bad1 100644 --- a/src/modules/bios/bios.c +++ b/src/modules/bios/bios.c @@ -76,21 +76,15 @@ bool ffParseBiosJsonObject(FFinstance* instance, const char* type, JSONCData* da FFBiosOptions __attribute__((__cleanup__(ffDestroyBiosOptions))) options; ffInitBiosOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - 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, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_BIOS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); - } + ffPrintError(instance, FF_BIOS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintBios(instance, &options); diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c index 90d5c2f4d..5000db9f6 100644 --- a/src/modules/bluetooth/bluetooth.c +++ b/src/modules/bluetooth/bluetooth.c @@ -97,27 +97,21 @@ bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, JSONCDat FFBluetoothOptions __attribute__((__cleanup__(ffDestroyBluetoothOptions))) options; ffInitBluetoothOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - struct lh_entry* entry; - lh_foreach(data->ffjson_object_get_object(module), entry) + if (strcasecmp(key, "type") == 0) + continue; + + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "showConnected") == 0) { - 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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; - - if (strcasecmp(key, "showConnected") == 0) - { - options.showDisconnected = data->ffjson_object_get_boolean(val); - continue; - } - - ffPrintError(instance, FF_BLUETOOTH_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + options.showDisconnected = data->ffjson_object_get_boolean(val); + continue; } + + ffPrintError(instance, FF_BLUETOOTH_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintBluetooth(instance, &options); diff --git a/src/modules/board/board.c b/src/modules/board/board.c index 6f41aa76e..37cb8717e 100644 --- a/src/modules/board/board.c +++ b/src/modules/board/board.c @@ -74,21 +74,15 @@ bool ffParseBoardJsonObject(FFinstance* instance, const char* type, JSONCData* d FFBoardOptions __attribute__((__cleanup__(ffDestroyBoardOptions))) options; ffInitBoardOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - 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, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_BOARD_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); - } + ffPrintError(instance, FF_BOARD_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintBoard(instance, &options); diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index fd85ea459..a51aee300 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -88,21 +88,15 @@ bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, JSONCDa FFBrightnessOptions __attribute__((__cleanup__(ffDestroyBrightnessOptions))) options; ffInitBrightnessOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - 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, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_BRIGHTNESS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); - } + ffPrintError(instance, FF_BRIGHTNESS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintBrightness(instance, &options); diff --git a/src/modules/command/command.c b/src/modules/command/command.c index 43143fb5f..fcc700bcb 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -93,33 +93,27 @@ bool ffParseCommandJsonObject(FFinstance* instance, const char* type, JSONCData* FFCommandOptions __attribute__((__cleanup__(ffDestroyCommandOptions))) options; ffInitCommandOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - struct lh_entry* entry; - lh_foreach(data->ffjson_object_get_object(module), entry) + if (strcasecmp(key, "type") == 0) + continue; + + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "shell") == 0) { - 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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; - - if (strcasecmp(key, "shell") == 0) - { - ffStrbufSetS(&options.shell, data->ffjson_object_get_string(val)); - continue; - } - - if (strcasecmp(key, "text") == 0) - { - ffStrbufSetS(&options.text, data->ffjson_object_get_string(val)); - continue; - } - - ffPrintError(instance, FF_COMMAND_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + ffStrbufSetS(&options.shell, data->ffjson_object_get_string(val)); + continue; } + + if (strcasecmp(key, "text") == 0) + { + ffStrbufSetS(&options.text, data->ffjson_object_get_string(val)); + continue; + } + + ffPrintError(instance, FF_COMMAND_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintCommand(instance, &options); diff --git a/src/modules/datetime/datetime.c b/src/modules/datetime/datetime.c index 40d09b851..c3db61512 100644 --- a/src/modules/datetime/datetime.c +++ b/src/modules/datetime/datetime.c @@ -79,21 +79,15 @@ bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, JSONCData FFDateTimeOptions __attribute__((__cleanup__(ffDestroyDateTimeOptions))) options; ffInitDateTimeOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - 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, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_DATETIME_DISPLAY_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); - } + ffPrintError(instance, FF_DATETIME_DISPLAY_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintDateTime(instance, &options); diff --git a/src/modules/display/display.c b/src/modules/display/display.c index 72330878c..798698ce3 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -167,49 +167,43 @@ bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, JSONCData* FFDisplayOptions __attribute__((__cleanup__(ffDestroyDisplayOptions))) options; ffInitDisplayOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - struct lh_entry* entry; - lh_foreach(data->ffjson_object_get_object(module), entry) + if (strcasecmp(key, "type") == 0) + continue; + + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "compactType") == 0) { - 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 (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; - - if (strcasecmp(key, "compactType") == 0) - { - int value; - const char* error = ffJsonConfigParseEnum(data, val, &value, (FFKeyValuePair[]) { - { "none", FF_DISPLAY_COMPACT_TYPE_NONE }, - { "original", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT }, - { "scaled", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT }, - {}, - }); - if (error) - ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &options.moduleArgs, "Invalid %s value: %s", key, error); - else - options.compactType = (FFDisplayCompactType) value; - continue; - } - - if (strcasecmp(key, "detectName") == 0) - { - options.detectName = data->ffjson_object_get_boolean(val); - continue; - } - - if (strcasecmp(key, "preciseRefreshRate") == 0) - { - options.preciseRefreshRate = data->ffjson_object_get_boolean(val); - continue; - } - - ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + int value; + const char* error = ffJsonConfigParseEnum(data, val, &value, (FFKeyValuePair[]) { + { "none", FF_DISPLAY_COMPACT_TYPE_NONE }, + { "original", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT }, + { "scaled", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT }, + {}, + }); + if (error) + ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &options.moduleArgs, "Invalid %s value: %s", key, error); + else + options.compactType = (FFDisplayCompactType) value; + continue; } + + if (strcasecmp(key, "detectName") == 0) + { + options.detectName = data->ffjson_object_get_boolean(val); + continue; + } + + if (strcasecmp(key, "preciseRefreshRate") == 0) + { + options.preciseRefreshRate = data->ffjson_object_get_boolean(val); + continue; + } + + ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintDisplay(instance, &options); diff --git a/src/modules/host/host.c b/src/modules/host/host.c index d4a498c13..417da2816 100644 --- a/src/modules/host/host.c +++ b/src/modules/host/host.c @@ -85,21 +85,15 @@ bool ffParseHostJsonObject(FFinstance* instance, const char* type, JSONCData* da FFHostOptions __attribute__((__cleanup__(ffDestroyHostOptions))) options; ffInitHostOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - 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, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_HOST_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); - } + ffPrintError(instance, FF_HOST_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintHost(instance, &options); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index dd2d2d157..fc2e30bfd 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -29,11 +29,17 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, false; } -static inline void wrapJsoncFree(JSONCData* data) +typedef struct JsonConfigData { - assert(data); - if (data->root) - data->ffjson_object_put(data->root); + JSONCData data; + json_object* root; +} JsonConfigData; + +static inline void wrapJsoncFree(JsonConfigData* jsonConfig) +{ + assert(jsonConfig); + if (jsonConfig->root) + jsonConfig->data.ffjson_object_put(jsonConfig->root); } static const char* parseModules(FFinstance* instance, JSONCData* data, json_object* modules) @@ -52,7 +58,8 @@ static const char* parseModules(FFinstance* instance, JSONCData* data, json_obje } else if (data->ffjson_object_is_type(module, json_type_object)) { - type = data->ffjson_object_get_string(data->ffjson_object_object_get(module, "type")); + json_object* object = data->ffjson_object_object_get(module, "type"); + type = data->ffjson_object_get_string(object); if (!type) return "module object must contain a type key"; } else @@ -74,18 +81,19 @@ static const char* printJsonConfig(FFinstance* instance) "libjson-c" FF_LIBRARY_EXTENSION, 5 #endif ) - JSONCData __attribute__((__cleanup__(wrapJsoncFree))) data = {}; - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_tokener_parse) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_is_type) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_array) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_boolean) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_double) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_int) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string_len) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_object) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_object_get) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_put) + JsonConfigData __attribute__((__cleanup__(wrapJsoncFree))) jsonConfig = {}; + JSONCData* data = &jsonConfig.data; + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_tokener_parse) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_is_type) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_array) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_boolean) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_double) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_int) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_string_len) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_string) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_object) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_object_get) + FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_put) FF_STRBUF_AUTO_DESTROY content; ffStrbufInit(&content); @@ -98,11 +106,11 @@ static const char* printJsonConfig(FFinstance* instance) if (success) break; } - data.root = data.ffjson_tokener_parse(content.chars); - if (!data.root) + jsonConfig.root = data->ffjson_tokener_parse(content.chars); + if (!jsonConfig.root) return "Failed to parse JSON config file"; - lh_table* rootObject = data.ffjson_object_get_object(data.root); + lh_table* rootObject = data->ffjson_object_get_object(jsonConfig.root); if (!rootObject) return "Invalid JSON config format. Root value must be an object"; @@ -114,7 +122,7 @@ static const char* printJsonConfig(FFinstance* instance) if (strcmp(key, "modules") == 0) { - const char* error = parseModules(instance, &data, val); + const char* error = parseModules(instance, data, val); if (error) return error; } else diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c index 31f206581..c1abfa977 100644 --- a/src/modules/kernel/kernel.c +++ b/src/modules/kernel/kernel.c @@ -60,21 +60,15 @@ bool ffParseKernelJsonObject(FFinstance* instance, const char* type, JSONCData* FFKernelOptions __attribute__((__cleanup__(ffDestroyKernelOptions))) options; ffInitKernelOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - 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, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_KERNEL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); - } + ffPrintError(instance, FF_KERNEL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintKernel(instance, &options); diff --git a/src/modules/os/os.c b/src/modules/os/os.c index e87488ded..2650948a9 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -183,29 +183,23 @@ bool ffParseOSJsonObject(FFinstance* instance, const char* type, JSONCData* data FFOSOptions __attribute__((__cleanup__(ffDestroyOSOptions))) options; ffInitOSOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - 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) + if (strcasecmp(key, "type") == 0) + continue; + + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + #if defined(__linux__) || defined(__FreeBSD__) + if (strcasecmp(key, "file") == 0) + { + ffStrbufSetS(&options.file, data->ffjson_object_get_string(val)); continue; - json_object* val = (struct json_object *)lh_entry_v(entry); + } + #endif - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; - - #if defined(__linux__) || defined(__FreeBSD__) - if (strcasecmp(key, "file") == 0) - { - ffStrbufSetS(&options.file, data->ffjson_object_get_string(val)); - continue; - } - #endif - - ffPrintError(instance, FF_OS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); - } + ffPrintError(instance, FF_OS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); } ffPrintOS(instance, &options); diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index 1c6b92bc9..7fd4bc615 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -69,24 +69,18 @@ bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, JSONCDat FFSeparatorOptions __attribute__((__cleanup__(ffDestroySeparatorOptions))) options; ffInitSeparatorOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - struct lh_entry* entry; - lh_foreach(data->ffjson_object_get_object(module), entry) + if (strcasecmp(key, "type") == 0) + continue; + + if (strcasecmp(key, "string") == 0) { - 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, "string") == 0) - { - ffStrbufSetS(&options.string, data->ffjson_object_get_string(val)); - continue; - } - - ffPrintErrorString(instance, FF_SEPARATOR_MODULE_NAME, 0, NULL, NULL, "Unknown JSON key %s", key); + ffStrbufSetS(&options.string, data->ffjson_object_get_string(val)); + continue; } + + ffPrintErrorString(instance, FF_SEPARATOR_MODULE_NAME, 0, NULL, NULL, "Unknown JSON key %s", key); } ffPrintSeparator(instance, &options); diff --git a/src/modules/title/title.c b/src/modules/title/title.c index 3503d01b3..88cae7e77 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -69,24 +69,18 @@ bool ffParseTitleJsonObject(FFinstance* instance, const char* type, JSONCData* d FFTitleOptions __attribute__((__cleanup__(ffDestroyTitleOptions))) options; ffInitTitleOptions(&options); - if (module) + FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) { - struct lh_entry* entry; - lh_foreach(data->ffjson_object_get_object(module), entry) + if (strcasecmp(key, "type") == 0) + continue; + + if (strcasecmp(key, "fdqn") == 0) { - 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); + 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); From dca9ce4b2d843230d48ee56d21fb358b6d0875fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 15 Mar 2023 15:24:40 +0800 Subject: [PATCH 25/71] JsonConfig: refactor to get rid of `data-ffjson_*` --- CMakeLists.txt | 3 +- src/common/config.h | 42 ------- src/common/json.c | 139 ++++++++++++++++++++++ src/common/json.h | 18 +++ src/common/{config.c => jsonconfig.c} | 20 ++-- src/common/jsonconfig.h | 10 ++ src/detection/terminalfont/terminalfont.c | 79 ++++-------- src/fastfetch.c | 3 +- src/modules/battery/battery.c | 43 +++---- src/modules/battery/battery.h | 4 +- src/modules/bios/bios.c | 17 +-- src/modules/bios/bios.h | 4 +- src/modules/bluetooth/bluetooth.c | 29 +++-- src/modules/bluetooth/bluetooth.h | 4 +- src/modules/board/board.c | 17 +-- src/modules/board/board.h | 4 +- src/modules/break/break.c | 2 +- src/modules/break/break.h | 4 +- src/modules/brightness/brightness.c | 17 +-- src/modules/brightness/brightness.h | 4 +- src/modules/command/command.c | 39 +++--- src/modules/command/command.h | 4 +- src/modules/datetime/datetime.c | 17 +-- src/modules/datetime/datetime.h | 4 +- src/modules/display/display.c | 69 ++++++----- src/modules/display/display.h | 4 +- src/modules/host/host.c | 17 +-- src/modules/host/host.h | 4 +- src/modules/jsonconfig/jsonconfig.c | 94 +++++---------- src/modules/kernel/kernel.c | 17 +-- src/modules/kernel/kernel.h | 4 +- src/modules/os/os.c | 33 ++--- src/modules/os/os.h | 4 +- src/modules/separator/separator.c | 23 ++-- src/modules/separator/separator.h | 4 +- src/modules/title/title.c | 23 ++-- src/modules/title/title.h | 4 +- 37 files changed, 463 insertions(+), 364 deletions(-) delete mode 100644 src/common/config.h create mode 100644 src/common/json.c create mode 100644 src/common/json.h rename src/common/{config.c => jsonconfig.c} (51%) create mode 100644 src/common/jsonconfig.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e85996d78..162626cf4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -228,10 +228,11 @@ configure_file(src/fastfetch_config.h.in fastfetch_config.h) set(LIBFASTFETCH_SRC src/common/bar.c - src/common/config.c src/common/font.c src/common/format.c src/common/init.c + src/common/json.c + src/common/jsonconfig.c src/common/library.c src/common/option.c src/common/parsing.c diff --git a/src/common/config.h b/src/common/config.h deleted file mode 100644 index 4254e2126..000000000 --- a/src/common/config.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#ifdef FF_HAVE_JSONC - -#include - -#include "common/library.h" - -typedef struct JSONCData -{ - FF_LIBRARY_SYMBOL(json_tokener_parse) - FF_LIBRARY_SYMBOL(json_object_is_type) - FF_LIBRARY_SYMBOL(json_object_get_array) - FF_LIBRARY_SYMBOL(json_object_get_boolean) - FF_LIBRARY_SYMBOL(json_object_get_double) - FF_LIBRARY_SYMBOL(json_object_get_int) - FF_LIBRARY_SYMBOL(json_object_get_string_len) - FF_LIBRARY_SYMBOL(json_object_get_string) - FF_LIBRARY_SYMBOL(json_object_get_object) - FF_LIBRARY_SYMBOL(json_object_object_get) - FF_LIBRARY_SYMBOL(json_object_put) -} JSONCData; - -bool ffJsonConfigParseModuleArgs(JSONCData* data, const char* key, json_object* val, FFModuleArgs* moduleArgs); -const char* ffJsonConfigParseEnum(JSONCData* data, json_object* val, int* result, FFKeyValuePair pairs[]); - -// Modified from json_object_object_foreach -#define FF_JSON_OBJECT_OBJECT_FOREACH(data, obj, keyVar, valVar) \ - const char* keyVar = NULL; \ - json_object* valVar = NULL; \ - for (struct lh_entry* entry##keyVar = (obj) ? lh_table_head(data->ffjson_object_get_object(obj)) : NULL; \ - ({ \ - if (entry##keyVar) \ - { \ - keyVar = (const char*) lh_entry_k(entry##keyVar); \ - valVar = (json_object*) lh_entry_v(entry##keyVar); \ - }; \ - entry##keyVar; \ - }); \ - entry##keyVar = lh_entry_next(entry##keyVar)) - -#endif diff --git a/src/common/json.c b/src/common/json.c new file mode 100644 index 000000000..cfbcd1f64 --- /dev/null +++ b/src/common/json.c @@ -0,0 +1,139 @@ +#include "common/json.h" + +#ifdef FF_HAVE_JSONC + +#include "common/library.h" +#include "common/thread.h" + +#include + +typedef struct FFJsonLibrary +{ + FF_LIBRARY_SYMBOL(json_tokener_parse) + FF_LIBRARY_SYMBOL(json_object_is_type) + FF_LIBRARY_SYMBOL(json_object_get_array) + FF_LIBRARY_SYMBOL(json_object_get_boolean) + FF_LIBRARY_SYMBOL(json_object_get_double) + FF_LIBRARY_SYMBOL(json_object_get_int) + FF_LIBRARY_SYMBOL(json_object_get_string_len) + FF_LIBRARY_SYMBOL(json_object_get_string) + FF_LIBRARY_SYMBOL(json_object_get_object) + FF_LIBRARY_SYMBOL(json_object_object_get) + FF_LIBRARY_SYMBOL(json_object_put) +} FFJsonLibrary; + +static const FFJsonLibrary* loadLibSymbols(const FFinstance* instance) +{ + assert(instance); + + static FFJsonLibrary lib; + FF_LIBRARY_LOAD(libjsonc, &instance->config.libJSONC, NULL, + #ifdef _WIN32 + "libjson-c-5" FF_LIBRARY_EXTENSION, -1 + #else + "libjson-c" FF_LIBRARY_EXTENSION, 5 + #endif + ) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_tokener_parse, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_is_type, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_get_array, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_get_boolean, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_get_double, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_get_int, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_get_string_len, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_get_string, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_get_object, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_object_get, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_put, NULL) + libjsonc = NULL; // don't dlclose automatically + return &lib; +} + +const FFJsonLibrary* ffJsonLib = NULL; +bool ffJsonLoadLibrary(const FFinstance* instance) +{ + static bool loaded = false; + static FFThreadMutex mutex = FF_THREAD_MUTEX_INITIALIZER; + + if (!loaded) + { + ffThreadMutexLock(&mutex); + + if(!loaded) + { + loaded = true; + ffJsonLib = loadLibSymbols(instance); + } + + ffThreadMutexUnlock(&mutex); + } + return !!ffJsonLib; +} + +struct json_object *json_tokener_parse(const char *str) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_tokener_parse(str); +} + +int json_object_is_type(const json_object *obj, enum json_type type) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_is_type(obj, type); +} + +struct array_list *json_object_get_array(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_array(obj); +} + +json_bool json_object_get_boolean(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_boolean(obj); +} + +double json_object_get_double(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_double(obj); +} + +int32_t json_object_get_int(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_int(obj); +} + +int json_object_get_string_len(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_string_len(obj); +} + +const char *json_object_get_string(json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_string(obj); +} + +struct lh_table *json_object_get_object(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_object(obj); +} + +struct json_object *json_object_object_get(const json_object *obj, const char *key) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_object_get(obj, key); +} + +int json_object_put(json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_put(obj); +} + +#endif diff --git a/src/common/json.h b/src/common/json.h new file mode 100644 index 000000000..e1bb3ad59 --- /dev/null +++ b/src/common/json.h @@ -0,0 +1,18 @@ +#pragma once + +#ifdef FF_HAVE_JSONC + +#include "fastfetch.h" + +#include + +bool ffJsonLoadLibrary(const FFinstance* instance); + +static inline void wrapJsoncFree(json_object** root) +{ + assert(root); + if (*root) + json_object_put(*root); +} + +#endif diff --git a/src/common/config.c b/src/common/jsonconfig.c similarity index 51% rename from src/common/config.c rename to src/common/jsonconfig.c index c154583c9..151e058e5 100644 --- a/src/common/config.c +++ b/src/common/jsonconfig.c @@ -1,33 +1,33 @@ #include "fastfetch.h" -#include "common/config.h" +#include "common/jsonconfig.h" #ifdef FF_HAVE_JSONC -bool ffJsonConfigParseModuleArgs(JSONCData* data, const char* key, json_object* val, FFModuleArgs* moduleArgs) +bool ffJsonConfigParseModuleArgs(const char* key, json_object* val, FFModuleArgs* moduleArgs) { if(strcasecmp(key, "key") == 0) { - ffStrbufSetNS(&moduleArgs->key, (uint32_t) data->ffjson_object_get_string_len(val), data->ffjson_object_get_string(val)); + ffStrbufSetNS(&moduleArgs->key, (uint32_t) json_object_get_string_len(val), json_object_get_string(val)); return true; } else if(strcasecmp(key, "format") == 0) { - ffStrbufSetNS(&moduleArgs->outputFormat, (uint32_t) data->ffjson_object_get_string_len(val), data->ffjson_object_get_string(val)); + ffStrbufSetNS(&moduleArgs->outputFormat, (uint32_t) json_object_get_string_len(val), json_object_get_string(val)); return true; } else if(strcasecmp(key, "error") == 0) { - ffStrbufSetNS(&moduleArgs->errorFormat, (uint32_t) data->ffjson_object_get_string_len(val), data->ffjson_object_get_string(val)); + ffStrbufSetNS(&moduleArgs->errorFormat, (uint32_t) json_object_get_string_len(val), json_object_get_string(val)); return true; } return false; } -const char* ffJsonConfigParseEnum(JSONCData* data, json_object* val, int* result, FFKeyValuePair pairs[]) +const char* ffJsonConfigParseEnum(json_object* val, int* result, FFKeyValuePair pairs[]) { - if (data->ffjson_object_is_type(val, json_type_int)) + if (json_object_is_type(val, json_type_int)) { - int intVal = data->ffjson_object_get_int(val); + int intVal = json_object_get_int(val); for (const FFKeyValuePair* pPair = pairs; pPair->key; ++pPair) { @@ -40,9 +40,9 @@ const char* ffJsonConfigParseEnum(JSONCData* data, json_object* val, int* result return "Invalid enum integer"; } - else if (data->ffjson_object_is_type(val, json_type_string)) + else if (json_object_is_type(val, json_type_string)) { - const char* strVal = data->ffjson_object_get_string(val); + const char* strVal = json_object_get_string(val); for (const FFKeyValuePair* pPair = pairs; pPair->key; ++pPair) { if (strcasecmp(strVal, pPair->key) == 0) diff --git a/src/common/jsonconfig.h b/src/common/jsonconfig.h new file mode 100644 index 000000000..76a72c304 --- /dev/null +++ b/src/common/jsonconfig.h @@ -0,0 +1,10 @@ +#pragma once + +#ifdef FF_HAVE_JSONC + +#include "common/json.h" + +bool ffJsonConfigParseModuleArgs(const char* key, json_object* val, FFModuleArgs* moduleArgs); +const char* ffJsonConfigParseEnum(json_object* val, int* result, FFKeyValuePair pairs[]); + +#endif diff --git a/src/detection/terminalfont/terminalfont.c b/src/detection/terminalfont/terminalfont.c index d9693f637..2e502861a 100644 --- a/src/detection/terminalfont/terminalfont.c +++ b/src/detection/terminalfont/terminalfont.c @@ -71,80 +71,45 @@ FF_MAYBE_UNUSED static void detectTTY(FFTerminalFontResult* terminalFont) #include "common/library.h" #include "common/processing.h" +#include "common/json.h" #include -#include -typedef struct JSONCData +static const char* detectWTProfile(json_object* profile, FFstrbuf* name, double* size) { - FF_LIBRARY_SYMBOL(json_tokener_parse) - FF_LIBRARY_SYMBOL(json_object_get_array) - FF_LIBRARY_SYMBOL(json_object_is_type) - FF_LIBRARY_SYMBOL(json_object_get_double) - FF_LIBRARY_SYMBOL(json_object_get_string_len) - FF_LIBRARY_SYMBOL(json_object_get_string) - FF_LIBRARY_SYMBOL(json_object_object_get) - FF_LIBRARY_SYMBOL(json_object_put) - - json_object* root; -} JSONCData; - -static const char* detectWTProfile(JSONCData* data, json_object* profile, FFstrbuf* name, double* size) -{ - json_object* font = data->ffjson_object_object_get(profile, "font"); + json_object* font = json_object_object_get(profile, "font"); if (!font) return "json_object_object_get(profile, \"font\"); failed"; - if (!data->ffjson_object_is_type(font, json_type_object)) + if (!json_object_is_type(font, json_type_object)) return "json_object_is_type(font, json_type_object) returns false"; if (name->length == 0) { - json_object* pface = data->ffjson_object_object_get(font, "face"); - if(data->ffjson_object_is_type(pface, json_type_string)) - ffStrbufAppendNS(name, (uint32_t) data->ffjson_object_get_string_len(pface), data->ffjson_object_get_string(pface)); + json_object* pface = json_object_object_get(font, "face"); + if(json_object_is_type(pface, json_type_string)) + ffStrbufAppendNS(name, (uint32_t) json_object_get_string_len(pface), json_object_get_string(pface)); } if (*size < 0) { - json_object* psize = data->ffjson_object_object_get(font, "size"); - if (data->ffjson_object_is_type(psize, json_type_int) || data->ffjson_object_is_type(psize, json_type_double)) - *size = data->ffjson_object_get_double(psize); + json_object* psize = json_object_object_get(font, "size"); + if (json_object_is_type(psize, json_type_int) || json_object_is_type(psize, json_type_double)) + *size = json_object_get_double(psize); } return NULL; } -static inline void wrapJsoncFree(JSONCData* data) -{ - assert(data); - if (data->root) - data->ffjson_object_put(data->root); -} - static const char* detectFromWTImpl(const FFinstance* instance, FFstrbuf* content, FFstrbuf* name, double* size) { - FF_LIBRARY_LOAD(libjsonc, &instance->config.libJSONC, "dlopen libjson-c" FF_LIBRARY_EXTENSION" failed", - #ifdef _WIN32 - "libjson-c-5" FF_LIBRARY_EXTENSION, -1 - #else - "libjson-c" FF_LIBRARY_EXTENSION, 5 - #endif - ) - JSONCData __attribute__((__cleanup__(wrapJsoncFree))) data = {}; - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_tokener_parse) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_is_type) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_array) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_double) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string_len) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_get_string) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_object_get) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, data, json_object_put) + if (ffJsonLoadLibrary(instance)) + return "Failed to load json-c library"; - data.root = data.ffjson_tokener_parse(content->chars); - if (!data.root) + json_object* __attribute__((__cleanup__(wrapJsoncFree))) root = json_tokener_parse(content->chars); + if (!root) return "Failed to parse WT JSON config file"; - json_object* profiles = data.ffjson_object_object_get(data.root, "profiles"); + json_object* profiles = json_object_object_get(root, "profiles"); if (!profiles) return "json_object_object_get(root, \"profiles\") failed"; @@ -153,29 +118,29 @@ static const char* detectFromWTImpl(const FFinstance* instance, FFstrbuf* conten ffStrbufTrim(&wtProfileId, '\''); if (wtProfileId.length > 0) { - array_list* list = data.ffjson_object_get_array(data.ffjson_object_object_get(profiles, "list")); + array_list* list = json_object_get_array(json_object_object_get(profiles, "list")); if (list) { for (size_t idx = 0; idx < list->length; ++idx) { json_object* profile = (json_object*) list->array[idx]; - json_object* guid = data.ffjson_object_object_get(profile, "guid"); + json_object* guid = json_object_object_get(profile, "guid"); - if (!data.ffjson_object_is_type(guid, json_type_string)) + if (!json_object_is_type(guid, json_type_string)) continue; - if(ffStrbufEqualS(&wtProfileId, data.ffjson_object_get_string(guid))) + if(ffStrbufEqualS(&wtProfileId, json_object_get_string(guid))) { - detectWTProfile(&data, profile, name, size); + detectWTProfile(profile, name, size); break; } } } } - json_object* defaults = data.ffjson_object_object_get(profiles, "defaults"); + json_object* defaults = json_object_object_get(profiles, "defaults"); if (defaults) - detectWTProfile(&data, defaults, name, size); + detectWTProfile(defaults, name, size); if(name->length == 0) ffStrbufSetS(name, "Cascadia Mono"); diff --git a/src/fastfetch.c b/src/fastfetch.c index 6f28ca97c..aafdbabd1 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -18,8 +18,7 @@ #pragma GCC diagnostic ignored "-Wsign-conversion" -#include "modules/os/os.h" -#include "common/config.h" +#include "common/jsonconfig.h" #include "modules/modules.h" typedef struct CustomValue diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index 6bc094450..38f95a40a 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -148,7 +148,7 @@ void ffDestroyBatteryOptions(FFBatteryOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_BATTERY_MODULE_NAME) != 0) return false; @@ -156,29 +156,32 @@ bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, JSONCData* FFBatteryOptions __attribute__((__cleanup__(ffDestroyBatteryOptions))) options; ffInitBatteryOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; - - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; - - #ifdef __linux__ - if (strcasecmp(key, "dir") == 0) + json_object_object_foreach(module, key, val) { - ffStrbufSetS(&options.dir, data->ffjson_object_get_string(val)); - continue; - } - #endif + if (strcasecmp(key, "type") == 0) + continue; - if (strcasecmp(key, "temp") == 0) - { - options.temp = (bool) data->ffjson_object_get_boolean(val); - continue; - } + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + #ifdef __linux__ + if (strcasecmp(key, "dir") == 0) + { + ffStrbufSetS(&options.dir, json_object_get_string(val)); + continue; + } + #endif + + if (strcasecmp(key, "temp") == 0) + { + options.temp = (bool) json_object_get_boolean(val); + continue; + } + + ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintBattery(instance, &options); diff --git a/src/modules/battery/battery.h b/src/modules/battery/battery.h index 20d76a50b..4b69fbd10 100644 --- a/src/modules/battery/battery.h +++ b/src/modules/battery/battery.h @@ -9,6 +9,6 @@ bool ffParseBatteryCommandOptions(FFBatteryOptions* options, const char* key, co void ffDestroyBatteryOptions(FFBatteryOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/bios/bios.c b/src/modules/bios/bios.c index 87f68bad1..b936bd6f3 100644 --- a/src/modules/bios/bios.c +++ b/src/modules/bios/bios.c @@ -68,7 +68,7 @@ void ffDestroyBiosOptions(FFBiosOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseBiosJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseBiosJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_BIOS_MODULE_NAME) != 0) return false; @@ -76,15 +76,18 @@ bool ffParseBiosJsonObject(FFinstance* instance, const char* type, JSONCData* da FFBiosOptions __attribute__((__cleanup__(ffDestroyBiosOptions))) options; ffInitBiosOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; + json_object_object_foreach(module, key, val) + { + if (strcasecmp(key, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_BIOS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + ffPrintError(instance, FF_BIOS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintBios(instance, &options); diff --git a/src/modules/bios/bios.h b/src/modules/bios/bios.h index c751285c5..2b9a82149 100644 --- a/src/modules/bios/bios.h +++ b/src/modules/bios/bios.h @@ -8,6 +8,6 @@ bool ffParseBiosCommandOptions(FFBiosOptions* options, const char* key, const ch void ffDestroyBiosOptions(FFBiosOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseBiosJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseBiosJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c index 5000db9f6..503dfe569 100644 --- a/src/modules/bluetooth/bluetooth.c +++ b/src/modules/bluetooth/bluetooth.c @@ -89,7 +89,7 @@ void ffDestroyBluetoothOptions(FFBluetoothOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_BLUETOOTH_MODULE_NAME) != 0) return false; @@ -97,21 +97,24 @@ bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, JSONCDat FFBluetoothOptions __attribute__((__cleanup__(ffDestroyBluetoothOptions))) options; ffInitBluetoothOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; - - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; - - if (strcasecmp(key, "showConnected") == 0) + json_object_object_foreach(module, key, val) { - options.showDisconnected = data->ffjson_object_get_boolean(val); - continue; - } + if (strcasecmp(key, "type") == 0) + continue; - ffPrintError(instance, FF_BLUETOOTH_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "showConnected") == 0) + { + options.showDisconnected = json_object_get_boolean(val); + continue; + } + + ffPrintError(instance, FF_BLUETOOTH_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintBluetooth(instance, &options); diff --git a/src/modules/bluetooth/bluetooth.h b/src/modules/bluetooth/bluetooth.h index 500d39290..8350590e6 100644 --- a/src/modules/bluetooth/bluetooth.h +++ b/src/modules/bluetooth/bluetooth.h @@ -8,6 +8,6 @@ bool ffParseBluetoothCommandOptions(FFBluetoothOptions* options, const char* key void ffDestroyBluetoothOptions(FFBluetoothOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/board/board.c b/src/modules/board/board.c index 37cb8717e..01efb70c4 100644 --- a/src/modules/board/board.c +++ b/src/modules/board/board.c @@ -66,7 +66,7 @@ void ffDestroyBoardOptions(FFBoardOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseBoardJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseBoardJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_BOARD_MODULE_NAME) != 0) return false; @@ -74,15 +74,18 @@ bool ffParseBoardJsonObject(FFinstance* instance, const char* type, JSONCData* d FFBoardOptions __attribute__((__cleanup__(ffDestroyBoardOptions))) options; ffInitBoardOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; + json_object_object_foreach(module, key, val) + { + if (strcasecmp(key, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_BOARD_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + ffPrintError(instance, FF_BOARD_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintBoard(instance, &options); diff --git a/src/modules/board/board.h b/src/modules/board/board.h index 2027baf4b..4763aefeb 100644 --- a/src/modules/board/board.h +++ b/src/modules/board/board.h @@ -8,6 +8,6 @@ bool ffParseBoardCommandOptions(FFBoardOptions* options, const char* key, const void ffDestroyBoardOptions(FFBoardOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseBoardJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseBoardJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/break/break.c b/src/modules/break/break.c index 05587a6fd..4fe59425f 100644 --- a/src/modules/break/break.c +++ b/src/modules/break/break.c @@ -11,7 +11,7 @@ void ffPrintBreak(FFinstance* instance) } #ifdef FF_HAVE_JSONC -bool ffParseBreakJsonObject(FFinstance* instance, const char* type, FF_MAYBE_UNUSED JSONCData* data, FF_MAYBE_UNUSED json_object* module) +bool ffParseBreakJsonObject(FFinstance* instance, const char* type, FF_MAYBE_UNUSED json_object* module) { if (strcasecmp(type, FF_BREAK_MODULE_NAME) != 0) return false; diff --git a/src/modules/break/break.h b/src/modules/break/break.h index 81e40f5c8..5be05f55d 100644 --- a/src/modules/break/break.h +++ b/src/modules/break/break.h @@ -5,6 +5,6 @@ void ffPrintBreak(FFinstance* instance); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseBreakJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseBreakJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index a51aee300..af0e4a3f9 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -80,7 +80,7 @@ void ffDestroyBrightnessOptions(FFBrightnessOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_BRIGHTNESS_MODULE_NAME) != 0) return false; @@ -88,15 +88,18 @@ bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, JSONCDa FFBrightnessOptions __attribute__((__cleanup__(ffDestroyBrightnessOptions))) options; ffInitBrightnessOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; + json_object_object_foreach(module, key, val) + { + if (strcasecmp(key, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_BRIGHTNESS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + ffPrintError(instance, FF_BRIGHTNESS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintBrightness(instance, &options); diff --git a/src/modules/brightness/brightness.h b/src/modules/brightness/brightness.h index 5f32ddb6f..9cde955e5 100644 --- a/src/modules/brightness/brightness.h +++ b/src/modules/brightness/brightness.h @@ -8,6 +8,6 @@ bool ffParseBrightnessCommandOptions(FFBrightnessOptions* options, const char* k void ffDestroyBrightnessOptions(FFBrightnessOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/command/command.c b/src/modules/command/command.c index fcc700bcb..d2de35eb4 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -85,7 +85,7 @@ void ffDestroyCommandOptions(FFCommandOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseCommandJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseCommandJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_COMMAND_MODULE_NAME) != 0) return false; @@ -93,27 +93,30 @@ bool ffParseCommandJsonObject(FFinstance* instance, const char* type, JSONCData* FFCommandOptions __attribute__((__cleanup__(ffDestroyCommandOptions))) options; ffInitCommandOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; - - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; - - if (strcasecmp(key, "shell") == 0) + json_object_object_foreach(module, key, val) { - ffStrbufSetS(&options.shell, data->ffjson_object_get_string(val)); - continue; - } + if (strcasecmp(key, "type") == 0) + continue; - if (strcasecmp(key, "text") == 0) - { - ffStrbufSetS(&options.text, data->ffjson_object_get_string(val)); - continue; - } + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_COMMAND_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + if (strcasecmp(key, "shell") == 0) + { + ffStrbufSetS(&options.shell, json_object_get_string(val)); + continue; + } + + if (strcasecmp(key, "text") == 0) + { + ffStrbufSetS(&options.text, json_object_get_string(val)); + continue; + } + + ffPrintError(instance, FF_COMMAND_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintCommand(instance, &options); diff --git a/src/modules/command/command.h b/src/modules/command/command.h index de894975b..bcee46df7 100644 --- a/src/modules/command/command.h +++ b/src/modules/command/command.h @@ -8,6 +8,6 @@ bool ffParseCommandCommandOptions(FFCommandOptions* options, const char* key, co void ffDestroyCommandOptions(FFCommandOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseCommandJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseCommandJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/datetime/datetime.c b/src/modules/datetime/datetime.c index c3db61512..58eb07958 100644 --- a/src/modules/datetime/datetime.c +++ b/src/modules/datetime/datetime.c @@ -71,7 +71,7 @@ void ffDestroyDateTimeOptions(FFDateTimeOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_DATETIME_MODULE_NAME) != 0) return false; @@ -79,15 +79,18 @@ bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, JSONCData FFDateTimeOptions __attribute__((__cleanup__(ffDestroyDateTimeOptions))) options; ffInitDateTimeOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; + json_object_object_foreach(module, key, val) + { + if (strcasecmp(key, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_DATETIME_DISPLAY_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + ffPrintError(instance, FF_DATETIME_DISPLAY_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintDateTime(instance, &options); diff --git a/src/modules/datetime/datetime.h b/src/modules/datetime/datetime.h index 7536e3da7..1a92349e0 100644 --- a/src/modules/datetime/datetime.h +++ b/src/modules/datetime/datetime.h @@ -8,6 +8,6 @@ bool ffParseDateTimeCommandOptions(FFDateTimeOptions* options, const char* key, void ffDestroyDateTimeOptions(FFDateTimeOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/display/display.c b/src/modules/display/display.c index 798698ce3..16a7d9b00 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -159,7 +159,7 @@ void ffDestroyDisplayOptions(FFDisplayOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_DISPLAY_MODULE_NAME) != 0) return false; @@ -167,43 +167,46 @@ bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, JSONCData* FFDisplayOptions __attribute__((__cleanup__(ffDestroyDisplayOptions))) options; ffInitDisplayOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; - - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; - - if (strcasecmp(key, "compactType") == 0) + json_object_object_foreach(module, key, val) { - int value; - const char* error = ffJsonConfigParseEnum(data, val, &value, (FFKeyValuePair[]) { - { "none", FF_DISPLAY_COMPACT_TYPE_NONE }, - { "original", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT }, - { "scaled", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT }, - {}, - }); - if (error) - ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &options.moduleArgs, "Invalid %s value: %s", key, error); - else - options.compactType = (FFDisplayCompactType) value; - continue; - } + if (strcasecmp(key, "type") == 0) + continue; - if (strcasecmp(key, "detectName") == 0) - { - options.detectName = data->ffjson_object_get_boolean(val); - continue; - } + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; - if (strcasecmp(key, "preciseRefreshRate") == 0) - { - options.preciseRefreshRate = data->ffjson_object_get_boolean(val); - continue; - } + if (strcasecmp(key, "compactType") == 0) + { + int value; + const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { + { "none", FF_DISPLAY_COMPACT_TYPE_NONE }, + { "original", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT }, + { "scaled", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT }, + {}, + }); + if (error) + ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &options.moduleArgs, "Invalid %s value: %s", key, error); + else + options.compactType = (FFDisplayCompactType) value; + continue; + } - ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + if (strcasecmp(key, "detectName") == 0) + { + options.detectName = json_object_get_boolean(val); + continue; + } + + if (strcasecmp(key, "preciseRefreshRate") == 0) + { + options.preciseRefreshRate = json_object_get_boolean(val); + continue; + } + + ffPrintError(instance, FF_DISPLAY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintDisplay(instance, &options); diff --git a/src/modules/display/display.h b/src/modules/display/display.h index bb09d0e5f..8a4dea42f 100644 --- a/src/modules/display/display.h +++ b/src/modules/display/display.h @@ -8,6 +8,6 @@ bool ffParseDisplayCommandOptions(FFDisplayOptions* options, const char* key, co void ffDestroyDisplayOptions(FFDisplayOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/host/host.c b/src/modules/host/host.c index 417da2816..2ec61f6db 100644 --- a/src/modules/host/host.c +++ b/src/modules/host/host.c @@ -77,7 +77,7 @@ void ffDestroyHostOptions(FFHostOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseHostJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseHostJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_HOST_MODULE_NAME) != 0) return false; @@ -85,15 +85,18 @@ bool ffParseHostJsonObject(FFinstance* instance, const char* type, JSONCData* da FFHostOptions __attribute__((__cleanup__(ffDestroyHostOptions))) options; ffInitHostOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; + json_object_object_foreach(module, key, val) + { + if (strcasecmp(key, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_HOST_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + ffPrintError(instance, FF_HOST_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintHost(instance, &options); diff --git a/src/modules/host/host.h b/src/modules/host/host.h index c2a0ca695..3a848542b 100644 --- a/src/modules/host/host.h +++ b/src/modules/host/host.h @@ -8,6 +8,6 @@ bool ffParseHostCommandOptions(FFHostOptions* options, const char* key, const ch void ffDestroyHostOptions(FFHostOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseHostJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseHostJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index fc2e30bfd..4538cc96d 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -1,71 +1,59 @@ #include "modules/jsonconfig/jsonconfig.h" -#include "common/config.h" +#include "common/jsonconfig.h" #include "common/printing.h" #ifdef FF_HAVE_JSONC #include "common/io/io.h" +#include "common/json.h" #include "modules/modules.h" #include -static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, json_object* module) { return - ffParseTitleJsonObject(instance, type, data, module) || - ffParseBatteryJsonObject(instance, type, data, module) || - ffParseBiosJsonObject(instance, type, data, module) || - ffParseBluetoothJsonObject(instance, type, data, module) || - ffParseBoardJsonObject(instance, type, data, module) || - ffParseBreakJsonObject(instance, type, data, module) || - ffParseBrightnessJsonObject(instance, type, data, module) || - ffParseCommandJsonObject(instance, type, data, module) || - ffParseDateTimeJsonObject(instance, type, data, module) || - ffParseDisplayJsonObject(instance, type, data, module) || - ffParseHostJsonObject(instance, type, data, module) || - ffParseKernelJsonObject(instance, type, data, module) || - ffParseOSJsonObject(instance, type, data, module) || - ffParseSeparatorJsonObject(instance, type, data, module) || + ffParseTitleJsonObject(instance, type, module) || + ffParseBatteryJsonObject(instance, type, module) || + ffParseBiosJsonObject(instance, type, module) || + ffParseBluetoothJsonObject(instance, type, module) || + ffParseBoardJsonObject(instance, type, module) || + ffParseBreakJsonObject(instance, type, module) || + ffParseBrightnessJsonObject(instance, type, module) || + ffParseCommandJsonObject(instance, type, module) || + ffParseDateTimeJsonObject(instance, type, module) || + ffParseDisplayJsonObject(instance, type, module) || + ffParseHostJsonObject(instance, type, module) || + ffParseKernelJsonObject(instance, type, module) || + ffParseOSJsonObject(instance, type, module) || + ffParseSeparatorJsonObject(instance, type, module) || false; } -typedef struct JsonConfigData +static const char* parseModules(FFinstance* instance, json_object* modules) { - JSONCData data; - json_object* root; -} JsonConfigData; - -static inline void wrapJsoncFree(JsonConfigData* jsonConfig) -{ - assert(jsonConfig); - if (jsonConfig->root) - jsonConfig->data.ffjson_object_put(jsonConfig->root); -} - -static const char* parseModules(FFinstance* instance, JSONCData* data, json_object* modules) -{ - array_list* list = data->ffjson_object_get_array(modules); + array_list* list = json_object_get_array(modules); if (!list) return "modules must be an array of strings or objects"; for (size_t idx = 0; idx < list->length; ++idx) { json_object* module = (json_object*) list->array[idx]; const char* type = NULL; - if (data->ffjson_object_is_type(module, json_type_string)) + if (json_object_is_type(module, json_type_string)) { - type = data->ffjson_object_get_string(module); + type = json_object_get_string(module); module = NULL; } - else if (data->ffjson_object_is_type(module, json_type_object)) + else if (json_object_is_type(module, json_type_object)) { - json_object* object = data->ffjson_object_object_get(module, "type"); - type = data->ffjson_object_get_string(object); + json_object* object = json_object_object_get(module, "type"); + type = json_object_get_string(object); if (!type) return "module object must contain a type key"; } else return "modules must be an array of strings or objects"; - if(!parseModuleJsonObject(instance, type, data, module)) + if(!parseModuleJsonObject(instance, type, module)) return "Unknown module type"; } @@ -74,26 +62,8 @@ static const char* parseModules(FFinstance* instance, JSONCData* data, json_obje static const char* printJsonConfig(FFinstance* instance) { - FF_LIBRARY_LOAD(libjsonc, &instance->config.libJSONC, "dlopen libjson-c" FF_LIBRARY_EXTENSION" failed", - #ifdef _WIN32 - "libjson-c-5" FF_LIBRARY_EXTENSION, -1 - #else - "libjson-c" FF_LIBRARY_EXTENSION, 5 - #endif - ) - JsonConfigData __attribute__((__cleanup__(wrapJsoncFree))) jsonConfig = {}; - JSONCData* data = &jsonConfig.data; - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_tokener_parse) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_is_type) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_array) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_boolean) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_double) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_int) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_string_len) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_string) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_object) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_object_get) - FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_put) + if (!ffJsonLoadLibrary(instance)) + return "Failed to load json-c library"; FF_STRBUF_AUTO_DESTROY content; ffStrbufInit(&content); @@ -106,11 +76,11 @@ static const char* printJsonConfig(FFinstance* instance) if (success) break; } - jsonConfig.root = data->ffjson_tokener_parse(content.chars); - if (!jsonConfig.root) + json_object* __attribute__((__cleanup__(wrapJsoncFree))) root = json_tokener_parse(content.chars); + if (!root) return "Failed to parse JSON config file"; - lh_table* rootObject = data->ffjson_object_get_object(jsonConfig.root); + lh_table* rootObject = json_object_get_object(root); if (!rootObject) return "Invalid JSON config format. Root value must be an object"; @@ -118,11 +88,11 @@ static const char* printJsonConfig(FFinstance* instance) lh_foreach(rootObject, entry) { const char* key = (const char *)lh_entry_k(entry); - json_object* val = (struct json_object *)lh_entry_v(entry); + json_object* val = (json_object *)lh_entry_v(entry); if (strcmp(key, "modules") == 0) { - const char* error = parseModules(instance, data, val); + const char* error = parseModules(instance, val); if (error) return error; } else diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c index c1abfa977..6bbd06bf9 100644 --- a/src/modules/kernel/kernel.c +++ b/src/modules/kernel/kernel.c @@ -52,7 +52,7 @@ void ffDestroyKernelOptions(FFKernelOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseKernelJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseKernelJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_KERNEL_MODULE_NAME) != 0) return false; @@ -60,15 +60,18 @@ bool ffParseKernelJsonObject(FFinstance* instance, const char* type, JSONCData* FFKernelOptions __attribute__((__cleanup__(ffDestroyKernelOptions))) options; ffInitKernelOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; + json_object_object_foreach(module, key, val) + { + if (strcasecmp(key, "type") == 0) + continue; - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; - ffPrintError(instance, FF_KERNEL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + ffPrintError(instance, FF_KERNEL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintKernel(instance, &options); diff --git a/src/modules/kernel/kernel.h b/src/modules/kernel/kernel.h index 7d3b55b35..1bdb63e84 100644 --- a/src/modules/kernel/kernel.h +++ b/src/modules/kernel/kernel.h @@ -9,6 +9,6 @@ bool ffParseKernelCommandOptions(FFKernelOptions* options, const char* key, cons void ffDestroyKernelOptions(FFKernelOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseKernelJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseKernelJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 2650948a9..6cb032f5e 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -175,7 +175,7 @@ void ffDestroyOSOptions(FFOSOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseOSJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseOSJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_OS_MODULE_NAME) != 0) return false; @@ -183,23 +183,26 @@ bool ffParseOSJsonObject(FFinstance* instance, const char* type, JSONCData* data FFOSOptions __attribute__((__cleanup__(ffDestroyOSOptions))) options; ffInitOSOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; - - if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) - continue; - - #if defined(__linux__) || defined(__FreeBSD__) - if (strcasecmp(key, "file") == 0) - { - ffStrbufSetS(&options.file, data->ffjson_object_get_string(val)); + json_object_object_foreach(module, key, val) + { + if (strcasecmp(key, "type") == 0) continue; - } - #endif - ffPrintError(instance, FF_OS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + #if defined(__linux__) || defined(__FreeBSD__) + if (strcasecmp(key, "file") == 0) + { + ffStrbufSetS(&options.file, json_object_get_string(val)); + continue; + } + #endif + + ffPrintError(instance, FF_OS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } } ffPrintOS(instance, &options); diff --git a/src/modules/os/os.h b/src/modules/os/os.h index 9d66a32d4..dc685a687 100644 --- a/src/modules/os/os.h +++ b/src/modules/os/os.h @@ -9,6 +9,6 @@ bool ffParseOSCommandOptions(FFOSOptions* options, const char* key, const char* void ffDestroyOSOptions(FFOSOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseOSJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseOSJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index 7fd4bc615..d40602b08 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -61,7 +61,7 @@ void ffDestroySeparatorOptions(FFSeparatorOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_SEPARATOR_MODULE_NAME) != 0) return false; @@ -69,18 +69,21 @@ bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, JSONCDat FFSeparatorOptions __attribute__((__cleanup__(ffDestroySeparatorOptions))) options; ffInitSeparatorOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; - - if (strcasecmp(key, "string") == 0) + json_object_object_foreach(module, key, val) { - ffStrbufSetS(&options.string, data->ffjson_object_get_string(val)); - continue; - } + if (strcasecmp(key, "type") == 0) + continue; - ffPrintErrorString(instance, FF_SEPARATOR_MODULE_NAME, 0, NULL, NULL, "Unknown JSON key %s", key); + if (strcasecmp(key, "string") == 0) + { + ffStrbufSetS(&options.string, json_object_get_string(val)); + continue; + } + + ffPrintErrorString(instance, FF_SEPARATOR_MODULE_NAME, 0, NULL, NULL, "Unknown JSON key %s", key); + } } ffPrintSeparator(instance, &options); diff --git a/src/modules/separator/separator.h b/src/modules/separator/separator.h index 295afa215..dccebb0c4 100644 --- a/src/modules/separator/separator.h +++ b/src/modules/separator/separator.h @@ -9,6 +9,6 @@ bool ffParseSeparatorCommandOptions(FFSeparatorOptions* options, const char* key void ffDestroySeparatorOptions(FFSeparatorOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, json_object* module); #endif diff --git a/src/modules/title/title.c b/src/modules/title/title.c index 88cae7e77..118090af6 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -61,7 +61,7 @@ void ffDestroyTitleOptions(FFTitleOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseTitleJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +bool ffParseTitleJsonObject(FFinstance* instance, const char* type, json_object* module) { if (strcasecmp(type, FF_TITLE_MODULE_NAME) != 0) return false; @@ -69,18 +69,21 @@ bool ffParseTitleJsonObject(FFinstance* instance, const char* type, JSONCData* d FFTitleOptions __attribute__((__cleanup__(ffDestroyTitleOptions))) options; ffInitTitleOptions(&options); - FF_JSON_OBJECT_OBJECT_FOREACH(data, module, key, val) + if (module) { - if (strcasecmp(key, "type") == 0) - continue; - - if (strcasecmp(key, "fdqn") == 0) + json_object_object_foreach(module, key, val) { - options.fdqn = data->ffjson_object_get_boolean(val); - continue; - } + if (strcasecmp(key, "type") == 0) + continue; - ffPrintErrorString(instance, FF_TITLE_MODULE_NAME, 0, NULL, NULL, "Unknown JSON key %s", key); + if (strcasecmp(key, "fdqn") == 0) + { + options.fdqn = json_object_get_boolean(val); + continue; + } + + ffPrintErrorString(instance, FF_TITLE_MODULE_NAME, 0, NULL, NULL, "Unknown JSON key %s", key); + } } ffPrintTitle(instance, &options); diff --git a/src/modules/title/title.h b/src/modules/title/title.h index b361e72c7..7d0a8a609 100644 --- a/src/modules/title/title.h +++ b/src/modules/title/title.h @@ -9,6 +9,6 @@ bool ffParseTitleCommandOptions(FFTitleOptions* options, const char* key, const void ffDestroyTitleOptions(FFTitleOptions* options); #ifdef FF_HAVE_JSONC -#include "common/config.h" -bool ffParseTitleJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#include "common/jsonconfig.h" +bool ffParseTitleJsonObject(FFinstance* instance, const char* type, json_object* module); #endif From ff721218f5bfae91b76f95f989f34082d012295f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 15 Mar 2023 16:54:50 +0800 Subject: [PATCH 26/71] JsonConfig: simplify code --- src/common/json.c | 16 +++++ src/fastfetch.c | 24 ++++---- src/modules/battery/battery.c | 10 +--- src/modules/battery/battery.h | 4 +- src/modules/bios/bios.c | 10 +--- src/modules/bios/bios.h | 4 +- src/modules/bluetooth/bluetooth.c | 10 +--- src/modules/bluetooth/bluetooth.h | 4 +- src/modules/board/board.c | 10 +--- src/modules/board/board.h | 4 +- src/modules/break/break.c | 10 +--- src/modules/break/break.h | 4 +- src/modules/brightness/brightness.c | 10 +--- src/modules/brightness/brightness.h | 4 +- src/modules/command/command.c | 11 +--- src/modules/command/command.h | 4 +- src/modules/datetime/datetime.c | 10 +--- src/modules/datetime/datetime.h | 4 +- src/modules/display/display.c | 10 +--- src/modules/display/display.h | 4 +- src/modules/host/host.c | 10 +--- src/modules/host/host.h | 4 +- src/modules/jsonconfig/jsonconfig.c | 93 +++++++++++++++++++++++------ src/modules/jsonconfig/jsonconfig.h | 2 + src/modules/kernel/kernel.c | 10 +--- src/modules/kernel/kernel.h | 4 +- src/modules/os/os.c | 10 +--- src/modules/os/os.h | 4 +- src/modules/separator/separator.c | 11 +--- src/modules/separator/separator.h | 4 +- src/modules/title/title.c | 11 +--- src/modules/title/title.h | 4 +- 32 files changed, 162 insertions(+), 172 deletions(-) diff --git a/src/common/json.c b/src/common/json.c index cfbcd1f64..053854675 100644 --- a/src/common/json.c +++ b/src/common/json.c @@ -18,7 +18,9 @@ typedef struct FFJsonLibrary FF_LIBRARY_SYMBOL(json_object_get_string_len) FF_LIBRARY_SYMBOL(json_object_get_string) FF_LIBRARY_SYMBOL(json_object_get_object) + FF_LIBRARY_SYMBOL(json_object_object_del) FF_LIBRARY_SYMBOL(json_object_object_get) + FF_LIBRARY_SYMBOL(json_object_object_length) FF_LIBRARY_SYMBOL(json_object_put) } FFJsonLibrary; @@ -43,7 +45,9 @@ static const FFJsonLibrary* loadLibSymbols(const FFinstance* instance) FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_get_string_len, NULL) FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_get_string, NULL) FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_get_object, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_object_del, NULL) FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_object_get, NULL) + FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_object_length, NULL) FF_LIBRARY_LOAD_SYMBOL_VAR(libjsonc, lib, json_object_put, NULL) libjsonc = NULL; // don't dlclose automatically return &lib; @@ -124,12 +128,24 @@ struct lh_table *json_object_get_object(const json_object *obj) return ffJsonLib->ffjson_object_get_object(obj); } +void json_object_object_del(struct json_object *obj, const char *key) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_object_del(obj, key); +} + struct json_object *json_object_object_get(const json_object *obj, const char *key) { assert(ffJsonLib); return ffJsonLib->ffjson_object_object_get(obj, key); } +int json_object_object_length(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_object_length(obj); +} + int json_object_put(json_object *obj) { assert(ffJsonLib); diff --git a/src/fastfetch.c b/src/fastfetch.c index aafdbabd1..80df7fc42 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1251,23 +1251,23 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char if(strcasecmp(line, "break") == 0) ffPrintBreak(instance); - else if(strcasecmp(line, "title") == 0) + else if(strcasecmp(line, FF_TITLE_MODULE_NAME) == 0) ffPrintTitle(instance, &instance->config.title); - else if(strcasecmp(line, "separator") == 0) + else if(strcasecmp(line, FF_SEPARATOR_MODULE_NAME) == 0) ffPrintSeparator(instance, &instance->config.separator); - else if(strcasecmp(line, "os") == 0) + else if(strcasecmp(line, FF_OS_MODULE_NAME) == 0) ffPrintOS(instance, &instance->config.os); - else if(strcasecmp(line, "host") == 0) + else if(strcasecmp(line, FF_HOST_MODULE_NAME) == 0) ffPrintHost(instance, &instance->config.host); - else if(strcasecmp(line, "bios") == 0) + else if(strcasecmp(line, FF_BIOS_MODULE_NAME) == 0) ffPrintBios(instance, &instance->config.bios); - else if(strcasecmp(line, "board") == 0) + else if(strcasecmp(line, FF_BOARD_MODULE_NAME) == 0) ffPrintBoard(instance, &instance->config.board); - else if(strcasecmp(line, "brightness") == 0) + else if(strcasecmp(line, FF_BRIGHTNESS_MODULE_NAME) == 0) ffPrintBrightness(instance, &instance->config.brightness); else if(strcasecmp(line, "chassis") == 0) ffPrintChassis(instance); - else if(strcasecmp(line, "kernel") == 0) + else if(strcasecmp(line, FF_KERNEL_MODULE_NAME) == 0) ffPrintKernel(instance, &instance->config.kernel); else if(strcasecmp(line, "uptime") == 0) ffPrintUptime(instance); @@ -1277,7 +1277,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintPackages(instance); else if(strcasecmp(line, "shell") == 0) ffPrintShell(instance); - else if(strcasecmp(line, "display") == 0) + else if(strcasecmp(line, FF_DISPLAY_MODULE_NAME) == 0) ffPrintDisplay(instance, &instance->config.display); else if(strcasecmp(line, "desktopenvironment") == 0 || strcasecmp(line, "de") == 0) ffPrintDesktopEnvironment(instance); @@ -1329,7 +1329,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintPlayer(instance); else if(strcasecmp(line, "media") == 0) ffPrintMedia(instance); - else if(strcasecmp(line, "datetime") == 0) + else if(strcasecmp(line, FF_DATETIME_MODULE_NAME) == 0) ffPrintDateTime(instance, &instance->config.dateTime); else if(strcasecmp(line, "colors") == 0) ffPrintColors(instance); @@ -1341,7 +1341,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintOpenCL(instance); else if(strcasecmp(line, "users") == 0) ffPrintUsers(instance); - else if(strcasecmp(line, "command") == 0) + else if(strcasecmp(line, FF_COMMAND_MODULE_NAME) == 0) ffPrintCommand(instance, &instance->config.command); else if(strcasecmp(line, "bluetooth") == 0) ffPrintBluetooth(instance, &instance->config.bluetooth); @@ -1349,7 +1349,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintSound(instance); else if(strcasecmp(line, "gamepad") == 0) ffPrintGamepad(instance); - else if(strcasecmp(line, "jsonconfig") == 0) + else if(strcasecmp(line, FF_JSONCONFIG_MODULE_NAME) == 0) ffPrintJsonConfig(instance); else ffPrintErrorString(instance, line, 0, NULL, NULL, ""); diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index 38f95a40a..e3ec40eed 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -4,7 +4,6 @@ #include "detection/battery/battery.h" #include "modules/battery/battery.h" -#define FF_BATTERY_MODULE_NAME "Battery" #define FF_BATTERY_NUM_FORMAT_ARGS 5 static void printBattery(FFinstance* instance, FFBatteryOptions* options, BatteryResult* result, uint8_t index) @@ -148,11 +147,8 @@ void ffDestroyBatteryOptions(FFBatteryOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseBatteryJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_BATTERY_MODULE_NAME) != 0) - return false; - FFBatteryOptions __attribute__((__cleanup__(ffDestroyBatteryOptions))) options; ffInitBatteryOptions(&options); @@ -160,9 +156,6 @@ bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, json_objec { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -185,6 +178,5 @@ bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, json_objec } ffPrintBattery(instance, &options); - return true; } #endif diff --git a/src/modules/battery/battery.h b/src/modules/battery/battery.h index 4b69fbd10..efe7f9132 100644 --- a/src/modules/battery/battery.h +++ b/src/modules/battery/battery.h @@ -2,6 +2,8 @@ #include "fastfetch.h" +#define FF_BATTERY_MODULE_NAME "Battery" + void ffPrintBattery(FFinstance* instance, FFBatteryOptions* options); void ffInitBatteryOptions(FFBatteryOptions* options); @@ -10,5 +12,5 @@ void ffDestroyBatteryOptions(FFBatteryOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseBatteryJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseBatteryJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/bios/bios.c b/src/modules/bios/bios.c index b936bd6f3..12e79e048 100644 --- a/src/modules/bios/bios.c +++ b/src/modules/bios/bios.c @@ -3,7 +3,6 @@ #include "detection/bios/bios.h" #include "modules/bios/bios.h" -#define FF_BIOS_MODULE_NAME "Bios" #define FF_BIOS_NUM_FORMAT_ARGS 4 void ffPrintBios(FFinstance* instance, FFBiosOptions* options) @@ -68,11 +67,8 @@ void ffDestroyBiosOptions(FFBiosOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseBiosJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseBiosJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_BIOS_MODULE_NAME) != 0) - return false; - FFBiosOptions __attribute__((__cleanup__(ffDestroyBiosOptions))) options; ffInitBiosOptions(&options); @@ -80,9 +76,6 @@ bool ffParseBiosJsonObject(FFinstance* instance, const char* type, json_object* { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -91,6 +84,5 @@ bool ffParseBiosJsonObject(FFinstance* instance, const char* type, json_object* } ffPrintBios(instance, &options); - return true; } #endif diff --git a/src/modules/bios/bios.h b/src/modules/bios/bios.h index 2b9a82149..8ff5c7837 100644 --- a/src/modules/bios/bios.h +++ b/src/modules/bios/bios.h @@ -2,6 +2,8 @@ #include "fastfetch.h" +#define FF_BIOS_MODULE_NAME "Bios" + void ffPrintBios(FFinstance* instance, FFBiosOptions* options); void ffInitBiosOptions(FFBiosOptions* options); bool ffParseBiosCommandOptions(FFBiosOptions* options, const char* key, const char* value); @@ -9,5 +11,5 @@ void ffDestroyBiosOptions(FFBiosOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseBiosJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseBiosJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c index 503dfe569..1b33db8bf 100644 --- a/src/modules/bluetooth/bluetooth.c +++ b/src/modules/bluetooth/bluetooth.c @@ -2,7 +2,6 @@ #include "detection/bluetooth/bluetooth.h" #include "modules/bluetooth/bluetooth.h" -#define FF_BLUETOOTH_MODULE_NAME "Bluetooth" #define FF_BLUETOOTH_NUM_FORMAT_ARGS 4 static void printDevice(FFinstance* instance, FFBluetoothOptions* options, const FFBluetoothDevice* device, uint8_t index) @@ -89,11 +88,8 @@ void ffDestroyBluetoothOptions(FFBluetoothOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseBluetoothJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_BLUETOOTH_MODULE_NAME) != 0) - return false; - FFBluetoothOptions __attribute__((__cleanup__(ffDestroyBluetoothOptions))) options; ffInitBluetoothOptions(&options); @@ -101,9 +97,6 @@ bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, json_obj { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -118,6 +111,5 @@ bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, json_obj } ffPrintBluetooth(instance, &options); - return true; } #endif diff --git a/src/modules/bluetooth/bluetooth.h b/src/modules/bluetooth/bluetooth.h index 8350590e6..5c72b0ec7 100644 --- a/src/modules/bluetooth/bluetooth.h +++ b/src/modules/bluetooth/bluetooth.h @@ -2,6 +2,8 @@ #include "fastfetch.h" +#define FF_BLUETOOTH_MODULE_NAME "Bluetooth" + void ffPrintBluetooth(FFinstance* instance, FFBluetoothOptions* options); void ffInitBluetoothOptions(FFBluetoothOptions* options); bool ffParseBluetoothCommandOptions(FFBluetoothOptions* options, const char* key, const char* value); @@ -9,5 +11,5 @@ void ffDestroyBluetoothOptions(FFBluetoothOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseBluetoothJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseBluetoothJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/board/board.c b/src/modules/board/board.c index 01efb70c4..39c1fab01 100644 --- a/src/modules/board/board.c +++ b/src/modules/board/board.c @@ -3,7 +3,6 @@ #include "detection/board/board.h" #include "modules/board/board.h" -#define FF_BOARD_MODULE_NAME "Board" #define FF_BOARD_NUM_FORMAT_ARGS 3 void ffPrintBoard(FFinstance* instance, FFBoardOptions* options) @@ -66,11 +65,8 @@ void ffDestroyBoardOptions(FFBoardOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseBoardJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseBoardJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_BOARD_MODULE_NAME) != 0) - return false; - FFBoardOptions __attribute__((__cleanup__(ffDestroyBoardOptions))) options; ffInitBoardOptions(&options); @@ -78,9 +74,6 @@ bool ffParseBoardJsonObject(FFinstance* instance, const char* type, json_object* { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -89,6 +82,5 @@ bool ffParseBoardJsonObject(FFinstance* instance, const char* type, json_object* } ffPrintBoard(instance, &options); - return true; } #endif diff --git a/src/modules/board/board.h b/src/modules/board/board.h index 4763aefeb..10b9c6f5c 100644 --- a/src/modules/board/board.h +++ b/src/modules/board/board.h @@ -2,6 +2,8 @@ #include "fastfetch.h" +#define FF_BOARD_MODULE_NAME "Board" + void ffPrintBoard(FFinstance* instance, FFBoardOptions* options); void ffInitBoardOptions(FFBoardOptions* options); bool ffParseBoardCommandOptions(FFBoardOptions* options, const char* key, const char* value); @@ -9,5 +11,5 @@ void ffDestroyBoardOptions(FFBoardOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseBoardJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseBoardJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/break/break.c b/src/modules/break/break.c index 4fe59425f..59d205210 100644 --- a/src/modules/break/break.c +++ b/src/modules/break/break.c @@ -2,8 +2,6 @@ #include "common/printing.h" #include "modules/break/break.h" -#define FF_BREAK_MODULE_NAME "Break" - void ffPrintBreak(FFinstance* instance) { ffLogoPrintLine(instance); @@ -11,12 +9,8 @@ void ffPrintBreak(FFinstance* instance) } #ifdef FF_HAVE_JSONC -bool ffParseBreakJsonObject(FFinstance* instance, const char* type, FF_MAYBE_UNUSED json_object* module) +void ffParseBreakJsonObject(FFinstance* instance, FF_MAYBE_UNUSED json_object* module) { - if (strcasecmp(type, FF_BREAK_MODULE_NAME) != 0) - return false; - - ffPrintBreak(instance); - return true; + return ffPrintBreak(instance); } #endif diff --git a/src/modules/break/break.h b/src/modules/break/break.h index 5be05f55d..a7b34957d 100644 --- a/src/modules/break/break.h +++ b/src/modules/break/break.h @@ -2,9 +2,11 @@ #include "fastfetch.h" +#define FF_BREAK_MODULE_NAME "Break" + void ffPrintBreak(FFinstance* instance); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseBreakJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseBreakJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index af0e4a3f9..655501a98 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -3,7 +3,6 @@ #include "detection/brightness/brightness.h" #include "modules/brightness/brightness.h" -#define FF_BRIGHTNESS_MODULE_NAME "Brightness" #define FF_BRIGHTNESS_NUM_FORMAT_ARGS 2 void ffPrintBrightness(FFinstance* instance, FFBrightnessOptions* options) @@ -80,11 +79,8 @@ void ffDestroyBrightnessOptions(FFBrightnessOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseBrightnessJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_BRIGHTNESS_MODULE_NAME) != 0) - return false; - FFBrightnessOptions __attribute__((__cleanup__(ffDestroyBrightnessOptions))) options; ffInitBrightnessOptions(&options); @@ -92,9 +88,6 @@ bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, json_ob { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -103,6 +96,5 @@ bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, json_ob } ffPrintBrightness(instance, &options); - return true; } #endif diff --git a/src/modules/brightness/brightness.h b/src/modules/brightness/brightness.h index 9cde955e5..58fbbf302 100644 --- a/src/modules/brightness/brightness.h +++ b/src/modules/brightness/brightness.h @@ -2,6 +2,8 @@ #include "fastfetch.h" +#define FF_BRIGHTNESS_MODULE_NAME "Brightness" + void ffPrintBrightness(FFinstance* instance, FFBrightnessOptions* options); void ffInitBrightnessOptions(FFBrightnessOptions* options); bool ffParseBrightnessCommandOptions(FFBrightnessOptions* options, const char* key, const char* value); @@ -9,5 +11,5 @@ void ffDestroyBrightnessOptions(FFBrightnessOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseBrightnessJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseBrightnessJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/command/command.c b/src/modules/command/command.c index d2de35eb4..92768cd31 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -4,8 +4,6 @@ #include "common/processing.h" #include "modules/command/command.h" -#define FF_COMMAND_MODULE_NAME "Command" - void ffPrintCommand(FFinstance* instance, FFCommandOptions* options) { FF_STRBUF_AUTO_DESTROY result; @@ -85,11 +83,8 @@ void ffDestroyCommandOptions(FFCommandOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseCommandJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseCommandJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_COMMAND_MODULE_NAME) != 0) - return false; - FFCommandOptions __attribute__((__cleanup__(ffDestroyCommandOptions))) options; ffInitCommandOptions(&options); @@ -97,9 +92,6 @@ bool ffParseCommandJsonObject(FFinstance* instance, const char* type, json_objec { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -120,6 +112,5 @@ bool ffParseCommandJsonObject(FFinstance* instance, const char* type, json_objec } ffPrintCommand(instance, &options); - return true; } #endif diff --git a/src/modules/command/command.h b/src/modules/command/command.h index bcee46df7..9944b9bd7 100644 --- a/src/modules/command/command.h +++ b/src/modules/command/command.h @@ -2,6 +2,8 @@ #include "fastfetch.h" +#define FF_COMMAND_MODULE_NAME "Command" + void ffPrintCommand(FFinstance* instance, FFCommandOptions* options); void ffInitCommandOptions(FFCommandOptions* options); bool ffParseCommandCommandOptions(FFCommandOptions* options, const char* key, const char* value); @@ -9,5 +11,5 @@ void ffDestroyCommandOptions(FFCommandOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseCommandJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseCommandJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/datetime/datetime.c b/src/modules/datetime/datetime.c index 58eb07958..654060f77 100644 --- a/src/modules/datetime/datetime.c +++ b/src/modules/datetime/datetime.c @@ -3,7 +3,6 @@ #include "detection/datetime/datetime.h" #include "modules/datetime/datetime.h" -#define FF_DATETIME_MODULE_NAME "DateTime" #define FF_DATETIME_DISPLAY_NAME "Date & Time" #define FF_DATETIME_NUM_FORMAT_ARGS 20 @@ -71,11 +70,8 @@ void ffDestroyDateTimeOptions(FFDateTimeOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseDateTimeJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_DATETIME_MODULE_NAME) != 0) - return false; - FFDateTimeOptions __attribute__((__cleanup__(ffDestroyDateTimeOptions))) options; ffInitDateTimeOptions(&options); @@ -83,9 +79,6 @@ bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, json_obje { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -94,6 +87,5 @@ bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, json_obje } ffPrintDateTime(instance, &options); - return true; } #endif diff --git a/src/modules/datetime/datetime.h b/src/modules/datetime/datetime.h index 1a92349e0..737646611 100644 --- a/src/modules/datetime/datetime.h +++ b/src/modules/datetime/datetime.h @@ -2,6 +2,8 @@ #include "fastfetch.h" +#define FF_DATETIME_MODULE_NAME "DateTime" + void ffPrintDateTime(FFinstance* instance, FFDateTimeOptions* options); void ffInitDateTimeOptions(FFDateTimeOptions* options); bool ffParseDateTimeCommandOptions(FFDateTimeOptions* options, const char* key, const char* value); @@ -9,5 +11,5 @@ void ffDestroyDateTimeOptions(FFDateTimeOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseDateTimeJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseDateTimeJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/display/display.c b/src/modules/display/display.c index 16a7d9b00..737ad228d 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -3,7 +3,6 @@ #include "detection/displayserver/displayserver.h" #include "modules/display/display.h" -#define FF_DISPLAY_MODULE_NAME "Display" #define FF_DISPLAY_NUM_FORMAT_ARGS 7 void ffPrintDisplay(FFinstance* instance, FFDisplayOptions* options) @@ -159,11 +158,8 @@ void ffDestroyDisplayOptions(FFDisplayOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseDisplayJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_DISPLAY_MODULE_NAME) != 0) - return false; - FFDisplayOptions __attribute__((__cleanup__(ffDestroyDisplayOptions))) options; ffInitDisplayOptions(&options); @@ -171,9 +167,6 @@ bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, json_objec { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -210,6 +203,5 @@ bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, json_objec } ffPrintDisplay(instance, &options); - return true; } #endif diff --git a/src/modules/display/display.h b/src/modules/display/display.h index 8a4dea42f..f5f31627c 100644 --- a/src/modules/display/display.h +++ b/src/modules/display/display.h @@ -2,6 +2,8 @@ #include "fastfetch.h" +#define FF_DISPLAY_MODULE_NAME "Display" + void ffPrintDisplay(FFinstance* instance, FFDisplayOptions* options); void ffInitDisplayOptions(FFDisplayOptions* options); bool ffParseDisplayCommandOptions(FFDisplayOptions* options, const char* key, const char* value); @@ -9,5 +11,5 @@ void ffDestroyDisplayOptions(FFDisplayOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseDisplayJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseDisplayJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/host/host.c b/src/modules/host/host.c index 2ec61f6db..0dfd42f4c 100644 --- a/src/modules/host/host.c +++ b/src/modules/host/host.c @@ -3,7 +3,6 @@ #include "detection/host/host.h" #include "modules/host/host.h" -#define FF_HOST_MODULE_NAME "Host" #define FF_HOST_NUM_FORMAT_ARGS 5 void ffPrintHost(FFinstance* instance, FFHostOptions* options) @@ -77,11 +76,8 @@ void ffDestroyHostOptions(FFHostOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseHostJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseHostJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_HOST_MODULE_NAME) != 0) - return false; - FFHostOptions __attribute__((__cleanup__(ffDestroyHostOptions))) options; ffInitHostOptions(&options); @@ -89,9 +85,6 @@ bool ffParseHostJsonObject(FFinstance* instance, const char* type, json_object* { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -100,6 +93,5 @@ bool ffParseHostJsonObject(FFinstance* instance, const char* type, json_object* } ffPrintHost(instance, &options); - return true; } #endif diff --git a/src/modules/host/host.h b/src/modules/host/host.h index 3a848542b..9801d8010 100644 --- a/src/modules/host/host.h +++ b/src/modules/host/host.h @@ -2,6 +2,8 @@ #include "fastfetch.h" +#define FF_HOST_MODULE_NAME "Host" + void ffPrintHost(FFinstance* instance, FFHostOptions* options); void ffInitHostOptions(FFHostOptions* options); bool ffParseHostCommandOptions(FFHostOptions* options, const char* key, const char* value); @@ -9,5 +11,5 @@ void ffDestroyHostOptions(FFHostOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseHostJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseHostJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 4538cc96d..e2ee26dfb 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -9,25 +9,80 @@ #include "modules/modules.h" #include +#include -static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, json_object* module) +static inline bool tryModule(FFinstance* instance, const char* type, json_object* module, const char* moduleName, void (*const f)(FFinstance *instance, json_object *module)) { - return - ffParseTitleJsonObject(instance, type, module) || - ffParseBatteryJsonObject(instance, type, module) || - ffParseBiosJsonObject(instance, type, module) || - ffParseBluetoothJsonObject(instance, type, module) || - ffParseBoardJsonObject(instance, type, module) || - ffParseBreakJsonObject(instance, type, module) || - ffParseBrightnessJsonObject(instance, type, module) || - ffParseCommandJsonObject(instance, type, module) || - ffParseDateTimeJsonObject(instance, type, module) || - ffParseDisplayJsonObject(instance, type, module) || - ffParseHostJsonObject(instance, type, module) || - ffParseKernelJsonObject(instance, type, module) || - ffParseOSJsonObject(instance, type, module) || - ffParseSeparatorJsonObject(instance, type, module) || - false; + if (strcasecmp(type, moduleName) == 0) + { + if (module) json_object_object_del(module, "type"); // this line frees `type` + f(instance, module); + return true; + } + return false; +} + +static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_object* module) +{ + switch (toupper(type[0])) + { + case 'B': { + return + tryModule(instance, type, module, FF_BATTERY_MODULE_NAME, ffParseBatteryJsonObject) || + tryModule(instance, type, module, FF_BIOS_MODULE_NAME, ffParseBiosJsonObject) || + tryModule(instance, type, module, FF_BLUETOOTH_MODULE_NAME, ffParseBluetoothJsonObject) || + tryModule(instance, type, module, FF_BOARD_MODULE_NAME, ffParseBoardJsonObject) || + tryModule(instance, type, module, FF_BREAK_MODULE_NAME, ffParseBreakJsonObject) || + tryModule(instance, type, module, FF_BRIGHTNESS_MODULE_NAME, ffParseBrightnessJsonObject) || + false; + } + + case 'C': { + return + tryModule(instance, type, module, FF_COMMAND_MODULE_NAME, ffParseCommandJsonObject) || + false; + } + + case 'D': { + return + tryModule(instance, type, module, FF_DATETIME_MODULE_NAME, ffParseDateTimeJsonObject) || + tryModule(instance, type, module, FF_DISPLAY_MODULE_NAME, ffParseDisplayJsonObject) || + false; + } + + case 'H': { + return + tryModule(instance, type, module, FF_HOST_MODULE_NAME, ffParseHostJsonObject) || + false; + } + + case 'K': { + return + tryModule(instance, type, module, FF_KERNEL_MODULE_NAME, ffParseKernelJsonObject) || + false; + } + + case 'O': { + return + tryModule(instance, type, module, FF_OS_MODULE_NAME, ffParseOSJsonObject) || + false; + } + + case 'S': { + return + tryModule(instance, type, module, FF_SEPARATOR_MODULE_NAME, ffParseSeparatorJsonObject) || + false; + } + + case 'T': { + return + tryModule(instance, type, module, FF_TITLE_MODULE_NAME, ffParseTitleJsonObject) || + false; + } + + default: + return false; + } } static const char* parseModules(FFinstance* instance, json_object* modules) @@ -48,7 +103,9 @@ static const char* parseModules(FFinstance* instance, json_object* modules) { json_object* object = json_object_object_get(module, "type"); type = json_object_get_string(object); - if (!type) return "module object must contain a type key"; + if (!type) return "module object must contain a \"type\" key ( case sensitive )"; + if (json_object_object_length(module) == 1) // contains only Property type + module = NULL; } else return "modules must be an array of strings or objects"; diff --git a/src/modules/jsonconfig/jsonconfig.h b/src/modules/jsonconfig/jsonconfig.h index a29f7bda5..fe0b7e43a 100644 --- a/src/modules/jsonconfig/jsonconfig.h +++ b/src/modules/jsonconfig/jsonconfig.h @@ -2,4 +2,6 @@ #include "fastfetch.h" +#define FF_JSONCONFIG_MODULE_NAME "JsonConfig" + void ffPrintJsonConfig(FFinstance* instance); diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c index 6bbd06bf9..36b5e8545 100644 --- a/src/modules/kernel/kernel.c +++ b/src/modules/kernel/kernel.c @@ -2,7 +2,6 @@ #include "common/printing.h" #include "modules/kernel/kernel.h" -#define FF_KERNEL_MODULE_NAME "Kernel" #define FF_KERNEL_NUM_FORMAT_ARGS 4 void ffPrintKernel(FFinstance* instance, FFKernelOptions* options) @@ -52,11 +51,8 @@ void ffDestroyKernelOptions(FFKernelOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseKernelJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseKernelJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_KERNEL_MODULE_NAME) != 0) - return false; - FFKernelOptions __attribute__((__cleanup__(ffDestroyKernelOptions))) options; ffInitKernelOptions(&options); @@ -64,9 +60,6 @@ bool ffParseKernelJsonObject(FFinstance* instance, const char* type, json_object { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -75,6 +68,5 @@ bool ffParseKernelJsonObject(FFinstance* instance, const char* type, json_object } ffPrintKernel(instance, &options); - return true; } #endif diff --git a/src/modules/kernel/kernel.h b/src/modules/kernel/kernel.h index 1bdb63e84..ee0d78300 100644 --- a/src/modules/kernel/kernel.h +++ b/src/modules/kernel/kernel.h @@ -3,6 +3,8 @@ #include "fastfetch.h" #include "modules/kernel/option.h" +#define FF_KERNEL_MODULE_NAME "Kernel" + void ffPrintKernel(FFinstance* instance, FFKernelOptions* options); void ffInitKernelOptions(FFKernelOptions* options); bool ffParseKernelCommandOptions(FFKernelOptions* options, const char* key, const char* value); @@ -10,5 +12,5 @@ void ffDestroyKernelOptions(FFKernelOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseKernelJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseKernelJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 6cb032f5e..637c1094a 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -6,7 +6,6 @@ #include -#define FF_OS_MODULE_NAME "OS" #define FF_OS_NUM_FORMAT_ARGS 12 static void buildOutputDefault(const FFinstance* instance, const FFOSResult* os, FFstrbuf* result) @@ -175,11 +174,8 @@ void ffDestroyOSOptions(FFOSOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseOSJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseOSJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_OS_MODULE_NAME) != 0) - return false; - FFOSOptions __attribute__((__cleanup__(ffDestroyOSOptions))) options; ffInitOSOptions(&options); @@ -187,9 +183,6 @@ bool ffParseOSJsonObject(FFinstance* instance, const char* type, json_object* mo { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) continue; @@ -206,6 +199,5 @@ bool ffParseOSJsonObject(FFinstance* instance, const char* type, json_object* mo } ffPrintOS(instance, &options); - return true; } #endif diff --git a/src/modules/os/os.h b/src/modules/os/os.h index dc685a687..90e9c5981 100644 --- a/src/modules/os/os.h +++ b/src/modules/os/os.h @@ -3,6 +3,8 @@ #include "fastfetch.h" #include "modules/os/option.h" +#define FF_OS_MODULE_NAME "OS" + void ffPrintOS(FFinstance* instance, FFOSOptions* options); void ffInitOSOptions(FFOSOptions* options); bool ffParseOSCommandOptions(FFOSOptions* options, const char* key, const char* value); @@ -10,5 +12,5 @@ void ffDestroyOSOptions(FFOSOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseOSJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseOSJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index d40602b08..d693dc398 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -2,8 +2,6 @@ #include "common/printing.h" #include "modules/separator/separator.h" -#define FF_SEPARATOR_MODULE_NAME "Separator" - void ffPrintSeparator(FFinstance* instance, FFSeparatorOptions* options) { uint32_t titleLength = instance->state.titleLength; @@ -61,11 +59,8 @@ void ffDestroySeparatorOptions(FFSeparatorOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseSeparatorJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_SEPARATOR_MODULE_NAME) != 0) - return false; - FFSeparatorOptions __attribute__((__cleanup__(ffDestroySeparatorOptions))) options; ffInitSeparatorOptions(&options); @@ -73,9 +68,6 @@ bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, json_obj { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (strcasecmp(key, "string") == 0) { ffStrbufSetS(&options.string, json_object_get_string(val)); @@ -87,6 +79,5 @@ bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, json_obj } ffPrintSeparator(instance, &options); - return true; } #endif diff --git a/src/modules/separator/separator.h b/src/modules/separator/separator.h index dccebb0c4..de26799bc 100644 --- a/src/modules/separator/separator.h +++ b/src/modules/separator/separator.h @@ -3,6 +3,8 @@ #include "fastfetch.h" #include "modules/separator/option.h" +#define FF_SEPARATOR_MODULE_NAME "Separator" + void ffPrintSeparator(FFinstance* instance, FFSeparatorOptions* options); void ffInitSeparatorOptions(FFSeparatorOptions* options); bool ffParseSeparatorCommandOptions(FFSeparatorOptions* options, const char* key, const char* value); @@ -10,5 +12,5 @@ void ffDestroySeparatorOptions(FFSeparatorOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseSeparatorJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseSeparatorJsonObject(FFinstance* instance, json_object* module); #endif diff --git a/src/modules/title/title.c b/src/modules/title/title.c index 118090af6..fcdcdd3a1 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -3,8 +3,6 @@ #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) @@ -61,11 +59,8 @@ void ffDestroyTitleOptions(FFTitleOptions* options) } #ifdef FF_HAVE_JSONC -bool ffParseTitleJsonObject(FFinstance* instance, const char* type, json_object* module) +void ffParseTitleJsonObject(FFinstance* instance, json_object* module) { - if (strcasecmp(type, FF_TITLE_MODULE_NAME) != 0) - return false; - FFTitleOptions __attribute__((__cleanup__(ffDestroyTitleOptions))) options; ffInitTitleOptions(&options); @@ -73,9 +68,6 @@ bool ffParseTitleJsonObject(FFinstance* instance, const char* type, json_object* { json_object_object_foreach(module, key, val) { - if (strcasecmp(key, "type") == 0) - continue; - if (strcasecmp(key, "fdqn") == 0) { options.fdqn = json_object_get_boolean(val); @@ -87,6 +79,5 @@ bool ffParseTitleJsonObject(FFinstance* instance, const char* type, json_object* } ffPrintTitle(instance, &options); - return true; } #endif diff --git a/src/modules/title/title.h b/src/modules/title/title.h index 7d0a8a609..ab6e07eae 100644 --- a/src/modules/title/title.h +++ b/src/modules/title/title.h @@ -3,6 +3,8 @@ #include "fastfetch.h" #include "modules/title/option.h" +#define FF_TITLE_MODULE_NAME "Title" + void ffPrintTitle(FFinstance* instance, FFTitleOptions* options); void ffInitTitleOptions(FFTitleOptions* options); bool ffParseTitleCommandOptions(FFTitleOptions* options, const char* key, const char* value); @@ -10,5 +12,5 @@ void ffDestroyTitleOptions(FFTitleOptions* options); #ifdef FF_HAVE_JSONC #include "common/jsonconfig.h" -bool ffParseTitleJsonObject(FFinstance* instance, const char* type, json_object* module); +void ffParseTitleJsonObject(FFinstance* instance, json_object* module); #endif From 9209ac5773a1ead7890a74375caff246d429bb4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 15 Mar 2023 17:02:54 +0800 Subject: [PATCH 27/71] Colors: support JSON config --- CMakeLists.txt | 2 +- src/fastfetch.c | 2 +- src/modules/{ => colors}/colors.c | 8 ++++++++ src/modules/colors/colors.h | 12 ++++++++++++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + 6 files changed, 24 insertions(+), 2 deletions(-) rename src/modules/{ => colors}/colors.c (82%) create mode 100644 src/modules/colors/colors.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 162626cf4..6090b0de2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,7 +269,7 @@ set(LIBFASTFETCH_SRC src/modules/brightness/brightness.c src/modules/break/break.c src/modules/chassis.c - src/modules/colors.c + src/modules/colors/colors.c src/modules/cpu.c src/modules/cpuUsage.c src/modules/cursor.c diff --git a/src/fastfetch.c b/src/fastfetch.c index 80df7fc42..259eb23a7 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1331,7 +1331,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintMedia(instance); else if(strcasecmp(line, FF_DATETIME_MODULE_NAME) == 0) ffPrintDateTime(instance, &instance->config.dateTime); - else if(strcasecmp(line, "colors") == 0) + else if(strcasecmp(line, FF_COLORS_MODULE_NAME) == 0) ffPrintColors(instance); else if(strcasecmp(line, "vulkan") == 0) ffPrintVulkan(instance); diff --git a/src/modules/colors.c b/src/modules/colors/colors.c similarity index 82% rename from src/modules/colors.c rename to src/modules/colors/colors.c index 186a225cf..a355844c5 100644 --- a/src/modules/colors.c +++ b/src/modules/colors/colors.c @@ -1,6 +1,7 @@ #include "fastfetch.h" #include "common/printing.h" #include "util/textModifier.h" +#include "modules/colors/colors.h" void ffPrintColors(FFinstance* instance) { @@ -28,3 +29,10 @@ void ffPrintColors(FFinstance* instance) puts(FASTFETCH_TEXT_MODIFIER_RESET); } + +#ifdef FF_HAVE_JSONC +void ffParseColorsJsonObject(FFinstance* instance, FF_MAYBE_UNUSED json_object* module) +{ + return ffPrintColors(instance); +} +#endif diff --git a/src/modules/colors/colors.h b/src/modules/colors/colors.h new file mode 100644 index 000000000..11887735d --- /dev/null +++ b/src/modules/colors/colors.h @@ -0,0 +1,12 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_COLORS_MODULE_NAME "Colors" + +void ffPrintColors(FFinstance* instance); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseColorsJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index e2ee26dfb..50adc012b 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -40,6 +40,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'C': { return tryModule(instance, type, module, FF_COMMAND_MODULE_NAME, ffParseCommandJsonObject) || + tryModule(instance, type, module, FF_COLORS_MODULE_NAME, ffParseColorsJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 46ab35e4a..f9c8d51ee 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -10,6 +10,7 @@ #include "modules/board/board.h" #include "modules/break/break.h" #include "modules/command/command.h" +#include "modules/colors/colors.h" #include "modules/datetime/datetime.h" #include "modules/display/display.h" #include "modules/host/host.h" From f205982ae54d40c0d62553e16b9d1b8780f8496d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 15 Mar 2023 18:17:24 +0800 Subject: [PATCH 28/71] CPU: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 5 +- src/detection/cpu/cpu_apple.c | 2 +- src/detection/cpu/cpu_bsd.c | 4 +- src/detection/cpu/cpu_linux.c | 2 +- src/detection/cpu/cpu_windows.c | 2 +- src/fastfetch.c | 9 +-- src/fastfetch.h | 4 +- src/flashfetch.c | 2 +- src/modules/cpu.c | 56 -------------- src/modules/cpu/cpu.c | 111 ++++++++++++++++++++++++++++ src/modules/cpu/cpu.h | 15 ++++ src/modules/cpu/option.h | 13 ++++ src/modules/cpuUsage.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 17 files changed, 157 insertions(+), 75 deletions(-) delete mode 100644 src/modules/cpu.c create mode 100644 src/modules/cpu/cpu.c create mode 100644 src/modules/cpu/cpu.h create mode 100644 src/modules/cpu/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6090b0de2..aa3eef464 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -270,7 +270,7 @@ set(LIBFASTFETCH_SRC src/modules/break/break.c src/modules/chassis.c src/modules/colors/colors.c - src/modules/cpu.c + src/modules/cpu/cpu.c src/modules/cpuUsage.c src/modules/cursor.c src/modules/custom.c diff --git a/src/common/init.c b/src/common/init.c index a09e34fa8..56e1c8d2d 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -80,7 +80,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.cursor); initModuleArg(&instance->config.terminal); initModuleArg(&instance->config.terminalFont); - initModuleArg(&instance->config.cpu); + ffInitCPUOptions(&instance->config.cpu); initModuleArg(&instance->config.cpuUsage); initModuleArg(&instance->config.gpu); initModuleArg(&instance->config.memory); @@ -132,7 +132,6 @@ static void defaultConfig(FFinstance* instance) ffStrbufInit(&instance->config.libwlanapi); ffStrbufInit(&instance->config.libnm); - instance->config.cpuTemp = false; instance->config.gpuTemp = false; instance->config.gpuForceVulkan = false; @@ -316,7 +315,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.cursor); destroyModuleArg(&instance->config.terminal); destroyModuleArg(&instance->config.terminalFont); - destroyModuleArg(&instance->config.cpu); + ffDestroyCPUOptions(&instance->config.cpu); destroyModuleArg(&instance->config.cpuUsage); destroyModuleArg(&instance->config.gpu); destroyModuleArg(&instance->config.memory); diff --git a/src/detection/cpu/cpu_apple.c b/src/detection/cpu/cpu_apple.c index 3de61f93d..7f3f3598f 100644 --- a/src/detection/cpu/cpu_apple.c +++ b/src/detection/cpu/cpu_apple.c @@ -65,7 +65,7 @@ void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu) if(cpu->frequencyMax == 0.0) cpu->frequencyMax = getFrequency("hw.cpufrequency"); - if (instance->config.cpuTemp) + if (instance->config.cpu.temp) cpu->temperature = detectCpuTemp(&cpu->name); else cpu->temperature = FF_CPU_TEMP_UNSET; diff --git a/src/detection/cpu/cpu_bsd.c b/src/detection/cpu/cpu_bsd.c index 2308c8985..9f1e018d3 100644 --- a/src/detection/cpu/cpu_bsd.c +++ b/src/detection/cpu/cpu_bsd.c @@ -5,9 +5,9 @@ void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu) { FF_UNUSED(instance); - if (instance->config.cpuTemp) + if (instance->config.cpu.temp) { - FFstrbuf cpuTemp; + FF_STRBUF_AUTO_DESTROY cpuTemp; ffStrbufInit(&cpuTemp); if(ffSysctlGetString("temperature", &cpuTemp)) cpu->temperature = FF_CPU_TEMP_UNSET; diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index 202317033..d46221333 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -106,7 +106,7 @@ static void parseIsa(FFstrbuf* cpuIsa) void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu) { - if(instance->config.cpuTemp) + if(instance->config.cpu.temp) cpu->temperature = detectCPUTemp(); else cpu->temperature = FF_CPU_TEMP_UNSET; diff --git a/src/detection/cpu/cpu_windows.c b/src/detection/cpu/cpu_windows.c index b38d5bb63..13413bec3 100644 --- a/src/detection/cpu/cpu_windows.c +++ b/src/detection/cpu/cpu_windows.c @@ -51,6 +51,6 @@ void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu) ffRegReadStrbuf(hKey, L"ProcessorNameString", &cpu->name, NULL); ffRegReadStrbuf(hKey, L"VendorIdentifier", &cpu->vendor, NULL); - if(instance->config.cpuTemp) + if(instance->config.cpu.temp) ffDetectSmbiosTemp(&cpu->temperature, NULL); } diff --git a/src/fastfetch.c b/src/fastfetch.c index 259eb23a7..a2d43ad04 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1010,6 +1010,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseOSCommandOptions(&instance->config.os, key, value)) {} else if(ffParseHostCommandOptions(&instance->config.host, key, value)) {} + else if(ffParseOSCommandOptions(&instance->config.os, key, value)) {} else if(ffParseBiosCommandOptions(&instance->config.bios, key, value)) {} else if(ffParseBoardCommandOptions(&instance->config.board, key, value)) {} else if(optionParseModuleArgs(key, value, "chassis", &instance->config.chassis)) {} @@ -1032,7 +1033,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "cursor", &instance->config.cursor)) {} else if(optionParseModuleArgs(key, value, "terminal", &instance->config.terminal)) {} else if(optionParseModuleArgs(key, value, "terminal-font", &instance->config.terminalFont)) {} - else if(optionParseModuleArgs(key, value, "cpu", &instance->config.cpu)) {} + else if(ffParseCPUCommandOptions(&instance->config.cpu, key, value)) {} else if(optionParseModuleArgs(key, value, "cpu-usage", &instance->config.cpuUsage)) {} else if(optionParseModuleArgs(key, value, "gpu", &instance->config.gpu)) {} else if(optionParseModuleArgs(key, value, "memory", &instance->config.memory)) {} @@ -1121,8 +1122,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Module options// ////////////////// - else if(strcasecmp(key, "--cpu-temp") == 0) - instance->config.cpuTemp = optionParseBoolean(value); else if(strcasecmp(key, "--gpu-temp") == 0) instance->config.gpuTemp = optionParseBoolean(value); else if(strcasecmp(key, "--gpu-force-vulkan") == 0) @@ -1299,8 +1298,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintTerminal(instance); else if(strcasecmp(line, "terminalfont") == 0) ffPrintTerminalFont(instance); - else if(strcasecmp(line, "cpu") == 0) - ffPrintCPU(instance); + else if(strcasecmp(line, FF_CPU_MODULE_NAME) == 0) + ffPrintCPU(instance, &instance->config.cpu); else if(strcasecmp(line, "cpuusage") == 0) ffPrintCPUUsage(instance); else if(strcasecmp(line, "gpu") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 3fe6d3f54..3287874e1 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -116,7 +116,7 @@ typedef struct FFconfig FFModuleArgs cursor; FFModuleArgs terminal; FFModuleArgs terminalFont; - FFModuleArgs cpu; + FFCPUOptions cpu; FFModuleArgs cpuUsage; FFModuleArgs gpu; FFModuleArgs memory; @@ -166,7 +166,6 @@ typedef struct FFconfig FFstrbuf libwlanapi; FFstrbuf libnm; - bool cpuTemp; bool gpuTemp; bool gpuForceVulkan; @@ -265,7 +264,6 @@ void ffPrintFont(FFinstance* instance); void ffPrintCursor(FFinstance* instance); void ffPrintTerminal(FFinstance* instance); void ffPrintTerminalFont(FFinstance* instance); -void ffPrintCPU(FFinstance* instance); void ffPrintCPUUsage(FFinstance* instance); void ffPrintGPU(FFinstance* instance); void ffPrintMemory(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index ef097343e..06ee5c0a6 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -43,7 +43,7 @@ int main(int argc, char** argv) ffPrintCursor(&instance); ffPrintTerminal(&instance); ffPrintTerminalFont(&instance); - ffPrintCPU(&instance); + ffPrintCPU(&instance, &instance.config.cpu); ffPrintGPU(&instance); ffPrintMemory(&instance); //ffPrintSwap(&instance); diff --git a/src/modules/cpu.c b/src/modules/cpu.c deleted file mode 100644 index eb38a9805..000000000 --- a/src/modules/cpu.c +++ /dev/null @@ -1,56 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/cpu/cpu.h" - -#define FF_CPU_MODULE_NAME "CPU" -#define FF_CPU_NUM_FORMAT_ARGS 8 - -void ffPrintCPU(FFinstance* instance) -{ - const FFCPUResult* cpu = ffDetectCPU(instance); - - if(cpu->vendor.length == 0 && cpu->name.length == 0 && cpu->coresOnline <= 1) - { - ffPrintError(instance, FF_CPU_MODULE_NAME, 0, &instance->config.cpu, "No CPU detected"); - return; - } - - if(instance->config.cpu.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_CPU_MODULE_NAME, 0, &instance->config.cpu.key); - - if(cpu->name.length > 0) - ffStrbufWriteTo(&cpu->name, stdout); - else if(cpu->vendor.length > 0) - { - ffStrbufWriteTo(&cpu->vendor, stdout); - fputs(" CPU", stdout); - } - else - fputs("CPU", stdout); - - if(cpu->coresOnline > 1) - printf(" (%u)", cpu->coresOnline); - - if(cpu->frequencyMax > 0.0) - printf(" @ %.9g GHz", cpu->frequencyMax); - - if(cpu->temperature == cpu->temperature) //FF_CPU_TEMP_UNSET - printf(" - %.1f°C", cpu->temperature); - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_CPU_MODULE_NAME, 0, &instance->config.cpu, FF_CPU_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &cpu->name}, - {FF_FORMAT_ARG_TYPE_STRBUF, &cpu->vendor}, - {FF_FORMAT_ARG_TYPE_UINT16, &cpu->coresPhysical}, - {FF_FORMAT_ARG_TYPE_UINT16, &cpu->coresLogical}, - {FF_FORMAT_ARG_TYPE_UINT16, &cpu->coresOnline}, - {FF_FORMAT_ARG_TYPE_DOUBLE, &cpu->frequencyMin}, - {FF_FORMAT_ARG_TYPE_DOUBLE, &cpu->frequencyMax}, - {FF_FORMAT_ARG_TYPE_DOUBLE, &cpu->temperature} - }); - } -} diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c new file mode 100644 index 000000000..07c16c28a --- /dev/null +++ b/src/modules/cpu/cpu.c @@ -0,0 +1,111 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/cpu/cpu.h" +#include "modules/cpu/cpu.h" + +#define FF_CPU_NUM_FORMAT_ARGS 8 + +void ffPrintCPU(FFinstance* instance, FFCPUOptions* options) +{ + const FFCPUResult* cpu = ffDetectCPU(instance); + + if(cpu->vendor.length == 0 && cpu->name.length == 0 && cpu->coresOnline <= 1) + { + ffPrintError(instance, FF_CPU_MODULE_NAME, 0, &options->moduleArgs, "No CPU detected"); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_CPU_MODULE_NAME, 0, &options->moduleArgs.key); + + if(cpu->name.length > 0) + ffStrbufWriteTo(&cpu->name, stdout); + else if(cpu->vendor.length > 0) + { + ffStrbufWriteTo(&cpu->vendor, stdout); + fputs(" CPU", stdout); + } + else + fputs("CPU", stdout); + + if(cpu->coresOnline > 1) + printf(" (%u)", cpu->coresOnline); + + if(cpu->frequencyMax > 0.0) + printf(" @ %.9g GHz", cpu->frequencyMax); + + if(cpu->temperature == cpu->temperature) //FF_CPU_TEMP_UNSET + printf(" - %.1f°C", cpu->temperature); + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_CPU_MODULE_NAME, 0, &options->moduleArgs, FF_CPU_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &cpu->name}, + {FF_FORMAT_ARG_TYPE_STRBUF, &cpu->vendor}, + {FF_FORMAT_ARG_TYPE_UINT16, &cpu->coresPhysical}, + {FF_FORMAT_ARG_TYPE_UINT16, &cpu->coresLogical}, + {FF_FORMAT_ARG_TYPE_UINT16, &cpu->coresOnline}, + {FF_FORMAT_ARG_TYPE_DOUBLE, &cpu->frequencyMin}, + {FF_FORMAT_ARG_TYPE_DOUBLE, &cpu->frequencyMax}, + {FF_FORMAT_ARG_TYPE_DOUBLE, &cpu->temperature} + }); + } +} + +void ffInitCPUOptions(FFCPUOptions* options) +{ + options->moduleName = FF_CPU_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + options->temp = false; +} + +bool ffParseCPUCommandOptions(FFCPUOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_CPU_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "temp") == 0) + { + options->temp = ffOptionParseBoolean(value); + return true; + } + + return false; +} + +void ffDestroyCPUOptions(FFCPUOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseCPUJsonObject(FFinstance* instance, json_object* module) +{ + FFCPUOptions __attribute__((__cleanup__(ffDestroyCPUOptions))) options; + ffInitCPUOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "temp") == 0) + { + options.temp = (bool) json_object_get_boolean(val); + continue; + } + + ffPrintError(instance, FF_CPU_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintCPU(instance, &options); +} +#endif diff --git a/src/modules/cpu/cpu.h b/src/modules/cpu/cpu.h new file mode 100644 index 000000000..04c5c6f7a --- /dev/null +++ b/src/modules/cpu/cpu.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_CPU_MODULE_NAME "CPU" + +void ffPrintCPU(FFinstance* instance, FFCPUOptions* options); +void ffInitCPUOptions(FFCPUOptions* options); +bool ffParseCPUCommandOptions(FFCPUOptions* options, const char* key, const char* value); +void ffDestroyCPUOptions(FFCPUOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseCPUJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/cpu/option.h b/src/modules/cpu/option.h new file mode 100644 index 000000000..9e54bfeaf --- /dev/null +++ b/src/modules/cpu/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 FFCPUOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + bool temp; +} FFCPUOptions; diff --git a/src/modules/cpuUsage.c b/src/modules/cpuUsage.c index cb952a06a..73cd0b91c 100644 --- a/src/modules/cpuUsage.c +++ b/src/modules/cpuUsage.c @@ -13,7 +13,7 @@ void ffPrintCPUUsage(FFinstance* instance) if(error) { - ffPrintError(instance, FF_CPU_USAGE_MODULE_NAME, 0, &instance->config.cpu, "%s", error); + ffPrintError(instance, FF_CPU_USAGE_MODULE_NAME, 0, &instance->config.cpuUsage, "%s", error); return; } diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 50adc012b..53c1e79bc 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -39,6 +39,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'C': { return + tryModule(instance, type, module, FF_CPU_MODULE_NAME, ffParseCPUJsonObject) || tryModule(instance, type, module, FF_COMMAND_MODULE_NAME, ffParseCommandJsonObject) || tryModule(instance, type, module, FF_COLORS_MODULE_NAME, ffParseColorsJsonObject) || false; diff --git a/src/modules/modules.h b/src/modules/modules.h index f9c8d51ee..c394a62d8 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -9,6 +9,7 @@ #include "modules/brightness/brightness.h" #include "modules/board/board.h" #include "modules/break/break.h" +#include "modules/cpu/cpu.h" #include "modules/command/command.h" #include "modules/colors/colors.h" #include "modules/datetime/datetime.h" diff --git a/src/modules/options.h b/src/modules/options.h index 0777c7487..2752c3bac 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -7,6 +7,7 @@ #include "modules/bluetooth/option.h" #include "modules/board/option.h" #include "modules/brightness/option.h" +#include "modules/cpu/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" #include "modules/display/option.h" From 0f3fa38c04413406a9880e5e2408403d49bdbf70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 15 Mar 2023 20:58:37 +0800 Subject: [PATCH 29/71] TerminalFont: fix Windows Terminal detection --- src/detection/terminalfont/terminalfont.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/detection/terminalfont/terminalfont.c b/src/detection/terminalfont/terminalfont.c index 2e502861a..dbb10a8b0 100644 --- a/src/detection/terminalfont/terminalfont.c +++ b/src/detection/terminalfont/terminalfont.c @@ -102,7 +102,7 @@ static const char* detectWTProfile(json_object* profile, FFstrbuf* name, double* static const char* detectFromWTImpl(const FFinstance* instance, FFstrbuf* content, FFstrbuf* name, double* size) { - if (ffJsonLoadLibrary(instance)) + if (!ffJsonLoadLibrary(instance)) return "Failed to load json-c library"; json_object* __attribute__((__cleanup__(wrapJsoncFree))) root = json_tokener_parse(content->chars); From 305533a0d495ba7b17852afbf9006a709c21c6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 17 Mar 2023 17:56:31 +0800 Subject: [PATCH 30/71] CpuUsage: support JSON config --- CMakeLists.txt | 14 +-- src/common/init.c | 4 +- src/detection/cpuUsage/cpuUsage.h | 8 -- .../cpuUsage.c => cpuusage/cpuusage.c} | 3 +- src/detection/cpuusage/cpuusage.h | 8 ++ .../cpuusage_apple.c} | 2 +- .../cpuusage_bsd.c} | 2 +- .../cpuusage_linux.c} | 2 +- .../cpuusage_windows.c} | 2 +- src/fastfetch.c | 8 +- src/fastfetch.h | 4 +- src/flashfetch.c | 2 +- src/modules/cpuUsage.c | 42 --------- src/modules/cpuusage/cpuusage.c | 85 +++++++++++++++++++ src/modules/cpuusage/cpuusage.h | 15 ++++ src/modules/cpuusage/option.h | 11 +++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 19 files changed, 142 insertions(+), 73 deletions(-) delete mode 100644 src/detection/cpuUsage/cpuUsage.h rename src/detection/{cpuUsage/cpuUsage.c => cpuusage/cpuusage.c} (95%) create mode 100644 src/detection/cpuusage/cpuusage.h rename src/detection/{cpuUsage/cpuUsage_apple.c => cpuusage/cpuusage_apple.c} (94%) rename src/detection/{cpuUsage/cpuUsage_bsd.c => cpuusage/cpuusage_bsd.c} (93%) rename src/detection/{cpuUsage/cpuUsage_linux.c => cpuusage/cpuusage_linux.c} (95%) rename src/detection/{cpuUsage/cpuUsage_windows.c => cpuusage/cpuusage_windows.c} (97%) delete mode 100644 src/modules/cpuUsage.c create mode 100644 src/modules/cpuusage/cpuusage.c create mode 100644 src/modules/cpuusage/cpuusage.h create mode 100644 src/modules/cpuusage/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index aa3eef464..0f9447715 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -241,7 +241,7 @@ set(LIBFASTFETCH_SRC src/common/settings.c src/detection/bluetooth/bluetooth.c src/detection/cpu/cpu.c - src/detection/cpuUsage/cpuUsage.c + src/detection/cpuusage/cpuusage.c src/detection/datetime/datetime.c src/detection/disk/disk.c src/detection/displayserver/displayserver.c @@ -271,7 +271,7 @@ set(LIBFASTFETCH_SRC src/modules/chassis.c src/modules/colors/colors.c src/modules/cpu/cpu.c - src/modules/cpuUsage.c + src/modules/cpuusage/cpuusage.c src/modules/cursor.c src/modules/custom.c src/modules/command/command.c @@ -333,7 +333,7 @@ if(LINUX) src/detection/brightness/brightness_linux.c src/detection/chassis/chassis_linux.c src/detection/cpu/cpu_linux.c - src/detection/cpuUsage/cpuUsage_linux.c + src/detection/cpuusage/cpuusage_linux.c src/detection/cursor/cursor_linux.c src/detection/bluetooth/bluetooth_linux.c src/detection/disk/disk_linux.c @@ -383,7 +383,7 @@ elseif(ANDROID) src/detection/chassis/chassis_nosupport.c src/detection/cpu/cpu_linux.c src/detection/cursor/cursor_nosupport.c - src/detection/cpuUsage/cpuUsage_linux.c + src/detection/cpuusage/cpuusage_linux.c src/detection/disk/disk_linux.c src/detection/displayserver/displayserver_nosupport.c src/detection/font/font_nosupport.c @@ -426,7 +426,7 @@ elseif(BSD) src/detection/brightness/brightness_nosupport.c src/detection/chassis/chassis_nosupport.c src/detection/cpu/cpu_bsd.c - src/detection/cpuUsage/cpuUsage_bsd.c + src/detection/cpuusage/cpuusage_bsd.c src/detection/cursor/cursor_linux.c src/detection/disk/disk_bsd.c src/detection/displayserver/linux/displayserver_linux.c @@ -475,7 +475,7 @@ elseif(APPLE) src/detection/brightness/brightness_apple.c src/detection/chassis/chassis_nosupport.c src/detection/cpu/cpu_apple.c - src/detection/cpuUsage/cpuUsage_apple.c + src/detection/cpuusage/cpuUsage_apple.c src/detection/cursor/cursor_apple.m src/detection/disk/disk_apple.m src/detection/disk/disk_bsd.c @@ -520,7 +520,7 @@ elseif(WIN32) src/detection/brightness/brightness_windows.cpp src/detection/chassis/chassis_nosupport.c src/detection/cpu/cpu_windows.c - src/detection/cpuUsage/cpuUsage_windows.c + src/detection/cpuusage/cpuusage_windows.c src/detection/cursor/cursor_windows.c src/detection/disk/disk_windows.c src/detection/displayserver/displayserver_windows.c diff --git a/src/common/init.c b/src/common/init.c index 56e1c8d2d..7d9882192 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -81,7 +81,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.terminal); initModuleArg(&instance->config.terminalFont); ffInitCPUOptions(&instance->config.cpu); - initModuleArg(&instance->config.cpuUsage); + ffInitCPUUsageOptions(&instance->config.cpuUsage); initModuleArg(&instance->config.gpu); initModuleArg(&instance->config.memory); initModuleArg(&instance->config.swap); @@ -316,7 +316,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.terminal); destroyModuleArg(&instance->config.terminalFont); ffDestroyCPUOptions(&instance->config.cpu); - destroyModuleArg(&instance->config.cpuUsage); + ffDestroyCPUUsageOptions(&instance->config.cpuUsage); destroyModuleArg(&instance->config.gpu); destroyModuleArg(&instance->config.memory); destroyModuleArg(&instance->config.swap); diff --git a/src/detection/cpuUsage/cpuUsage.h b/src/detection/cpuUsage/cpuUsage.h deleted file mode 100644 index 250b30570..000000000 --- a/src/detection/cpuUsage/cpuUsage.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#ifndef FF_INCLUDED_detection_cpu_cpuUsage -#define FF_INCLUDED_detection_cpu_cpuUsage - -const char* ffGetCpuUsageResult(double* result); - -#endif diff --git a/src/detection/cpuUsage/cpuUsage.c b/src/detection/cpuusage/cpuusage.c similarity index 95% rename from src/detection/cpuUsage/cpuUsage.c rename to src/detection/cpuusage/cpuusage.c index 88355668d..7342bbc55 100644 --- a/src/detection/cpuUsage/cpuUsage.c +++ b/src/detection/cpuusage/cpuusage.c @@ -1,6 +1,5 @@ #include "fastfetch.h" -#include "cpuUsage.h" - +#include "detection/cpuusage/cpuusage.h" #include "common/time.h" #include diff --git a/src/detection/cpuusage/cpuusage.h b/src/detection/cpuusage/cpuusage.h new file mode 100644 index 000000000..fb3c81e8e --- /dev/null +++ b/src/detection/cpuusage/cpuusage.h @@ -0,0 +1,8 @@ +#pragma once + +#ifndef FF_INCLUDED_detection_cpuusage_cpuusage +#define FF_INCLUDED_detection_cpuusage_cpuusage + +const char* ffGetCpuUsageResult(double* result); + +#endif diff --git a/src/detection/cpuUsage/cpuUsage_apple.c b/src/detection/cpuusage/cpuusage_apple.c similarity index 94% rename from src/detection/cpuUsage/cpuUsage_apple.c rename to src/detection/cpuusage/cpuusage_apple.c index d3b533f48..b94615219 100644 --- a/src/detection/cpuUsage/cpuUsage_apple.c +++ b/src/detection/cpuusage/cpuusage_apple.c @@ -1,5 +1,5 @@ #include "fastfetch.h" -#include "cpuUsage.h" +#include "detection/cpuusage/cpuusage.h" #include #include diff --git a/src/detection/cpuUsage/cpuUsage_bsd.c b/src/detection/cpuusage/cpuusage_bsd.c similarity index 93% rename from src/detection/cpuUsage/cpuUsage_bsd.c rename to src/detection/cpuusage/cpuusage_bsd.c index d96064fd4..fa1945aaa 100644 --- a/src/detection/cpuUsage/cpuUsage_bsd.c +++ b/src/detection/cpuusage/cpuusage_bsd.c @@ -1,4 +1,4 @@ -#include "cpuUsage.h" +#include "detection/cpuusage/cpuusage.h" #include #include diff --git a/src/detection/cpuUsage/cpuUsage_linux.c b/src/detection/cpuusage/cpuusage_linux.c similarity index 95% rename from src/detection/cpuUsage/cpuUsage_linux.c rename to src/detection/cpuusage/cpuusage_linux.c index 1888b2b13..78c64215e 100644 --- a/src/detection/cpuUsage/cpuUsage_linux.c +++ b/src/detection/cpuusage/cpuusage_linux.c @@ -1,5 +1,5 @@ #include "fastfetch.h" -#include "cpuUsage.h" +#include "detection/cpuusage/cpuusage.h" #include #include diff --git a/src/detection/cpuUsage/cpuUsage_windows.c b/src/detection/cpuusage/cpuusage_windows.c similarity index 97% rename from src/detection/cpuUsage/cpuUsage_windows.c rename to src/detection/cpuusage/cpuusage_windows.c index 60ebef4be..a22250d83 100644 --- a/src/detection/cpuUsage/cpuUsage_windows.c +++ b/src/detection/cpuusage/cpuusage_windows.c @@ -1,5 +1,5 @@ #include "fastfetch.h" -#include "cpuUsage.h" +#include "detection/cpuusage/cpuusage.h" #include "util/mallocHelper.h" diff --git a/src/fastfetch.c b/src/fastfetch.c index a2d43ad04..a93a8f486 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1034,7 +1034,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "terminal", &instance->config.terminal)) {} else if(optionParseModuleArgs(key, value, "terminal-font", &instance->config.terminalFont)) {} else if(ffParseCPUCommandOptions(&instance->config.cpu, key, value)) {} - else if(optionParseModuleArgs(key, value, "cpu-usage", &instance->config.cpuUsage)) {} + else if(ffParseCPUUsageCommandOptions(&instance->config.cpuUsage, key, value)) {} else if(optionParseModuleArgs(key, value, "gpu", &instance->config.gpu)) {} else if(optionParseModuleArgs(key, value, "memory", &instance->config.memory)) {} else if(optionParseModuleArgs(key, value, "swap", &instance->config.swap)) {} @@ -1300,8 +1300,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintTerminalFont(instance); else if(strcasecmp(line, FF_CPU_MODULE_NAME) == 0) ffPrintCPU(instance, &instance->config.cpu); - else if(strcasecmp(line, "cpuusage") == 0) - ffPrintCPUUsage(instance); + else if(strcasecmp(line, FF_CPUUSAGE_MODULE_NAME) == 0) + ffPrintCPUUsage(instance, &instance->config.cpuUsage); else if(strcasecmp(line, "gpu") == 0) ffPrintGPU(instance); else if(strcasecmp(line, "memory") == 0) @@ -1373,7 +1373,7 @@ int main(int argc, const char** argv) if(data.structure.length == 0) ffStrbufAppendS(&data.structure, FASTFETCH_DATATEXT_STRUCTURE); - if(ffStrbufContainIgnCaseS(&data.structure, "CPUUsage")) + if(ffStrbufContainIgnCaseS(&data.structure, FF_CPUUSAGE_MODULE_NAME)) ffPrepareCPUUsage(); if(instance.config.multithreading) diff --git a/src/fastfetch.h b/src/fastfetch.h index 3287874e1..add99a4f5 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -117,7 +117,7 @@ typedef struct FFconfig FFModuleArgs terminal; FFModuleArgs terminalFont; FFCPUOptions cpu; - FFModuleArgs cpuUsage; + FFCPUUsageOptions cpuUsage; FFModuleArgs gpu; FFModuleArgs memory; FFModuleArgs swap; @@ -242,7 +242,6 @@ void ffLogoBuiltinListAutocompletion(); //Common -void ffPrepareCPUUsage(); void ffPreparePublicIp(FFinstance* instance); void ffPrepareWeather(FFinstance* instance); @@ -264,7 +263,6 @@ void ffPrintFont(FFinstance* instance); void ffPrintCursor(FFinstance* instance); void ffPrintTerminal(FFinstance* instance); void ffPrintTerminalFont(FFinstance* instance); -void ffPrintCPUUsage(FFinstance* instance); void ffPrintGPU(FFinstance* instance); void ffPrintMemory(FFinstance* instance); void ffPrintSwap(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 06ee5c0a6..fe269f1a7 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -55,7 +55,7 @@ int main(int argc, char** argv) //ffPrintLocalIp(&instance); //ffPrintPublicIp(&instance); //ffPrintWifi(&instance); - //ffPrintCPUUsage(&instance); + //ffPrintCPUUsage(&instance, &instance.config.cpuUsage); ffPrintLocale(&instance); //ffPrintDateTime(&instance); //ffPrintDate(&instance); diff --git a/src/modules/cpuUsage.c b/src/modules/cpuUsage.c deleted file mode 100644 index 73cd0b91c..000000000 --- a/src/modules/cpuUsage.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "common/bar.h" -#include "detection/cpuUsage/cpuUsage.h" - -#define FF_CPU_USAGE_MODULE_NAME "CPU Usage" -#define FF_CPU_USAGE_NUM_FORMAT_ARGS 1 - -void ffPrintCPUUsage(FFinstance* instance) -{ - double percentage = 0.0/0.0; - const char* error = ffGetCpuUsageResult(&percentage); - - if(error) - { - ffPrintError(instance, FF_CPU_USAGE_MODULE_NAME, 0, &instance->config.cpuUsage, "%s", error); - return; - } - - if(instance->config.cpuUsage.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_CPU_USAGE_MODULE_NAME, 0, &instance->config.cpuUsage.key); - - FF_STRBUF_AUTO_DESTROY str; - ffStrbufInit(&str); - if(instance->config.percentType & FF_PERCENTAGE_TYPE_BAR_BIT) - ffAppendPercentBar(instance, &str, (uint8_t)percentage, 0, 5, 8); - if(instance->config.percentType & FF_PERCENTAGE_TYPE_NUM_BIT) - { - if(str.length > 0) - ffStrbufAppendC(&str, ' '); - ffAppendPercentNum(instance, &str, (uint8_t) percentage, 50, 80, str.length > 0); - } - ffStrbufPutTo(&str, stdout); - } - else - { - ffPrintFormat(instance, FF_CPU_USAGE_MODULE_NAME, 0, &instance->config.cpuUsage, FF_CPU_USAGE_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_DOUBLE, &percentage} - }); - } -} diff --git a/src/modules/cpuusage/cpuusage.c b/src/modules/cpuusage/cpuusage.c new file mode 100644 index 000000000..b7ccddc41 --- /dev/null +++ b/src/modules/cpuusage/cpuusage.c @@ -0,0 +1,85 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "common/bar.h" +#include "detection/cpuusage/cpuusage.h" +#include "modules/cpuusage/cpuusage.h" + +#define FF_CPUUSAGE_DISPLAY_NAME "CPU Usage" +#define FF_CPUUSAGE_NUM_FORMAT_ARGS 1 + +void ffPrintCPUUsage(FFinstance* instance, FFCPUUsageOptions* options) +{ + double percentage = 0.0/0.0; + const char* error = ffGetCpuUsageResult(&percentage); + + if(error) + { + ffPrintError(instance, FF_CPUUSAGE_DISPLAY_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_CPUUSAGE_DISPLAY_NAME, 0, &options->moduleArgs.key); + + FF_STRBUF_AUTO_DESTROY str; + ffStrbufInit(&str); + if(instance->config.percentType & FF_PERCENTAGE_TYPE_BAR_BIT) + ffAppendPercentBar(instance, &str, (uint8_t)percentage, 0, 5, 8); + if(instance->config.percentType & FF_PERCENTAGE_TYPE_NUM_BIT) + { + if(str.length > 0) + ffStrbufAppendC(&str, ' '); + ffAppendPercentNum(instance, &str, (uint8_t) percentage, 50, 80, str.length > 0); + } + ffStrbufPutTo(&str, stdout); + } + else + { + ffPrintFormat(instance, FF_CPUUSAGE_DISPLAY_NAME, 0, &options->moduleArgs, FF_CPUUSAGE_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_DOUBLE, &percentage} + }); + } +} + +void ffInitCPUUsageOptions(FFCPUUsageOptions* options) +{ + options->moduleName = FF_CPUUSAGE_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseCPUUsageCommandOptions(FFCPUUsageOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_CPUUSAGE_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyCPUUsageOptions(FFCPUUsageOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseCPUUsageJsonObject(FFinstance* instance, json_object* module) +{ + FFCPUUsageOptions __attribute__((__cleanup__(ffDestroyCPUUsageOptions))) options; + ffInitCPUUsageOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_CPUUSAGE_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintCPUUsage(instance, &options); +} +#endif diff --git a/src/modules/cpuusage/cpuusage.h b/src/modules/cpuusage/cpuusage.h new file mode 100644 index 000000000..941c7ab84 --- /dev/null +++ b/src/modules/cpuusage/cpuusage.h @@ -0,0 +1,15 @@ +#pragma once + +#define FF_CPUUSAGE_MODULE_NAME "CPUUsage" + +void ffPrepareCPUUsage(); + +void ffPrintCPUUsage(FFinstance* instance, FFCPUUsageOptions* options); +void ffInitCPUUsageOptions(FFCPUUsageOptions* options); +bool ffParseCPUUsageCommandOptions(FFCPUUsageOptions* options, const char* key, const char* value); +void ffDestroyCPUUsageOptions(FFCPUUsageOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseCPUUsageJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/cpuusage/option.h b/src/modules/cpuusage/option.h new file mode 100644 index 000000000..c779b6c5a --- /dev/null +++ b/src/modules/cpuusage/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 FFCPUUsageOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFCPUUsageOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 53c1e79bc..c96147171 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -40,6 +40,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'C': { return tryModule(instance, type, module, FF_CPU_MODULE_NAME, ffParseCPUJsonObject) || + tryModule(instance, type, module, FF_CPUUSAGE_MODULE_NAME, ffParseCPUUsageJsonObject) || tryModule(instance, type, module, FF_COMMAND_MODULE_NAME, ffParseCommandJsonObject) || tryModule(instance, type, module, FF_COLORS_MODULE_NAME, ffParseColorsJsonObject) || false; diff --git a/src/modules/modules.h b/src/modules/modules.h index c394a62d8..ade634349 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -10,6 +10,7 @@ #include "modules/board/board.h" #include "modules/break/break.h" #include "modules/cpu/cpu.h" +#include "modules/cpuusage/cpuusage.h" #include "modules/command/command.h" #include "modules/colors/colors.h" #include "modules/datetime/datetime.h" diff --git a/src/modules/options.h b/src/modules/options.h index 2752c3bac..6bd874fc3 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -8,6 +8,7 @@ #include "modules/board/option.h" #include "modules/brightness/option.h" #include "modules/cpu/option.h" +#include "modules/cpuusage/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" #include "modules/display/option.h" From 83dda3e8ab69fe82eec9e8bbbcba09414d66ec8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 20 Mar 2023 14:57:46 +0800 Subject: [PATCH 31/71] Cursor: 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/cursor.c | 55 ----------------- src/modules/cursor/cursor.c | 93 +++++++++++++++++++++++++++++ src/modules/cursor/cursor.h | 15 +++++ src/modules/cursor/option.h | 11 ++++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 130 insertions(+), 64 deletions(-) delete mode 100644 src/modules/cursor.c create mode 100644 src/modules/cursor/cursor.c create mode 100644 src/modules/cursor/cursor.h create mode 100644 src/modules/cursor/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f9447715..bd9d2029b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -272,7 +272,7 @@ set(LIBFASTFETCH_SRC src/modules/colors/colors.c src/modules/cpu/cpu.c src/modules/cpuusage/cpuusage.c - src/modules/cursor.c + src/modules/cursor/cursor.c src/modules/custom.c src/modules/command/command.c src/modules/datetime/datetime.c diff --git a/src/common/init.c b/src/common/init.c index 7d9882192..05f6ebb92 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -77,7 +77,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.theme); initModuleArg(&instance->config.icons); initModuleArg(&instance->config.font); - initModuleArg(&instance->config.cursor); + ffInitCursorOptions(&instance->config.cursor); initModuleArg(&instance->config.terminal); initModuleArg(&instance->config.terminalFont); ffInitCPUOptions(&instance->config.cpu); @@ -312,7 +312,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.theme); destroyModuleArg(&instance->config.icons); destroyModuleArg(&instance->config.font); - destroyModuleArg(&instance->config.cursor); + ffDestroyCursorOptions(&instance->config.cursor); destroyModuleArg(&instance->config.terminal); destroyModuleArg(&instance->config.terminalFont); ffDestroyCPUOptions(&instance->config.cpu); diff --git a/src/fastfetch.c b/src/fastfetch.c index a93a8f486..ac1632f2f 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1030,7 +1030,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "icons", &instance->config.icons)) {} else if(optionParseModuleArgs(key, value, "wallpaper", &instance->config.wallpaper)) {} else if(optionParseModuleArgs(key, value, "font", &instance->config.font)) {} - else if(optionParseModuleArgs(key, value, "cursor", &instance->config.cursor)) {} + else if(ffParseCursorCommandOptions(&instance->config.cursor, key, value)) {} else if(optionParseModuleArgs(key, value, "terminal", &instance->config.terminal)) {} else if(optionParseModuleArgs(key, value, "terminal-font", &instance->config.terminalFont)) {} else if(ffParseCPUCommandOptions(&instance->config.cpu, key, value)) {} @@ -1292,8 +1292,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintWallpaper(instance); else if(strcasecmp(line, "font") == 0) ffPrintFont(instance); - else if(strcasecmp(line, "cursor") == 0) - ffPrintCursor(instance); + 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, "terminalfont") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index add99a4f5..bab35e820 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -113,7 +113,7 @@ typedef struct FFconfig FFModuleArgs theme; FFModuleArgs icons; FFModuleArgs font; - FFModuleArgs cursor; + FFCursorOptions cursor; FFModuleArgs terminal; FFModuleArgs terminalFont; FFCPUOptions cpu; @@ -260,7 +260,6 @@ void ffPrintTheme(FFinstance* instance); void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); void ffPrintFont(FFinstance* instance); -void ffPrintCursor(FFinstance* instance); void ffPrintTerminal(FFinstance* instance); void ffPrintTerminalFont(FFinstance* instance); void ffPrintGPU(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index fe269f1a7..b5020c6c7 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -40,7 +40,7 @@ int main(int argc, char** argv) ffPrintTheme(&instance); ffPrintIcons(&instance); ffPrintFont(&instance); - ffPrintCursor(&instance); + ffPrintCursor(&instance, &instance.config.cursor); ffPrintTerminal(&instance); ffPrintTerminalFont(&instance); ffPrintCPU(&instance, &instance.config.cpu); diff --git a/src/modules/cursor.c b/src/modules/cursor.c deleted file mode 100644 index a5ddc90be..000000000 --- a/src/modules/cursor.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "fastfetch.h" - -#include "common/printing.h" -#include "detection/cursor/cursor.h" - -#define FF_CURSOR_MODULE_NAME "Cursor" -#define FF_CURSOR_NUM_FORMAT_ARGS 2 - -static void printCursor(FFinstance* instance, FFCursorResult* cursor) -{ - ffStrbufRemoveIgnCaseEndS(&cursor->theme, "cursors"); - ffStrbufRemoveIgnCaseEndS(&cursor->theme, "cursor"); - ffStrbufTrimRight(&cursor->theme, '_'); - ffStrbufTrimRight(&cursor->theme, '-'); - if(cursor->theme.length == 0) - ffStrbufAppendS(&cursor->theme, "default"); - - if(instance->config.cursor.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_CURSOR_MODULE_NAME, 0, &instance->config.cursor.key); - ffStrbufWriteTo(&cursor->theme, stdout); - - if(cursor->size.length > 0) - printf(" (%spx)", cursor->size.chars); - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_CURSOR_MODULE_NAME, 0, &instance->config.cursor, FF_CURSOR_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &cursor->theme}, - {FF_FORMAT_ARG_TYPE_STRBUF, &cursor->size} - }); - } -} - - -void ffPrintCursor(FFinstance* instance) -{ - FFCursorResult result; - ffStrbufInit(&result.error); - ffStrbufInit(&result.theme); - ffStrbufInit(&result.size); - - ffDetectCursor(instance, &result); - - if(result.error.length) - ffPrintError(instance, FF_CURSOR_MODULE_NAME, 0, &instance->config.cursor, "%s", result.error.chars); - else - printCursor(instance, &result); - - ffStrbufDestroy(&result.error); - ffStrbufDestroy(&result.theme); - ffStrbufDestroy(&result.size); -} diff --git a/src/modules/cursor/cursor.c b/src/modules/cursor/cursor.c new file mode 100644 index 000000000..1845fac3b --- /dev/null +++ b/src/modules/cursor/cursor.c @@ -0,0 +1,93 @@ +#include "fastfetch.h" + +#include "common/printing.h" +#include "detection/cursor/cursor.h" +#include "modules/cursor/cursor.h" + +#define FF_CURSOR_NUM_FORMAT_ARGS 2 + +void ffPrintCursor(FFinstance* instance, FFCursorOptions* options) +{ + FFCursorResult result; + ffStrbufInit(&result.error); + ffStrbufInit(&result.theme); + ffStrbufInit(&result.size); + + ffDetectCursor(instance, &result); + + if(result.error.length) + ffPrintError(instance, FF_CURSOR_MODULE_NAME, 0, &options->moduleArgs, "%s", result.error.chars); + else + { + ffStrbufRemoveIgnCaseEndS(&result.theme, "cursors"); + ffStrbufRemoveIgnCaseEndS(&result.theme, "cursor"); + ffStrbufTrimRight(&result.theme, '_'); + ffStrbufTrimRight(&result.theme, '-'); + if(result.theme.length == 0) + ffStrbufAppendS(&result.theme, "default"); + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_CURSOR_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufWriteTo(&result.theme, stdout); + + if(result.size.length > 0) + printf(" (%spx)", result.size.chars); + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_CURSOR_MODULE_NAME, 0, &options->moduleArgs, FF_CURSOR_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &result.theme}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.size} + }); + } + } + + ffStrbufDestroy(&result.error); + ffStrbufDestroy(&result.theme); + ffStrbufDestroy(&result.size); +} + +void ffInitCursorOptions(FFCursorOptions* options) +{ + options->moduleName = FF_CURSOR_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseCursorCommandOptions(FFCursorOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_CURSOR_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyCursorOptions(FFCursorOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseCursorJsonObject(FFinstance* instance, json_object* module) +{ + FFCursorOptions __attribute__((__cleanup__(ffDestroyCursorOptions))) options; + ffInitCursorOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_CURSOR_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintCursor(instance, &options); +} +#endif diff --git a/src/modules/cursor/cursor.h b/src/modules/cursor/cursor.h new file mode 100644 index 000000000..913e0668e --- /dev/null +++ b/src/modules/cursor/cursor.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_CURSOR_MODULE_NAME "Cursor" + +void ffPrintCursor(FFinstance* instance, FFCursorOptions* options); +void ffInitCursorOptions(FFCursorOptions* options); +bool ffParseCursorCommandOptions(FFCursorOptions* options, const char* key, const char* value); +void ffDestroyCursorOptions(FFCursorOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseCursorJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/cursor/option.h b/src/modules/cursor/option.h new file mode 100644 index 000000000..9a648c844 --- /dev/null +++ b/src/modules/cursor/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 FFCursorOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFCursorOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index c96147171..c287f5222 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -43,6 +43,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o tryModule(instance, type, module, FF_CPUUSAGE_MODULE_NAME, ffParseCPUUsageJsonObject) || tryModule(instance, type, module, FF_COMMAND_MODULE_NAME, ffParseCommandJsonObject) || tryModule(instance, type, module, FF_COLORS_MODULE_NAME, ffParseColorsJsonObject) || + tryModule(instance, type, module, FF_CURSOR_MODULE_NAME, ffParseCursorJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index ade634349..7b5325717 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -13,6 +13,7 @@ #include "modules/cpuusage/cpuusage.h" #include "modules/command/command.h" #include "modules/colors/colors.h" +#include "modules/cursor/cursor.h" #include "modules/datetime/datetime.h" #include "modules/display/display.h" #include "modules/host/host.h" diff --git a/src/modules/options.h b/src/modules/options.h index 6bd874fc3..9f72b93b8 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -9,6 +9,7 @@ #include "modules/brightness/option.h" #include "modules/cpu/option.h" #include "modules/cpuusage/option.h" +#include "modules/cursor/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" #include "modules/display/option.h" From e3e8c689edee50d12ae54a7fdf99b0100445a59f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 20 Mar 2023 15:46:00 +0800 Subject: [PATCH 32/71] Custom: support JSON module Note: old command options `--set` and `--set-keyless` were removed. To reuse custom module, JSON config must be used. --- CMakeLists.txt | 3 +- src/common/init.c | 2 + src/fastfetch.c | 52 ++++--------------------- src/fastfetch.h | 2 +- src/modules/custom.c | 10 ----- src/modules/custom/custom.c | 59 +++++++++++++++++++++++++++++ src/modules/custom/custom.h | 15 ++++++++ src/modules/custom/option.h | 11 ++++++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/util/FFvaluestore.c | 46 ---------------------- src/util/FFvaluestore.h | 16 -------- 13 files changed, 99 insertions(+), 120 deletions(-) delete mode 100644 src/modules/custom.c create mode 100644 src/modules/custom/custom.c create mode 100644 src/modules/custom/custom.h create mode 100644 src/modules/custom/option.h delete mode 100644 src/util/FFvaluestore.c delete mode 100644 src/util/FFvaluestore.h diff --git a/CMakeLists.txt b/CMakeLists.txt index bd9d2029b..cbcb3330f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -273,7 +273,7 @@ set(LIBFASTFETCH_SRC src/modules/cpu/cpu.c src/modules/cpuusage/cpuusage.c src/modules/cursor/cursor.c - src/modules/custom.c + src/modules/custom/custom.c src/modules/command/command.c src/modules/datetime/datetime.c src/modules/de.c @@ -316,7 +316,6 @@ set(LIBFASTFETCH_SRC src/modules/jsonconfig/jsonconfig.c src/util/FFlist.c src/util/FFstrbuf.c - src/util/FFvaluestore.c src/util/platform/FFPlatform.c src/util/stringUtils.c ) diff --git a/src/common/init.c b/src/common/init.c index 05f6ebb92..8f3013621 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -65,6 +65,7 @@ static void defaultConfig(FFinstance* instance) ffInitBrightnessOptions(&instance->config.brightness); initModuleArg(&instance->config.chassis); ffInitCommandOptions(&instance->config.command); + ffInitCustomOptions(&instance->config.custom); ffInitKernelOptions(&instance->config.kernel); initModuleArg(&instance->config.uptime); initModuleArg(&instance->config.processes); @@ -300,6 +301,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyBrightnessOptions(&instance->config.brightness); destroyModuleArg(&instance->config.chassis); ffDestroyCommandOptions(&instance->config.command); + ffDestroyCustomOptions(&instance->config.custom); ffDestroyKernelOptions(&instance->config.kernel); destroyModuleArg(&instance->config.uptime); destroyModuleArg(&instance->config.processes); diff --git a/src/fastfetch.c b/src/fastfetch.c index ac1632f2f..eac551c0f 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -3,7 +3,6 @@ #include "common/parsing.h" #include "common/io/io.h" #include "common/time.h" -#include "util/FFvaluestore.h" #include "util/stringUtils.h" #include "logo/logo.h" @@ -30,7 +29,6 @@ typedef struct CustomValue // Things only needed by fastfetch typedef struct FFdata { - FFvaluestore customValues; FFstrbuf structure; bool loadUserConfig; } FFdata; @@ -718,32 +716,6 @@ static uint32_t optionParseUInt32(const char* key, const char* value) return num; } -static void optionParseCustomValue(FFdata* data, const char* key, const char* value, bool printKey) -{ - if(value == NULL) - { - fprintf(stderr, "Error: usage: %s \n", key); - exit(411); - } - - char* separator = strchr(value, '='); - - if(separator == NULL) - { - fprintf(stderr, "Error: usage: %s , '=' missing\n", key); - exit(412); - } - - *separator = '\0'; - - bool created; - CustomValue* customValue = ffValuestoreSet(&data->customValues, value, &created); - if(created) - ffStrbufInit(&customValue->value); - ffStrbufSetS(&customValue->value, separator + 1); - customValue->printKey = printKey; -} - static void optionParseEnum(const char* argumentKey, const char* requestedKey, void* result, ...) { if(requestedKey == NULL) @@ -990,10 +962,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseColor(key, value, &instance->config.colorKeys); ffStrbufSet(&instance->config.colorTitle, &instance->config.colorKeys); } - else if(strcasecmp(key, "--set") == 0) - optionParseCustomValue(data, key, value, true); - else if(strcasecmp(key, "--set-keyless") == 0) - optionParseCustomValue(data, key, value, false); else if(strcasecmp(key, "--binary-prefix") == 0) { optionParseEnum(key, value, &instance->config.binaryPrefixType, @@ -1015,6 +983,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseBoardCommandOptions(&instance->config.board, key, value)) {} else if(optionParseModuleArgs(key, value, "chassis", &instance->config.chassis)) {} 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(optionParseModuleArgs(key, value, "processes", &instance->config.processes)) {} @@ -1239,16 +1208,9 @@ static void parseArguments(FFinstance* instance, FFdata* data, int argc, const c } } -static void parseStructureCommand(FFinstance* instance, FFdata* data, const char* line) +static void parseStructureCommand(FFinstance* instance, const char* line) { - CustomValue* customValue = ffValuestoreGet(&data->customValues, line); - if(customValue != NULL) - { - ffPrintCustom(instance, customValue->printKey ? line : NULL, customValue->value.chars); - return; - } - - if(strcasecmp(line, "break") == 0) + if(strcasecmp(line, FF_BREAK_MODULE_NAME) == 0) ffPrintBreak(instance); else if(strcasecmp(line, FF_TITLE_MODULE_NAME) == 0) ffPrintTitle(instance, &instance->config.title); @@ -1302,6 +1264,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintCPU(instance, &instance->config.cpu); else if(strcasecmp(line, FF_CPUUSAGE_MODULE_NAME) == 0) ffPrintCPUUsage(instance, &instance->config.cpuUsage); + else if(strcasecmp(line, FF_CUSTOM_MODULE_NAME) == 0) + ffPrintCustom(instance, &instance->config.custom); else if(strcasecmp(line, "gpu") == 0) ffPrintGPU(instance); else if(strcasecmp(line, "memory") == 0) @@ -1310,7 +1274,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintSwap(instance); else if(strcasecmp(line, "disk") == 0) ffPrintDisk(instance); - else if(strcasecmp(line, "battery") == 0) + else if(strcasecmp(line, FF_BATTERY_MODULE_NAME) == 0) ffPrintBattery(instance, &instance->config.battery); else if(strcasecmp(line, "poweradapter") == 0) ffPrintPowerAdapter(instance); @@ -1361,7 +1325,6 @@ int main(int argc, const char** argv) //Data stores things only needed for the configuration of fastfetch FFdata data; - ffValuestoreInit(&data.customValues, sizeof(CustomValue)); ffStrbufInitA(&data.structure, 256); data.loadUserConfig = true; @@ -1402,7 +1365,7 @@ int main(int argc, const char** argv) if(__builtin_expect(instance.config.stat, false)) ms = ffTimeGetTick(); - parseStructureCommand(&instance, &data, data.structure.chars + startIndex); + parseStructureCommand(&instance, data.structure.chars + startIndex); if(__builtin_expect(instance.config.stat, false)) { @@ -1424,7 +1387,6 @@ int main(int argc, const char** argv) ffFinish(&instance); ffStrbufDestroy(&data.structure); - ffValuestoreDestroy(&data.customValues); ffDestroyInstance(&instance); } diff --git a/src/fastfetch.h b/src/fastfetch.h index bab35e820..ab3cf6745 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -118,6 +118,7 @@ typedef struct FFconfig FFModuleArgs terminalFont; FFCPUOptions cpu; FFCPUUsageOptions cpuUsage; + FFCustomOptions custom; FFModuleArgs gpu; FFModuleArgs memory; FFModuleArgs swap; @@ -247,7 +248,6 @@ void ffPrepareWeather(FFinstance* instance); //Printing -void ffPrintCustom(FFinstance* instance, const char* key, const char* value); void ffPrintChassis(FFinstance* instance); void ffPrintUptime(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); diff --git a/src/modules/custom.c b/src/modules/custom.c deleted file mode 100644 index f91a5b69e..000000000 --- a/src/modules/custom.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "util/textModifier.h" - -void ffPrintCustom(FFinstance* instance, const char* key, const char* value) -{ - ffPrintLogoAndKey(instance, key, 0, NULL); - ffPrintUserString(value); - puts(FASTFETCH_TEXT_MODIFIER_RESET); -} diff --git a/src/modules/custom/custom.c b/src/modules/custom/custom.c new file mode 100644 index 000000000..b90f96be4 --- /dev/null +++ b/src/modules/custom/custom.c @@ -0,0 +1,59 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "modules/custom/custom.h" +#include "util/textModifier.h" + +void ffPrintCustom(FFinstance* instance, FFCustomOptions* options) +{ + if (options->moduleArgs.outputFormat.length == 0) + { + ffPrintError(instance, FF_CUSTOM_MODULE_NAME, 0, &options->moduleArgs, "output format must be set for custom module"); + return; + } + + ffPrintLogoAndKey(instance, options->moduleArgs.key.length == 0 ? NULL : FF_CUSTOM_MODULE_NAME, 0, &options->moduleArgs.key); + ffPrintUserString(options->moduleArgs.outputFormat.chars); + puts(FASTFETCH_TEXT_MODIFIER_RESET); +} + +void ffInitCustomOptions(FFCustomOptions* options) +{ + options->moduleName = FF_CUSTOM_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseCustomCommandOptions(FFCustomOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_CUSTOM_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyCustomOptions(FFCustomOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseCustomJsonObject(FFinstance* instance, json_object* module) +{ + FFCustomOptions __attribute__((__cleanup__(ffDestroyCustomOptions))) options; + ffInitCustomOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_CUSTOM_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintCustom(instance, &options); +} +#endif diff --git a/src/modules/custom/custom.h b/src/modules/custom/custom.h new file mode 100644 index 000000000..ab3873549 --- /dev/null +++ b/src/modules/custom/custom.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_CUSTOM_MODULE_NAME "Custom" + +void ffPrintCustom(FFinstance* instance, FFCustomOptions* options); +void ffInitCustomOptions(FFCustomOptions* options); +bool ffParseCustomCommandOptions(FFCustomOptions* options, const char* key, const char* value); +void ffDestroyCustomOptions(FFCustomOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseCustomJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/custom/option.h b/src/modules/custom/option.h new file mode 100644 index 000000000..f2b238831 --- /dev/null +++ b/src/modules/custom/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 FFCustomOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFCustomOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index c287f5222..65d636942 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -44,6 +44,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o tryModule(instance, type, module, FF_COMMAND_MODULE_NAME, ffParseCommandJsonObject) || tryModule(instance, type, module, FF_COLORS_MODULE_NAME, ffParseColorsJsonObject) || tryModule(instance, type, module, FF_CURSOR_MODULE_NAME, ffParseCursorJsonObject) || + tryModule(instance, type, module, FF_CUSTOM_MODULE_NAME, ffParseCustomJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 7b5325717..baa4d424a 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -14,6 +14,7 @@ #include "modules/command/command.h" #include "modules/colors/colors.h" #include "modules/cursor/cursor.h" +#include "modules/custom/custom.h" #include "modules/datetime/datetime.h" #include "modules/display/display.h" #include "modules/host/host.h" diff --git a/src/modules/options.h b/src/modules/options.h index 9f72b93b8..fb0bfad87 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -10,6 +10,7 @@ #include "modules/cpu/option.h" #include "modules/cpuusage/option.h" #include "modules/cursor/option.h" +#include "modules/custom/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" #include "modules/display/option.h" diff --git a/src/util/FFvaluestore.c b/src/util/FFvaluestore.c deleted file mode 100644 index 68040045b..000000000 --- a/src/util/FFvaluestore.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "FFvaluestore.h" - -#include - -typedef char KeyType[32]; //31 byte key + \0 - -void ffValuestoreInit(FFvaluestore* vs, uint32_t valueSize) -{ - ffListInit(vs, (uint32_t) (sizeof(KeyType) + valueSize)); -} - -void* ffValuestoreGet(FFvaluestore* vs, const char* key) -{ - for(uint32_t i = 0; i < vs->length; i++) - { - char* element = ffListGet(vs, i); - if(strcmp(element, key) == 0) - return element + sizeof(KeyType); - } - - return NULL; -} - -void* ffValuestoreSet(FFvaluestore* vs, const char* key, bool* created) -{ - char* element = ffValuestoreGet(vs, key); - if(element != NULL) - { - if(created != NULL) - *created = false; - return element; - } - - element = ffListAdd(vs); - strncpy(element, key, sizeof(KeyType) - 1); - element[sizeof(KeyType) - 1] = '\0'; - - if(created != NULL) - *created = true; - return element + sizeof(KeyType); -} - -void ffValuestoreDestroy(FFvaluestore* vs) -{ - ffListDestroy(vs); -} diff --git a/src/util/FFvaluestore.h b/src/util/FFvaluestore.h deleted file mode 100644 index 4d966837c..000000000 --- a/src/util/FFvaluestore.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#ifndef FASTFETCH_INCLUDED_FFVALUESTORE -#define FASTFETCH_INCLUDED_FFVALUESTORE - -#include "FFlist.h" -#include "FFcheckmacros.h" - -typedef FFlist FFvaluestore; - -void ffValuestoreInit(FFvaluestore* vs, uint32_t valueSize); -FF_C_NODISCARD void* ffValuestoreGet(FFvaluestore* vs, const char* key); -FF_C_NODISCARD void* ffValuestoreSet(FFvaluestore* vs, const char* key, bool* created); //created may be NULL -void ffValuestoreDestroy(FFvaluestore* vs); - -#endif From 9addc016fb9f9771f90c3117da664be85f2e3dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 26 Mar 2023 20:41:03 +0800 Subject: [PATCH 33/71] CMake: fix char case issue --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cbcb3330f..414b967b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -474,7 +474,7 @@ elseif(APPLE) src/detection/brightness/brightness_apple.c src/detection/chassis/chassis_nosupport.c src/detection/cpu/cpu_apple.c - src/detection/cpuusage/cpuUsage_apple.c + src/detection/cpuusage/cpuusage_apple.c src/detection/cursor/cursor_apple.m src/detection/disk/disk_apple.m src/detection/disk/disk_bsd.c From 2359b7e2f4aa24d78e6143017eb7f74ab917b397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 26 Mar 2023 20:42:18 +0800 Subject: [PATCH 34/71] GPU: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 10 +- src/detection/gpu/gpu.c | 2 +- src/detection/gpu/gpu.h | 9 +- src/detection/gpu/gpu_apple.c | 2 +- src/detection/gpu/gpu_linux.c | 2 +- src/fastfetch.c | 14 +- src/fastfetch.h | 9 +- src/flashfetch.c | 2 +- src/modules/gpu.c | 104 --------------- src/modules/gpu/gpu.c | 196 ++++++++++++++++++++++++++++ src/modules/gpu/gpu.h | 13 ++ src/modules/gpu/option.h | 22 ++++ src/modules/jsonconfig/jsonconfig.c | 6 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 16 files changed, 251 insertions(+), 144 deletions(-) delete mode 100644 src/modules/gpu.c create mode 100644 src/modules/gpu/gpu.c create mode 100644 src/modules/gpu/gpu.h create mode 100644 src/modules/gpu/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 414b967b0..ff92d6850 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -279,7 +279,7 @@ set(LIBFASTFETCH_SRC src/modules/de.c src/modules/disk.c src/modules/font.c - src/modules/gpu.c + src/modules/gpu/gpu.c src/modules/host/host.c src/modules/icons.c src/modules/gamepad.c diff --git a/src/common/init.c b/src/common/init.c index 8f3013621..60ad7c514 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -83,7 +83,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.terminalFont); ffInitCPUOptions(&instance->config.cpu); ffInitCPUUsageOptions(&instance->config.cpuUsage); - initModuleArg(&instance->config.gpu); + ffInitGPUOptions(&instance->config.gpu); initModuleArg(&instance->config.memory); initModuleArg(&instance->config.swap); initModuleArg(&instance->config.disk); @@ -133,12 +133,6 @@ static void defaultConfig(FFinstance* instance) ffStrbufInit(&instance->config.libwlanapi); ffStrbufInit(&instance->config.libnm); - instance->config.gpuTemp = false; - instance->config.gpuForceVulkan = false; - - instance->config.gpuHideIntegrated = false; - instance->config.gpuHideDiscrete = false; - instance->config.shellVersion = true; instance->config.terminalVersion = true; @@ -319,7 +313,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.terminalFont); ffDestroyCPUOptions(&instance->config.cpu); ffDestroyCPUUsageOptions(&instance->config.cpuUsage); - destroyModuleArg(&instance->config.gpu); + ffDestroyGPUOptions(&instance->config.gpu); destroyModuleArg(&instance->config.memory); destroyModuleArg(&instance->config.swap); destroyModuleArg(&instance->config.disk); diff --git a/src/detection/gpu/gpu.c b/src/detection/gpu/gpu.c index b50560dfe..59ac5bf68 100644 --- a/src/detection/gpu/gpu.c +++ b/src/detection/gpu/gpu.c @@ -36,7 +36,7 @@ const FFlist* ffDetectGPU(const FFinstance* instance) { FF_DETECTION_INTERNAL_GUARD(FFlist, ffListInit(&result, sizeof(FFGPUResult)); - if(instance->config.gpuForceVulkan || ffDetectGPUImpl(&result, instance) != NULL) + if(instance->config.gpu.forceVulkan || ffDetectGPUImpl(&result, instance) != NULL) { const FFVulkanResult* vulkan = ffDetectVulkan(instance); result = vulkan->gpus; diff --git a/src/detection/gpu/gpu.h b/src/detection/gpu/gpu.h index 1d34958bf..2f04a440e 100644 --- a/src/detection/gpu/gpu.h +++ b/src/detection/gpu/gpu.h @@ -14,13 +14,6 @@ extern const char* FF_GPU_VENDOR_NAME_AMD; extern const char* FF_GPU_VENDOR_NAME_INTEL; extern const char* FF_GPU_VENDOR_NAME_NVIDIA; -typedef enum FFGpuType -{ - FF_GPU_TYPE_UNKNOWN, - FF_GPU_TYPE_INTEGRATED, - FF_GPU_TYPE_DISCRETE, -} FFGpuType; - typedef struct FFGPUMemory { uint64_t total; @@ -29,7 +22,7 @@ typedef struct FFGPUMemory typedef struct FFGPUResult { - FFGpuType type; + FFGPUType type; FFstrbuf vendor; FFstrbuf name; FFstrbuf driver; diff --git a/src/detection/gpu/gpu_apple.c b/src/detection/gpu/gpu_apple.c index 3cde517c8..937b835f6 100644 --- a/src/detection/gpu/gpu_apple.c +++ b/src/detection/gpu/gpu_apple.c @@ -99,7 +99,7 @@ const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance) if(ffCfDictGetInt(properties, CFSTR("gpu-core-count"), &gpu->coreCount)) gpu->coreCount = FF_GPU_CORE_COUNT_UNSET; - if(instance->config.gpuTemp) + if(instance->config.gpu.temp) gpu->temperature = detectGpuTemp(&gpu->name); else gpu->temperature = FF_GPU_TEMP_UNSET; diff --git a/src/detection/gpu/gpu_linux.c b/src/detection/gpu/gpu_linux.c index 63697050f..d5a081fdd 100644 --- a/src/detection/gpu/gpu_linux.c +++ b/src/detection/gpu/gpu_linux.c @@ -216,7 +216,7 @@ static void pciHandleDevice(const FFinstance* instance, FFlist* results, PCIData gpu->coreCount = FF_GPU_CORE_COUNT_UNSET; gpu->temperature = FF_GPU_TEMP_UNSET; - if(instance->config.gpuTemp) + if(instance->config.gpu.temp) pciDetectTemperatur(gpu, device); } diff --git a/src/fastfetch.c b/src/fastfetch.c index eac551c0f..659e552bb 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1004,7 +1004,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con 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)) {} - else if(optionParseModuleArgs(key, value, "gpu", &instance->config.gpu)) {} + else if(ffParseGPUCommandOptions(&instance->config.gpu, key, value)) {} else if(optionParseModuleArgs(key, value, "memory", &instance->config.memory)) {} else if(optionParseModuleArgs(key, value, "swap", &instance->config.swap)) {} else if(optionParseModuleArgs(key, value, "disk", &instance->config.disk)) {} @@ -1091,14 +1091,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Module options// ////////////////// - else if(strcasecmp(key, "--gpu-temp") == 0) - instance->config.gpuTemp = optionParseBoolean(value); - else if(strcasecmp(key, "--gpu-force-vulkan") == 0) - instance->config.gpuForceVulkan = optionParseBoolean(value); - else if(strcasecmp(key, "--gpu-hide-integrated") == 0) - instance->config.gpuHideIntegrated = optionParseBoolean(value); - else if(strcasecmp(key, "--gpu-hide-discrete") == 0) - instance->config.gpuHideDiscrete = optionParseBoolean(value); else if(strcasecmp(key, "--shell-version") == 0) instance->config.shellVersion = optionParseBoolean(value); else if(strcasecmp(key, "--terminal-version") == 0) @@ -1266,8 +1258,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintCPUUsage(instance, &instance->config.cpuUsage); else if(strcasecmp(line, FF_CUSTOM_MODULE_NAME) == 0) ffPrintCustom(instance, &instance->config.custom); - else if(strcasecmp(line, "gpu") == 0) - ffPrintGPU(instance); + else if(strcasecmp(line, FF_GPU_MODULE_NAME) == 0) + ffPrintGPU(instance, &instance->config.gpu); else if(strcasecmp(line, "memory") == 0) ffPrintMemory(instance); else if(strcasecmp(line, "swap") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index ab3cf6745..887d6d040 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -119,7 +119,7 @@ typedef struct FFconfig FFCPUOptions cpu; FFCPUUsageOptions cpuUsage; FFCustomOptions custom; - FFModuleArgs gpu; + FFGPUOptions gpu; FFModuleArgs memory; FFModuleArgs swap; FFModuleArgs disk; @@ -167,12 +167,6 @@ typedef struct FFconfig FFstrbuf libwlanapi; FFstrbuf libnm; - bool gpuTemp; - bool gpuForceVulkan; - - bool gpuHideIntegrated; - bool gpuHideDiscrete; - bool shellVersion; bool terminalVersion; @@ -262,7 +256,6 @@ void ffPrintWallpaper(FFinstance* instance); void ffPrintFont(FFinstance* instance); void ffPrintTerminal(FFinstance* instance); void ffPrintTerminalFont(FFinstance* instance); -void ffPrintGPU(FFinstance* instance); void ffPrintMemory(FFinstance* instance); void ffPrintSwap(FFinstance* instance); void ffPrintDisk(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index b5020c6c7..4bbc4c765 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -44,7 +44,7 @@ int main(int argc, char** argv) ffPrintTerminal(&instance); ffPrintTerminalFont(&instance); ffPrintCPU(&instance, &instance.config.cpu); - ffPrintGPU(&instance); + ffPrintGPU(&instance, &instance.config.gpu); ffPrintMemory(&instance); //ffPrintSwap(&instance); ffPrintDisk(&instance); diff --git a/src/modules/gpu.c b/src/modules/gpu.c deleted file mode 100644 index 0033d33be..000000000 --- a/src/modules/gpu.c +++ /dev/null @@ -1,104 +0,0 @@ -#include "fastfetch.h" -#include "common/bar.h" -#include "common/parsing.h" -#include "common/printing.h" -#include "detection/host/host.h" -#include "detection/gpu/gpu.h" - -#include - -#define FF_GPU_MODULE_NAME "GPU" -#define FF_GPU_NUM_FORMAT_ARGS 6 - -static void printGPUResult(FFinstance* instance, uint8_t index, const FFGPUResult* gpu) -{ - if(instance->config.gpu.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_GPU_MODULE_NAME, index, &instance->config.gpu.key); - - FF_STRBUF_AUTO_DESTROY output; - ffStrbufInitA(&output, gpu->vendor.length + 1 + gpu->name.length); - - if(gpu->vendor.length > 0 && !ffStrbufStartsWith(&gpu->name, &gpu->vendor)) - { - ffStrbufAppend(&output, &gpu->vendor); - ffStrbufAppendC(&output, ' '); - } - - ffStrbufAppend(&output, &gpu->name); - - if(gpu->coreCount != FF_GPU_CORE_COUNT_UNSET) - ffStrbufAppendF(&output, " (%d)", gpu->coreCount); - - if(gpu->temperature == gpu->temperature) //FF_GPU_TEMP_UNSET - ffStrbufAppendF(&output, " - %.1f°C", gpu->temperature); - - if(gpu->dedicated.total != FF_GPU_VMEM_SIZE_UNSET && gpu->dedicated.total != 0) - { - ffStrbufAppendS(&output, " ("); - - if(gpu->dedicated.used != FF_GPU_VMEM_SIZE_UNSET) - { - ffParseSize(gpu->dedicated.used, instance->config.binaryPrefixType, &output); - ffStrbufAppendS(&output, " / "); - } - ffParseSize(gpu->dedicated.total, instance->config.binaryPrefixType, &output); - if(gpu->dedicated.used != FF_GPU_VMEM_SIZE_UNSET) - { - ffStrbufAppendS(&output, ", "); - ffAppendPercentNum(instance, &output, (uint8_t) (gpu->dedicated.used * 100 / gpu->dedicated.total), 50, 80, false); - } - ffStrbufAppendC(&output, ')'); - } - - ffStrbufPutTo(&output, stdout); - } - else - { - const char* type; - if(gpu->type == FF_GPU_TYPE_INTEGRATED) - type = "Integrated"; - else if(gpu->type == FF_GPU_TYPE_DISCRETE) - type = "Discrete"; - else - type = "Unknown"; - - ffPrintFormat(instance, FF_GPU_MODULE_NAME, index, &instance->config.gpu, FF_GPU_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &gpu->vendor}, - {FF_FORMAT_ARG_TYPE_STRBUF, &gpu->name}, - {FF_FORMAT_ARG_TYPE_STRBUF, &gpu->driver}, - {FF_FORMAT_ARG_TYPE_DOUBLE, &gpu->temperature}, - {FF_FORMAT_ARG_TYPE_INT, &gpu->coreCount}, - {FF_FORMAT_ARG_TYPE_STRING, type}, - }); - } -} - -void ffPrintGPU(FFinstance* instance) -{ - const FFlist* gpus = ffDetectGPU(instance); - - FFlist selectedGpus; - ffListInitA(&selectedGpus, sizeof(const FFGPUResult*), gpus->length); - - for(uint32_t i = 0; i < gpus->length; i++) - { - const FFGPUResult* gpu = ffListGet(gpus, i); - - if(gpu->type == FF_GPU_TYPE_INTEGRATED && instance->config.gpuHideIntegrated) - continue; - - if(gpu->type == FF_GPU_TYPE_DISCRETE && instance->config.gpuHideDiscrete) - continue; - - * (const FFGPUResult**) ffListAdd(&selectedGpus) = gpu; - } - - for(uint32_t i = 0; i < selectedGpus.length; i++) - printGPUResult(instance, selectedGpus.length == 1 ? 0 : (uint8_t) (i + 1), * (const FFGPUResult**) ffListGet(&selectedGpus, i)); - - if(selectedGpus.length == 0) - ffPrintError(instance, FF_GPU_MODULE_NAME, 0, &instance->config.gpu, "No GPUs found"); - - ffListDestroy(&selectedGpus); -} diff --git a/src/modules/gpu/gpu.c b/src/modules/gpu/gpu.c new file mode 100644 index 000000000..9b544c974 --- /dev/null +++ b/src/modules/gpu/gpu.c @@ -0,0 +1,196 @@ +#include "fastfetch.h" +#include "common/bar.h" +#include "common/parsing.h" +#include "common/printing.h" +#include "detection/host/host.h" +#include "detection/gpu/gpu.h" +#include "modules/gpu/gpu.h" + +#include + +#define FF_GPU_NUM_FORMAT_ARGS 6 + +static void printGPUResult(FFinstance* instance, FFGPUOptions* options, uint8_t index, const FFGPUResult* gpu) +{ + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_GPU_MODULE_NAME, index, &options->moduleArgs.key); + + FF_STRBUF_AUTO_DESTROY output; + ffStrbufInitA(&output, gpu->vendor.length + 1 + gpu->name.length); + + if(gpu->vendor.length > 0 && !ffStrbufStartsWith(&gpu->name, &gpu->vendor)) + { + ffStrbufAppend(&output, &gpu->vendor); + ffStrbufAppendC(&output, ' '); + } + + ffStrbufAppend(&output, &gpu->name); + + if(gpu->coreCount != FF_GPU_CORE_COUNT_UNSET) + ffStrbufAppendF(&output, " (%d)", gpu->coreCount); + + if(gpu->temperature == gpu->temperature) //FF_GPU_TEMP_UNSET + ffStrbufAppendF(&output, " - %.1f°C", gpu->temperature); + + if(gpu->dedicated.total != FF_GPU_VMEM_SIZE_UNSET && gpu->dedicated.total != 0) + { + ffStrbufAppendS(&output, " ("); + + if(gpu->dedicated.used != FF_GPU_VMEM_SIZE_UNSET) + { + ffParseSize(gpu->dedicated.used, instance->config.binaryPrefixType, &output); + ffStrbufAppendS(&output, " / "); + } + ffParseSize(gpu->dedicated.total, instance->config.binaryPrefixType, &output); + if(gpu->dedicated.used != FF_GPU_VMEM_SIZE_UNSET) + { + ffStrbufAppendS(&output, ", "); + ffAppendPercentNum(instance, &output, (uint8_t) (gpu->dedicated.used * 100 / gpu->dedicated.total), 50, 80, false); + } + ffStrbufAppendC(&output, ')'); + } + + ffStrbufPutTo(&output, stdout); + } + else + { + const char* type; + if(gpu->type == FF_GPU_TYPE_INTEGRATED) + type = "Integrated"; + else if(gpu->type == FF_GPU_TYPE_DISCRETE) + type = "Discrete"; + else + type = "Unknown"; + + ffPrintFormat(instance, FF_GPU_MODULE_NAME, index, &options->moduleArgs, FF_GPU_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &gpu->vendor}, + {FF_FORMAT_ARG_TYPE_STRBUF, &gpu->name}, + {FF_FORMAT_ARG_TYPE_STRBUF, &gpu->driver}, + {FF_FORMAT_ARG_TYPE_DOUBLE, &gpu->temperature}, + {FF_FORMAT_ARG_TYPE_INT, &gpu->coreCount}, + {FF_FORMAT_ARG_TYPE_STRING, type}, + }); + } +} + +void ffPrintGPU(FFinstance* instance, FFGPUOptions* options) +{ + const FFlist* gpus = ffDetectGPU(instance); + + FF_LIST_AUTO_DESTROY selectedGPUs; + ffListInitA(&selectedGPUs, sizeof(const FFGPUResult*), gpus->length); + + FF_LIST_FOR_EACH(FFGPUResult, gpu, *gpus) + { + if(gpu->type == FF_GPU_TYPE_INTEGRATED && options->hideType == FF_GPU_TYPE_INTEGRATED) + continue; + + if(gpu->type == FF_GPU_TYPE_DISCRETE && options->hideType == FF_GPU_TYPE_DISCRETE) + continue; + + * (const FFGPUResult**) ffListAdd(&selectedGPUs) = gpu; + } + + for(uint32_t i = 0; i < selectedGPUs.length; i++) + printGPUResult(instance, options, selectedGPUs.length == 1 ? 0 : (uint8_t) (i + 1), * (const FFGPUResult**) ffListGet(&selectedGPUs, i)); + + if(selectedGPUs.length == 0) + ffPrintError(instance, FF_GPU_MODULE_NAME, 0, &options->moduleArgs, "No GPUs found"); +} + +void ffInitGPUOptions(FFGPUOptions* options) +{ + options->moduleName = FF_GPU_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + options->forceVulkan = false; + options->temp = false; + options->hideType = FF_GPU_TYPE_UNKNOWN; +} + +bool ffParseGPUCommandOptions(FFGPUOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_GPU_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "force-vulkan") == 0) + { + options->forceVulkan = ffOptionParseBoolean(value); + return true; + } + + if (strcasecmp(subKey, "temp") == 0) + { + options->temp = ffOptionParseBoolean(value); + return true; + } + + if (strcasecmp(subKey, "hide-type") == 0) + { + options->hideType = (FFGPUType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { + { "none", FF_GPU_TYPE_UNKNOWN }, + { "intergrated", FF_GPU_TYPE_INTEGRATED }, + { "discrete", FF_GPU_TYPE_DISCRETE }, + {}, + }); + } + + return false; +} + +void ffDestroyGPUOptions(FFGPUOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseGPUJsonObject(FFinstance* instance, json_object* module) +{ + FFGPUOptions __attribute__((__cleanup__(ffDestroyGPUOptions))) options; + ffInitGPUOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "temp") == 0) + { + options.temp = (bool) json_object_get_boolean(val); + continue; + } + + if (strcasecmp(key, "forceVulkan") == 0) + { + options.forceVulkan = (bool) json_object_get_boolean(val); + continue; + } + + if (strcasecmp(key, "hideType") == 0) + { + int value; + const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { + { "none", FF_GPU_TYPE_UNKNOWN }, + { "intergrated", FF_GPU_TYPE_INTEGRATED }, + { "discrete", FF_GPU_TYPE_DISCRETE }, + {}, + }); + if (error) + ffPrintError(instance, FF_GPU_MODULE_NAME, 0, &options.moduleArgs, "Invalid %s value: %s", key, error); + else + options.hideType = (FFGPUType) value; + continue; + } + + ffPrintError(instance, FF_GPU_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintGPU(instance, &options); +} +#endif diff --git a/src/modules/gpu/gpu.h b/src/modules/gpu/gpu.h new file mode 100644 index 000000000..156e6ba89 --- /dev/null +++ b/src/modules/gpu/gpu.h @@ -0,0 +1,13 @@ +#pragma once + +#define FF_GPU_MODULE_NAME "GPU" + +void ffPrintGPU(FFinstance* instance, FFGPUOptions* options); +void ffInitGPUOptions(FFGPUOptions* options); +bool ffParseGPUCommandOptions(FFGPUOptions* options, const char* key, const char* value); +void ffDestroyGPUOptions(FFGPUOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseGPUJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/gpu/option.h b/src/modules/gpu/option.h new file mode 100644 index 000000000..0aaa6a6f7 --- /dev/null +++ b/src/modules/gpu/option.h @@ -0,0 +1,22 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef enum FFGPUType +{ + FF_GPU_TYPE_UNKNOWN, + FF_GPU_TYPE_INTEGRATED, + FF_GPU_TYPE_DISCRETE, +} FFGPUType; + +typedef struct FFGPUOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFGPUType hideType; + bool temp; + bool forceVulkan; +} FFGPUOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 65d636942..140b8dedc 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -55,6 +55,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'G': { + return + tryModule(instance, type, module, FF_GPU_MODULE_NAME, ffParseGPUJsonObject) || + false; + } + case 'H': { return tryModule(instance, type, module, FF_HOST_MODULE_NAME, ffParseHostJsonObject) || diff --git a/src/modules/modules.h b/src/modules/modules.h index baa4d424a..1a1d3349b 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -17,6 +17,7 @@ #include "modules/custom/custom.h" #include "modules/datetime/datetime.h" #include "modules/display/display.h" +#include "modules/gpu/gpu.h" #include "modules/host/host.h" #include "modules/kernel/kernel.h" #include "modules/separator/separator.h" diff --git a/src/modules/options.h b/src/modules/options.h index fb0bfad87..0463e7b20 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -15,6 +15,7 @@ #include "modules/datetime/option.h" #include "modules/display/option.h" #include "modules/host/option.h" +#include "modules/gpu/option.h" #include "modules/kernel/option.h" #include "modules/os/option.h" #include "modules/separator/option.h" From 623557f52159c92c8fb6565ee25ea9489d7fd97c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 2 Apr 2023 00:13:11 +0800 Subject: [PATCH 35/71] Disk: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 8 +- src/fastfetch.c | 18 +- src/fastfetch.h | 16 +- src/flashfetch.c | 2 +- src/modules/disk.c | 157 --------------- src/modules/disk/disk.c | 291 ++++++++++++++++++++++++++++ src/modules/disk/disk.h | 15 ++ src/modules/disk/option.h | 24 +++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 341 insertions(+), 195 deletions(-) delete mode 100644 src/modules/disk.c create mode 100644 src/modules/disk/disk.c create mode 100644 src/modules/disk/disk.h create mode 100644 src/modules/disk/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ff92d6850..0557ce42a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -277,7 +277,7 @@ set(LIBFASTFETCH_SRC src/modules/command/command.c src/modules/datetime/datetime.c src/modules/de.c - src/modules/disk.c + src/modules/disk/disk.c src/modules/font.c src/modules/gpu/gpu.c src/modules/host/host.c diff --git a/src/common/init.c b/src/common/init.c index 60ad7c514..bb3843cac 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -86,7 +86,7 @@ static void defaultConfig(FFinstance* instance) ffInitGPUOptions(&instance->config.gpu); initModuleArg(&instance->config.memory); initModuleArg(&instance->config.swap); - initModuleArg(&instance->config.disk); + ffInitDiskOptions(&instance->config.disk); ffInitBatteryOptions(&instance->config.battery); initModuleArg(&instance->config.powerAdapter); initModuleArg(&instance->config.locale); @@ -136,9 +136,6 @@ static void defaultConfig(FFinstance* instance) instance->config.shellVersion = true; instance->config.terminalVersion = true; - ffStrbufInitA(&instance->config.diskFolders, 0); - instance->config.diskShowTypes = FF_DISK_TYPE_REGULAR_BIT | FF_DISK_TYPE_EXTERNAL_BIT; - instance->config.soundType = FF_SOUND_TYPE_MAIN; instance->config.localIpShowType = FF_LOCALIP_TYPE_IPV4_BIT; @@ -316,7 +313,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyGPUOptions(&instance->config.gpu); destroyModuleArg(&instance->config.memory); destroyModuleArg(&instance->config.swap); - destroyModuleArg(&instance->config.disk); + ffDestroyDiskOptions(&instance->config.disk); ffDestroyBatteryOptions(&instance->config.battery); destroyModuleArg(&instance->config.powerAdapter); destroyModuleArg(&instance->config.locale); @@ -363,7 +360,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.libwlanapi); ffStrbufDestroy(&instance->config.libnm); - ffStrbufDestroy(&instance->config.diskFolders); ffStrbufDestroy(&instance->config.localIpNamePrefix); ffStrbufDestroy(&instance->config.publicIpUrl); ffStrbufDestroy(&instance->config.weatherOutputFormat); diff --git a/src/fastfetch.c b/src/fastfetch.c index 659e552bb..6a7da5b28 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1007,7 +1007,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseGPUCommandOptions(&instance->config.gpu, key, value)) {} else if(optionParseModuleArgs(key, value, "memory", &instance->config.memory)) {} else if(optionParseModuleArgs(key, value, "swap", &instance->config.swap)) {} - else if(optionParseModuleArgs(key, value, "disk", &instance->config.disk)) {} + else if(ffParseDiskCommandOptions(&instance->config.disk, key, value)) {} else if(ffParseBatteryCommandOptions(&instance->config.battery, key, value)) {} else if(optionParseModuleArgs(key, value, "poweradapter", &instance->config.powerAdapter)) {} else if(optionParseModuleArgs(key, value, "locale", &instance->config.locale)) {} @@ -1095,18 +1095,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con instance->config.shellVersion = optionParseBoolean(value); else if(strcasecmp(key, "--terminal-version") == 0) instance->config.terminalVersion = optionParseBoolean(value); - else if(strcasecmp(key, "--disk-folders") == 0) - optionParseString(key, value, &instance->config.diskFolders); - else if(strcasecmp(key, "--disk-show-regular") == 0) - optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_REGULAR_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_REGULAR_BIT); - else if(strcasecmp(key, "--disk-show-removable") == 0) - optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_EXTERNAL_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_EXTERNAL_BIT); - else if(strcasecmp(key, "--disk-show-hidden") == 0) - optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_HIDDEN_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_HIDDEN_BIT); - else if(strcasecmp(key, "--disk-show-subvolumes") == 0) - optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_SUBVOLUME_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_SUBVOLUME_BIT); - else if(strcasecmp(key, "--disk-show-unknown") == 0) - optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_UNKNOWN_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_UNKNOWN_BIT); else if(strcasecmp(key, "--sound-type") == 0) { optionParseEnum(key, value, &instance->config.soundType, @@ -1264,8 +1252,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintMemory(instance); else if(strcasecmp(line, "swap") == 0) ffPrintSwap(instance); - else if(strcasecmp(line, "disk") == 0) - ffPrintDisk(instance); + else if(strcasecmp(line, FF_DISK_MODULE_NAME) == 0) + ffPrintDisk(instance, &instance->config.disk); else if(strcasecmp(line, FF_BATTERY_MODULE_NAME) == 0) ffPrintBattery(instance, &instance->config.battery); else if(strcasecmp(line, "poweradapter") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 887d6d040..79a727e6a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -33,16 +33,6 @@ typedef enum FFLocalIpCompactType FF_LOCALIP_COMPACT_TYPE_ONELINE, } FFLocalIpCompactType; -typedef enum FFDiskType -{ - FF_DISK_TYPE_NONE = 0, - FF_DISK_TYPE_REGULAR_BIT = 1 << 0, - FF_DISK_TYPE_HIDDEN_BIT = 1 << 1, - FF_DISK_TYPE_EXTERNAL_BIT = 1 << 2, - FF_DISK_TYPE_SUBVOLUME_BIT = 1 << 3, - FF_DISK_TYPE_UNKNOWN_BIT = 1 << 4, -} FFDiskType; - typedef enum FFBinaryPrefixType { FF_BINARY_PREFIX_TYPE_IEC, // 1024 Bytes = 1 KiB, 1024 KiB = 1 MiB, ... (standard) @@ -122,7 +112,7 @@ typedef struct FFconfig FFGPUOptions gpu; FFModuleArgs memory; FFModuleArgs swap; - FFModuleArgs disk; + FFDiskOptions disk; FFBatteryOptions battery; FFModuleArgs powerAdapter; FFModuleArgs locale; @@ -170,9 +160,6 @@ typedef struct FFconfig bool shellVersion; bool terminalVersion; - FFstrbuf diskFolders; - FFDiskType diskShowTypes; - FFstrbuf localIpNamePrefix; FFLocalIpType localIpShowType; @@ -258,7 +245,6 @@ void ffPrintTerminal(FFinstance* instance); void ffPrintTerminalFont(FFinstance* instance); void ffPrintMemory(FFinstance* instance); void ffPrintSwap(FFinstance* instance); -void ffPrintDisk(FFinstance* instance); void ffPrintPowerAdapter(FFinstance* instance); void ffPrintLocale(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 4bbc4c765..2b85b8c5d 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -47,7 +47,7 @@ int main(int argc, char** argv) ffPrintGPU(&instance, &instance.config.gpu); ffPrintMemory(&instance); //ffPrintSwap(&instance); - ffPrintDisk(&instance); + ffPrintDisk(&instance, &instance.config.disk); ffPrintBattery(&instance, &instance.config.battery); ffPrintPowerAdapter(&instance); //ffPrintPlayer(&instance); diff --git a/src/modules/disk.c b/src/modules/disk.c deleted file mode 100644 index dd2064d73..000000000 --- a/src/modules/disk.c +++ /dev/null @@ -1,157 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "common/parsing.h" -#include "common/bar.h" -#include "detection/disk/disk.h" - -#define FF_DISK_MODULE_NAME "Disk" -#define FF_DISK_NUM_FORMAT_ARGS 10 - -static void printDisk(FFinstance* instance, const FFDisk* disk) -{ - FF_STRBUF_AUTO_DESTROY key; - ffStrbufInit(&key); - - if(instance->config.disk.key.length == 0) - { - ffStrbufAppendF(&key, "%s (%s)", FF_DISK_MODULE_NAME, disk->mountpoint.chars); - } - else - { - ffParseFormatString(&key, &instance->config.disk.key, 1, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &disk->mountpoint} - }); - } - - FF_STRBUF_AUTO_DESTROY usedPretty; - ffStrbufInit(&usedPretty); - ffParseSize(disk->bytesUsed, instance->config.binaryPrefixType, &usedPretty); - - FF_STRBUF_AUTO_DESTROY totalPretty; - ffStrbufInit(&totalPretty); - ffParseSize(disk->bytesTotal, instance->config.binaryPrefixType, &totalPretty); - - uint8_t bytesPercentage = disk->bytesTotal > 0 ? (uint8_t) (((long double) disk->bytesUsed / (long double) disk->bytesTotal) * 100.0) : 0; - - if(instance->config.disk.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, key.chars, 0, NULL); - - FF_STRBUF_AUTO_DESTROY str; - ffStrbufInit(&str); - - if(disk->bytesTotal > 0) - { - if(instance->config.percentType & FF_PERCENTAGE_TYPE_BAR_BIT) - { - ffAppendPercentBar(instance, &str, bytesPercentage, 0, 5, 8); - ffStrbufAppendC(&str, ' '); - } - - if(!(instance->config.percentType & FF_PERCENTAGE_TYPE_HIDE_OTHERS_BIT)) - ffStrbufAppendF(&str, "%s / %s ", usedPretty.chars, totalPretty.chars); - - if(instance->config.percentType & FF_PERCENTAGE_TYPE_NUM_BIT) - { - ffAppendPercentNum(instance, &str, (uint8_t) bytesPercentage, 50, 80, str.length > 0); - ffStrbufAppendC(&str, ' '); - } - } - else - ffStrbufAppendS(&str, "Unknown "); - - if(disk->type & FF_DISK_TYPE_EXTERNAL_BIT && !(instance->config.percentType & FF_PERCENTAGE_TYPE_HIDE_OTHERS_BIT)) - ffStrbufAppendS(&str, "[Removable]"); - - ffStrbufTrimRight(&str, ' '); - ffStrbufPutTo(&str, stdout); - } - else - { - uint8_t filesPercentage = disk->filesTotal > 0 ? (uint8_t) (((double) disk->filesUsed / (double) disk->filesTotal) * 100.0) : 0; - - ffPrintFormatString(instance, key.chars, 0, NULL, &instance->config.disk.outputFormat, FF_DISK_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &usedPretty}, - {FF_FORMAT_ARG_TYPE_STRBUF, &totalPretty}, - {FF_FORMAT_ARG_TYPE_UINT8, &bytesPercentage}, - {FF_FORMAT_ARG_TYPE_UINT, &disk->filesUsed}, - {FF_FORMAT_ARG_TYPE_UINT, &disk->filesTotal}, - {FF_FORMAT_ARG_TYPE_UINT8, &filesPercentage}, - {FF_FORMAT_ARG_TYPE_BOOL, FF_FORMAT_ARG_VALUE_BOOL(disk->type & FF_DISK_TYPE_EXTERNAL_BIT)}, - {FF_FORMAT_ARG_TYPE_BOOL, FF_FORMAT_ARG_VALUE_BOOL(disk->type & FF_DISK_TYPE_HIDDEN_BIT)}, - {FF_FORMAT_ARG_TYPE_STRBUF, &disk->filesystem}, - {FF_FORMAT_ARG_TYPE_STRBUF, &disk->name} - }); - } -} - -static void printMountpoint(FFinstance* instance, const FFlist* disks, const char* mountpoint) -{ - for(uint32_t i = disks->length; i > 0; i--) - { - FFDisk* disk = ffListGet(disks, i - 1); - if(strncmp(mountpoint, disk->mountpoint.chars, disk->mountpoint.length) == 0) - { - printDisk(instance, disk); - return; - } - } - - ffPrintError(instance, FF_DISK_MODULE_NAME, 0, &instance->config.disk, "No disk found for mountpoint: %s", mountpoint); -} - -static void printMountpoints(FFinstance* instance, const FFlist* disks) -{ - #ifdef _WIN32 - const char separator = ';'; - #else - const char separator = ':'; - #endif - - FF_STRBUF_AUTO_DESTROY mountpoints; - ffStrbufInitCopy(&mountpoints, &instance->config.diskFolders); - ffStrbufTrim(&mountpoints, separator); - - uint32_t startIndex = 0; - while(startIndex < mountpoints.length) - { - uint32_t colonIndex = ffStrbufNextIndexC(&mountpoints, startIndex, separator); - mountpoints.chars[colonIndex] = '\0'; - - printMountpoint(instance, disks, mountpoints.chars + startIndex); - - startIndex = colonIndex + 1; - } -} - -static void printAutodetected(FFinstance* instance, const FFlist* disks) -{ - bool found = false; - - FF_LIST_FOR_EACH(FFDisk, disk, *disks) - { - if(!(disk->type & instance->config.diskShowTypes)) - continue; - - printDisk(instance, disk); - found = true; - } - - if (!found) - ffPrintError(instance, FF_DISK_MODULE_NAME, 0, &instance->config.disk, "No disk found"); -} - -void ffPrintDisk(FFinstance* instance) -{ - const FFDiskResult* disks = ffDetectDisks(); - if(disks->error.length > 0) - { - ffPrintError(instance, FF_DISK_MODULE_NAME, 0, &instance->config.disk, "%s", disks->error.chars); - return; - } - - if(instance->config.diskFolders.length == 0) - printAutodetected(instance, &disks->disks); - else - printMountpoints(instance, &disks->disks); -} diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c new file mode 100644 index 000000000..ee5585f73 --- /dev/null +++ b/src/modules/disk/disk.c @@ -0,0 +1,291 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "common/parsing.h" +#include "common/bar.h" +#include "detection/disk/disk.h" +#include "modules/disk/disk.h" + +#define FF_DISK_NUM_FORMAT_ARGS 10 +#pragma GCC diagnostic ignored "-Wsign-conversion" + +static void printDisk(FFinstance* instance, FFDiskOptions* options, const FFDisk* disk) +{ + FF_STRBUF_AUTO_DESTROY key; + ffStrbufInit(&key); + + if(options->moduleArgs.key.length == 0) + { + ffStrbufAppendF(&key, "%s (%s)", FF_DISK_MODULE_NAME, disk->mountpoint.chars); + } + else + { + ffParseFormatString(&key, &options->moduleArgs.key, 1, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &disk->mountpoint} + }); + } + + FF_STRBUF_AUTO_DESTROY usedPretty; + ffStrbufInit(&usedPretty); + ffParseSize(disk->bytesUsed, instance->config.binaryPrefixType, &usedPretty); + + FF_STRBUF_AUTO_DESTROY totalPretty; + ffStrbufInit(&totalPretty); + ffParseSize(disk->bytesTotal, instance->config.binaryPrefixType, &totalPretty); + + uint8_t bytesPercentage = disk->bytesTotal > 0 ? (uint8_t) (((long double) disk->bytesUsed / (long double) disk->bytesTotal) * 100.0) : 0; + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, key.chars, 0, NULL); + + FF_STRBUF_AUTO_DESTROY str; + ffStrbufInit(&str); + + if(disk->bytesTotal > 0) + { + if(instance->config.percentType & FF_PERCENTAGE_TYPE_BAR_BIT) + { + ffAppendPercentBar(instance, &str, bytesPercentage, 0, 5, 8); + ffStrbufAppendC(&str, ' '); + } + + if(!(instance->config.percentType & FF_PERCENTAGE_TYPE_HIDE_OTHERS_BIT)) + ffStrbufAppendF(&str, "%s / %s ", usedPretty.chars, totalPretty.chars); + + if(instance->config.percentType & FF_PERCENTAGE_TYPE_NUM_BIT) + { + ffAppendPercentNum(instance, &str, (uint8_t) bytesPercentage, 50, 80, str.length > 0); + ffStrbufAppendC(&str, ' '); + } + } + else + ffStrbufAppendS(&str, "Unknown "); + + if((disk->type & FF_DISK_TYPE_EXTERNAL_BIT) && !(instance->config.percentType & FF_PERCENTAGE_TYPE_HIDE_OTHERS_BIT)) + ffStrbufAppendS(&str, "[Removable]"); + + ffStrbufTrimRight(&str, ' '); + ffStrbufPutTo(&str, stdout); + } + else + { + uint8_t filesPercentage = disk->filesTotal > 0 ? (uint8_t) (((double) disk->filesUsed / (double) disk->filesTotal) * 100.0) : 0; + + ffPrintFormatString(instance, key.chars, 0, NULL, &options->moduleArgs.outputFormat, FF_DISK_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &usedPretty}, + {FF_FORMAT_ARG_TYPE_STRBUF, &totalPretty}, + {FF_FORMAT_ARG_TYPE_UINT8, &bytesPercentage}, + {FF_FORMAT_ARG_TYPE_UINT, &disk->filesUsed}, + {FF_FORMAT_ARG_TYPE_UINT, &disk->filesTotal}, + {FF_FORMAT_ARG_TYPE_UINT8, &filesPercentage}, + {FF_FORMAT_ARG_TYPE_BOOL, FF_FORMAT_ARG_VALUE_BOOL(disk->type & FF_DISK_TYPE_EXTERNAL_BIT)}, + {FF_FORMAT_ARG_TYPE_BOOL, FF_FORMAT_ARG_VALUE_BOOL(disk->type & FF_DISK_TYPE_HIDDEN_BIT)}, + {FF_FORMAT_ARG_TYPE_STRBUF, &disk->filesystem}, + {FF_FORMAT_ARG_TYPE_STRBUF, &disk->name} + }); + } +} + +static void printMountpoint(FFinstance* instance, FFDiskOptions* options, const FFlist* disks, const char* mountpoint) +{ + for(uint32_t i = disks->length; i > 0; i--) + { + FFDisk* disk = ffListGet(disks, i - 1); + if(strncmp(mountpoint, disk->mountpoint.chars, disk->mountpoint.length) == 0) + { + printDisk(instance, options, disk); + return; + } + } + + ffPrintError(instance, FF_DISK_MODULE_NAME, 0, &options->moduleArgs, "No disk found for mountpoint: %s", mountpoint); +} + +static void printMountpoints(FFinstance* instance, FFDiskOptions* options, const FFlist* disks) +{ + #ifdef _WIN32 + const char separator = ';'; + #else + const char separator = ':'; + #endif + + FFstrbuf mountpoints; + ffStrbufInitCopy(&mountpoints, &options->folders); + ffStrbufTrim(&mountpoints, separator); + + uint32_t startIndex = 0; + while(startIndex < mountpoints.length) + { + uint32_t colonIndex = ffStrbufNextIndexC(&mountpoints, startIndex, separator); + mountpoints.chars[colonIndex] = '\0'; + + printMountpoint(instance, options, disks, mountpoints.chars + startIndex); + + startIndex = colonIndex + 1; + } +} + +static void printAutodetected(FFinstance* instance, FFDiskOptions* options, const FFlist* disks) +{ + FF_LIST_FOR_EACH(FFDisk, disk, *disks) + { + if(!(disk->type & options->showTypes)) + continue; + + printDisk(instance, options, disk); + } +} + +void ffPrintDisk(FFinstance* instance, FFDiskOptions* options) +{ + const FFDiskResult* disks = ffDetectDisks(); + if(disks->error.length > 0) + { + ffPrintError(instance, FF_DISK_MODULE_NAME, 0, &options->moduleArgs, "%s", disks->error.chars); + return; + } + + if(options->folders.length == 0) + printAutodetected(instance, options, &disks->disks); + else + printMountpoints(instance, options, &disks->disks); +} + + +void ffInitDiskOptions(FFDiskOptions* options) +{ + options->moduleName = FF_DISK_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + ffStrbufInit(&options->folders); + options->showTypes = FF_DISK_TYPE_REGULAR_BIT | FF_DISK_TYPE_EXTERNAL_BIT; +} + +bool ffParseDiskCommandOptions(FFDiskOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_DISK_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "folders") == 0) + { + ffOptionParseString(key, value, &options->folders); + return true; + } + + if (strcasecmp(subKey, "show-regular") == 0) + { + if (ffOptionParseBoolean(value)) + options->showTypes |= FF_DISK_TYPE_REGULAR_BIT; + else + options->showTypes &= ~FF_DISK_TYPE_REGULAR_BIT; + return true; + } + + if (strcasecmp(subKey, "show-removable") == 0) + { + if (ffOptionParseBoolean(value)) + options->showTypes |= FF_DISK_TYPE_EXTERNAL_BIT; + else + options->showTypes &= ~FF_DISK_TYPE_EXTERNAL_BIT; + return true; + } + + if (strcasecmp(subKey, "show-hidden") == 0) + { + if (ffOptionParseBoolean(value)) + options->showTypes |= FF_DISK_TYPE_HIDDEN_BIT; + else + options->showTypes &= ~FF_DISK_TYPE_HIDDEN_BIT; + return true; + } + + if (strcasecmp(subKey, "show-subvolumes") == 0) + { + if (ffOptionParseBoolean(value)) + options->showTypes |= FF_DISK_TYPE_SUBVOLUME_BIT; + else + options->showTypes &= ~FF_DISK_TYPE_SUBVOLUME_BIT; + return true; + } + + if (strcasecmp(subKey, "show-unknown") == 0) + { + if (ffOptionParseBoolean(value)) + options->showTypes |= FF_DISK_TYPE_UNKNOWN_BIT; + else + options->showTypes &= ~FF_DISK_TYPE_UNKNOWN_BIT; + return true; + } + + return false; +} + +void ffDestroyDiskOptions(FFDiskOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseDiskJsonObject(FFinstance* instance, json_object* module) +{ + FFDiskOptions __attribute__((__cleanup__(ffDestroyDiskOptions))) options; + ffInitDiskOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "folders") == 0) + { + ffStrbufSetS(&options.folders, json_object_get_string(val)); + continue; + } + + if (strcasecmp(key, "showRemovable") == 0) + { + if (json_object_get_boolean(val)) + options.showTypes |= FF_DISK_TYPE_EXTERNAL_BIT; + else + options.showTypes &= ~FF_DISK_TYPE_EXTERNAL_BIT; + continue; + } + + if (strcasecmp(key, "showHidden") == 0) + { + if (json_object_get_boolean(val)) + options.showTypes |= FF_DISK_TYPE_HIDDEN_BIT; + else + options.showTypes &= ~FF_DISK_TYPE_HIDDEN_BIT; + continue; + } + + if (strcasecmp(key, "showSubvolumes") == 0) + { + if (json_object_get_boolean(val)) + options.showTypes |= FF_DISK_TYPE_SUBVOLUME_BIT; + else + options.showTypes &= ~FF_DISK_TYPE_SUBVOLUME_BIT; + continue; + } + + if (strcasecmp(key, "show-unknown") == 0) + { + if (json_object_get_boolean(val)) + options.showTypes |= FF_DISK_TYPE_UNKNOWN_BIT; + else + options.showTypes &= ~FF_DISK_TYPE_UNKNOWN_BIT; + continue; + } + + ffPrintError(instance, FF_DISK_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintDisk(instance, &options); +} +#endif diff --git a/src/modules/disk/disk.h b/src/modules/disk/disk.h new file mode 100644 index 000000000..5d3fc05ba --- /dev/null +++ b/src/modules/disk/disk.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_DISK_MODULE_NAME "Disk" + +void ffPrintDisk(FFinstance* instance, FFDiskOptions* options); +void ffInitDiskOptions(FFDiskOptions* options); +bool ffParseDiskCommandOptions(FFDiskOptions* options, const char* key, const char* value); +void ffDestroyDiskOptions(FFDiskOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseDiskJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/disk/option.h b/src/modules/disk/option.h new file mode 100644 index 000000000..702e5bcbf --- /dev/null +++ b/src/modules/disk/option.h @@ -0,0 +1,24 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef enum FFDiskType +{ + FF_DISK_TYPE_NONE = 0, + FF_DISK_TYPE_REGULAR_BIT = 1 << 0, + FF_DISK_TYPE_HIDDEN_BIT = 1 << 1, + FF_DISK_TYPE_EXTERNAL_BIT = 1 << 2, + FF_DISK_TYPE_SUBVOLUME_BIT = 1 << 3, + FF_DISK_TYPE_UNKNOWN_BIT = 1 << 4, +} FFDiskType; + +typedef struct FFDiskOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFstrbuf folders; + FFDiskType showTypes; +} FFDiskOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 140b8dedc..58a2af865 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -52,6 +52,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o return tryModule(instance, type, module, FF_DATETIME_MODULE_NAME, ffParseDateTimeJsonObject) || tryModule(instance, type, module, FF_DISPLAY_MODULE_NAME, ffParseDisplayJsonObject) || + tryModule(instance, type, module, FF_DISK_MODULE_NAME, ffParseDiskJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 1a1d3349b..53b48ea51 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -16,6 +16,7 @@ #include "modules/cursor/cursor.h" #include "modules/custom/custom.h" #include "modules/datetime/datetime.h" +#include "modules/disk/disk.h" #include "modules/display/display.h" #include "modules/gpu/gpu.h" #include "modules/host/host.h" diff --git a/src/modules/options.h b/src/modules/options.h index 0463e7b20..5c5b57385 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -13,6 +13,7 @@ #include "modules/custom/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" +#include "modules/disk/option.h" #include "modules/display/option.h" #include "modules/host/option.h" #include "modules/gpu/option.h" From 8dc443f827a4645cfefcfb5d26371b168671d2b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 4 Apr 2023 11:01:42 +0800 Subject: [PATCH 36/71] Gamepad: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 6 +- src/fastfetch.h | 3 +- src/modules/gamepad.c | 48 --------------- src/modules/gamepad/gamepad.c | 90 +++++++++++++++++++++++++++++ src/modules/gamepad/gamepad.h | 15 +++++ src/modules/gamepad/option.h | 11 ++++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 11 files changed, 126 insertions(+), 56 deletions(-) delete mode 100644 src/modules/gamepad.c create mode 100644 src/modules/gamepad/gamepad.c create mode 100644 src/modules/gamepad/gamepad.h create mode 100644 src/modules/gamepad/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0557ce42a..6a984849b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -282,7 +282,7 @@ set(LIBFASTFETCH_SRC src/modules/gpu/gpu.c src/modules/host/host.c src/modules/icons.c - src/modules/gamepad.c + src/modules/gamepad/gamepad.c src/modules/kernel/kernel.c src/modules/locale.c src/modules/localip.c diff --git a/src/common/init.c b/src/common/init.c index bb3843cac..d9f186694 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -105,7 +105,7 @@ static void defaultConfig(FFinstance* instance) ffInitBluetoothOptions(&instance->config.bluetooth); initModuleArg(&instance->config.sound); ffInitSeparatorOptions(&instance->config.separator); - initModuleArg(&instance->config.gamepad); + ffInitGamepadOptions(&instance->config.gamepad); ffStrbufInitA(&instance->config.libPCI, 0); ffStrbufInitA(&instance->config.libVulkan, 0); @@ -332,7 +332,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyBluetoothOptions(&instance->config.bluetooth); ffDestroySeparatorOptions(&instance->config.separator); destroyModuleArg(&instance->config.sound); - destroyModuleArg(&instance->config.gamepad); + ffDestroyGamepadOptions(&instance->config.gamepad); ffStrbufDestroy(&instance->config.libPCI); ffStrbufDestroy(&instance->config.libVulkan); diff --git a/src/fastfetch.c b/src/fastfetch.c index 6a7da5b28..af3bb42fa 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1024,7 +1024,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseBluetoothCommandOptions(&instance->config.bluetooth, key, value)) {} else if(ffParseSeparatorCommandOptions(&instance->config.separator, key, value)) {} else if(optionParseModuleArgs(key, value, "sound", &instance->config.sound)) {} - else if(optionParseModuleArgs(key, value, "gamepad", &instance->config.gamepad)) {} + else if(ffParseGamepadCommandOptions(&instance->config.gamepad, key, value)) {} /////////////////// //Library options// @@ -1290,8 +1290,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintBluetooth(instance, &instance->config.bluetooth); else if(strcasecmp(line, "sound") == 0) ffPrintSound(instance); - else if(strcasecmp(line, "gamepad") == 0) - ffPrintGamepad(instance); + else if(strcasecmp(line, FF_GAMEPAD_MODULE_NAME) == 0) + ffPrintGamepad(instance, &instance->config.gamepad); else if(strcasecmp(line, FF_JSONCONFIG_MODULE_NAME) == 0) ffPrintJsonConfig(instance); else diff --git a/src/fastfetch.h b/src/fastfetch.h index 79a727e6a..dbf48833d 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -129,7 +129,7 @@ typedef struct FFconfig FFBluetoothOptions bluetooth; FFSeparatorOptions separator; FFModuleArgs sound; - FFModuleArgs gamepad; + FFGamepadOptions gamepad; FFstrbuf libPCI; FFstrbuf libVulkan; @@ -262,6 +262,5 @@ void ffPrintOpenGL(FFinstance* instance); void ffPrintOpenCL(FFinstance* instance); void ffPrintUsers(FFinstance* instance); void ffPrintSound(FFinstance* instance); -void ffPrintGamepad(FFinstance* instance); #endif diff --git a/src/modules/gamepad.c b/src/modules/gamepad.c deleted file mode 100644 index 6bcb332f8..000000000 --- a/src/modules/gamepad.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "common/printing.h" -#include "detection/gamepad/gamepad.h" - -#define FF_GAMEPAD_MODULE_NAME "Gamepad" -#define FF_GAMEPAD_NUM_FORMAT_ARGS 2 - -static void printDevice(FFinstance* instance, const FFGamepadDevice* device, uint8_t index) -{ - if(instance->config.gamepad.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_GAMEPAD_MODULE_NAME, index, &instance->config.gamepad.key); - ffStrbufPutTo(&device->name, stdout); - } - else - { - ffPrintFormat(instance, FF_GAMEPAD_MODULE_NAME, index, &instance->config.gamepad, FF_GAMEPAD_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &device->name}, - {FF_FORMAT_ARG_TYPE_STRBUF, &device->identifier}, - }); - } -} - -void ffPrintGamepad(FFinstance* instance) -{ - FF_LIST_AUTO_DESTROY result; - ffListInit(&result, sizeof(FFGamepadDevice)); - const char* error = ffDetectGamepad(instance, &result); - - if(error) - { - ffPrintError(instance, FF_GAMEPAD_MODULE_NAME, 0, &instance->config.gamepad, "%s", error); - return; - } - - if(!result.length) - { - ffPrintError(instance, FF_GAMEPAD_MODULE_NAME, 0, &instance->config.gamepad, "No devices detected"); - return; - } - - uint8_t index = 0; - FF_LIST_FOR_EACH(FFGamepadDevice, device, result) - { - printDevice(instance, device, result.length > 1 ? ++index : 0); - ffStrbufDestroy(&device->identifier); - ffStrbufDestroy(&device->name); - } -} diff --git a/src/modules/gamepad/gamepad.c b/src/modules/gamepad/gamepad.c new file mode 100644 index 000000000..a0cd64f27 --- /dev/null +++ b/src/modules/gamepad/gamepad.c @@ -0,0 +1,90 @@ +#include "common/printing.h" +#include "detection/gamepad/gamepad.h" +#include "modules/gamepad/gamepad.h" + +#define FF_GAMEPAD_NUM_FORMAT_ARGS 2 + +static void printDevice(FFinstance* instance, FFGamepadOptions* options, const FFGamepadDevice* device, uint8_t index) +{ + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_GAMEPAD_MODULE_NAME, index, &options->moduleArgs.key); + ffStrbufPutTo(&device->name, stdout); + } + else + { + ffPrintFormat(instance, FF_GAMEPAD_MODULE_NAME, index, &options->moduleArgs, FF_GAMEPAD_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &device->name}, + {FF_FORMAT_ARG_TYPE_STRBUF, &device->identifier}, + }); + } +} + +void ffPrintGamepad(FFinstance* instance, FFGamepadOptions* options) +{ + FF_LIST_AUTO_DESTROY result; + ffListInit(&result, sizeof(FFGamepadDevice)); + const char* error = ffDetectGamepad(instance, &result); + + if(error) + { + ffPrintError(instance, FF_GAMEPAD_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(!result.length) + { + ffPrintError(instance, FF_GAMEPAD_MODULE_NAME, 0, &options->moduleArgs, "No devices detected"); + return; + } + + uint8_t index = 0; + FF_LIST_FOR_EACH(FFGamepadDevice, device, result) + { + printDevice(instance, options, device, result.length > 1 ? ++index : 0); + ffStrbufDestroy(&device->identifier); + ffStrbufDestroy(&device->name); + } +} + +void ffInitGamepadOptions(FFGamepadOptions* options) +{ + options->moduleName = FF_GAMEPAD_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseGamepadCommandOptions(FFGamepadOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_GAMEPAD_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyGamepadOptions(FFGamepadOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseGamepadJsonObject(FFinstance* instance, json_object* module) +{ + FFGamepadOptions __attribute__((__cleanup__(ffDestroyGamepadOptions))) options; + ffInitGamepadOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_GAMEPAD_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintGamepad(instance, &options); +} +#endif diff --git a/src/modules/gamepad/gamepad.h b/src/modules/gamepad/gamepad.h new file mode 100644 index 000000000..2ada4ad2f --- /dev/null +++ b/src/modules/gamepad/gamepad.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_GAMEPAD_MODULE_NAME "Gamepad" + +void ffPrintGamepad(FFinstance* instance, FFGamepadOptions* options); +void ffInitGamepadOptions(FFGamepadOptions* options); +bool ffParseGamepadCommandOptions(FFGamepadOptions* options, const char* key, const char* value); +void ffDestroyGamepadOptions(FFGamepadOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseGamepadJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/gamepad/option.h b/src/modules/gamepad/option.h new file mode 100644 index 000000000..6cca7f2fd --- /dev/null +++ b/src/modules/gamepad/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 FFGamepadOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFGamepadOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 58a2af865..012348521 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -58,6 +58,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'G': { return + tryModule(instance, type, module, FF_GAMEPAD_MODULE_NAME, ffParseGamepadJsonObject) || tryModule(instance, type, module, FF_GPU_MODULE_NAME, ffParseGPUJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 53b48ea51..c033acb3a 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -18,6 +18,7 @@ #include "modules/datetime/datetime.h" #include "modules/disk/disk.h" #include "modules/display/display.h" +#include "modules/gamepad/gamepad.h" #include "modules/gpu/gpu.h" #include "modules/host/host.h" #include "modules/kernel/kernel.h" diff --git a/src/modules/options.h b/src/modules/options.h index 5c5b57385..919b8793a 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -16,6 +16,7 @@ #include "modules/disk/option.h" #include "modules/display/option.h" #include "modules/host/option.h" +#include "modules/gamepad/option.h" #include "modules/gpu/option.h" #include "modules/kernel/option.h" #include "modules/os/option.h" From 3526092b3887fe6f53bafa0d5a39530107e15b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 4 Apr 2023 12:28:52 +0800 Subject: [PATCH 37/71] Font: 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/font.c | 34 ------------- src/modules/font/font.c | 75 +++++++++++++++++++++++++++++ src/modules/font/font.h | 15 ++++++ src/modules/font/option.h | 11 +++++ src/modules/jsonconfig/jsonconfig.c | 6 +++ src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 117 insertions(+), 43 deletions(-) delete mode 100644 src/modules/font.c create mode 100644 src/modules/font/font.c create mode 100644 src/modules/font/font.h create mode 100644 src/modules/font/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a984849b..244924952 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,7 +278,7 @@ set(LIBFASTFETCH_SRC src/modules/datetime/datetime.c src/modules/de.c src/modules/disk/disk.c - src/modules/font.c + src/modules/font/font.c src/modules/gpu/gpu.c src/modules/host/host.c src/modules/icons.c diff --git a/src/common/init.c b/src/common/init.c index d9f186694..a049663e3 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -77,7 +77,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.wmTheme); initModuleArg(&instance->config.theme); initModuleArg(&instance->config.icons); - initModuleArg(&instance->config.font); + ffInitFontOptions(&instance->config.font); ffInitCursorOptions(&instance->config.cursor); initModuleArg(&instance->config.terminal); initModuleArg(&instance->config.terminalFont); @@ -304,7 +304,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.wmTheme); destroyModuleArg(&instance->config.theme); destroyModuleArg(&instance->config.icons); - destroyModuleArg(&instance->config.font); + ffDestroyFontOptions(&instance->config.font); ffDestroyCursorOptions(&instance->config.cursor); destroyModuleArg(&instance->config.terminal); destroyModuleArg(&instance->config.terminalFont); diff --git a/src/fastfetch.c b/src/fastfetch.c index af3bb42fa..d481622bc 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -998,7 +998,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} else if(optionParseModuleArgs(key, value, "icons", &instance->config.icons)) {} else if(optionParseModuleArgs(key, value, "wallpaper", &instance->config.wallpaper)) {} - else if(optionParseModuleArgs(key, value, "font", &instance->config.font)) {} + 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(optionParseModuleArgs(key, value, "terminal-font", &instance->config.terminalFont)) {} @@ -1232,8 +1232,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintIcons(instance); else if(strcasecmp(line, "wallpaper") == 0) ffPrintWallpaper(instance); - else if(strcasecmp(line, "font") == 0) - ffPrintFont(instance); + else if(strcasecmp(line, FF_FONT_MODULE_NAME) == 0) + 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) diff --git a/src/fastfetch.h b/src/fastfetch.h index dbf48833d..04c66f3b8 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -102,7 +102,7 @@ typedef struct FFconfig FFModuleArgs wmTheme; FFModuleArgs theme; FFModuleArgs icons; - FFModuleArgs font; + FFFontOptions font; FFCursorOptions cursor; FFModuleArgs terminal; FFModuleArgs terminalFont; @@ -240,7 +240,6 @@ void ffPrintWMTheme(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); -void ffPrintFont(FFinstance* instance); void ffPrintTerminal(FFinstance* instance); void ffPrintTerminalFont(FFinstance* instance); void ffPrintMemory(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 2b85b8c5d..051a67cab 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -39,7 +39,7 @@ int main(int argc, char** argv) ffPrintWMTheme(&instance); ffPrintTheme(&instance); ffPrintIcons(&instance); - ffPrintFont(&instance); + ffPrintFont(&instance, &instance.config.font); ffPrintCursor(&instance, &instance.config.cursor); ffPrintTerminal(&instance); ffPrintTerminalFont(&instance); diff --git a/src/modules/font.c b/src/modules/font.c deleted file mode 100644 index c33d144fe..000000000 --- a/src/modules/font.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/font/font.h" -#include "detection/displayserver/displayserver.h" - -#define FF_FONT_MODULE_NAME "Font" -#define FF_FONT_NUM_FORMAT_ARGS (FF_DETECT_FONT_NUM_FONTS + 1) - -void ffPrintFont(FFinstance* instance) -{ - const FFFontResult* font = ffDetectFont(instance); - - if(font->error.length > 0) - { - ffPrintError(instance, FF_FONT_MODULE_NAME, 0, &instance->config.font, "%s", font->error.chars); - return; - } - - if(instance->config.font.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_FONT_MODULE_NAME, 0, &instance->config.font.key); - ffStrbufPutTo(&font->display, stdout); - } - else - { - ffPrintFormat(instance, FF_FONT_MODULE_NAME, 0, &instance->config.font, FF_FONT_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[0]}, - {FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[1]}, - {FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[2]}, - {FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[3]}, - {FF_FORMAT_ARG_TYPE_STRBUF, &font->display}, - }); - } -} diff --git a/src/modules/font/font.c b/src/modules/font/font.c new file mode 100644 index 000000000..be9159c6f --- /dev/null +++ b/src/modules/font/font.c @@ -0,0 +1,75 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/font/font.h" +#include "modules/font/font.h" + +#define FF_FONT_NUM_FORMAT_ARGS (FF_DETECT_FONT_NUM_FONTS + 1) + +void ffPrintFont(FFinstance* instance, FFFontOptions* options) +{ + const FFFontResult* font = ffDetectFont(instance); + + if(font->error.length > 0) + { + ffPrintError(instance, FF_FONT_MODULE_NAME, 0, &options->moduleArgs, "%s", font->error.chars); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_FONT_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&font->display, stdout); + } + else + { + ffPrintFormat(instance, FF_FONT_MODULE_NAME, 0, &options->moduleArgs, FF_FONT_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[0]}, + {FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[1]}, + {FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[2]}, + {FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[3]}, + {FF_FORMAT_ARG_TYPE_STRBUF, &font->display}, + }); + } +} + +void ffInitFontOptions(FFFontOptions* options) +{ + options->moduleName = FF_FONT_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseFontCommandOptions(FFFontOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_FONT_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyFontOptions(FFFontOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseFontJsonObject(FFinstance* instance, json_object* module) +{ + FFFontOptions __attribute__((__cleanup__(ffDestroyFontOptions))) options; + ffInitFontOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_FONT_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintFont(instance, &options); +} +#endif diff --git a/src/modules/font/font.h b/src/modules/font/font.h new file mode 100644 index 000000000..36627b72f --- /dev/null +++ b/src/modules/font/font.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_FONT_MODULE_NAME "Font" + +void ffPrintFont(FFinstance* instance, FFFontOptions* options); +void ffInitFontOptions(FFFontOptions* options); +bool ffParseFontCommandOptions(FFFontOptions* options, const char* key, const char* value); +void ffDestroyFontOptions(FFFontOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseFontJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/font/option.h b/src/modules/font/option.h new file mode 100644 index 000000000..9318bac4b --- /dev/null +++ b/src/modules/font/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 FFFontOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFFontOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 012348521..ba4ba7e51 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -56,6 +56,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'F': { + return + tryModule(instance, type, module, FF_FONT_MODULE_NAME, ffParseFontJsonObject) || + false; + } + case 'G': { return tryModule(instance, type, module, FF_GAMEPAD_MODULE_NAME, ffParseGamepadJsonObject) || diff --git a/src/modules/modules.h b/src/modules/modules.h index c033acb3a..c4e04e954 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -18,6 +18,7 @@ #include "modules/datetime/datetime.h" #include "modules/disk/disk.h" #include "modules/display/display.h" +#include "modules/font/font.h" #include "modules/gamepad/gamepad.h" #include "modules/gpu/gpu.h" #include "modules/host/host.h" diff --git a/src/modules/options.h b/src/modules/options.h index 919b8793a..d74d5976c 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -15,6 +15,7 @@ #include "modules/datetime/option.h" #include "modules/disk/option.h" #include "modules/display/option.h" +#include "modules/font/option.h" #include "modules/host/option.h" #include "modules/gamepad/option.h" #include "modules/gpu/option.h" From 0b96818f6d339ecc2251bba6799a7a852aee065e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 4 Apr 2023 17:47:42 +0800 Subject: [PATCH 38/71] Locale: add JSON config support --- 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/locale.c | 33 ------------- src/modules/locale/locale.c | 73 +++++++++++++++++++++++++++++ src/modules/locale/locale.h | 15 ++++++ src/modules/locale/option.h | 11 +++++ src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 115 insertions(+), 42 deletions(-) delete mode 100644 src/modules/locale.c create mode 100644 src/modules/locale/locale.c create mode 100644 src/modules/locale/locale.h create mode 100644 src/modules/locale/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 244924952..1ca63dc97 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -284,7 +284,7 @@ set(LIBFASTFETCH_SRC src/modules/icons.c src/modules/gamepad/gamepad.c src/modules/kernel/kernel.c - src/modules/locale.c + src/modules/locale/locale.c src/modules/localip.c src/modules/memory.c src/modules/opencl.c diff --git a/src/common/init.c b/src/common/init.c index a049663e3..791367863 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -89,7 +89,7 @@ static void defaultConfig(FFinstance* instance) ffInitDiskOptions(&instance->config.disk); ffInitBatteryOptions(&instance->config.battery); initModuleArg(&instance->config.powerAdapter); - initModuleArg(&instance->config.locale); + ffInitLocaleOptions(&instance->config.locale); initModuleArg(&instance->config.localIP); initModuleArg(&instance->config.publicIP); initModuleArg(&instance->config.weather); @@ -316,7 +316,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyDiskOptions(&instance->config.disk); ffDestroyBatteryOptions(&instance->config.battery); destroyModuleArg(&instance->config.powerAdapter); - destroyModuleArg(&instance->config.locale); + ffDestroyLocaleOptions(&instance->config.locale); destroyModuleArg(&instance->config.localIP); destroyModuleArg(&instance->config.publicIP); destroyModuleArg(&instance->config.wallpaper); diff --git a/src/fastfetch.c b/src/fastfetch.c index d481622bc..e3b9492fc 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1010,7 +1010,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseDiskCommandOptions(&instance->config.disk, key, value)) {} else if(ffParseBatteryCommandOptions(&instance->config.battery, key, value)) {} else if(optionParseModuleArgs(key, value, "poweradapter", &instance->config.powerAdapter)) {} - else if(optionParseModuleArgs(key, value, "locale", &instance->config.locale)) {} + else if(ffParseLocaleCommandOptions(&instance->config.locale, key, value)) {} else if(optionParseModuleArgs(key, value, "localip", &instance->config.localIP)) {} else if(optionParseModuleArgs(key, value, "publicip", &instance->config.publicIP)) {} else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {} @@ -1258,8 +1258,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintBattery(instance, &instance->config.battery); else if(strcasecmp(line, "poweradapter") == 0) ffPrintPowerAdapter(instance); - else if(strcasecmp(line, "locale") == 0) - ffPrintLocale(instance); + else if(strcasecmp(line, FF_LOCALE_MODULE_NAME) == 0) + ffPrintLocale(instance, &instance->config.locale); else if(strcasecmp(line, "localip") == 0) ffPrintLocalIp(instance); else if(strcasecmp(line, "publicip") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 04c66f3b8..d7d513737 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -115,7 +115,7 @@ typedef struct FFconfig FFDiskOptions disk; FFBatteryOptions battery; FFModuleArgs powerAdapter; - FFModuleArgs locale; + FFLocaleOptions locale; FFModuleArgs localIP; FFModuleArgs publicIP; FFModuleArgs weather; @@ -245,7 +245,6 @@ void ffPrintTerminalFont(FFinstance* instance); void ffPrintMemory(FFinstance* instance); void ffPrintSwap(FFinstance* instance); void ffPrintPowerAdapter(FFinstance* instance); -void ffPrintLocale(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); void ffPrintDateTime(FFinstance* instance, FFDateTimeOptions* options); diff --git a/src/flashfetch.c b/src/flashfetch.c index 051a67cab..4c0db155e 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -56,7 +56,7 @@ int main(int argc, char** argv) //ffPrintPublicIp(&instance); //ffPrintWifi(&instance); //ffPrintCPUUsage(&instance, &instance.config.cpuUsage); - ffPrintLocale(&instance); + ffPrintLocale(&instance, &instance.config.locale); //ffPrintDateTime(&instance); //ffPrintDate(&instance); //ffPrintTime(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index ba4ba7e51..13ec41c67 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -81,6 +81,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'L': { + return + tryModule(instance, type, module, FF_LOCALE_MODULE_NAME, ffParseLocaleJsonObject) || + false; + } + case 'O': { return tryModule(instance, type, module, FF_OS_MODULE_NAME, ffParseOSJsonObject) || diff --git a/src/modules/locale.c b/src/modules/locale.c deleted file mode 100644 index 8c56b0638..000000000 --- a/src/modules/locale.c +++ /dev/null @@ -1,33 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/locale/locale.h" - -#define FF_LOCALE_MODULE_NAME "Locale" -#define FF_LOCALE_NUM_FORMAT_ARGS 1 - -void ffPrintLocale(FFinstance* instance) -{ - FFstrbuf locale; - ffStrbufInit(&locale); - - ffDetectLocale(&locale); - if(locale.length == 0) - { - ffPrintError(instance, FF_LOCALE_MODULE_NAME, 0, &instance->config.locale, "No locale found"); - return; - } - - if(instance->config.locale.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_LOCALE_MODULE_NAME, 0, &instance->config.locale.key); - ffStrbufPutTo(&locale, stdout); - } - else - { - ffPrintFormat(instance, FF_LOCALE_MODULE_NAME, 0, &instance->config.locale, FF_LOCALE_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &locale} - }); - } - - ffStrbufDestroy(&locale); -} diff --git a/src/modules/locale/locale.c b/src/modules/locale/locale.c new file mode 100644 index 000000000..5d3a510dd --- /dev/null +++ b/src/modules/locale/locale.c @@ -0,0 +1,73 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/locale/locale.h" +#include "modules/locale/locale.h" + +#define FF_LOCALE_NUM_FORMAT_ARGS 1 + +void ffPrintLocale(FFinstance* instance, FFLocaleOptions* options) +{ + FF_STRBUF_AUTO_DESTROY locale; + ffStrbufInit(&locale); + + ffDetectLocale(&locale); + if(locale.length == 0) + { + ffPrintError(instance, FF_LOCALE_MODULE_NAME, 0, &options->moduleArgs, "No locale found"); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_LOCALE_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&locale, stdout); + } + else + { + ffPrintFormat(instance, FF_LOCALE_MODULE_NAME, 0, &options->moduleArgs, FF_LOCALE_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &locale} + }); + } +} + +void ffInitLocaleOptions(FFLocaleOptions* options) +{ + options->moduleName = FF_LOCALE_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseLocaleCommandOptions(FFLocaleOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_LOCALE_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyLocaleOptions(FFLocaleOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseLocaleJsonObject(FFinstance* instance, json_object* module) +{ + FFLocaleOptions __attribute__((__cleanup__(ffDestroyLocaleOptions))) options; + ffInitLocaleOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_LOCALE_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintLocale(instance, &options); +} +#endif diff --git a/src/modules/locale/locale.h b/src/modules/locale/locale.h new file mode 100644 index 000000000..e02f91154 --- /dev/null +++ b/src/modules/locale/locale.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_LOCALE_MODULE_NAME "Locale" + +void ffPrintLocale(FFinstance* instance, FFLocaleOptions* options); +void ffInitLocaleOptions(FFLocaleOptions* options); +bool ffParseLocaleCommandOptions(FFLocaleOptions* options, const char* key, const char* value); +void ffDestroyLocaleOptions(FFLocaleOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseLocaleJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/locale/option.h b/src/modules/locale/option.h new file mode 100644 index 000000000..3e3253037 --- /dev/null +++ b/src/modules/locale/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 FFLocaleOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFLocaleOptions; diff --git a/src/modules/modules.h b/src/modules/modules.h index c4e04e954..31310935b 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -23,6 +23,7 @@ #include "modules/gpu/gpu.h" #include "modules/host/host.h" #include "modules/kernel/kernel.h" +#include "modules/locale/locale.h" #include "modules/separator/separator.h" #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" diff --git a/src/modules/options.h b/src/modules/options.h index d74d5976c..7cc1569a4 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -20,6 +20,7 @@ #include "modules/gamepad/option.h" #include "modules/gpu/option.h" #include "modules/kernel/option.h" +#include "modules/locale/option.h" #include "modules/os/option.h" #include "modules/separator/option.h" #include "modules/title/option.h" From 7e85db68430611a2c86c8b1e4b5b186e1f917fe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 4 Apr 2023 20:46:50 +0800 Subject: [PATCH 39/71] LocalIP: add JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 8 +- src/detection/localip/localip.h | 2 +- src/detection/localip/localip_linux.c | 14 +- src/detection/localip/localip_windows.c | 12 +- src/fastfetch.c | 16 +- src/fastfetch.h | 24 +-- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/localip.c | 119 ----------- src/modules/localip/localip.c | 269 ++++++++++++++++++++++++ src/modules/localip/localip.h | 15 ++ src/modules/localip/option.h | 25 +++ src/modules/modules.h | 1 + src/modules/options.h | 1 + 14 files changed, 332 insertions(+), 177 deletions(-) delete mode 100644 src/modules/localip.c create mode 100644 src/modules/localip/localip.c create mode 100644 src/modules/localip/localip.h create mode 100644 src/modules/localip/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ca63dc97..cb7ed9dc0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -285,7 +285,7 @@ set(LIBFASTFETCH_SRC src/modules/gamepad/gamepad.c src/modules/kernel/kernel.c src/modules/locale/locale.c - src/modules/localip.c + src/modules/localip/localip.c src/modules/memory.c src/modules/opencl.c src/modules/opengl.c diff --git a/src/common/init.c b/src/common/init.c index 791367863..fb2ce3889 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -90,7 +90,7 @@ static void defaultConfig(FFinstance* instance) ffInitBatteryOptions(&instance->config.battery); initModuleArg(&instance->config.powerAdapter); ffInitLocaleOptions(&instance->config.locale); - initModuleArg(&instance->config.localIP); + ffInitLocalIpOptions(&instance->config.localIP); initModuleArg(&instance->config.publicIP); initModuleArg(&instance->config.weather); initModuleArg(&instance->config.wifi); @@ -138,9 +138,6 @@ static void defaultConfig(FFinstance* instance) instance->config.soundType = FF_SOUND_TYPE_MAIN; - instance->config.localIpShowType = FF_LOCALIP_TYPE_IPV4_BIT; - ffStrbufInit(&instance->config.localIpNamePrefix); - instance->config.publicIpTimeout = 0; ffStrbufInit(&instance->config.publicIpUrl); @@ -317,7 +314,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyBatteryOptions(&instance->config.battery); destroyModuleArg(&instance->config.powerAdapter); ffDestroyLocaleOptions(&instance->config.locale); - destroyModuleArg(&instance->config.localIP); + ffDestroyLocalIpOptions(&instance->config.localIP); destroyModuleArg(&instance->config.publicIP); destroyModuleArg(&instance->config.wallpaper); destroyModuleArg(&instance->config.weather); @@ -360,7 +357,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.libwlanapi); ffStrbufDestroy(&instance->config.libnm); - ffStrbufDestroy(&instance->config.localIpNamePrefix); ffStrbufDestroy(&instance->config.publicIpUrl); ffStrbufDestroy(&instance->config.weatherOutputFormat); ffStrbufDestroy(&instance->config.playerName); diff --git a/src/detection/localip/localip.h b/src/detection/localip/localip.h index f90e97c26..4c9a91539 100644 --- a/src/detection/localip/localip.h +++ b/src/detection/localip/localip.h @@ -13,6 +13,6 @@ typedef struct FFLocalIpResult FFstrbuf mac; } FFLocalIpResult; -const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results); +const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results); #endif diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index b753d1447..29383c2ae 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -46,7 +46,7 @@ static void addNewIp(FFlist* list, const char* name, const char* addr, int type) } } -const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results) +const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) { struct ifaddrs* ifAddrStruct = NULL; if(getifaddrs(&ifAddrStruct) < 0) @@ -57,15 +57,15 @@ const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results) if (!ifa->ifa_addr || !(ifa->ifa_flags & IFF_RUNNING)) continue; - if ((ifa->ifa_flags & IFF_LOOPBACK) && !(instance->config.localIpShowType & FF_LOCALIP_TYPE_LOOP_BIT)) + if ((ifa->ifa_flags & IFF_LOOPBACK) && !(options->showType & FF_LOCALIP_TYPE_LOOP_BIT)) continue; - if (instance->config.localIpNamePrefix.length && strncmp(ifa->ifa_name, instance->config.localIpNamePrefix.chars, instance->config.localIpNamePrefix.length) != 0) + if (options->namePrefix.length && strncmp(ifa->ifa_name, options->namePrefix.chars, options->namePrefix.length) != 0) continue; if (ifa->ifa_addr->sa_family == AF_INET) { - if (!(instance->config.localIpShowType & FF_LOCALIP_TYPE_IPV4_BIT)) + if (!(options->showType & FF_LOCALIP_TYPE_IPV4_BIT)) continue; struct sockaddr_in* ipv4 = (struct sockaddr_in*) ifa->ifa_addr; @@ -75,7 +75,7 @@ const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results) } else if (ifa->ifa_addr->sa_family == AF_INET6) { - if (!(instance->config.localIpShowType & FF_LOCALIP_TYPE_IPV6_BIT)) + if (!(options->showType & FF_LOCALIP_TYPE_IPV6_BIT)) continue; struct sockaddr_in6* ipv6 = (struct sockaddr_in6 *)ifa->ifa_addr; @@ -86,7 +86,7 @@ const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results) #if defined(__FreeBSD__) || defined(__APPLE__) else if (ifa->ifa_addr->sa_family == AF_LINK) { - if (!(instance->config.localIpShowType & FF_LOCALIP_TYPE_MAC_BIT)) + if (!(options->showType & FF_LOCALIP_TYPE_MAC_BIT)) continue; char addressBuffer[32]; @@ -98,7 +98,7 @@ const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results) #else else if (ifa->ifa_addr->sa_family == AF_PACKET) { - if (!(instance->config.localIpShowType & FF_LOCALIP_TYPE_MAC_BIT)) + if (!(options->showType & FF_LOCALIP_TYPE_MAC_BIT)) continue; char addressBuffer[32]; diff --git a/src/detection/localip/localip_windows.c b/src/detection/localip/localip_windows.c index aa3c1dd52..d1295afb0 100644 --- a/src/detection/localip/localip_windows.c +++ b/src/detection/localip/localip_windows.c @@ -37,7 +37,7 @@ static void addNewIp(FFlist* list, const char* name, const char* value, int type } } -const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results) +const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) { IP_ADAPTER_ADDRESSES* FF_AUTO_FREE adapter_addresses = NULL; @@ -51,8 +51,8 @@ const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results) assert(adapter_addresses); DWORD error = GetAdaptersAddresses( - instance->config.localIpShowType & FF_LOCALIP_TYPE_IPV4_BIT - ? instance->config.localIpShowType & FF_LOCALIP_TYPE_IPV6_BIT ? AF_UNSPEC : AF_INET + options->showType & FF_LOCALIP_TYPE_IPV4_BIT + ? options->showType & FF_LOCALIP_TYPE_IPV6_BIT ? AF_UNSPEC : AF_INET : AF_INET6, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER, NULL, @@ -71,17 +71,17 @@ const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results) for (IP_ADAPTER_ADDRESSES* adapter = adapter_addresses; adapter; adapter = adapter->Next) { bool isLoop = adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK; - if (isLoop && !(instance->config.localIpShowType & FF_LOCALIP_TYPE_LOOP_BIT)) + if (isLoop && !(options->showType & FF_LOCALIP_TYPE_LOOP_BIT)) continue; bool newIp = true; char name[128]; WideCharToMultiByte(CP_UTF8, 0, adapter->FriendlyName, -1, name, sizeof(name), NULL, NULL); - if (instance->config.localIpNamePrefix.length && strncmp(name, instance->config.localIpNamePrefix.chars, instance->config.localIpNamePrefix.length) != 0) + if (options->namePrefix.length && strncmp(name, options->namePrefix.chars, options->namePrefix.length) != 0) continue; - if (instance->config.localIpShowType & FF_LOCALIP_TYPE_MAC_BIT && adapter->PhysicalAddressLength == 6) + if (options->showType & FF_LOCALIP_TYPE_MAC_BIT && adapter->PhysicalAddressLength == 6) { char addressBuffer[32]; uint8_t* ptr = adapter->PhysicalAddress; diff --git a/src/fastfetch.c b/src/fastfetch.c index e3b9492fc..e1884e5f6 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1011,7 +1011,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseBatteryCommandOptions(&instance->config.battery, key, value)) {} else if(optionParseModuleArgs(key, value, "poweradapter", &instance->config.powerAdapter)) {} else if(ffParseLocaleCommandOptions(&instance->config.locale, key, value)) {} - else if(optionParseModuleArgs(key, value, "localip", &instance->config.localIP)) {} + else if(ffParseLocalIpCommandOptions(&instance->config.localIP, key, value)) {} else if(optionParseModuleArgs(key, value, "publicip", &instance->config.publicIP)) {} else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {} else if(optionParseModuleArgs(key, value, "player", &instance->config.player)) {} @@ -1104,18 +1104,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con NULL ); } - else if(strcasecmp(key, "--localip-show-ipv4") == 0) - optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_IPV4_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_IPV4_BIT); - else if(strcasecmp(key, "--localip-show-ipv6") == 0) - optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_IPV6_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_IPV6_BIT); - else if(strcasecmp(key, "--localip-show-mac") == 0) - optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_MAC_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_MAC_BIT); - else if(strcasecmp(key, "--localip-show-loop") == 0) - optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_LOOP_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_LOOP_BIT); - else if(strcasecmp(key, "--localip-compact") == 0) - optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_COMPACT_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_COMPACT_BIT); - else if(strcasecmp(key, "--localip-name-prefix") == 0) - optionParseString(key, value, &instance->config.localIpNamePrefix); else if(strcasecmp(key, "--player-name") == 0) optionParseString(key, value, &instance->config.playerName); else if(strcasecmp(key, "--publicip-url") == 0) @@ -1261,7 +1249,7 @@ static void parseStructureCommand(FFinstance* instance, const char* line) else if(strcasecmp(line, FF_LOCALE_MODULE_NAME) == 0) ffPrintLocale(instance, &instance->config.locale); else if(strcasecmp(line, "localip") == 0) - ffPrintLocalIp(instance); + ffPrintLocalIp(instance, &instance->config.localIP); else if(strcasecmp(line, "publicip") == 0) ffPrintPublicIp(instance); else if(strcasecmp(line, "wifi") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index d7d513737..2068ab03b 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -26,13 +26,6 @@ typedef enum FFSoundType FF_SOUND_TYPE_ALL, } FFSoundType; -typedef enum FFLocalIpCompactType -{ - FF_LOCALIP_COMPACT_TYPE_NONE, - FF_LOCALIP_COMPACT_TYPE_MULTILINE, - FF_LOCALIP_COMPACT_TYPE_ONELINE, -} FFLocalIpCompactType; - typedef enum FFBinaryPrefixType { FF_BINARY_PREFIX_TYPE_IEC, // 1024 Bytes = 1 KiB, 1024 KiB = 1 MiB, ... (standard) @@ -48,17 +41,6 @@ typedef enum FFGLType FF_GL_TYPE_OSMESA } FFGLType; -typedef enum FFLocalIpType -{ - FF_LOCALIP_TYPE_NONE, - FF_LOCALIP_TYPE_LOOP_BIT = 1 << 0, - FF_LOCALIP_TYPE_IPV4_BIT = 1 << 1, - FF_LOCALIP_TYPE_IPV6_BIT = 1 << 2, - FF_LOCALIP_TYPE_MAC_BIT = 1 << 3, - - FF_LOCALIP_TYPE_COMPACT_BIT = 1 << 10, -} FFLocalIpType; - typedef struct FFconfig { FFLogoOptions logo; @@ -116,7 +98,7 @@ typedef struct FFconfig FFBatteryOptions battery; FFModuleArgs powerAdapter; FFLocaleOptions locale; - FFModuleArgs localIP; + FFLocalIpOptions localIP; FFModuleArgs publicIP; FFModuleArgs weather; FFModuleArgs player; @@ -160,9 +142,6 @@ typedef struct FFconfig bool shellVersion; bool terminalVersion; - FFstrbuf localIpNamePrefix; - FFLocalIpType localIpShowType; - FFstrbuf publicIpUrl; uint32_t publicIpTimeout; @@ -250,7 +229,6 @@ void ffPrintMedia(FFinstance* instance); void ffPrintDateTime(FFinstance* instance, FFDateTimeOptions* options); void ffPrintDate(FFinstance* instance); void ffPrintTime(FFinstance* instance); -void ffPrintLocalIp(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); void ffPrintWifi(FFinstance* instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 13ec41c67..f1f12cd93 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -84,6 +84,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'L': { return tryModule(instance, type, module, FF_LOCALE_MODULE_NAME, ffParseLocaleJsonObject) || + tryModule(instance, type, module, FF_LOCALIP_MODULE_NAME, ffParseLocalIpJsonObject) || false; } diff --git a/src/modules/localip.c b/src/modules/localip.c deleted file mode 100644 index 5d6de0bad..000000000 --- a/src/modules/localip.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/localip/localip.h" - -#define FF_LOCALIP_MODULE_NAME "Local IP" -#define FF_LOCALIP_NUM_FORMAT_ARGS 2 - -static int sortIps(const FFLocalIpResult* left, const FFLocalIpResult* right) -{ - return ffStrbufComp(&left->name, &right->name); -} - -static void formatKey(const FFinstance* instance, const FFLocalIpResult* ip, FFstrbuf* key) -{ - if(instance->config.localIP.key.length == 0) - { - if(ip->name.length) - ffStrbufSetF(key, FF_LOCALIP_MODULE_NAME " (%*s)", ip->name.length, ip->name.chars); - else - ffStrbufSetS(key, FF_LOCALIP_MODULE_NAME); - } - else - { - ffStrbufClear(key); - ffParseFormatString(key, &instance->config.localIP.key, 1, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &ip->name} - }); - } -} - -static void printIp(FFLocalIpResult* ip) -{ - bool flag = false; - if (ip->ipv4.length) - { - ffStrbufWriteTo(&ip->ipv4, stdout); - flag = true; - } - if (ip->ipv6.length) - { - if (flag) putchar(' '); - ffStrbufWriteTo(&ip->ipv6, stdout); - flag = true; - } - if (ip->mac.length) - { - if (flag) - printf(" (%s)", ip->mac.chars); - else - ffStrbufWriteTo(&ip->mac, stdout); - } -} - -void ffPrintLocalIp(FFinstance* instance) -{ - FF_LIST_AUTO_DESTROY results; - ffListInit(&results, sizeof(FFLocalIpResult)); - - const char* error = ffDetectLocalIps(instance, &results); - - if(error) - { - ffPrintError(instance, FF_LOCALIP_MODULE_NAME, 0, &instance->config.localIP, "%s", error); - return; - } - - if(results.length == 0) - { - ffPrintError(instance, FF_LOCALIP_MODULE_NAME, 0, &instance->config.localIP, "Failed to detect any IPs"); - return; - } - - ffListSort(&results, (void*) sortIps); - - if (instance->config.localIpShowType & FF_LOCALIP_TYPE_COMPACT_BIT) - { - ffPrintLogoAndKey(instance, FF_LOCALIP_MODULE_NAME, 0, &instance->config.localIP.key); - - FF_LIST_FOR_EACH(FFLocalIpResult, ip, results) - { - if ((void*) ip != (void*) results.data) - fputs(" - ", stdout); - printIp(ip); - } - } - else - { - FF_STRBUF_AUTO_DESTROY key; - ffStrbufInit(&key); - - FF_LIST_FOR_EACH(FFLocalIpResult, ip, results) - { - formatKey(instance, ip, &key); - if(instance->config.localIP.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, key.chars, 0, NULL); - printIp(ip); - putchar('\n'); - } - else - { - ffPrintFormatString(instance, key.chars, 0, NULL, &instance->config.localIP.outputFormat, FF_LOCALIP_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &ip->ipv4}, - {FF_FORMAT_ARG_TYPE_STRBUF, &ip->ipv6}, - {FF_FORMAT_ARG_TYPE_STRBUF, &ip->mac}, - {FF_FORMAT_ARG_TYPE_STRBUF, &ip->name}, - }); - } - } - } - - FF_LIST_FOR_EACH(FFLocalIpResult, ip, results) - { - ffStrbufDestroy(&ip->name); - ffStrbufDestroy(&ip->ipv4); - ffStrbufDestroy(&ip->ipv6); - ffStrbufDestroy(&ip->mac); - } -} diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c new file mode 100644 index 000000000..b10507b8b --- /dev/null +++ b/src/modules/localip/localip.c @@ -0,0 +1,269 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/localip/localip.h" +#include "modules/localip/localip.h" + +#define FF_LOCALIP_DISPLAY_NAME "Local IP" +#define FF_LOCALIP_NUM_FORMAT_ARGS 2 +#pragma GCC diagnostic ignored "-Wsign-conversion" + +static int sortIps(const FFLocalIpResult* left, const FFLocalIpResult* right) +{ + return ffStrbufComp(&left->name, &right->name); +} + +static void formatKey(const FFLocalIpOptions* options, const FFLocalIpResult* ip, FFstrbuf* key) +{ + if(options->moduleArgs.key.length == 0) + { + if(ip->name.length) + ffStrbufSetF(key, FF_LOCALIP_DISPLAY_NAME " (%s)", ip->name.chars); + else + ffStrbufSetS(key, FF_LOCALIP_DISPLAY_NAME); + } + else + { + ffStrbufClear(key); + ffParseFormatString(key, &options->moduleArgs.key, 2, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &ip->name}, + }); + } +} + +static void printIp(FFLocalIpResult* ip) +{ + bool flag = false; + if (ip->ipv4.length) + { + ffStrbufWriteTo(&ip->ipv4, stdout); + flag = true; + } + if (ip->ipv6.length) + { + if (flag) putchar(' '); + ffStrbufWriteTo(&ip->ipv6, stdout); + flag = true; + } + if (ip->mac.length) + { + if (flag) + printf(" (%s)", ip->mac.chars); + else + ffStrbufWriteTo(&ip->mac, stdout); + } +} + +void ffPrintLocalIp(FFinstance* instance, FFLocalIpOptions* options) +{ + FF_LIST_AUTO_DESTROY results; + ffListInit(&results, sizeof(FFLocalIpResult)); + + const char* error = ffDetectLocalIps(options, &results); + + if(error) + { + ffPrintError(instance, FF_LOCALIP_DISPLAY_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(results.length == 0) + { + ffPrintError(instance, FF_LOCALIP_DISPLAY_NAME, 0, &options->moduleArgs, "Failed to detect any IPs"); + return; + } + + ffListSort(&results, (const void*) sortIps); + + if (options->showType & FF_LOCALIP_TYPE_COMPACT_BIT) + { + ffPrintLogoAndKey(instance, FF_LOCALIP_DISPLAY_NAME, 0, &options->moduleArgs.key); + + FF_LIST_FOR_EACH(FFLocalIpResult, ip, results) + { + if ((void*) ip != (void*) results.data) + fputs(" - ", stdout); + printIp(ip); + } + } + else + { + FF_STRBUF_AUTO_DESTROY key; + ffStrbufInit(&key); + + FF_LIST_FOR_EACH(FFLocalIpResult, ip, results) + { + formatKey(options, ip, &key); + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, key.chars, 0, NULL); + printIp(ip); + putchar('\n'); + } + else + { + ffPrintFormatString(instance, key.chars, 0, NULL, &options->moduleArgs.outputFormat, FF_LOCALIP_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &ip->ipv4}, + {FF_FORMAT_ARG_TYPE_STRBUF, &ip->ipv6}, + {FF_FORMAT_ARG_TYPE_STRBUF, &ip->mac}, + {FF_FORMAT_ARG_TYPE_STRBUF, &ip->name}, + }); + } + } + } + + FF_LIST_FOR_EACH(FFLocalIpResult, ip, results) + { + ffStrbufDestroy(&ip->name); + ffStrbufDestroy(&ip->ipv4); + ffStrbufDestroy(&ip->ipv6); + ffStrbufDestroy(&ip->mac); + } +} + +void ffInitLocalIpOptions(FFLocalIpOptions* options) +{ + options->moduleName = FF_LOCALIP_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + options->showType = FF_LOCALIP_TYPE_IPV4_BIT; + ffStrbufInit(&options->namePrefix); +} + +bool ffParseLocalIpCommandOptions(FFLocalIpOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_LOCALIP_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "show-ipv4") == 0) + { + if (ffOptionParseBoolean(value)) + options->showType |= FF_LOCALIP_TYPE_IPV4_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_IPV4_BIT; + return true; + } + + if (strcasecmp(subKey, "show-ipv6") == 0) + { + if (ffOptionParseBoolean(value)) + options->showType |= FF_LOCALIP_TYPE_IPV6_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_IPV6_BIT; + return true; + } + + if (strcasecmp(subKey, "show-mac") == 0) + { + if (ffOptionParseBoolean(value)) + options->showType |= FF_LOCALIP_TYPE_MAC_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_MAC_BIT; + return true; + } + + if (strcasecmp(subKey, "show-loop") == 0) + { + if (ffOptionParseBoolean(value)) + options->showType |= FF_LOCALIP_TYPE_LOOP_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_LOOP_BIT; + return true; + } + + if(strcasecmp(subKey, "compact") == 0) + { + if (ffOptionParseBoolean(value)) + options->showType |= FF_LOCALIP_TYPE_COMPACT_BIT; + else + options->showType &= ~FF_LOCALIP_TYPE_COMPACT_BIT; + return true; + } + + if (strcasecmp(subKey, "name-prefix") == 0) + { + ffOptionParseString(key, value, &options->namePrefix); + return true; + } + + return false; +} + +void ffDestroyLocalIpOptions(FFLocalIpOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + ffStrbufDestroy(&options->namePrefix); +} + +#ifdef FF_HAVE_JSONC +void ffParseLocalIpJsonObject(FFinstance* instance, json_object* module) +{ + FFLocalIpOptions __attribute__((__cleanup__(ffDestroyLocalIpOptions))) options; + ffInitLocalIpOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "showIpv4") == 0) + { + if (json_object_get_boolean(val)) + options.showType |= FF_LOCALIP_TYPE_IPV4_BIT; + else + options.showType &= ~FF_LOCALIP_TYPE_IPV4_BIT; + continue; + } + + if (strcasecmp(key, "showIpv6") == 0) + { + if (json_object_get_boolean(val)) + options.showType |= FF_LOCALIP_TYPE_IPV6_BIT; + else + options.showType &= ~FF_LOCALIP_TYPE_IPV6_BIT; + continue; + } + + if (strcasecmp(key, "showMac") == 0) + { + if (json_object_get_boolean(val)) + options.showType |= FF_LOCALIP_TYPE_MAC_BIT; + else + options.showType &= ~FF_LOCALIP_TYPE_MAC_BIT; + continue; + } + + if (strcasecmp(key, "showLoop") == 0) + { + if (json_object_get_boolean(val)) + options.showType |= FF_LOCALIP_TYPE_LOOP_BIT; + else + options.showType &= ~FF_LOCALIP_TYPE_LOOP_BIT; + continue; + } + + if (strcasecmp(key, "compact") == 0) + { + if (json_object_get_boolean(val)) + options.showType |= FF_LOCALIP_TYPE_COMPACT_BIT; + else + options.showType &= ~FF_LOCALIP_TYPE_COMPACT_BIT; + continue; + } + + if (strcasecmp(key, "namePrefix") == 0) + { + ffStrbufSetS(&options.namePrefix, json_object_get_string(val)); + continue; + } + + ffPrintError(instance, FF_LOCALIP_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintLocalIp(instance, &options); +} +#endif diff --git a/src/modules/localip/localip.h b/src/modules/localip/localip.h new file mode 100644 index 000000000..e27babe41 --- /dev/null +++ b/src/modules/localip/localip.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_LOCALIP_MODULE_NAME "LocalIp" + +void ffPrintLocalIp(FFinstance* instance, FFLocalIpOptions* options); +void ffInitLocalIpOptions(FFLocalIpOptions* options); +bool ffParseLocalIpCommandOptions(FFLocalIpOptions* options, const char* key, const char* value); +void ffDestroyLocalIpOptions(FFLocalIpOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseLocalIpJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/localip/option.h b/src/modules/localip/option.h new file mode 100644 index 000000000..65dcfc60d --- /dev/null +++ b/src/modules/localip/option.h @@ -0,0 +1,25 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef enum FFLocalIpType +{ + FF_LOCALIP_TYPE_NONE, + FF_LOCALIP_TYPE_LOOP_BIT = 1 << 0, + FF_LOCALIP_TYPE_IPV4_BIT = 1 << 1, + FF_LOCALIP_TYPE_IPV6_BIT = 1 << 2, + FF_LOCALIP_TYPE_MAC_BIT = 1 << 3, + + FF_LOCALIP_TYPE_COMPACT_BIT = 1 << 10, +} FFLocalIpType; + +typedef struct FFLocalIpOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFLocalIpType showType; + FFstrbuf namePrefix; +} FFLocalIpOptions; diff --git a/src/modules/modules.h b/src/modules/modules.h index 31310935b..49c3fa56b 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -24,6 +24,7 @@ #include "modules/host/host.h" #include "modules/kernel/kernel.h" #include "modules/locale/locale.h" +#include "modules/localip/localip.h" #include "modules/separator/separator.h" #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" diff --git a/src/modules/options.h b/src/modules/options.h index 7cc1569a4..f8045ac9b 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -21,6 +21,7 @@ #include "modules/gpu/option.h" #include "modules/kernel/option.h" #include "modules/locale/option.h" +#include "modules/localip/option.h" #include "modules/os/option.h" #include "modules/separator/option.h" #include "modules/title/option.h" From 2df1305521a538b01f30c32ae1c6533ff4393152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 12 Apr 2023 14:05:09 +0800 Subject: [PATCH 40/71] Sound: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 6 +- src/fastfetch.c | 17 +-- src/fastfetch.h | 12 +-- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/sound.c | 85 --------------- src/modules/sound/option.h | 20 ++++ src/modules/sound/sound.c | 154 ++++++++++++++++++++++++++++ src/modules/sound/sound.h | 16 +++ 12 files changed, 202 insertions(+), 115 deletions(-) delete mode 100644 src/modules/sound.c create mode 100644 src/modules/sound/option.h create mode 100644 src/modules/sound/sound.c create mode 100644 src/modules/sound/sound.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cb7ed9dc0..488ec3f18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -298,7 +298,7 @@ set(LIBFASTFETCH_SRC src/modules/display/display.c src/modules/separator/separator.c src/modules/shell.c - src/modules/sound.c + src/modules/sound/sound.c src/modules/swap.c src/modules/media.c src/modules/terminal.c diff --git a/src/common/init.c b/src/common/init.c index fb2ce3889..d805d0724 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -103,7 +103,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.openCL); initModuleArg(&instance->config.users); ffInitBluetoothOptions(&instance->config.bluetooth); - initModuleArg(&instance->config.sound); + ffInitSoundOptions(&instance->config.sound); ffInitSeparatorOptions(&instance->config.separator); ffInitGamepadOptions(&instance->config.gamepad); @@ -136,8 +136,6 @@ static void defaultConfig(FFinstance* instance) instance->config.shellVersion = true; instance->config.terminalVersion = true; - instance->config.soundType = FF_SOUND_TYPE_MAIN; - instance->config.publicIpTimeout = 0; ffStrbufInit(&instance->config.publicIpUrl); @@ -328,7 +326,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.users); ffDestroyBluetoothOptions(&instance->config.bluetooth); ffDestroySeparatorOptions(&instance->config.separator); - destroyModuleArg(&instance->config.sound); + ffDestroySoundOptions(&instance->config.sound); ffDestroyGamepadOptions(&instance->config.gamepad); ffStrbufDestroy(&instance->config.libPCI); diff --git a/src/fastfetch.c b/src/fastfetch.c index e1884e5f6..50546fea8 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1023,7 +1023,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "users", &instance->config.users)) {} else if(ffParseBluetoothCommandOptions(&instance->config.bluetooth, key, value)) {} else if(ffParseSeparatorCommandOptions(&instance->config.separator, key, value)) {} - else if(optionParseModuleArgs(key, value, "sound", &instance->config.sound)) {} + else if(ffParseSoundCommandOptions(&instance->config.sound, key, value)) {} else if(ffParseGamepadCommandOptions(&instance->config.gamepad, key, value)) {} /////////////////// @@ -1095,15 +1095,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con instance->config.shellVersion = optionParseBoolean(value); else if(strcasecmp(key, "--terminal-version") == 0) instance->config.terminalVersion = optionParseBoolean(value); - else if(strcasecmp(key, "--sound-type") == 0) - { - optionParseEnum(key, value, &instance->config.soundType, - "main", FF_SOUND_TYPE_MAIN, - "active", FF_SOUND_TYPE_ACTIVE, - "all", FF_SOUND_TYPE_ALL, - NULL - ); - } else if(strcasecmp(key, "--player-name") == 0) optionParseString(key, value, &instance->config.playerName); else if(strcasecmp(key, "--publicip-url") == 0) @@ -1274,10 +1265,10 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintUsers(instance); else if(strcasecmp(line, FF_COMMAND_MODULE_NAME) == 0) ffPrintCommand(instance, &instance->config.command); - else if(strcasecmp(line, "bluetooth") == 0) + else if(strcasecmp(line, FF_BLUETOOTH_MODULE_NAME) == 0) ffPrintBluetooth(instance, &instance->config.bluetooth); - else if(strcasecmp(line, "sound") == 0) - ffPrintSound(instance); + else if(strcasecmp(line, FF_SOUND_MODULE_NAME) == 0) + ffPrintSound(instance, &instance->config.sound); else if(strcasecmp(line, FF_GAMEPAD_MODULE_NAME) == 0) ffPrintGamepad(instance, &instance->config.gamepad); else if(strcasecmp(line, FF_JSONCONFIG_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 2068ab03b..1e6b9ee1e 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -19,13 +19,6 @@ static inline void ffUnused(int dummy, ...) { (void) dummy; } #include "modules/options.h" #include "logo/option.h" -typedef enum FFSoundType -{ - FF_SOUND_TYPE_MAIN, - FF_SOUND_TYPE_ACTIVE, - FF_SOUND_TYPE_ALL, -} FFSoundType; - typedef enum FFBinaryPrefixType { FF_BINARY_PREFIX_TYPE_IEC, // 1024 Bytes = 1 KiB, 1024 KiB = 1 MiB, ... (standard) @@ -110,7 +103,7 @@ typedef struct FFconfig FFModuleArgs users; FFBluetoothOptions bluetooth; FFSeparatorOptions separator; - FFModuleArgs sound; + FFSoundOptions sound; FFGamepadOptions gamepad; FFstrbuf libPCI; @@ -148,8 +141,6 @@ typedef struct FFconfig FFstrbuf weatherOutputFormat; uint32_t weatherTimeout; - FFSoundType soundType; - FFstrbuf playerName; uint32_t percentType; @@ -237,6 +228,5 @@ void ffPrintVulkan(FFinstance* instance); void ffPrintOpenGL(FFinstance* instance); void ffPrintOpenCL(FFinstance* instance); void ffPrintUsers(FFinstance* instance); -void ffPrintSound(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index 4c0db155e..451d72ace 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -66,7 +66,7 @@ int main(int argc, char** argv) //ffPrintUsers(&instance); //ffPrintWeather(&instance); //ffPrintBluetooth(&instance); - //ffPrintSound(&instance); + //ffPrintSound(&instance, &instance.config.sound); //ffPrintGamepad(&instance); ffPrintBreak(&instance); ffPrintColors(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index f1f12cd93..0311a4711 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -97,6 +97,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'S': { return tryModule(instance, type, module, FF_SEPARATOR_MODULE_NAME, ffParseSeparatorJsonObject) || + tryModule(instance, type, module, FF_SOUND_MODULE_NAME, ffParseSoundJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 49c3fa56b..e2fff95f3 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -26,5 +26,6 @@ #include "modules/locale/locale.h" #include "modules/localip/localip.h" #include "modules/separator/separator.h" +#include "modules/sound/sound.h" #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" diff --git a/src/modules/options.h b/src/modules/options.h index f8045ac9b..fc2b460a5 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -24,4 +24,5 @@ #include "modules/localip/option.h" #include "modules/os/option.h" #include "modules/separator/option.h" +#include "modules/sound/option.h" #include "modules/title/option.h" diff --git a/src/modules/sound.c b/src/modules/sound.c deleted file mode 100644 index ffc4aee76..000000000 --- a/src/modules/sound.c +++ /dev/null @@ -1,85 +0,0 @@ -#include "common/printing.h" -#include "detection/sound/sound.h" - -#define FF_SOUND_MODULE_NAME "Sound" -#define FF_SOUND_NUM_FORMAT_ARGS 4 - -static void printDevice(FFinstance* instance, const FFSoundDevice* device, uint8_t index) -{ - if(instance->config.sound.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_SOUND_MODULE_NAME, index, &instance->config.sound.key); - ffStrbufWriteTo(&device->name, stdout); - - if(device->volume != FF_SOUND_VOLUME_UNKNOWN) - { - if(device->volume > 0) - printf(" (%d%%)", device->volume); - else - fputs(" (muted)", stdout); - } - - if(device->main && index > 0) - fputs(" (*)", stdout); - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_SOUND_MODULE_NAME, index, &instance->config.sound, FF_SOUND_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_BOOL, &device->main}, - {FF_FORMAT_ARG_TYPE_STRBUF, &device->name}, - {FF_FORMAT_ARG_TYPE_UINT8, &device->volume}, - {FF_FORMAT_ARG_TYPE_STRBUF, &device->identifier} - }); - } -} - -static void printSound(FFinstance* instance, FFlist* devices) -{ - FF_LIST_AUTO_DESTROY filtered; - ffListInit(&filtered, sizeof(FFSoundDevice*)); - - FF_LIST_FOR_EACH(FFSoundDevice, device, *devices) - { - switch (instance->config.soundType) - { - case FF_SOUND_TYPE_MAIN: if (!device->main) continue; break; - case FF_SOUND_TYPE_ACTIVE: if (!device->active) continue; break; - case FF_SOUND_TYPE_ALL: break; - } - - *(FFSoundDevice**)ffListAdd(&filtered) = device; - } - - if(filtered.length == 0) - { - ffPrintError(instance, FF_SOUND_MODULE_NAME, 0, &instance->config.sound, "No active sound devices found"); - return; - } - - uint8_t index = 1; - FF_LIST_FOR_EACH(FFSoundDevice*, device, filtered) - printDevice(instance, *device, filtered.length == 1 ? 0 : index++); -} - -void ffPrintSound(FFinstance* instance) -{ - FF_LIST_AUTO_DESTROY result; - ffListInit(&result, sizeof(FFSoundDevice)); - const char* error = ffDetectSound(instance, &result); - - if(error) - { - ffPrintError(instance, FF_SOUND_MODULE_NAME, 0, &instance->config.sound, "%s", error); - return; - } - - printSound(instance, &result); - - FF_LIST_FOR_EACH(FFSoundDevice, device, result) - { - ffStrbufDestroy(&device->identifier); - ffStrbufDestroy(&device->name); - } -} diff --git a/src/modules/sound/option.h b/src/modules/sound/option.h new file mode 100644 index 000000000..b0586036b --- /dev/null +++ b/src/modules/sound/option.h @@ -0,0 +1,20 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef enum FFSoundType +{ + FF_SOUND_TYPE_MAIN, + FF_SOUND_TYPE_ACTIVE, + FF_SOUND_TYPE_ALL, +} FFSoundType; + +typedef struct FFSoundOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFSoundType soundType; +} FFSoundOptions; diff --git a/src/modules/sound/sound.c b/src/modules/sound/sound.c new file mode 100644 index 000000000..678c47b5d --- /dev/null +++ b/src/modules/sound/sound.c @@ -0,0 +1,154 @@ +#include "common/printing.h" +#include "detection/sound/sound.h" +#include "modules/sound/sound.h" + +#define FF_SOUND_NUM_FORMAT_ARGS 4 + +static void printDevice(FFinstance* instance, FFSoundOptions* options, const FFSoundDevice* device, uint8_t index) +{ + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_SOUND_MODULE_NAME, index, &options->moduleArgs.key); + ffStrbufWriteTo(&device->name, stdout); + + if(device->volume != FF_SOUND_VOLUME_UNKNOWN) + { + if(device->volume > 0) + printf(" (%d%%)", device->volume); + else + fputs(" (muted)", stdout); + } + + if(device->main && index > 0) + fputs(" (*)", stdout); + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_SOUND_MODULE_NAME, index, &options->moduleArgs, FF_SOUND_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_BOOL, &device->main}, + {FF_FORMAT_ARG_TYPE_STRBUF, &device->name}, + {FF_FORMAT_ARG_TYPE_UINT8, &device->volume}, + {FF_FORMAT_ARG_TYPE_STRBUF, &device->identifier} + }); + } +} + +void ffPrintSound(FFinstance* instance, FFSoundOptions* options) +{ + FF_LIST_AUTO_DESTROY result; + ffListInit(&result, sizeof(FFSoundDevice)); + const char* error = ffDetectSound(instance, &result); + + if(error) + { + ffPrintError(instance, FF_SOUND_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + FF_LIST_AUTO_DESTROY filtered; + ffListInit(&filtered, sizeof(FFSoundDevice*)); + + FF_LIST_FOR_EACH(FFSoundDevice, device, result) + { + switch (options->soundType) + { + case FF_SOUND_TYPE_MAIN: if (!device->main) continue; break; + case FF_SOUND_TYPE_ACTIVE: if (!device->active) continue; break; + case FF_SOUND_TYPE_ALL: break; + } + + *(FFSoundDevice**)ffListAdd(&filtered) = device; + } + + if(filtered.length == 0) + { + ffPrintError(instance, FF_SOUND_MODULE_NAME, 0, &options->moduleArgs, "No active sound devices found"); + return; + } + + uint8_t index = 1; + FF_LIST_FOR_EACH(FFSoundDevice*, device, filtered) + { + printDevice(instance, options, *device, filtered.length == 1 ? 0 : index++); + } + + FF_LIST_FOR_EACH(FFSoundDevice, device, result) + { + ffStrbufDestroy(&device->identifier); + ffStrbufDestroy(&device->name); + } +} + + +void ffInitSoundOptions(FFSoundOptions* options) +{ + options->moduleName = FF_SOUND_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + options->soundType = FF_SOUND_TYPE_MAIN; +} + +bool ffParseSoundCommandOptions(FFSoundOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_SOUND_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "sound-type") == 0) + { + options->soundType = (FFSoundType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { + { "main", FF_SOUND_TYPE_MAIN }, + { "active", FF_SOUND_TYPE_ACTIVE }, + { "all", FF_SOUND_TYPE_ALL }, + {}, + }); + return true; + } + + return false; +} + +void ffDestroySoundOptions(FFSoundOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseSoundJsonObject(FFinstance* instance, json_object* module) +{ + FFSoundOptions __attribute__((__cleanup__(ffDestroySoundOptions))) options; + ffInitSoundOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "soundType") == 0) + { + int value; + const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { + { "main", FF_SOUND_TYPE_MAIN }, + { "active", FF_SOUND_TYPE_ACTIVE }, + { "all", FF_SOUND_TYPE_ALL }, + {}, + }); + if (error) + ffPrintError(instance, FF_SOUND_MODULE_NAME, 0, &options.moduleArgs, "Invalid %s value: %s", key, error); + else + options.soundType = (FFSoundType) value; + continue; + } + + ffPrintError(instance, FF_SOUND_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintSound(instance, &options); +} +#endif diff --git a/src/modules/sound/sound.h b/src/modules/sound/sound.h new file mode 100644 index 000000000..fa9d8dc87 --- /dev/null +++ b/src/modules/sound/sound.h @@ -0,0 +1,16 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/title/option.h" + +#define FF_SOUND_MODULE_NAME "Sound" + +void ffPrintSound(FFinstance* instance, FFSoundOptions* options); +void ffInitSoundOptions(FFSoundOptions* options); +bool ffParseSoundCommandOptions(FFSoundOptions* options, const char* key, const char* value); +void ffDestroySoundOptions(FFSoundOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseSoundJsonObject(FFinstance* instance, json_object* module); +#endif From c7119498a3c1c6137135a3f8f91fff4e4cb56516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 15 Apr 2023 15:29:54 +0800 Subject: [PATCH 41/71] Global: major FFstrbuf related code refactor --- src/common/font.c | 2 +- src/common/format.c | 19 +--- src/common/init.c | 46 +++++----- src/common/io/io_unix.c | 9 +- src/common/io/io_windows.c | 8 +- src/common/library.c | 5 +- src/common/networking_windows.c | 3 +- src/common/printing.c | 17 +--- src/common/processing_windows.c | 3 +- src/common/properties.c | 18 +--- src/detection/battery/battery_android.c | 3 +- src/detection/battery/battery_linux.c | 23 ++--- src/detection/brightness/brightness_linux.c | 6 +- src/detection/cpu/cpu_bsd.c | 3 +- src/detection/cpu/cpu_linux.c | 24 ++--- src/detection/disk/disk_linux.c | 3 +- .../displayserver/displayserver_apple.c | 3 +- .../displayserver/displayserver_nosupport.c | 12 +-- .../displayserver/displayserver_windows.c | 3 +- .../displayserver/linux/displayserver_linux.c | 4 +- src/detection/displayserver/linux/wayland.c | 4 +- src/detection/displayserver/linux/wmde.c | 40 ++------- src/detection/gamepad/gamepad_linux.c | 3 +- src/detection/gpu/gpu_linux.c | 14 +-- src/detection/gtk_qt/gtk.c | 5 +- src/detection/gtk_qt/qt.c | 7 +- src/detection/host/host_android.c | 4 +- src/detection/host/host_linux.c | 4 +- src/detection/icons/icons_linux.c | 3 +- src/detection/media/media.c | 2 +- src/detection/media/media_linux.c | 5 +- src/detection/os/os_apple.m | 8 +- src/detection/packages/packages_apple.c | 6 +- src/detection/packages/packages_linux.c | 16 +--- src/detection/packages/packages_windows.c | 3 +- src/detection/temps/temps_linux.c | 8 +- src/detection/terminalfont/terminalfont.c | 55 +++--------- .../terminalfont/terminalfont_apple.m | 3 +- .../terminalfont/terminalfont_linux.c | 53 +++-------- .../terminalfont/terminalfont_windows.c | 22 ++--- .../terminalshell/terminalshell_linux.c | 5 +- src/detection/theme/theme_linux.c | 6 +- src/detection/wallpaper/wallpaper_apple.c | 3 +- src/detection/wifi/wifi_android.c | 3 +- src/detection/wifi/wifi_linux.c | 7 +- src/detection/wmtheme/wmtheme_linux.c | 8 +- src/detection/wmtheme/wmtheme_windows.c | 3 +- src/fastfetch.c | 5 +- src/logo/image/image.c | 28 ++---- src/logo/logo.c | 10 +-- src/modules/battery/battery.c | 4 +- src/modules/brightness/brightness.c | 3 +- src/modules/chassis.c | 5 +- src/modules/command/command.c | 3 +- src/modules/cpuusage/cpuusage.c | 3 +- src/modules/disk/disk.c | 15 ++-- src/modules/display/display.c | 3 +- src/modules/gpu/gpu.c | 3 +- src/modules/host/host.c | 5 +- src/modules/icons.c | 3 +- src/modules/jsonconfig/jsonconfig.c | 3 +- src/modules/locale/locale.c | 3 +- src/modules/localip/localip.c | 3 +- src/modules/media.c | 10 +-- src/modules/memory.c | 9 +- src/modules/os/os.c | 3 +- src/modules/player.c | 5 +- src/modules/publicip.c | 15 +--- src/modules/swap.c | 9 +- src/modules/users.c | 14 +-- src/modules/wallpaper.c | 3 +- src/modules/weather.c | 10 +-- src/modules/wmtheme.c | 4 +- src/util/FFstrbuf.c | 20 ----- src/util/FFstrbuf.h | 87 ++++++++++++++++++- tests/strbuf.c | 9 +- 76 files changed, 274 insertions(+), 537 deletions(-) diff --git a/src/common/font.c b/src/common/font.c index d789d466f..8d79907b8 100644 --- a/src/common/font.c +++ b/src/common/font.c @@ -7,7 +7,7 @@ static void fontInit(FFfont* font) { ffStrbufInit(&font->pretty); ffStrbufInit(&font->name); - ffStrbufInitA(&font->size, 4); + ffStrbufInitA(&font->size, 8); ffListInitA(&font->styles, sizeof(FFstrbuf), 4); } diff --git a/src/common/format.c b/src/common/format.c index 7394822f8..07f54f247 100644 --- a/src/common/format.c +++ b/src/common/format.c @@ -134,18 +134,14 @@ void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t n continue; } - FFstrbuf placeholderValue; - ffStrbufInit(&placeholderValue); + FF_STRBUF_AUTO_DESTROY placeholderValue = ffStrbufCreate(); while(i < formatstr->length && formatstr->chars[i] != '}') ffStrbufAppendC(&placeholderValue, formatstr->chars[i++]); // test if for stop, if so break the loop if(placeholderValue.length == 1 && placeholderValue.chars[0] == '-') - { - ffStrbufDestroy(&placeholderValue); break; - } // test for end of an if, if so do nothing if(placeholderValue.length == 1 && placeholderValue.chars[0] == '?') @@ -155,7 +151,6 @@ void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t n else --numOpenIfs; - ffStrbufDestroy(&placeholderValue); continue; } @@ -167,7 +162,6 @@ void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t n else --numOpenNotIfs; - ffStrbufDestroy(&placeholderValue); continue; } @@ -182,7 +176,6 @@ void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t n --numOpenColors; } - ffStrbufDestroy(&placeholderValue); continue; } @@ -197,7 +190,6 @@ void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t n if(index > numArgs) { appendInvalidPlaceholder(buffer, "{?", &placeholderValue, i, formatstr->length); - ffStrbufDestroy(&placeholderValue); continue; } @@ -205,13 +197,11 @@ void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t n if(formatArgSet(&arguments[index - 1])) { ++numOpenIfs; - ffStrbufDestroy(&placeholderValue); continue; } // fastforward to the end of the if without printing the in between i = ffStrbufNextIndexS(formatstr, i, "{?}") + 2; // 2 is the length of "{?}" - 1 because the loop will increament it again directly after continue - ffStrbufDestroy(&placeholderValue); continue; } @@ -226,7 +216,6 @@ void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t n if(index > numArgs) { appendInvalidPlaceholder(buffer, "{/", &placeholderValue, i, formatstr->length); - ffStrbufDestroy(&placeholderValue); continue; } @@ -234,13 +223,11 @@ void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t n if(!formatArgSet(&arguments[index - 1])) { ++numOpenNotIfs; - ffStrbufDestroy(&placeholderValue); continue; } // fastforward to the end of the if without printing the in between i = ffStrbufNextIndexS(formatstr, i, "{/}") + 2; // 2 is the length of "{/}" - 1 because the loop will increament it again directly after continue - ffStrbufDestroy(&placeholderValue); continue; } @@ -252,7 +239,6 @@ void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t n ffStrbufAppendS(buffer, "\033["); ffStrbufAppend(buffer, &placeholderValue); ffStrbufAppendC(buffer, 'm'); - ffStrbufDestroy(&placeholderValue); continue; } @@ -262,13 +248,10 @@ void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t n if(index > numArgs) { appendInvalidPlaceholder(buffer, "{", &placeholderValue, i, formatstr->length); - ffStrbufDestroy(&placeholderValue); continue; } ffFormatAppendFormatArg(buffer, &arguments[index - 1]); - - ffStrbufDestroy(&placeholderValue); } ffStrbufTrimRight(buffer, ' '); diff --git a/src/common/init.c b/src/common/init.c index d805d0724..b6b8e6c61 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -107,28 +107,28 @@ static void defaultConfig(FFinstance* instance) ffInitSeparatorOptions(&instance->config.separator); ffInitGamepadOptions(&instance->config.gamepad); - ffStrbufInitA(&instance->config.libPCI, 0); - ffStrbufInitA(&instance->config.libVulkan, 0); - ffStrbufInitA(&instance->config.libWayland, 0); - ffStrbufInitA(&instance->config.libXcbRandr, 0); - ffStrbufInitA(&instance->config.libXcb, 0); - ffStrbufInitA(&instance->config.libXrandr, 0); - ffStrbufInitA(&instance->config.libX11, 0); - ffStrbufInitA(&instance->config.libGIO, 0); - ffStrbufInitA(&instance->config.libDConf, 0); - ffStrbufInitA(&instance->config.libDBus, 0); - ffStrbufInitA(&instance->config.libXFConf, 0); - ffStrbufInitA(&instance->config.libSQLite3, 0); - ffStrbufInitA(&instance->config.librpm, 0); - ffStrbufInitA(&instance->config.libImageMagick, 0); - ffStrbufInitA(&instance->config.libZ, 0); - ffStrbufInitA(&instance->config.libChafa, 0); - ffStrbufInitA(&instance->config.libEGL, 0); - ffStrbufInitA(&instance->config.libGLX, 0); - ffStrbufInitA(&instance->config.libOSMesa, 0); - ffStrbufInitA(&instance->config.libOpenCL, 0); - ffStrbufInitA(&instance->config.libJSONC, 0); - ffStrbufInitA(&instance->config.libfreetype, 0); + ffStrbufInit(&instance->config.libPCI); + ffStrbufInit(&instance->config.libVulkan); + ffStrbufInit(&instance->config.libWayland); + ffStrbufInit(&instance->config.libXcbRandr); + ffStrbufInit(&instance->config.libXcb); + ffStrbufInit(&instance->config.libXrandr); + ffStrbufInit(&instance->config.libX11); + ffStrbufInit(&instance->config.libGIO); + ffStrbufInit(&instance->config.libDConf); + ffStrbufInit(&instance->config.libDBus); + ffStrbufInit(&instance->config.libXFConf); + ffStrbufInit(&instance->config.libSQLite3); + ffStrbufInit(&instance->config.librpm); + ffStrbufInit(&instance->config.libImageMagick); + ffStrbufInit(&instance->config.libZ); + ffStrbufInit(&instance->config.libChafa); + ffStrbufInit(&instance->config.libEGL); + ffStrbufInit(&instance->config.libGLX); + ffStrbufInit(&instance->config.libOSMesa); + ffStrbufInit(&instance->config.libOpenCL); + ffStrbufInit(&instance->config.libJSONC); + ffStrbufInit(&instance->config.libfreetype); ffStrbufInit(&instance->config.libPulse); ffStrbufInit(&instance->config.libwlanapi); ffStrbufInit(&instance->config.libnm); @@ -142,7 +142,7 @@ static void defaultConfig(FFinstance* instance) instance->config.weatherTimeout = 0; ffStrbufInitS(&instance->config.weatherOutputFormat, "%t+-+%C+(%l)"); - ffStrbufInitA(&instance->config.playerName, 0); + ffStrbufInit(&instance->config.playerName); instance->config.percentType = 1; } diff --git a/src/common/io/io_unix.c b/src/common/io/io_unix.c index 420e4374e..8d506b05e 100644 --- a/src/common/io/io_unix.c +++ b/src/common/io/io_unix.c @@ -8,8 +8,7 @@ static void createSubfolders(const char* fileName) { - FFstrbuf path; - ffStrbufInit(&path); + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); while(*fileName != '\0') { @@ -18,8 +17,6 @@ static void createSubfolders(const char* fileName) mkdir(path.chars, S_IRWXU | S_IRGRP | S_IROTH); ++fileName; } - - ffStrbufDestroy(&path); } bool ffWriteFileData(const char* fileName, size_t dataSize, const void* data) @@ -218,9 +215,7 @@ void listFilesRecursively(FFstrbuf* folder, uint8_t indentation, const char* fol void ffListFilesRecursively(const char* path) { - FFstrbuf folder; - ffStrbufInitS(&folder, path); + FF_STRBUF_AUTO_DESTROY folder = ffStrbufCreateS(path); ffStrbufEnsureEndsWithC(&folder, '/'); listFilesRecursively(&folder, 0, NULL); - ffStrbufDestroy(&folder); } diff --git a/src/common/io/io_windows.c b/src/common/io/io_windows.c index 78cdad740..9a25a159a 100644 --- a/src/common/io/io_windows.c +++ b/src/common/io/io_windows.c @@ -2,9 +2,7 @@ static void createSubfolders(const char* fileName) { - FF_STRBUF_AUTO_DESTROY path; - ffStrbufInit(&path); - + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); while(*fileName != '\0') { ffStrbufAppendC(&path, *fileName); @@ -141,9 +139,7 @@ void listFilesRecursively(FFstrbuf* folder, uint8_t indentation, const char* fol void ffListFilesRecursively(const char* path) { - FFstrbuf folder; - ffStrbufInitS(&folder, path); + FF_STRBUF_AUTO_DESTROY folder = ffStrbufCreateS(path); ffStrbufEnsureEndsWithC(&folder, '/'); listFilesRecursively(&folder, 0, NULL); - ffStrbufDestroy(&folder); } diff --git a/src/common/library.c b/src/common/library.c index e771b8d4d..7f858e966 100644 --- a/src/common/library.c +++ b/src/common/library.c @@ -32,8 +32,7 @@ static void* libraryLoad(const char* path, int maxVersion) if(result != NULL || maxVersion < 0) return result; - FFstrbuf pathbuf; - ffStrbufInitA(&pathbuf, 64); + FF_STRBUF_AUTO_DESTROY pathbuf = ffStrbufCreateA(64); ffStrbufAppendS(&pathbuf, path); ffStrbufAppendC(&pathbuf, '.'); @@ -49,8 +48,6 @@ static void* libraryLoad(const char* path, int maxVersion) ffStrbufSubstrBefore(&pathbuf, originalLength); } - ffStrbufDestroy(&pathbuf); - #endif return result; diff --git a/src/common/networking_windows.c b/src/common/networking_windows.c index 5814acc16..4cb0e1d1a 100644 --- a/src/common/networking_windows.c +++ b/src/common/networking_windows.c @@ -75,8 +75,7 @@ bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, con } } - FF_STRBUF_AUTO_DESTROY command; - ffStrbufInitA(&command, 64); + FF_STRBUF_AUTO_DESTROY command = ffStrbufCreateA(64); ffStrbufAppendS(&command, "GET "); ffStrbufAppendS(&command, path); ffStrbufAppendS(&command, " HTTP/1.1\nHost: "); diff --git a/src/common/printing.c b/src/common/printing.c index 95350e09e..7ea0ecb03 100644 --- a/src/common/printing.c +++ b/src/common/printing.c @@ -26,13 +26,11 @@ void ffPrintLogoAndKey(FFinstance* instance, const char* moduleName, uint8_t mod } else { - FFstrbuf key; - ffStrbufInit(&key); + FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate(); ffParseFormatString(&key, customKeyFormat, 1, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_UINT8, &moduleIndex} }); ffPrintUserString(key.chars); - ffStrbufDestroy(&key); } if(!instance->config.pipe) @@ -46,9 +44,7 @@ void ffPrintLogoAndKey(FFinstance* instance, const char* moduleName, uint8_t mod void ffPrintFormatString(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFstrbuf* customKeyFormat, const FFstrbuf* format, uint32_t numArgs, const FFformatarg* arguments) { - FFstrbuf buffer; - ffStrbufInitA(&buffer, 256); - + FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreateA(256); ffParseFormatString(&buffer, format, numArgs, arguments); if(buffer.length > 0) @@ -57,8 +53,6 @@ void ffPrintFormatString(FFinstance* instance, const char* moduleName, uint8_t m ffPrintUserString(buffer.chars); putchar('\n'); } - - ffStrbufDestroy(&buffer); } void ffPrintFormat(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, uint32_t numArgs, const FFformatarg* arguments) @@ -74,15 +68,10 @@ static void printError(FFinstance* instance, const char* moduleName, uint8_t mod if(hasCustomErrorFormat) { - FFstrbuf error; - ffStrbufInit(&error); - ffStrbufAppendVF(&error, message, arguments); - + FF_STRBUF_AUTO_DESTROY error = ffStrbufCreateVF(message, arguments); ffPrintFormatString(instance, moduleName, moduleIndex, customKeyFormat, customErrorFormat, 1, (FFformatarg[]) { {FF_FORMAT_ARG_TYPE_STRBUF, &error} }); - - ffStrbufDestroy(&error); } else { diff --git a/src/common/processing_windows.c b/src/common/processing_windows.c index a2db719c1..580a29146 100644 --- a/src/common/processing_windows.c +++ b/src/common/processing_windows.c @@ -28,8 +28,7 @@ const char* ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[]) BOOL success; { - FF_STRBUF_AUTO_DESTROY cmdline; - ffStrbufInitF(&cmdline, "\"%s\"", argv[0]); + FF_STRBUF_AUTO_DESTROY cmdline = ffStrbufCreateF("\"%s\"", argv[0]); for(char* const* parg = &argv[1]; *parg; ++parg) { ffStrbufAppendC(&cmdline, ' '); diff --git a/src/common/properties.c b/src/common/properties.c index 48b797599..6543d14a4 100644 --- a/src/common/properties.c +++ b/src/common/properties.c @@ -146,25 +146,15 @@ done: bool ffParsePropFileHomeValues(const FFinstance* instance, const char* relativeFile, uint32_t numQueries, FFpropquery* queries) { - FFstrbuf absolutePath; - ffStrbufInitA(&absolutePath, 64); - ffStrbufAppend(&absolutePath, &instance->state.platform.homeDir); - ffStrbufAppendC(&absolutePath, '/'); - ffStrbufAppendS(&absolutePath, relativeFile); - - bool result = ffParsePropFileValues(absolutePath.chars, numQueries, queries); - - ffStrbufDestroy(&absolutePath); - - return result; + FF_STRBUF_AUTO_DESTROY absolutePath = ffStrbufCreateF("%s/%s", instance->state.platform.homeDir.chars, relativeFile); + return ffParsePropFileValues(absolutePath.chars, numQueries, queries); } bool ffParsePropFileListValues(const FFlist* list, const char* relativeFile, uint32_t numQueries, FFpropquery* queries) { bool foundAFile = false; - FFstrbuf baseDir; - ffStrbufInitA(&baseDir, 64); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateA(64); FF_LIST_FOR_EACH(FFstrbuf, dirPrefix, *list) { @@ -189,7 +179,5 @@ bool ffParsePropFileListValues(const FFlist* list, const char* relativeFile, uin break; } - ffStrbufDestroy(&baseDir); - return foundAFile; } diff --git a/src/detection/battery/battery_android.c b/src/detection/battery/battery_android.c index 1bcb48db7..0b90494fc 100644 --- a/src/detection/battery/battery_android.c +++ b/src/detection/battery/battery_android.c @@ -9,8 +9,7 @@ const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) { - FF_STRBUF_AUTO_DESTROY buffer; - ffStrbufInit(&buffer); + FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); if(ffProcessAppendStdOut(&buffer, (char* const[]){ FF_TERMUX_API_PATH, diff --git a/src/detection/battery/battery_linux.c b/src/detection/battery/battery_linux.c index 7ae4a3639..11da6f4e9 100644 --- a/src/detection/battery/battery_linux.c +++ b/src/detection/battery/battery_linux.c @@ -8,8 +8,7 @@ static void parseBattery(FFstrbuf* dir, FFlist* results) { uint32_t dirLength = dir->length; - FFstrbuf testBatteryBuffer; - ffStrbufInit(&testBatteryBuffer); + FF_STRBUF_AUTO_DESTROY testBatteryBuffer = ffStrbufCreate(); //type must exist and be "Battery" ffStrbufAppendS(dir, "/type"); @@ -17,10 +16,7 @@ static void parseBattery(FFstrbuf* dir, FFlist* results) ffStrbufSubstrBefore(dir, dirLength); if(ffStrbufIgnCaseCompS(&testBatteryBuffer, "Battery") != 0) - { - ffStrbufDestroy(&testBatteryBuffer); return; - } //scope may not exist or must not be "Device" ffStrbufAppendS(dir, "/scope"); @@ -28,10 +24,7 @@ static void parseBattery(FFstrbuf* dir, FFlist* results) ffStrbufSubstrBefore(dir, dirLength); if(ffStrbufIgnCaseCompS(&testBatteryBuffer, "Device") == 0) - { - ffStrbufDestroy(&testBatteryBuffer); return; - } BatteryResult* result = ffListAdd(results); @@ -41,7 +34,7 @@ static void parseBattery(FFstrbuf* dir, FFlist* results) ffStrbufSubstrBefore(dir, dirLength); if(available) result->capacity = ffStrbufToDouble(&testBatteryBuffer); - ffStrbufDestroy(&testBatteryBuffer); + if(!available) { result->capacity = 0.0/0.0; @@ -76,8 +69,8 @@ static void parseBattery(FFstrbuf* dir, FFlist* results) const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) { - FFstrbuf baseDir; - ffStrbufInitA(&baseDir, 64); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateA(64); + if(instance->config.battery.dir.length > 0) { ffStrbufAppend(&baseDir, &instance->config.battery.dir); @@ -92,10 +85,7 @@ const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) DIR* dirp = opendir(baseDir.chars); if(dirp == NULL) - { - ffStrbufDestroy(&baseDir); return "opendir(batteryDir) == NULL"; - } struct dirent* entry; while((entry = readdir(dirp)) != NULL) @@ -110,11 +100,8 @@ const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) closedir(dirp); - if(results->length == 0) { - ffStrbufDestroy(&baseDir); + if(results->length == 0) return "batteryDir doesn't contain any battery folder"; - } - ffStrbufDestroy(&baseDir); return NULL; } diff --git a/src/detection/brightness/brightness_linux.c b/src/detection/brightness/brightness_linux.c index 3222faeae..9c00f70e9 100644 --- a/src/detection/brightness/brightness_linux.c +++ b/src/detection/brightness/brightness_linux.c @@ -13,14 +13,12 @@ const char* ffDetectBrightness(FF_MAYBE_UNUSED FFlist* result) if(dirp == NULL) return "Failed to open `/sys/class/backlight/`"; - FF_STRBUF_AUTO_DESTROY backlightDir; - ffStrbufInitA(&backlightDir, 64); + FF_STRBUF_AUTO_DESTROY backlightDir = ffStrbufCreateA(64); ffStrbufAppendS(&backlightDir, backlightDirPath); uint32_t backlightDirLength = backlightDir.length; - FF_STRBUF_AUTO_DESTROY buffer; - ffStrbufInit(&buffer); + FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); struct dirent* entry; while((entry = readdir(dirp)) != NULL) diff --git a/src/detection/cpu/cpu_bsd.c b/src/detection/cpu/cpu_bsd.c index 9f1e018d3..c3c88e440 100644 --- a/src/detection/cpu/cpu_bsd.c +++ b/src/detection/cpu/cpu_bsd.c @@ -7,8 +7,7 @@ void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu) if (instance->config.cpu.temp) { - FF_STRBUF_AUTO_DESTROY cpuTemp; - ffStrbufInit(&cpuTemp); + FF_STRBUF_AUTO_DESTROY cpuTemp = ffStrbufCreate(); if(ffSysctlGetString("temperature", &cpuTemp)) cpu->temperature = FF_CPU_TEMP_UNSET; else diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index d46221333..bc14e2f18 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -41,12 +41,10 @@ static void parseCpuInfo(FFCPUResult* cpu, FFstrbuf* physicalCoresBuffer, FFstrb static double getGHz(const char* file) { - FFstrbuf content; - ffStrbufInit(&content); + FF_STRBUF_AUTO_DESTROY content = ffStrbufCreate(); if(ffAppendFileBuffer(file, &content)) { double herz = ffStrbufToDouble(&content); - ffStrbufDestroy(&content); //ffStrbufToDouble failed if(herz != herz) @@ -111,17 +109,10 @@ void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu) else cpu->temperature = FF_CPU_TEMP_UNSET; - FFstrbuf physicalCoresBuffer; - ffStrbufInit(&physicalCoresBuffer); - - FFstrbuf cpuMHz; - ffStrbufInit(&cpuMHz); - - FFstrbuf cpuIsa; - ffStrbufInit(&cpuIsa); - - FFstrbuf cpuUarch; - ffStrbufInit(&cpuUarch); + FF_STRBUF_AUTO_DESTROY physicalCoresBuffer = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY cpuMHz = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY cpuIsa = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY cpuUarch = ffStrbufCreate(); parseCpuInfo(cpu, &physicalCoresBuffer, &cpuMHz, &cpuIsa, &cpuUarch); @@ -155,9 +146,4 @@ void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu) ffStrbufAppendC(&cpu->name, ' '); ffStrbufAppend(&cpu->name, &cpuIsa); } - - ffStrbufDestroy(&physicalCoresBuffer); - ffStrbufDestroy(&cpuMHz); - ffStrbufDestroy(&cpuIsa); - ffStrbufDestroy(&cpuUarch); } diff --git a/src/detection/disk/disk_linux.c b/src/detection/disk/disk_linux.c index 6f4eab2bc..2be87af66 100644 --- a/src/detection/disk/disk_linux.c +++ b/src/detection/disk/disk_linux.c @@ -112,8 +112,7 @@ static void detectName(FFDisk* disk, const FFstrbuf* device) if(stat(device->chars, &deviceStat) != 0) return; - FF_STRBUF_AUTO_DESTROY basePath; - ffStrbufInit(&basePath); + FF_STRBUF_AUTO_DESTROY basePath = ffStrbufCreate(); //Try partlabel first ffStrbufSetS(&basePath, "/dev/disk/by-partlabel/"); diff --git a/src/detection/displayserver/displayserver_apple.c b/src/detection/displayserver/displayserver_apple.c index 05c017a49..e2ae57c5d 100644 --- a/src/detection/displayserver/displayserver_apple.c +++ b/src/detection/displayserver/displayserver_apple.c @@ -40,8 +40,7 @@ static void detectDisplays(FFDisplayServerResult* ds, bool detectName) } } - FF_STRBUF_AUTO_DESTROY name; - ffStrbufInit(&name); + FF_STRBUF_AUTO_DESTROY name = ffStrbufCreate(); if(detectName && CoreDisplay_DisplayCreateInfoDictionary) { CFDictionaryRef FF_CFTYPE_AUTO_RELEASE displayInfo = CoreDisplay_DisplayCreateInfoDictionary(screen); diff --git a/src/detection/displayserver/displayserver_nosupport.c b/src/detection/displayserver/displayserver_nosupport.c index 359ebc634..bef1e4554 100644 --- a/src/detection/displayserver/displayserver_nosupport.c +++ b/src/detection/displayserver/displayserver_nosupport.c @@ -4,11 +4,11 @@ void ffConnectDisplayServerImpl(FFDisplayServerResult* ds, const FFinstance* ins { FF_UNUSED(instance); - ffStrbufInitA(&ds->wmProcessName, 0); - ffStrbufInitA(&ds->wmPrettyName, 0); - ffStrbufInitA(&ds->wmProtocolName, 0); - ffStrbufInitA(&ds->deProcessName, 0); - ffStrbufInitA(&ds->dePrettyName, 0); - ffStrbufInitA(&ds->deVersion, 0); + ffStrbufInit(&ds->wmProcessName); + ffStrbufInit(&ds->wmPrettyName); + ffStrbufInit(&ds->wmProtocolName); + ffStrbufInit(&ds->deProcessName); + ffStrbufInit(&ds->dePrettyName); + ffStrbufInit(&ds->deVersion); ffListInitA(&ds->displays, sizeof(FFDisplayResult), 0); } diff --git a/src/detection/displayserver/displayserver_windows.c b/src/detection/displayserver/displayserver_windows.c index 1ee86ef5d..9b7bec99b 100644 --- a/src/detection/displayserver/displayserver_windows.c +++ b/src/detection/displayserver/displayserver_windows.c @@ -42,8 +42,7 @@ static void detectDisplays(FFDisplayServerResult* ds, bool detectName) DeleteDC(hdc); } - FF_STRBUF_AUTO_DESTROY name; - ffStrbufInit(&name); + FF_STRBUF_AUTO_DESTROY name = ffStrbufCreate(); if (detectName) { diff --git a/src/detection/displayserver/linux/displayserver_linux.c b/src/detection/displayserver/linux/displayserver_linux.c index 257c60cc1..4d50184f4 100644 --- a/src/detection/displayserver/linux/displayserver_linux.c +++ b/src/detection/displayserver/linux/displayserver_linux.c @@ -10,8 +10,7 @@ static void parseDRM(FFDisplayServerResult* result) if(dirp == NULL) return; - FFstrbuf drmDir; - ffStrbufInitA(&drmDir, 64); + FF_STRBUF_AUTO_DESTROY drmDir = ffStrbufCreateA(64); ffStrbufAppendS(&drmDir, drmDirPath); uint32_t drmDirLength = drmDir.length; @@ -48,7 +47,6 @@ static void parseDRM(FFDisplayServerResult* result) } closedir(dirp); - ffStrbufDestroy(&drmDir); } void ffConnectDisplayServerImpl(FFDisplayServerResult* ds, const FFinstance* instance) diff --git a/src/detection/displayserver/linux/wayland.c b/src/detection/displayserver/linux/wayland.c index d65fa70a5..b4e31f77e 100644 --- a/src/detection/displayserver/linux/wayland.c +++ b/src/detection/displayserver/linux/wayland.c @@ -42,13 +42,11 @@ static void waylandDetectWM(int fd, FFDisplayServerResult* result) if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == -1) return; - FFstrbuf procPath; - ffStrbufInit(&procPath); + FF_STRBUF_AUTO_DESTROY procPath = ffStrbufCreate(); ffStrbufAppendF(&procPath, "/proc/%d/cmdline", ucred.pid); //We check the cmdline for the process name, because it is not trimmed. ffReadFileBuffer(procPath.chars, &result->wmProcessName); ffStrbufSubstrBeforeFirstC(&result->wmProcessName, '\0'); //Trim the arguments ffStrbufSubstrAfterLastC(&result->wmProcessName, '/'); //Trim the path - ffStrbufDestroy(&procPath); } #else static void waylandDetectWM(int fd, FFDisplayServerResult* result) diff --git a/src/detection/displayserver/linux/wmde.c b/src/detection/displayserver/linux/wmde.c index db309b92a..a9e580cbe 100644 --- a/src/detection/displayserver/linux/wmde.c +++ b/src/detection/displayserver/linux/wmde.c @@ -165,14 +165,9 @@ static void getMate(const FFinstance* instance, FFDisplayServerResult* result) ffStrbufSetS(&result->deProcessName, "mate-session"); ffStrbufSetS(&result->dePrettyName, FF_DE_PRETTY_MATE); - FFstrbuf major; - ffStrbufInit(&major); - - FFstrbuf minor; - ffStrbufInit(&minor); - - FFstrbuf micro; - ffStrbufInit(µ); + FF_STRBUF_AUTO_DESTROY major = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY minor = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY micro = ffStrbufCreate(); ffParsePropFileDataValues(instance, "mate-about/mate-version.xml", 3, (FFpropquery[]) { {"", &major}, @@ -182,10 +177,6 @@ static void getMate(const FFinstance* instance, FFDisplayServerResult* result) ffParseSemver(&result->deVersion, &major, &minor, µ); - ffStrbufDestroy(&major); - ffStrbufDestroy(&minor); - ffStrbufDestroy(µ); - if(result->deVersion.length == 0 && instance->config.allowSlowOperations) { ffProcessAppendStdOut(&result->deVersion, (char* const[]){ @@ -244,13 +235,10 @@ static void getLXQt(const FFinstance* instance, FFDisplayServerResult* result) ffParsePropLines(result->deVersion.chars , "liblxqt", &result->deVersion); } - FFstrbuf wmProcessNameBuffer; - ffStrbufInit(&wmProcessNameBuffer); + FF_STRBUF_AUTO_DESTROY wmProcessNameBuffer = ffStrbufCreate(); ffParsePropFileConfig(instance, "lxqt/session.conf", "window_manager =", &wmProcessNameBuffer); applyBetterWM(result, wmProcessNameBuffer.chars); - - ffStrbufDestroy(&wmProcessNameBuffer); } static void getBudgie(const FFinstance* instance, FFDisplayServerResult* result) @@ -351,21 +339,14 @@ static void getFromProcDir(const FFinstance* instance, FFDisplayServerResult* re if(proc == NULL) return; - FFstrbuf procPath; - ffStrbufInitA(&procPath, 64); + FF_STRBUF_AUTO_DESTROY procPath = ffStrbufCreateA(64); ffStrbufAppendS(&procPath, "/proc/"); uint32_t procPathLength = procPath.length; - FFstrbuf userID; - ffStrbufInit(&userID); - ffStrbufAppendF(&userID, "%i", getuid()); - - FFstrbuf loginuid; - ffStrbufInit(&loginuid); - - FFstrbuf processName; - ffStrbufInitA(&processName, 256); //Some processes have large command lines (looking at you chrome) + FF_STRBUF_AUTO_DESTROY userID = ffStrbufCreateF("%i", getuid()); + FF_STRBUF_AUTO_DESTROY loginuid = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY processName = ffStrbufCreateA(256); //Some processes have large command lines (looking at you chrome) struct dirent* dirent; while((dirent = readdir(proc)) != NULL) @@ -407,11 +388,6 @@ static void getFromProcDir(const FFinstance* instance, FFDisplayServerResult* re } closedir(proc); - - ffStrbufDestroy(&processName); - ffStrbufDestroy(&loginuid); - ffStrbufDestroy(&userID); - ffStrbufDestroy(&procPath); } void ffdsDetectWMDE(const FFinstance* instance, FFDisplayServerResult* result) diff --git a/src/detection/gamepad/gamepad_linux.c b/src/detection/gamepad/gamepad_linux.c index ce61a5711..3da034044 100644 --- a/src/detection/gamepad/gamepad_linux.c +++ b/src/detection/gamepad/gamepad_linux.c @@ -10,8 +10,7 @@ const char* ffDetectGamepad(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* if(dirp == NULL) return "opendir(\"/sys/class/input/\") == NULL"; - FF_STRBUF_AUTO_DESTROY path; - ffStrbufInitS(&path, "/sys/class/input/"); + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateS("/sys/class/input/"); uint32_t baseLen = path.length; struct dirent* entry; diff --git a/src/detection/gpu/gpu_linux.c b/src/detection/gpu/gpu_linux.c index d5a081fdd..411bfd45b 100644 --- a/src/detection/gpu/gpu_linux.c +++ b/src/detection/gpu/gpu_linux.c @@ -64,14 +64,9 @@ static void drmDetectDeviceName(const FFinstance* instance, FFGPUResult* gpu, PC #endif } - FFstrbuf query; - ffStrbufInit(&query); - ffStrbufAppendF(&query, "%X, %X,", device->device_id, revId); - + FF_STRBUF_AUTO_DESTROY query = ffStrbufCreateF("%X, %X,", device->device_id, revId); ffParsePropFileData(instance, "libdrm/amdgpu.ids", query.chars, &gpu->name); - ffStrbufDestroy(&query); - const char* removeStrings[] = { "AMD ", "ATI ", " (TM)", "(TM)", @@ -116,10 +111,7 @@ static void pciDetectDriverName(FFGPUResult* gpu, PCIData* pci, struct pci_dev* if(!ffStrSet(base)) return; - FFstrbuf path; - ffStrbufInitA(&path, 64); - ffStrbufAppendF(&path, "%s/devices/%04x:%02x:%02x.%d/driver", base, device->domain, device->bus, device->dev, device->func); - + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateF("%s/devices/%04x:%02x:%02x.%d/driver", base, device->domain, device->bus, device->dev, device->func); ffStrbufEnsureFree(&gpu->driver, 1023); ssize_t resultLength = readlink(path.chars, gpu->driver.chars, gpu->driver.allocated - 1); //-1 for null terminator if(resultLength > 0) @@ -128,8 +120,6 @@ static void pciDetectDriverName(FFGPUResult* gpu, PCIData* pci, struct pci_dev* gpu->driver.chars[resultLength] = '\0'; ffStrbufSubstrAfterLastC(&gpu->driver, '/'); } - - ffStrbufDestroy(&path); } static void pciDetectTemperatur(FFGPUResult* gpu, struct pci_dev* device) diff --git a/src/detection/gtk_qt/gtk.c b/src/detection/gtk_qt/gtk.c index e61c951aa..abd5a857e 100644 --- a/src/detection/gtk_qt/gtk.c +++ b/src/detection/gtk_qt/gtk.c @@ -162,8 +162,7 @@ static void detectGTK(const FFinstance* instance, const char* version, FFGTKResu return; //We need to do this because we use multiple threads on configDirs - FFstrbuf baseDir; - ffStrbufInitA(&baseDir, 64); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateA(64); FF_LIST_FOR_EACH(FFstrbuf, configDir, instance->state.platform.configDirs) { @@ -172,8 +171,6 @@ static void detectGTK(const FFinstance* instance, const char* version, FFGTKResu if(allPropertiesSet(result)) break; } - - ffStrbufDestroy(&baseDir); } #define FF_DETECT_GTK_IMPL(version) \ diff --git a/src/detection/gtk_qt/qt.c b/src/detection/gtk_qt/qt.c index 74b54a1df..ebf36fbb9 100644 --- a/src/detection/gtk_qt/qt.c +++ b/src/detection/gtk_qt/qt.c @@ -85,8 +85,7 @@ static void detectPlasma(const FFinstance* instance, FFQtResult* result) bool foundAFile = false; //We need to do this because we use multiple threads on configDirs - FFstrbuf baseDir; - ffStrbufInitA(&baseDir, 64); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateA(64); FF_LIST_FOR_EACH(FFstrbuf, configDir, instance->state.platform.configDirs) { @@ -97,13 +96,9 @@ static void detectPlasma(const FFinstance* instance, FFQtResult* result) foundAFile = true; if(allValuesSet(result)) - { - ffStrbufDestroy(&baseDir); return; - } } - ffStrbufDestroy(&baseDir); if(!foundAFile) return; diff --git a/src/detection/host/host_android.c b/src/detection/host/host_android.c index edeb9cb47..240a65b9d 100644 --- a/src/detection/host/host_android.c +++ b/src/detection/host/host_android.c @@ -32,6 +32,6 @@ void ffDetectHostImpl(FFHostResult* host) //Not implemented - ffStrbufInitA(&host->productVersion, 0); - ffStrbufInitA(&host->productSku, 0); + ffStrbufInit(&host->productVersion); + ffStrbufInit(&host->productSku); } diff --git a/src/detection/host/host_linux.c b/src/detection/host/host_linux.c index 04ae3aa27..766b4f47a 100644 --- a/src/detection/host/host_linux.c +++ b/src/detection/host/host_linux.c @@ -89,8 +89,7 @@ void ffDetectHostImpl(FFHostResult* host) { ffStrbufAppendS(&host->productName, "Windows Subsystem for Linux"); - FFstrbuf wslVer; //Wide charactors - ffStrbufInit(&wslVer); + FF_STRBUF_AUTO_DESTROY wslVer = ffStrbufCreate(); //Wide charactors if(!ffProcessAppendStdOut(&wslVer, (char* const[]){ "wsl.exe", "--version", @@ -106,7 +105,6 @@ void ffDetectHostImpl(FFHostResult* host) } ffStrbufAppendC(&host->productName, ')'); } - ffStrbufDestroy(&wslVer); } } } diff --git a/src/detection/icons/icons_linux.c b/src/detection/icons/icons_linux.c index 4ab35b542..5246950db 100644 --- a/src/detection/icons/icons_linux.c +++ b/src/detection/icons/icons_linux.c @@ -18,8 +18,7 @@ const char* ffDetectIcons(const FFinstance* instance, FFstrbuf* result) if(plasma->length == 0 && gtk2->length == 0 && gtk3->length == 0 && gtk4->length == 0) return "No icons could be found"; - FF_STRBUF_AUTO_DESTROY gtkPretty; - ffStrbufInit(>kPretty); + FF_STRBUF_AUTO_DESTROY gtkPretty = ffStrbufCreate(); ffParseGTK(>kPretty, gtk2, gtk3, gtk4); if(plasma->length > 0) diff --git a/src/detection/media/media.c b/src/detection/media/media.c index 5c9d2145f..7bb38d0e5 100644 --- a/src/detection/media/media.c +++ b/src/detection/media/media.c @@ -6,7 +6,7 @@ void ffDetectMediaImpl(const FFinstance* instance, FFMediaResult* media); const FFMediaResult* ffDetectMedia(const FFinstance* instance) { FF_DETECTION_INTERNAL_GUARD(FFMediaResult, - ffStrbufInitA(&result.error, 0); + ffStrbufInit(&result.error); ffStrbufInit(&result.playerId); ffStrbufInit(&result.player); ffStrbufInit(&result.song); diff --git a/src/detection/media/media_linux.c b/src/detection/media/media_linux.c index d470641f7..f4e8c9ea2 100644 --- a/src/detection/media/media_linux.c +++ b/src/detection/media/media_linux.c @@ -107,12 +107,9 @@ static void getCustomBus(FFDBusData* data, const FFinstance* instance, FFMediaRe return; } - FFstrbuf busName; - ffStrbufInit(&busName); - ffStrbufAppendS(&busName, FF_DBUS_MPRIS_PREFIX); + FF_STRBUF_AUTO_DESTROY busName = ffStrbufCreateS(FF_DBUS_MPRIS_PREFIX); ffStrbufAppend(&busName, &instance->config.playerName); getBusProperties(data, busName.chars, result); - ffStrbufDestroy(&busName); } static void getBestBus(FFDBusData* data, FFMediaResult* result) diff --git a/src/detection/os/os_apple.m b/src/detection/os/os_apple.m index 49a387d42..0b537d718 100644 --- a/src/detection/os/os_apple.m +++ b/src/detection/os/os_apple.m @@ -107,10 +107,10 @@ void ffDetectOSImpl(FFOSResult* os, const FFinstance* instance) ffStrbufInit(&os->prettyName); ffStrbufInit(&os->versionID); - ffStrbufInitA(&os->codename, 0); - ffStrbufInitA(&os->idLike, 0); - ffStrbufInitA(&os->variant, 0); - ffStrbufInitA(&os->variantID, 0); + ffStrbufInit(&os->codename); + ffStrbufInit(&os->idLike); + ffStrbufInit(&os->variant); + ffStrbufInit(&os->variantID); parseSystemVersion(os); diff --git a/src/detection/packages/packages_apple.c b/src/detection/packages/packages_apple.c index eaaf5f2fa..0f7ab36e0 100644 --- a/src/detection/packages/packages_apple.c +++ b/src/detection/packages/packages_apple.c @@ -28,8 +28,7 @@ static uint32_t getNumElements(const char* dirname, unsigned char type) static void countBrewPackages(const char* dirname, FFPackagesResult* result) { - FF_STRBUF_AUTO_DESTROY baseDir; - ffStrbufInitS(&baseDir, dirname); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateS(dirname); uint32_t baseDirLength = baseDir.length; @@ -54,8 +53,7 @@ static void getBrewPackages(FFPackagesResult* result) static uint32_t countMacPortsPackages(const char* dirname) { - FF_STRBUF_AUTO_DESTROY baseDir; - ffStrbufInitS(&baseDir, dirname); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateS(dirname); ffStrbufAppendS(&baseDir, "/var/macports/software"); return getNumElements(baseDir.chars, DT_DIR); diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index b0b47f37c..4a9c483a0 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -132,12 +132,10 @@ static uint32_t getNixPackagesImpl(char* path) if(!ffPathExists(path, FF_PATHTYPE_DIRECTORY)) return 0; - FFstrbuf output; - ffStrbufInitA(&output, 128); + FF_STRBUF_AUTO_DESTROY output = ffStrbufCreateA(128); //https://github.com/LinusDierheimer/fastfetch/issues/195#issuecomment-1191748222 - FFstrbuf command; - ffStrbufInitA(&command, 255); + FF_STRBUF_AUTO_DESTROY command = ffStrbufCreateA(255); ffStrbufAppendS(&command, "for x in $(nix-store --query --requisites "); ffStrbufAppendS(&command, path); ffStrbufAppendS(&command, "); do if [ -d $x ]; then echo $x ; fi ; done | cut -d- -f2- | egrep '([0-9]{1,}\\.)+[0-9]{1,}' | egrep -v '\\-doc$|\\-man$|\\-info$|\\-dev$|\\-bin$|^nixos-system-nixos-' | uniq | wc -l"); @@ -149,12 +147,7 @@ static uint32_t getNixPackagesImpl(char* path) NULL }); - int result = (int) strtol(output.chars, NULL, 10); - - ffStrbufDestroy(&command); - ffStrbufDestroy(&output); - - return (uint32_t) result; + return (uint32_t) strtol(output.chars, NULL, 10); } static uint32_t getNixPackages(FFstrbuf* baseDir, const char* dirname) @@ -329,8 +322,7 @@ static void getPackageCountsBedrock(const FFinstance* instance, FFstrbuf* baseDi void ffDetectPackagesImpl(const FFinstance* instance, FFPackagesResult* result) { - FF_STRBUF_AUTO_DESTROY baseDir; - ffStrbufInitA(&baseDir, 512); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateA(512); ffStrbufAppendS(&baseDir, FASTFETCH_TARGET_DIR_ROOT); if(ffStrbufIgnCaseEqualS(&ffDetectOS(instance)->id, "bedrock")) diff --git a/src/detection/packages/packages_windows.c b/src/detection/packages/packages_windows.c index 086a10ea1..30870ce5d 100644 --- a/src/detection/packages/packages_windows.c +++ b/src/detection/packages/packages_windows.c @@ -34,8 +34,7 @@ static uint32_t getNumElements(const char* searchPath /* including `\*` suffix * static void detectScoop(const FFinstance* instance, FFPackagesResult* result) { - FF_STRBUF_AUTO_DESTROY scoopPath; - ffStrbufInitA(&scoopPath, MAX_PATH + 3); + FF_STRBUF_AUTO_DESTROY scoopPath = ffStrbufCreateA(MAX_PATH + 3); const char* scoopEnv = getenv("SCOOP"); if(ffStrSet(scoopEnv)) diff --git a/src/detection/temps/temps_linux.c b/src/detection/temps/temps_linux.c index 0ade8180f..55506c384 100644 --- a/src/detection/temps/temps_linux.c +++ b/src/detection/temps/temps_linux.c @@ -11,8 +11,7 @@ static bool parseHwmonDir(FFstrbuf* dir, FFTempValue* value) //https://www.kernel.org/doc/Documentation/hwmon/sysfs-interface uint32_t dirLength = dir->length; - FF_STRBUF_AUTO_DESTROY valueBuffer; - ffStrbufInit(&valueBuffer); + FF_STRBUF_AUTO_DESTROY valueBuffer = ffStrbufCreate(); ffStrbufAppendS(dir, "temp1_input"); if(!ffReadFileBuffer(dir->chars, &valueBuffer)) @@ -58,8 +57,7 @@ const FFTempsResult* ffDetectTemps() ffListInitA(&result.values, sizeof(FFTempValue), 16); - FFstrbuf baseDir; - ffStrbufInitA(&baseDir, 64); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateA(64); ffStrbufAppendS(&baseDir, "/sys/class/hwmon/"); uint32_t baseDirLength = baseDir.length; @@ -67,7 +65,6 @@ const FFTempsResult* ffDetectTemps() DIR* dirp = opendir(baseDir.chars); if(dirp == NULL) { - ffStrbufDestroy(&baseDir); ffThreadMutexUnlock(&mutex); return &result; } @@ -94,7 +91,6 @@ const FFTempsResult* ffDetectTemps() } closedir(dirp); - ffStrbufDestroy(&baseDir); ffThreadMutexUnlock(&mutex); return &result; diff --git a/src/detection/terminalfont/terminalfont.c b/src/detection/terminalfont/terminalfont.c index dbb10a8b0..cd0764247 100644 --- a/src/detection/terminalfont/terminalfont.c +++ b/src/detection/terminalfont/terminalfont.c @@ -6,11 +6,8 @@ static void detectAlacritty(const FFinstance* instance, FFTerminalFontResult* terminalFont) { - FFstrbuf fontName; - ffStrbufInit(&fontName); - - FFstrbuf fontSize; - ffStrbufInit(&fontSize); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY fontSize = ffStrbufCreate(); FFpropquery fontQuery[] = { {"family:", &fontName}, @@ -33,15 +30,11 @@ static void detectAlacritty(const FFinstance* instance, FFTerminalFontResult* te ffStrbufAppendS(&fontSize, "11"); ffFontInitValues(&terminalFont->font, fontName.chars, fontSize.chars); - - ffStrbufDestroy(&fontName); - ffStrbufDestroy(&fontSize); } FF_MAYBE_UNUSED static void detectTTY(FFTerminalFontResult* terminalFont) { - FFstrbuf fontName; - ffStrbufInit(&fontName); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); ffParsePropFile(FASTFETCH_TARGET_DIR_ETC"/vconsole.conf", "Font =", &fontName); @@ -61,8 +54,6 @@ FF_MAYBE_UNUSED static void detectTTY(FFTerminalFontResult* terminalFont) ffFontInitCopy(&terminalFont->font, fontName.chars); else ffStrbufAppendS(&terminalFont->error, "Couldn't find Font in "FASTFETCH_TARGET_DIR_ETC"/vconsole.conf"); - - ffStrbufDestroy(&fontName); } #if defined(_WIN32) || defined(__linux__) @@ -113,8 +104,7 @@ static const char* detectFromWTImpl(const FFinstance* instance, FFstrbuf* conten if (!profiles) return "json_object_object_get(root, \"profiles\") failed"; - FF_STRBUF_AUTO_DESTROY wtProfileId; - ffStrbufInitS(&wtProfileId, getenv("WT_PROFILE_ID")); + FF_STRBUF_AUTO_DESTROY wtProfileId = ffStrbufCreateS(getenv("WT_PROFILE_ID")); ffStrbufTrim(&wtProfileId, '\''); if (wtProfileId.length > 0) { @@ -158,8 +148,7 @@ static const char* detectFromWTImpl(const FFinstance* instance, FFstrbuf* conten static void detectFromWindowsTeriminal(const FFinstance* instance, const FFstrbuf* terminalExe, FFTerminalFontResult* terminalFont) { //https://learn.microsoft.com/en-us/windows/terminal/install#settings-json-file - FFstrbuf json; - ffStrbufInit(&json); + FF_STRBUF_AUTO_DESTROY json = ffStrbufCreate(); const char* error = NULL; #ifdef _WIN32 @@ -219,22 +208,18 @@ static void detectFromWindowsTeriminal(const FFinstance* instance, const FFstrbu if(error) { ffStrbufAppendS(&terminalFont->error, error); - ffStrbufDestroy(&json); return; } ffStrbufTrimRight(&json, '\n'); if(json.length == 0) { ffStrbufAppendS(&terminalFont->error, "Cannot find file \"settings.json\""); - ffStrbufDestroy(&json); return; } - FFstrbuf name; - ffStrbufInit(&name); + FF_STRBUF_AUTO_DESTROY name = ffStrbufCreate(); double size = -1; error = detectFromWTImpl(instance, &json, &name, &size); - ffStrbufDestroy(&json); if(error) ffStrbufAppendS(&terminalFont->error, error); @@ -244,8 +229,6 @@ static void detectFromWindowsTeriminal(const FFinstance* instance, const FFstrbu snprintf(sizeStr, sizeof(sizeStr), "%g", size); ffFontInitValues(&terminalFont->font, name.chars, sizeStr); } - - ffStrbufDestroy(&name); } #else //FF_HAVE_JSONC @@ -262,11 +245,8 @@ static void detectFromWindowsTeriminal(const FFinstance* instance, const FFstrbu FF_MAYBE_UNUSED static bool detectKitty(const FFinstance* instance, FFTerminalFontResult* result) { - FF_STRBUF_AUTO_DESTROY fontName; - ffStrbufInit(&fontName); - - FF_STRBUF_AUTO_DESTROY fontSize; - ffStrbufInit(&fontSize); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY fontSize = ffStrbufCreate(); FFpropquery fontQuery[] = { {"font_family ", &fontName}, @@ -288,11 +268,8 @@ FF_MAYBE_UNUSED static bool detectKitty(const FFinstance* instance, FFTerminalFo static void detectTerminator(const FFinstance* instance, FFTerminalFontResult* result) { - FF_STRBUF_AUTO_DESTROY useSystemFont; - ffStrbufInit(&useSystemFont); - - FF_STRBUF_AUTO_DESTROY fontName; - ffStrbufInit(&fontName); + FF_STRBUF_AUTO_DESTROY useSystemFont = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); FFpropquery fontQuery[] = { {"use_system_font =", &useSystemFont}, @@ -319,8 +296,7 @@ static void detectTerminator(const FFinstance* instance, FFTerminalFontResult* r static bool detectWezterm(FF_MAYBE_UNUSED const FFinstance* instance, FFTerminalFontResult* result) { - FF_STRBUF_AUTO_DESTROY fontName; - ffStrbufInit(&fontName); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); ffStrbufSetS(&result->error, ffProcessAppendStdOut(&fontName, (char* const[]){ "wezterm", @@ -347,11 +323,8 @@ static bool detectWezterm(FF_MAYBE_UNUSED const FFinstance* instance, FFTerminal static bool detectTabby(FF_MAYBE_UNUSED const FFinstance* instance, FFTerminalFontResult* result) { - FF_STRBUF_AUTO_DESTROY fontName; - ffStrbufInit(&fontName); - - FF_STRBUF_AUTO_DESTROY fontSize; - ffStrbufInit(&fontSize); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY fontSize = ffStrbufCreate(); FFpropquery fontQuery[] = { {"font: ", &fontName}, @@ -409,7 +382,7 @@ static bool detectTerminalFontCommon(const FFinstance* instance, const FFTermina const FFTerminalFontResult* ffDetectTerminalFont(const FFinstance* instance) { FF_DETECTION_INTERNAL_GUARD(FFTerminalFontResult, - ffStrbufInitA(&result.error, 0); + ffStrbufInit(&result.error); const FFTerminalShellResult* terminalShell = ffDetectTerminalShell(instance); diff --git a/src/detection/terminalfont/terminalfont_apple.m b/src/detection/terminalfont/terminalfont_apple.m index 2dd3d03b7..f95503585 100644 --- a/src/detection/terminalfont/terminalfont_apple.m +++ b/src/detection/terminalfont/terminalfont_apple.m @@ -46,8 +46,7 @@ static void detectIterm2(const FFinstance* instance, FFTerminalFontResult* termi static void detectAppleTerminal(FFTerminalFontResult* terminalFont) { - FF_STRBUF_AUTO_DESTROY font; - ffStrbufInit(&font); + FF_STRBUF_AUTO_DESTROY font = ffStrbufCreate(); ffOsascript("tell application \"Terminal\" to font name of window frontmost & \" \" & font size of window frontmost", &font); if(font.length == 0) diff --git a/src/detection/terminalfont/terminalfont_linux.c b/src/detection/terminalfont/terminalfont_linux.c index 9742a6daa..68f096523 100644 --- a/src/detection/terminalfont/terminalfont_linux.c +++ b/src/detection/terminalfont/terminalfont_linux.c @@ -35,8 +35,7 @@ static void detectFromGSettings(const FFinstance* instance, char* profilePath, c return; } - FFstrbuf path; - ffStrbufInitA(&path, 128); + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateA(128); ffStrbufAppendS(&path, profilePath); ffStrbufAppendS(&path, defaultProfile); ffStrbufAppendC(&path, '/'); @@ -57,64 +56,47 @@ static void detectFromGSettings(const FFinstance* instance, char* profilePath, c else ffStrbufAppendS(&terminalFont->error, "Could't get system monospace font name from GSettings / DConf"); } - - ffStrbufDestroy(&path); } static void detectFromConfigFile(const FFinstance* instance, const char* configFile, const char* start, FFTerminalFontResult* terminalFont) { - FFstrbuf fontName; - ffStrbufInit(&fontName); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); ffParsePropFileConfig(instance, configFile, start, &fontName); if(fontName.length == 0) ffStrbufAppendF(&terminalFont->error, "Couldn't find %s in .config/%s", start, configFile); else ffFontInitPango(&terminalFont->font, fontName.chars); - - ffStrbufDestroy(&fontName); } static void detectKonsole(const FFinstance* instance, FFTerminalFontResult* terminalFont) { - FFstrbuf profile; - ffStrbufInit(&profile); + FF_STRBUF_AUTO_DESTROY profile = ffStrbufCreate(); ffParsePropFileConfig(instance, "konsolerc", "DefaultProfile =", &profile); if(profile.length == 0) { ffStrbufAppendS(&terminalFont->error, "Couldn't find \"DefaultProfile=%[^\\n]\" in \".config/konsolerc\""); - ffStrbufDestroy(&profile); return; } - FFstrbuf profilePath; - ffStrbufInitA(&profilePath, 32); + FF_STRBUF_AUTO_DESTROY profilePath = ffStrbufCreateA(32); ffStrbufAppendS(&profilePath, "konsole/"); ffStrbufAppend(&profilePath, &profile); - ffStrbufDestroy(&profile); - - FFstrbuf fontName; - ffStrbufInit(&fontName); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); ffParsePropFileData(instance, profilePath.chars, "Font =", &fontName); if(fontName.length == 0) ffStrbufAppendF(&terminalFont->error, "Couldn't find \"Font=%%[^\\n]\" in \"%s\"", profilePath.chars); else ffFontInitQt(&terminalFont->font, fontName.chars); - - ffStrbufDestroy(&fontName); - ffStrbufDestroy(&profilePath); } static void detectXFCETerminal(const FFinstance* instance, FFTerminalFontResult* terminalFont) { - FFstrbuf useSysFont; - ffStrbufInit(&useSysFont); - - FFstrbuf fontName; - ffStrbufInit(&fontName); + FF_STRBUF_AUTO_DESTROY useSysFont = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); ffParsePropFileConfigValues(instance, "xfce4/terminal/terminalrc", 2, (FFpropquery[]) { {"FontUseSystem = ", &useSysFont}, @@ -136,21 +118,14 @@ static void detectXFCETerminal(const FFinstance* instance, FFTerminalFontResult* else ffStrbufAppendS(&terminalFont->error, "Couldn't find xsettings::/Gtk/MonospaceFontName in XFConf"); } - - ffStrbufDestroy(&fontName); - ffStrbufDestroy(&useSysFont); } static void detectDeepinTerminal(const FFinstance* instance, FFTerminalFontResult* terminalFont) { - FFstrbuf fontName; - ffStrbufInit(&fontName); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY fontSize = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY profile = ffStrbufCreate(); - FFstrbuf fontSize; - ffStrbufInit(&fontSize); - - FFstrbuf profile; - ffStrbufInit(&profile); ffStrbufAppend(&profile, &instance->state.platform.homeDir); ffStrbufAppendS(&profile, ".config/deepin/deepin-terminal/config.conf"); //TODO: Use config dirs FILE* file = fopen(profile.chars, "r"); @@ -180,23 +155,17 @@ static void detectDeepinTerminal(const FFinstance* instance, FFTerminalFontResul fclose(file); } - ffStrbufDestroy(&profile); - if(fontName.length == 0) ffStrbufAppendS(&fontName, "Noto Sans Mono"); if(fontSize.length == 0) ffStrbufAppendS(&fontSize, "11"); ffFontInitValues(&terminalFont->font, fontName.chars, fontSize.chars); - - ffStrbufDestroy(&fontName); - ffStrbufDestroy(&fontSize); } static void detectFootTerminal(const FFinstance* instance, FFTerminalFontResult* terminalFont) { - FF_STRBUF_AUTO_DESTROY font; - ffStrbufInit(&font); + FF_STRBUF_AUTO_DESTROY font = ffStrbufCreate(); if (!ffParsePropFileConfig(instance, "foot/foot.ini", "font=", &font) || !ffStrSet(font.chars)) { diff --git a/src/detection/terminalfont/terminalfont_windows.c b/src/detection/terminalfont/terminalfont_windows.c index da2f0568b..3a10e1bd6 100644 --- a/src/detection/terminalfont/terminalfont_windows.c +++ b/src/detection/terminalfont/terminalfont_windows.c @@ -8,11 +8,8 @@ static void detectMintty(const FFinstance* instance, FFTerminalFontResult* terminalFont) { - FF_STRBUF_AUTO_DESTROY fontName; - ffStrbufInit(&fontName); - - FF_STRBUF_AUTO_DESTROY fontSize; - ffStrbufInit(&fontSize); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY fontSize = ffStrbufCreate(); if(!ffParsePropFileConfigValues(instance, "mintty/config", 2, (FFpropquery[]) { {"Font=", &fontName}, @@ -54,14 +51,9 @@ static void detectConEmu(const FFinstance* instance, FFTerminalFontResult* termi FF_UNUSED(instance) //https://conemu.github.io/en/ConEmuXml.html#search-sequence - FFstrbuf path; - ffStrbufInit(&path); - - FFstrbuf fontName; - ffStrbufInit(&fontName); - - FFstrbuf fontSize; - ffStrbufInit(&fontSize); + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate(); + FF_STRBUF_AUTO_DESTROY fontSize = ffStrbufCreate(); const char* paths[] = { "ConEmuDir", "ConEmuBaseDir", "APPDATA" }; for (uint32_t i = 0; i < sizeof(paths) / sizeof(paths[0]); ++i) @@ -77,7 +69,6 @@ static void detectConEmu(const FFinstance* instance, FFTerminalFontResult* termi break; } } - ffStrbufDestroy(&path); if(fontName.length == 0 && fontSize.length == 0) { @@ -96,9 +87,6 @@ static void detectConEmu(const FFinstance* instance, FFTerminalFontResult* termi ffStrbufAppendS(&fontSize, "14"); ffFontInitValues(&terminalFont->font, fontName.chars, fontSize.chars); - - ffStrbufDestroy(&fontName); - ffStrbufDestroy(&fontSize); } void ffDetectTerminalFontPlatform(const FFinstance* instance, const FFTerminalShellResult* terminalShell, FFTerminalFontResult* terminalFont) diff --git a/src/detection/terminalshell/terminalshell_linux.c b/src/detection/terminalshell/terminalshell_linux.c index 6fb5cc008..45bf0091e 100644 --- a/src/detection/terminalshell/terminalshell_linux.c +++ b/src/detection/terminalshell/terminalshell_linux.c @@ -281,8 +281,7 @@ static void getUserShellFromEnv(const FFinstance* instance, FFTerminalShellResul static void getShellVersionGeneric(FFstrbuf* exe, const char* exeName, FFstrbuf* version) { - FFstrbuf command; - ffStrbufInit(&command); + FF_STRBUF_AUTO_DESTROY command = ffStrbufCreate(); ffStrbufAppendS(&command, "printf \"%s\" \"$"); ffStrbufAppendTransformS(&command, exeName, toupper); ffStrbufAppendS(&command, "_VERSION\""); @@ -297,8 +296,6 @@ static void getShellVersionGeneric(FFstrbuf* exe, const char* exeName, FFstrbuf* }); ffStrbufSubstrBeforeFirstC(version, '('); ffStrbufRemoveStrings(version, 2, "-release", "release"); - - ffStrbufDestroy(&command); } bool fftsGetShellVersion(FFstrbuf* exe, const char* exeName, FFstrbuf* version); diff --git a/src/detection/theme/theme_linux.c b/src/detection/theme/theme_linux.c index bcacf89ea..d59c6d2de 100644 --- a/src/detection/theme/theme_linux.c +++ b/src/detection/theme/theme_linux.c @@ -18,8 +18,7 @@ const char* ffDetectTheme(const FFinstance* instance, FFstrbuf* result) if(plasma->widgetStyle.length == 0 && plasma->colorScheme.length == 0 && gtk2->length == 0 && gtk3->length == 0 && gtk4->length == 0) return "No themes found"; - FF_STRBUF_AUTO_DESTROY plasmaColorPretty; - ffStrbufInit(&plasmaColorPretty); + FF_STRBUF_AUTO_DESTROY plasmaColorPretty = ffStrbufCreate(); if(ffStrbufStartsWithIgnCase(&plasma->colorScheme, &plasma->widgetStyle)) ffStrbufAppendNS(&plasmaColorPretty, plasma->colorScheme.length - plasma->widgetStyle.length, &plasma->colorScheme.chars[plasma->widgetStyle.length]); else @@ -27,8 +26,7 @@ const char* ffDetectTheme(const FFinstance* instance, FFstrbuf* result) ffStrbufTrim(&plasmaColorPretty, ' '); - FF_STRBUF_AUTO_DESTROY gtkPretty; - ffStrbufInit(>kPretty); + FF_STRBUF_AUTO_DESTROY gtkPretty = ffStrbufCreate(); ffParseGTK(>kPretty, gtk2, gtk3, gtk4); if(plasma->widgetStyle.length > 0) diff --git a/src/detection/wallpaper/wallpaper_apple.c b/src/detection/wallpaper/wallpaper_apple.c index f1235ba1e..7d2fb84dc 100644 --- a/src/detection/wallpaper/wallpaper_apple.c +++ b/src/detection/wallpaper/wallpaper_apple.c @@ -8,8 +8,7 @@ const char* ffDetectWallpaper(FF_MAYBE_UNUSED const FFinstance* instance, FFstrb #ifdef FF_HAVE_SQLITE3 - FF_STRBUF_AUTO_DESTROY path; - ffStrbufInitCopy(&path, &instance->state.platform.homeDir); + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateCopy(&instance->state.platform.homeDir); ffStrbufAppendS(&path, "Library/Application Support/Dock/desktoppicture.db"); if (ffSettingsGetSQLite3String(instance, path.chars, "SELECT value\n" diff --git a/src/detection/wifi/wifi_android.c b/src/detection/wifi/wifi_android.c index 8e6e2b072..39ae35541 100644 --- a/src/detection/wifi/wifi_android.c +++ b/src/detection/wifi/wifi_android.c @@ -8,8 +8,7 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* result) { - FF_STRBUF_AUTO_DESTROY buffer; - ffStrbufInit(&buffer); + FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); if(ffProcessAppendStdOut(&buffer, (char* const[]){ FF_TERMUX_API_PATH, diff --git a/src/detection/wifi/wifi_linux.c b/src/detection/wifi/wifi_linux.c index d0a679fdb..a92fa8c2e 100644 --- a/src/detection/wifi/wifi_linux.c +++ b/src/detection/wifi/wifi_linux.c @@ -144,8 +144,7 @@ static const char* detectWifiWithLibnm(const FFinstance* instance, FFlist* resul if(instance->config.allowSlowOperations) { - FF_STRBUF_AUTO_DESTROY output; - ffStrbufInit(&output); + FF_STRBUF_AUTO_DESTROY output = ffStrbufCreate(); if(!ffProcessAppendStdOut(&output, (char* const[]){ "iw", "dev", @@ -216,8 +215,7 @@ static const char* detectWifiWithIoctls(FF_MAYBE_UNUSED const FFinstance* instan if(!infs) return "if_nameindex() failed"; - FFstrbuf path; - ffStrbufInit(&path); + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); for(struct if_nameindex* i = infs; !(i->if_index == 0 && i->if_name == NULL); ++i) { @@ -307,7 +305,6 @@ static const char* detectWifiWithIoctls(FF_MAYBE_UNUSED const FFinstance* instan close(sock); } if_freenameindex(infs); - ffStrbufDestroy(&path); return NULL; } diff --git a/src/detection/wmtheme/wmtheme_linux.c b/src/detection/wmtheme/wmtheme_linux.c index e325e0bce..2099a3a2c 100644 --- a/src/detection/wmtheme/wmtheme_linux.c +++ b/src/detection/wmtheme/wmtheme_linux.c @@ -10,7 +10,7 @@ static bool detectWMThemeFromConfigFile(FFinstance* instance, const char* config { if(!ffParsePropFileConfig(instance, configFile, themeRegex, themeOrError)) { - ffStrbufInitF(themeOrError, "Config file %s doesn't exist", configFile); + ffStrbufAppendF(themeOrError, "Config file %s doesn't exist", configFile); return false; } @@ -131,8 +131,7 @@ static bool detectXFWM4(FFinstance* instance, FFstrbuf* themeOrError) static bool detectOpenbox(FFinstance* instance, const FFstrbuf* dePrettyName, FFstrbuf* themeOrError) { - FFstrbuf absolutePath; - ffStrbufInitA(&absolutePath, 64); + FF_STRBUF_AUTO_DESTROY absolutePath = ffStrbufCreateA(64); ffStrbufAppend(&absolutePath, &instance->state.platform.homeDir); //TODO: use config dirs @@ -150,7 +149,6 @@ static bool detectOpenbox(FFinstance* instance, const FFstrbuf* dePrettyName, FF if(file == NULL) { ffStrbufAppendF(themeOrError, "Couldn't open \"%s\"", absolutePath.chars); - ffStrbufDestroy(&absolutePath); return false; } @@ -184,11 +182,9 @@ static bool detectOpenbox(FFinstance* instance, const FFstrbuf* dePrettyName, FF if(themeOrError->length == 0) { ffStrbufAppendF(themeOrError, "Couldn't find theme name in \"%s\"", absolutePath.chars); - ffStrbufDestroy(&absolutePath); return false; } - ffStrbufDestroy(&absolutePath); return true; } diff --git a/src/detection/wmtheme/wmtheme_windows.c b/src/detection/wmtheme/wmtheme_windows.c index 0522b933b..67ea08f83 100644 --- a/src/detection/wmtheme/wmtheme_windows.c +++ b/src/detection/wmtheme/wmtheme_windows.c @@ -66,8 +66,7 @@ bool ffDetectWmTheme(FF_MAYBE_UNUSED FFinstance* instance, FFstrbuf* themeOrErro FF_HKEY_AUTO_DESTROY hKey = NULL; if(ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes", &hKey, NULL)) { - FF_STRBUF_AUTO_DESTROY theme; - ffStrbufInit(&theme); + FF_STRBUF_AUTO_DESTROY theme = ffStrbufCreate(); if(ffRegReadStrbuf(hKey, L"CurrentTheme", &theme, NULL)) { ffStrbufSubstrBeforeLastC(&theme, '.'); diff --git a/src/fastfetch.c b/src/fastfetch.c index 50546fea8..a3a36f7af 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -612,8 +612,7 @@ static void optionParseConfigFile(FFinstance* instance, FFdata* data, const char //Try to load as a relative path - FFstrbuf absolutePath; - ffStrbufInitA(&absolutePath, 128); + FF_STRBUF_AUTO_DESTROY absolutePath = ffStrbufCreateA(128); FF_LIST_FOR_EACH(FFstrbuf, path, instance->state.platform.dataDirs) { @@ -628,8 +627,6 @@ static void optionParseConfigFile(FFinstance* instance, FFdata* data, const char return; } - ffStrbufDestroy(&absolutePath); - //File not found fprintf(stderr, "Error: couldn't find config: %s\n", value); diff --git a/src/logo/image/image.c b/src/logo/image/image.c index 9da6584fc..4a033c2b4 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -12,8 +12,7 @@ static FFstrbuf base64Encode(FFstrbuf* in) { const char* base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - FFstrbuf out; - ffStrbufInitA(&out, 8 * (1 + in->length / 6)); + FFstrbuf out = ffStrbufCreateA(8 * (1 + in->length / 6)); unsigned val = 0; int valb = -6; @@ -41,8 +40,7 @@ static bool printImageIterm(FFinstance* instance) return false; } - FFstrbuf buf; - ffStrbufInit(&buf); + FF_STRBUF_AUTO_DESTROY buf = ffStrbufCreate(); if(!ffAppendFileBuffer(instance->config.logo.source.chars, &buf)) { fputs("Logo: Failed to load image file\n", stderr); @@ -51,7 +49,8 @@ static bool printImageIterm(FFinstance* instance) ffPrintCharTimes(' ', instance->config.logo.paddingLeft); ffPrintCharTimes('\n', instance->config.logo.paddingTop); - FFstrbuf base64 = base64Encode(&buf); + + FF_STRBUF_AUTO_DESTROY base64 = base64Encode(&buf); instance->state.logoWidth = instance->config.logo.width + instance->config.logo.paddingLeft + instance->config.logo.paddingRight; instance->state.logoHeight = instance->config.logo.paddingTop + instance->config.logo.height; printf("\033]1337;File=inline=1;width=%u;height=%u;preserveAspectRatio=%u:%s\a\033[9999999D\n\033[%uA", @@ -62,9 +61,6 @@ static bool printImageIterm(FFinstance* instance) (unsigned) instance->state.logoHeight ); - ffStrbufDestroy(&buf); - ffStrbufDestroy(&base64); - return true; } @@ -289,8 +285,7 @@ static bool printImageKitty(FFinstance* instance, FFLogoRequestData* requestData if(!checkAllocationResult(chars, length)) return false; - FFstrbuf result; - ffStrbufInitA(&result, (uint32_t) (length + 1024)); + FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA((uint32_t) (length + 1024)); const char* currentPos = chars; size_t remainingLength = length; @@ -304,7 +299,6 @@ static bool printImageKitty(FFinstance* instance, FFLogoRequestData* requestData printImagePixels(instance, requestData, &result, isCompressed ? FF_CACHE_FILE_KITTY_COMPRESSED : FF_CACHE_FILE_KITTY_UNCOMPRESSED); - ffStrbufDestroy(&result); free(chars); return true; } @@ -532,8 +526,7 @@ static void readCachedStrbuf(FFLogoRequestData* requestData, FFstrbuf* result, c static uint32_t readCachedUint32(FFLogoRequestData* requestData, const char* cacheFileName) { - FFstrbuf content; - ffStrbufInit(&content); + FF_STRBUF_AUTO_DESTROY content = ffStrbufCreate(); readCachedStrbuf(requestData, &content, cacheFileName); uint32_t result = 0; @@ -546,27 +539,20 @@ static uint32_t readCachedUint32(FFLogoRequestData* requestData, const char* cac memcpy(&result, content.chars, sizeof(result)); - ffStrbufDestroy(&content); - return result; } static bool printCachedChars(FFinstance* instance, FFLogoRequestData* requestData) { - FFstrbuf content; - ffStrbufInitA(&content, 32768); + FF_STRBUF_AUTO_DESTROY content = ffStrbufCreateA(32768); if(requestData->type == FF_LOGO_TYPE_IMAGE_CHAFA) readCachedStrbuf(requestData, &content, FF_CACHE_FILE_CHAFA); if(content.length == 0) - { - ffStrbufDestroy(&content); return false; - } ffLogoPrintChars(instance, content.chars, false); - ffStrbufDestroy(&content); return true; } diff --git a/src/logo/logo.c b/src/logo/logo.c index 4b7fa2124..2e2e54f8f 100644 --- a/src/logo/logo.c +++ b/src/logo/logo.c @@ -302,8 +302,7 @@ static void updateLogoPath(FFinstance* instance) if(ffPathExists(options->source.chars, FF_PATHTYPE_FILE)) return; - FFstrbuf fullPath; - ffStrbufInit(&fullPath); + FF_STRBUF_AUTO_DESTROY fullPath = ffStrbufCreate(); FF_LIST_FOR_EACH(FFstrbuf, dataDir, instance->state.platform.dataDirs) { @@ -318,20 +317,16 @@ static void updateLogoPath(FFinstance* instance) break; } } - - ffStrbufDestroy(&fullPath); } static bool logoPrintFileIfExists(FFinstance* instance, bool doColorReplacement, bool raw) { FFLogoOptions* options = &instance->config.logo; - FF_STRBUF_AUTO_DESTROY content; - ffStrbufInit(&content); + FF_STRBUF_AUTO_DESTROY content = ffStrbufCreate(); if(!ffAppendFileBuffer(options->source.chars, &content)) { - ffStrbufDestroy(&content); fputs("Logo: Failed to load file content from logo source\n", stderr); return false; } @@ -341,6 +336,7 @@ static bool logoPrintFileIfExists(FFinstance* instance, bool doColorReplacement, ffLogoPrintCharsRaw(instance, content.chars, content.length); else ffLogoPrintChars(instance, content.chars, doColorReplacement); + return true; } diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index e3ec40eed..92f5dea6f 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -17,8 +17,7 @@ static void printBattery(FFinstance* instance, FFBatteryOptions* options, Batter result->status.length > 0 && ffStrbufIgnCaseCompS(&result->status, "Unknown") != 0; - FFstrbuf str; - ffStrbufInit(&str); + FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate(); if(result->capacity >= 0) { @@ -58,7 +57,6 @@ static void printBattery(FFinstance* instance, FFBatteryOptions* options, Batter } ffStrbufPutTo(&str, stdout); - ffStrbufDestroy(&str); } else { diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index 655501a98..71176b922 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -23,8 +23,7 @@ void ffPrintBrightness(FFinstance* instance, FFBrightnessOptions* options) return; } - FF_STRBUF_AUTO_DESTROY key; - ffStrbufInit(&key); + FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate(); FF_LIST_FOR_EACH(FFBrightnessResult, item, result) { diff --git a/src/modules/chassis.c b/src/modules/chassis.c index 997242d65..4932ecc69 100644 --- a/src/modules/chassis.c +++ b/src/modules/chassis.c @@ -26,15 +26,12 @@ void ffPrintChassis(FFinstance* instance) { ffPrintLogoAndKey(instance, FF_CHASSIS_MODULE_NAME, 0, &instance->config.chassis.key); - FFstrbuf output; - ffStrbufInitCopy(&output, &result.chassisType); + FF_STRBUF_AUTO_DESTROY output = ffStrbufCreateCopy(&result.chassisType); if(result.chassisVersion.length > 0) ffStrbufAppendF(&output, " (%s)", result.chassisVersion.chars); ffStrbufPutTo(&output, stdout); - - ffStrbufDestroy(&output); } else { diff --git a/src/modules/command/command.c b/src/modules/command/command.c index 92768cd31..49177119d 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -6,8 +6,7 @@ void ffPrintCommand(FFinstance* instance, FFCommandOptions* options) { - FF_STRBUF_AUTO_DESTROY result; - ffStrbufInit(&result); + FF_STRBUF_AUTO_DESTROY result = ffStrbufCreate(); const char* error = ffProcessAppendStdOut(&result, (char* const[]){ options->shell.chars, #ifdef _WIN32 diff --git a/src/modules/cpuusage/cpuusage.c b/src/modules/cpuusage/cpuusage.c index b7ccddc41..74a078d34 100644 --- a/src/modules/cpuusage/cpuusage.c +++ b/src/modules/cpuusage/cpuusage.c @@ -22,8 +22,7 @@ void ffPrintCPUUsage(FFinstance* instance, FFCPUUsageOptions* options) { ffPrintLogoAndKey(instance, FF_CPUUSAGE_DISPLAY_NAME, 0, &options->moduleArgs.key); - FF_STRBUF_AUTO_DESTROY str; - ffStrbufInit(&str); + FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate(); if(instance->config.percentType & FF_PERCENTAGE_TYPE_BAR_BIT) ffAppendPercentBar(instance, &str, (uint8_t)percentage, 0, 5, 8); if(instance->config.percentType & FF_PERCENTAGE_TYPE_NUM_BIT) diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c index ee5585f73..eb4c90da1 100644 --- a/src/modules/disk/disk.c +++ b/src/modules/disk/disk.c @@ -10,8 +10,7 @@ static void printDisk(FFinstance* instance, FFDiskOptions* options, const FFDisk* disk) { - FF_STRBUF_AUTO_DESTROY key; - ffStrbufInit(&key); + FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate(); if(options->moduleArgs.key.length == 0) { @@ -24,12 +23,10 @@ static void printDisk(FFinstance* instance, FFDiskOptions* options, const FFDisk }); } - FF_STRBUF_AUTO_DESTROY usedPretty; - ffStrbufInit(&usedPretty); + FF_STRBUF_AUTO_DESTROY usedPretty = ffStrbufCreate(); ffParseSize(disk->bytesUsed, instance->config.binaryPrefixType, &usedPretty); - FF_STRBUF_AUTO_DESTROY totalPretty; - ffStrbufInit(&totalPretty); + FF_STRBUF_AUTO_DESTROY totalPretty = ffStrbufCreate(); ffParseSize(disk->bytesTotal, instance->config.binaryPrefixType, &totalPretty); uint8_t bytesPercentage = disk->bytesTotal > 0 ? (uint8_t) (((long double) disk->bytesUsed / (long double) disk->bytesTotal) * 100.0) : 0; @@ -38,8 +35,7 @@ static void printDisk(FFinstance* instance, FFDiskOptions* options, const FFDisk { ffPrintLogoAndKey(instance, key.chars, 0, NULL); - FF_STRBUF_AUTO_DESTROY str; - ffStrbufInit(&str); + FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate(); if(disk->bytesTotal > 0) { @@ -109,8 +105,7 @@ static void printMountpoints(FFinstance* instance, FFDiskOptions* options, const const char separator = ':'; #endif - FFstrbuf mountpoints; - ffStrbufInitCopy(&mountpoints, &options->folders); + FF_STRBUF_AUTO_DESTROY mountpoints = ffStrbufCreateCopy(&options->folders); ffStrbufTrim(&mountpoints, separator); uint32_t startIndex = 0; diff --git a/src/modules/display/display.c b/src/modules/display/display.c index 737ad228d..40045c6e5 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -43,8 +43,7 @@ void ffPrintDisplay(FFinstance* instance, FFDisplayOptions* options) return; } - FF_STRBUF_AUTO_DESTROY key; - ffStrbufInit(&key); + FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate(); for(uint32_t i = 0; i < dsResult->displays.length; i++) { diff --git a/src/modules/gpu/gpu.c b/src/modules/gpu/gpu.c index 9b544c974..1e3fd17ee 100644 --- a/src/modules/gpu/gpu.c +++ b/src/modules/gpu/gpu.c @@ -16,8 +16,7 @@ static void printGPUResult(FFinstance* instance, FFGPUOptions* options, uint8_t { ffPrintLogoAndKey(instance, FF_GPU_MODULE_NAME, index, &options->moduleArgs.key); - FF_STRBUF_AUTO_DESTROY output; - ffStrbufInitA(&output, gpu->vendor.length + 1 + gpu->name.length); + FF_STRBUF_AUTO_DESTROY output = ffStrbufCreateA(gpu->vendor.length + 1 + gpu->name.length); if(gpu->vendor.length > 0 && !ffStrbufStartsWith(&gpu->name, &gpu->vendor)) { diff --git a/src/modules/host/host.c b/src/modules/host/host.c index 0dfd42f4c..e6d18874e 100644 --- a/src/modules/host/host.c +++ b/src/modules/host/host.c @@ -25,8 +25,7 @@ void ffPrintHost(FFinstance* instance, FFHostOptions* options) { ffPrintLogoAndKey(instance, FF_HOST_MODULE_NAME, 0, &options->moduleArgs.key); - FFstrbuf output; - ffStrbufInit(&output); + FF_STRBUF_AUTO_DESTROY output = ffStrbufCreate(); if(host->productName.length > 0) ffStrbufAppend(&output, &host->productName); @@ -39,8 +38,6 @@ void ffPrintHost(FFinstance* instance, FFHostOptions* options) } ffStrbufPutTo(&output, stdout); - - ffStrbufDestroy(&output); } else { diff --git a/src/modules/icons.c b/src/modules/icons.c index d6851b973..02bc10368 100644 --- a/src/modules/icons.c +++ b/src/modules/icons.c @@ -7,8 +7,7 @@ void ffPrintIcons(FFinstance* instance) { - FF_STRBUF_AUTO_DESTROY icons; - ffStrbufInit(&icons); + FF_STRBUF_AUTO_DESTROY icons = ffStrbufCreate(); const char* error = ffDetectIcons(instance, &icons); if(error) diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 0311a4711..5ae6eef1b 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -149,8 +149,7 @@ static const char* printJsonConfig(FFinstance* instance) if (!ffJsonLoadLibrary(instance)) return "Failed to load json-c library"; - FF_STRBUF_AUTO_DESTROY content; - ffStrbufInit(&content); + FF_STRBUF_AUTO_DESTROY content = ffStrbufCreate(); FF_LIST_FOR_EACH(FFstrbuf, filename, instance->state.platform.configDirs) { uint32_t oldLength = filename->length; diff --git a/src/modules/locale/locale.c b/src/modules/locale/locale.c index 5d3a510dd..9a2f99f6d 100644 --- a/src/modules/locale/locale.c +++ b/src/modules/locale/locale.c @@ -7,8 +7,7 @@ void ffPrintLocale(FFinstance* instance, FFLocaleOptions* options) { - FF_STRBUF_AUTO_DESTROY locale; - ffStrbufInit(&locale); + FF_STRBUF_AUTO_DESTROY locale = ffStrbufCreate(); ffDetectLocale(&locale); if(locale.length == 0) diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index b10507b8b..92ec3fe21 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -87,8 +87,7 @@ void ffPrintLocalIp(FFinstance* instance, FFLocalIpOptions* options) } else { - FF_STRBUF_AUTO_DESTROY key; - ffStrbufInit(&key); + FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate(); FF_LIST_FOR_EACH(FFLocalIpResult, ip, results) { diff --git a/src/modules/media.c b/src/modules/media.c index eb0eaeeb2..74be335e0 100644 --- a/src/modules/media.c +++ b/src/modules/media.c @@ -52,8 +52,7 @@ void ffPrintMedia(FFinstance* instance) return; } - FFstrbuf songPretty; - ffStrbufInitCopy(&songPretty, &media->song); + FF_STRBUF_AUTO_DESTROY songPretty = ffStrbufCreateCopy(&media->song); const char* removeStrings[] = { "(Official Music Video)", "(Official Video)", "(Music Video)", "(Official HD Video)", "[Official Music Video]", "[Official Video]", "[Music Video]", "[Official HD Video]", @@ -72,8 +71,7 @@ void ffPrintMedia(FFinstance* instance) if(instance->config.media.outputFormat.length == 0) { //We don't expose artistPretty to the format, as it might be empty (when the think that the artist is already in the song title) - FFstrbuf artistPretty; - ffStrbufInitCopy(&artistPretty, &media->artist); + FF_STRBUF_AUTO_DESTROY artistPretty = ffStrbufCreateCopy(&media->artist); ffStrbufRemoveIgnCaseEndS(&artistPretty, " - Topic"); ffStrbufRemoveIgnCaseEndS(&artistPretty, "VEVO"); ffStrbufTrimRight(&artistPretty, ' '); @@ -93,8 +91,6 @@ void ffPrintMedia(FFinstance* instance) ffStrbufAppendF(&songPretty, " (%s)", media->status.chars); ffStrbufPutTo(&songPretty, stdout); - - ffStrbufDestroy(&artistPretty); } else { @@ -106,6 +102,4 @@ void ffPrintMedia(FFinstance* instance) {FF_FORMAT_ARG_TYPE_STRBUF, &media->status} }); } - - ffStrbufDestroy(&songPretty); } diff --git a/src/modules/memory.c b/src/modules/memory.c index 3c82b1a7b..729ffc777 100644 --- a/src/modules/memory.c +++ b/src/modules/memory.c @@ -18,12 +18,10 @@ void ffPrintMemory(FFinstance* instance) return; } - FF_STRBUF_AUTO_DESTROY usedPretty; - ffStrbufInit(&usedPretty); + FF_STRBUF_AUTO_DESTROY usedPretty = ffStrbufCreate(); ffParseSize(storage.bytesUsed, instance->config.binaryPrefixType, &usedPretty); - FF_STRBUF_AUTO_DESTROY totalPretty; - ffStrbufInit(&totalPretty); + FF_STRBUF_AUTO_DESTROY totalPretty = ffStrbufCreate(); ffParseSize(storage.bytesTotal, instance->config.binaryPrefixType, &totalPretty); uint8_t percentage = storage.bytesTotal == 0 @@ -37,8 +35,7 @@ void ffPrintMemory(FFinstance* instance) puts("Disabled"); else { - FF_STRBUF_AUTO_DESTROY str; - ffStrbufInit(&str); + FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate(); if(instance->config.percentType & FF_PERCENTAGE_TYPE_BAR_BIT) { diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 637c1094a..55a0552e8 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -107,8 +107,7 @@ void ffPrintOS(FFinstance* instance, FFOSOptions* options) if(options->moduleArgs.outputFormat.length == 0) { - FF_STRBUF_AUTO_DESTROY result; - ffStrbufInit(&result); + FF_STRBUF_AUTO_DESTROY result = ffStrbufCreate(); if(ffStrbufIgnCaseCompS(&os->id, "nixos") == 0) buildOutputNixOS(instance, os, &result); diff --git a/src/modules/player.c b/src/modules/player.c index 32eecde0f..6f4ab0df2 100644 --- a/src/modules/player.c +++ b/src/modules/player.c @@ -17,8 +17,7 @@ void ffPrintPlayer(FFinstance* instance) return; } - FFstrbuf playerPretty; - ffStrbufInit(&playerPretty); + FF_STRBUF_AUTO_DESTROY playerPretty = ffStrbufCreate(); //If we are on a website, prepend the website name if( @@ -70,6 +69,4 @@ void ffPrintPlayer(FFinstance* instance) {FF_FORMAT_ARG_TYPE_STRBUF, &media->url} }); } - - ffStrbufDestroy(&playerPretty); } diff --git a/src/modules/publicip.c b/src/modules/publicip.c index 61c85698e..2483be9d9 100644 --- a/src/modules/publicip.c +++ b/src/modules/publicip.c @@ -14,13 +14,11 @@ void ffPreparePublicIp(FFinstance* instance) status = ffNetworkingSendHttpRequest(&state, "ipinfo.io", "/ip", NULL); else { - FFstrbuf host; - ffStrbufInitCopy(&host, &instance->config.publicIpUrl); + FF_STRBUF_AUTO_DESTROY host = ffStrbufCreateCopy(&instance->config.publicIpUrl); ffStrbufSubstrAfterFirstS(&host, "://"); uint32_t pathStartIndex = ffStrbufFirstIndexC(&host, '/'); - FFstrbuf path; - ffStrbufInit(&path); + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); if(pathStartIndex != host.length) { ffStrbufAppendNS(&path, pathStartIndex, host.chars + (host.length - pathStartIndex)); @@ -29,9 +27,6 @@ void ffPreparePublicIp(FFinstance* instance) } status = ffNetworkingSendHttpRequest(&state, host.chars, path.length == 0 ? "/" : path.chars, NULL); - - ffStrbufDestroy(&path); - ffStrbufDestroy(&host); } } @@ -46,15 +41,13 @@ void ffPrintPublicIp(FFinstance* instance) return; } - FFstrbuf result; - ffStrbufInitA(&result, 4096); + FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(4096); bool success = ffNetworkingRecvHttpResponse(&state, &result, instance->config.publicIpTimeout); if(success) ffStrbufSubstrAfterFirstS(&result, "\r\n\r\n"); if(!success || result.length == 0) { ffPrintError(instance, FF_PUBLICIP_MODULE_NAME, 0, &instance->config.publicIP, "Failed to receive the server response"); - ffStrbufDestroy(&result); return; } @@ -69,6 +62,4 @@ void ffPrintPublicIp(FFinstance* instance) {FF_FORMAT_ARG_TYPE_STRBUF, &result} }); } - - ffStrbufDestroy(&result); } diff --git a/src/modules/swap.c b/src/modules/swap.c index 1f6175b15..37ba2a12b 100644 --- a/src/modules/swap.c +++ b/src/modules/swap.c @@ -18,12 +18,10 @@ void ffPrintSwap(FFinstance* instance) return; } - FF_STRBUF_AUTO_DESTROY usedPretty; - ffStrbufInit(&usedPretty); + FF_STRBUF_AUTO_DESTROY usedPretty = ffStrbufCreate(); ffParseSize(storage.bytesUsed, instance->config.binaryPrefixType, &usedPretty); - FF_STRBUF_AUTO_DESTROY totalPretty; - ffStrbufInit(&totalPretty); + FF_STRBUF_AUTO_DESTROY totalPretty = ffStrbufCreate(); ffParseSize(storage.bytesTotal, instance->config.binaryPrefixType, &totalPretty); uint8_t percentage = storage.bytesTotal == 0 @@ -37,8 +35,7 @@ void ffPrintSwap(FFinstance* instance) puts("Disabled"); else { - FF_STRBUF_AUTO_DESTROY str; - ffStrbufInit(&str); + FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate(); if(instance->config.percentType & FF_PERCENTAGE_TYPE_BAR_BIT) { diff --git a/src/modules/users.c b/src/modules/users.c index 1c78571b2..7fd27c36e 100644 --- a/src/modules/users.c +++ b/src/modules/users.c @@ -7,24 +7,20 @@ void ffPrintUsers(FFinstance* instance) { - FFlist users; + FF_LIST_AUTO_DESTROY users; ffListInit(&users, sizeof(FFstrbuf)); - FFstrbuf error; - ffStrbufInit(&error); + FF_STRBUF_AUTO_DESTROY error = ffStrbufCreate(); ffDetectUsers(&users, &error); if(error.length > 0) { ffPrintError(instance, FF_USERS_MODULE_NAME, 0, &instance->config.users, "%*s", error.length, error.chars); - ffListDestroy(&users); - ffStrbufDestroy(&error); return; } - FFstrbuf result; - ffStrbufInit(&result); + FF_STRBUF_AUTO_DESTROY result = ffStrbufCreate(); for(uint32_t i = 0; i < users.length; ++i) { if(i > 0) @@ -34,8 +30,6 @@ void ffPrintUsers(FFinstance* instance) ffStrbufDestroy(user); } - ffListDestroy(&users); - if(instance->config.users.outputFormat.length == 0) { ffPrintLogoAndKey(instance, FF_USERS_MODULE_NAME, 0, &instance->config.users.key); @@ -47,6 +41,4 @@ void ffPrintUsers(FFinstance* instance) {FF_FORMAT_ARG_TYPE_STRBUF, &result}, }); } - - ffStrbufDestroy(&result); } diff --git a/src/modules/wallpaper.c b/src/modules/wallpaper.c index 75caa5471..d17aef323 100644 --- a/src/modules/wallpaper.c +++ b/src/modules/wallpaper.c @@ -7,8 +7,7 @@ void ffPrintWallpaper(FFinstance* instance) { - FF_STRBUF_AUTO_DESTROY wallpaper; - ffStrbufInit(&wallpaper); + FF_STRBUF_AUTO_DESTROY wallpaper = ffStrbufCreate(); const char* error = ffDetectWallpaper(instance, &wallpaper); if(error) diff --git a/src/modules/weather.c b/src/modules/weather.c index a6bc63ce9..f26cd4de9 100644 --- a/src/modules/weather.c +++ b/src/modules/weather.c @@ -10,11 +10,9 @@ static int status = -1; void ffPrepareWeather(FFinstance* instance) { - FFstrbuf path; - ffStrbufInitS(&path, "/?format="); + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateS("/?format="); ffStrbufAppend(&path, &instance->config.weatherOutputFormat); status = ffNetworkingSendHttpRequest(&state, "wttr.in", path.chars, "User-Agent: curl/0.0.0\r\n"); - ffStrbufDestroy(&path); } void ffPrintWeather(FFinstance* instance) @@ -28,15 +26,13 @@ void ffPrintWeather(FFinstance* instance) return; } - FFstrbuf result; - ffStrbufInitA(&result, 4096); + FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(4096); bool success = ffNetworkingRecvHttpResponse(&state, &result, instance->config.weatherTimeout); if (success) ffStrbufSubstrAfterFirstS(&result, "\r\n\r\n"); if(!success || result.length == 0) { ffPrintError(instance, FF_WEATHER_MODULE_NAME, 0, &instance->config.weather, "Failed to receive the server response"); - ffStrbufDestroy(&result); return; } @@ -51,6 +47,4 @@ void ffPrintWeather(FFinstance* instance) {FF_FORMAT_ARG_TYPE_STRBUF, &result} }); } - - ffStrbufDestroy(&result); } diff --git a/src/modules/wmtheme.c b/src/modules/wmtheme.c index 4112d8321..91e46911c 100644 --- a/src/modules/wmtheme.c +++ b/src/modules/wmtheme.c @@ -7,8 +7,7 @@ void ffPrintWMTheme(FFinstance* instance) { - FFstrbuf themeOrError; - ffStrbufInit(&themeOrError); + FF_STRBUF_AUTO_DESTROY themeOrError = ffStrbufCreate(); if(ffDetectWmTheme(instance, &themeOrError)) { if(instance->config.wmTheme.outputFormat.length == 0) @@ -27,5 +26,4 @@ void ffPrintWMTheme(FFinstance* instance) { ffPrintError(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmTheme, "%*s", themeOrError.length, themeOrError.chars); } - ffStrbufDestroy(&themeOrError); } diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index bcf946071..eccea2341 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -35,16 +35,6 @@ void ffStrbufInitMove(FFstrbuf* strbuf, FFstrbuf* src) ffStrbufInit(strbuf); } -void ffStrbufInitF(FFstrbuf* strbuf, const char* format, ...) -{ - assert(format != NULL); - - va_list arguments; - va_start(arguments, format); - ffStrbufInitVF(strbuf, format, arguments); - va_end(arguments); -} - void ffStrbufInitVF(FFstrbuf* strbuf, const char* format, va_list arguments) { assert(format != NULL); @@ -458,13 +448,3 @@ uint16_t ffStrbufToUInt16(const FFstrbuf* strbuf, uint16_t defaultValue) unsigned long result = strtoul(strbuf->chars, &str_end, 10); return str_end == strbuf->chars || result > UINT16_MAX ? defaultValue : (uint16_t)result; } - -void ffStrbufDestroy(FFstrbuf* strbuf) -{ - if(strbuf->allocated == 0) return; - - //Avoid free-after-use. These 3 assignments are cheap so don't remove them - strbuf->allocated = strbuf->length = 0; - free(strbuf->chars); - strbuf->chars = CHAR_NULL_PTR; -} diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index d80a99483..c345d8e21 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -29,9 +29,8 @@ typedef struct FFstrbuf } FFstrbuf; void ffStrbufInitA(FFstrbuf* strbuf, uint32_t allocate); -void ffStrbufInitCopy(FFstrbuf* strbuf, const FFstrbuf* src); +void ffStrbufInitCopy(FFstrbuf* restrict strbuf, const FFstrbuf* restrict src); void ffStrbufInitMove(FFstrbuf* strbuf, FFstrbuf* src); -void ffStrbufInitF(FFstrbuf* strbuf, const char* format, ...); void ffStrbufInitVF(FFstrbuf* strbuf, const char* format, va_list arguments); void ffStrbufEnsureFree(FFstrbuf* strbuf, uint32_t free); @@ -91,7 +90,55 @@ void ffStrbufPutTo(const FFstrbuf* strbuf, FILE* file); FF_C_NODISCARD double ffStrbufToDouble(const FFstrbuf* strbuf); FF_C_NODISCARD uint16_t ffStrbufToUInt16(const FFstrbuf* strbuf, uint16_t defaultValue); -void ffStrbufDestroy(FFstrbuf* strbuf); +FF_C_NODISCARD static inline FFstrbuf ffStrbufCreateA(uint32_t allocate) +{ + FFstrbuf strbuf; + ffStrbufInitA(&strbuf, allocate); + return strbuf; +} + +FF_C_NODISCARD static inline FFstrbuf ffStrbufCreateCopy(const FFstrbuf* src) +{ + FFstrbuf strbuf; + ffStrbufInitCopy(&strbuf, src); + return strbuf; +} + +FF_C_NODISCARD static inline FFstrbuf ffStrbufCreateMove(FFstrbuf* src) +{ + FFstrbuf strbuf; + ffStrbufInitMove(&strbuf, src); + return strbuf; +} + +FF_C_NODISCARD static inline FFstrbuf ffStrbufCreateVF(const char* format, va_list arguments) +{ + FFstrbuf strbuf; + ffStrbufInitVF(&strbuf, format, arguments); + return strbuf; +} + +FF_C_PRINTF(2, 3) +static inline void ffStrbufInitF(FFstrbuf* strbuf, const char* format, ...) +{ + va_list arguments; + va_start(arguments, format); + ffStrbufInitVF(strbuf, format, arguments); + va_end(arguments); +} + +FF_C_PRINTF(1, 2) +FF_C_NODISCARD static inline FFstrbuf ffStrbufCreateF(const char* format, ...) +{ + FFstrbuf strbuf; + + va_list arguments; + va_start(arguments, format); + ffStrbufInitVF(&strbuf, format, arguments); + va_end(arguments); + + return strbuf; +} static inline void ffStrbufRecalculateLength(FFstrbuf* strbuf) { @@ -121,19 +168,40 @@ static inline void ffStrbufInit(FFstrbuf* strbuf) strbuf->chars = CHAR_NULL_PTR; } +FF_C_NODISCARD static inline FFstrbuf ffStrbufCreate() +{ + FFstrbuf strbuf; + ffStrbufInit(&strbuf); + return strbuf; +} + static inline void ffStrbufInitNS(FFstrbuf* strbuf, uint32_t length, const char* str) { ffStrbufInit(strbuf); ffStrbufAppendNS(strbuf, length, str); } +FF_C_NODISCARD static inline FFstrbuf ffStrbufCreateNS(uint32_t length, const char* str) +{ + FFstrbuf strbuf; + ffStrbufInitNS(&strbuf, length, str); + return strbuf; +} + static inline void ffStrbufInitS(FFstrbuf* strbuf, const char* str) { ffStrbufInit(strbuf); ffStrbufAppendS(strbuf, str); } -static inline void ffStrbufAppend(FFstrbuf* strbuf, const FFstrbuf* value) +FF_C_NODISCARD static inline FFstrbuf ffStrbufCreateS(const char* str) +{ + FFstrbuf strbuf; + ffStrbufInitS(&strbuf, str); + return strbuf; +} + +static inline void ffStrbufAppend(FFstrbuf* restrict strbuf, const FFstrbuf* restrict value) { assert(value != strbuf); if(value == NULL) @@ -323,6 +391,17 @@ static inline FF_C_NODISCARD bool ffStrbufEndsWithIgnCase(const FFstrbuf* strbuf return ffStrbufEndsWithIgnCaseNS(strbuf, end->length, end->chars); } +static inline void ffStrbufDestroy(FFstrbuf* strbuf) +{ + if(strbuf->allocated == 0) return; + + extern char* CHAR_NULL_PTR; + //Avoid free-after-use. These 3 assignments are cheap so don't remove them + strbuf->allocated = strbuf->length = 0; + free(strbuf->chars); + strbuf->chars = CHAR_NULL_PTR; +} + #define FF_STRBUF_AUTO_DESTROY FFstrbuf __attribute__((__cleanup__(ffStrbufDestroy))) #endif diff --git a/tests/strbuf.c b/tests/strbuf.c index 3d8d3d057..3df30af23 100644 --- a/tests/strbuf.c +++ b/tests/strbuf.c @@ -28,12 +28,12 @@ int main(void) FFstrbuf strbuf; //destroy 0 - ffStrbufInitA(&strbuf, 0); + ffStrbufInit(&strbuf); ffStrbufDestroy(&strbuf); //initA - ffStrbufInitA(&strbuf, 0); + ffStrbufInit(&strbuf); VERIFY(strbuf.chars[0] == 0); VERIFY(strbuf.allocated == 0); @@ -216,6 +216,11 @@ int main(void) ffStrbufDestroy(&strbuf); + { + FF_STRBUF_AUTO_DESTROY testCreate = ffStrbufCreateS("TEST"); + VERIFY(ffStrbufEqualS(&testCreate, "TEST")); + } + //Success puts("\033[32mAll tests passed!"FASTFETCH_TEXT_MODIFIER_RESET); } From 6d002c175f984e0abc75f5c855cee83d4e44f385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 18 Apr 2023 21:54:40 +0800 Subject: [PATCH 42/71] FFstrbuf: fix building on Windows --- src/util/FFstrbuf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index c345d8e21..32eb3da8c 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -29,7 +29,7 @@ typedef struct FFstrbuf } FFstrbuf; void ffStrbufInitA(FFstrbuf* strbuf, uint32_t allocate); -void ffStrbufInitCopy(FFstrbuf* restrict strbuf, const FFstrbuf* restrict src); +void ffStrbufInitCopy(FFstrbuf* __restrict strbuf, const FFstrbuf* __restrict src); void ffStrbufInitMove(FFstrbuf* strbuf, FFstrbuf* src); void ffStrbufInitVF(FFstrbuf* strbuf, const char* format, va_list arguments); @@ -201,7 +201,7 @@ FF_C_NODISCARD static inline FFstrbuf ffStrbufCreateS(const char* str) return strbuf; } -static inline void ffStrbufAppend(FFstrbuf* restrict strbuf, const FFstrbuf* restrict value) +static inline void ffStrbufAppend(FFstrbuf* __restrict strbuf, const FFstrbuf* __restrict value) { assert(value != strbuf); if(value == NULL) From 39582471e8572185bdcff6437f18210858fa374c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 21 Apr 2023 22:41:32 +0800 Subject: [PATCH 43/71] Global: major FFlist related code refactor --- src/detection/battery/battery_apple.c | 3 +-- src/detection/cpu/cpu_apple.c | 3 +-- src/detection/disk/disk_linux.c | 3 +-- src/detection/gpu/gpu_apple.c | 3 +-- src/modules/bluetooth/bluetooth.c | 5 +---- src/modules/brightness/brightness.c | 4 ++-- src/modules/gamepad/gamepad.c | 4 ++-- src/modules/localip/localip.c | 3 +-- src/modules/sound/sound.c | 7 +++---- src/modules/users.c | 3 +-- src/modules/wifi.c | 3 +-- src/util/FFlist.c | 8 -------- src/util/FFlist.h | 24 +++++++++++++++++++++--- tests/list.c | 7 +++++++ 14 files changed, 43 insertions(+), 37 deletions(-) diff --git a/src/detection/battery/battery_apple.c b/src/detection/battery/battery_apple.c index 8a4214180..af49b9a69 100644 --- a/src/detection/battery/battery_apple.c +++ b/src/detection/battery/battery_apple.c @@ -7,8 +7,7 @@ static double detectBatteryTemp() { - FF_LIST_AUTO_DESTROY temps; - ffListInit(&temps, sizeof(FFTempValue)); + FF_LIST_AUTO_DESTROY temps = ffListCreate(sizeof(FFTempValue)); ffDetectCoreTemps(FF_TEMP_BATTERY, &temps); diff --git a/src/detection/cpu/cpu_apple.c b/src/detection/cpu/cpu_apple.c index 7f3f3598f..fb53b60d2 100644 --- a/src/detection/cpu/cpu_apple.c +++ b/src/detection/cpu/cpu_apple.c @@ -15,8 +15,7 @@ static double getFrequency(const char* propName) static double detectCpuTemp(const FFstrbuf* cpuName) { - FF_LIST_AUTO_DESTROY temps; - ffListInit(&temps, sizeof(FFTempValue)); + FF_LIST_AUTO_DESTROY temps = ffListCreate(sizeof(FFTempValue)); if(ffStrbufStartsWithS(cpuName, "Apple M1")) ffDetectCoreTemps(FF_TEMP_CPU_M1X, &temps); diff --git a/src/detection/disk/disk_linux.c b/src/detection/disk/disk_linux.c index 2be87af66..210417ef4 100644 --- a/src/detection/disk/disk_linux.c +++ b/src/detection/disk/disk_linux.c @@ -201,8 +201,7 @@ void ffDetectDisksImpl(FFDiskResult* disks) return; } - FF_LIST_AUTO_DESTROY devices; - ffListInit(&devices, sizeof(FFstrbuf)); + FF_LIST_AUTO_DESTROY devices = ffListCreate(sizeof(FFstrbuf)); char* line = NULL; size_t len = 0; diff --git a/src/detection/gpu/gpu_apple.c b/src/detection/gpu/gpu_apple.c index 937b835f6..2245692b5 100644 --- a/src/detection/gpu/gpu_apple.c +++ b/src/detection/gpu/gpu_apple.c @@ -9,8 +9,7 @@ static double detectGpuTemp(const FFstrbuf* gpuName) { - FF_LIST_AUTO_DESTROY temps; - ffListInit(&temps, sizeof(FFTempValue)); + FF_LIST_AUTO_DESTROY temps = ffListCreate(sizeof(FFTempValue)); if(ffStrbufStartsWithS(gpuName, "Apple M1")) ffDetectCoreTemps(FF_TEMP_GPU_M1X, &temps); diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c index 1b33db8bf..2318336b5 100644 --- a/src/modules/bluetooth/bluetooth.c +++ b/src/modules/bluetooth/bluetooth.c @@ -37,8 +37,7 @@ void ffPrintBluetooth(FFinstance* instance, FFBluetoothOptions* options) return; } - FFlist filtered; - ffListInit(&filtered, sizeof(FFBluetoothDevice*)); + FF_LIST_AUTO_DESTROY filtered = ffListCreate(sizeof(FFBluetoothDevice*)); FF_LIST_FOR_EACH(FFBluetoothDevice, device, bluetooth->devices) { @@ -59,8 +58,6 @@ void ffPrintBluetooth(FFinstance* instance, FFBluetoothOptions* options) uint8_t index = (uint8_t) (filtered.length == 1 ? 0 : i + 1); printDevice(instance, options, *(FFBluetoothDevice**)ffListGet(&filtered, i), index); } - - ffListDestroy(&filtered); } void ffInitBluetoothOptions(FFBluetoothOptions* options) diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index 71176b922..34ae9f8f1 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -7,8 +7,8 @@ void ffPrintBrightness(FFinstance* instance, FFBrightnessOptions* options) { - FF_LIST_AUTO_DESTROY result; - ffListInit(&result, sizeof(FFBrightnessResult)); + FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFBrightnessResult)); + const char* error = ffDetectBrightness(&result); if(error) diff --git a/src/modules/gamepad/gamepad.c b/src/modules/gamepad/gamepad.c index a0cd64f27..6d4b37c53 100644 --- a/src/modules/gamepad/gamepad.c +++ b/src/modules/gamepad/gamepad.c @@ -22,8 +22,8 @@ static void printDevice(FFinstance* instance, FFGamepadOptions* options, const F void ffPrintGamepad(FFinstance* instance, FFGamepadOptions* options) { - FF_LIST_AUTO_DESTROY result; - ffListInit(&result, sizeof(FFGamepadDevice)); + FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFGamepadDevice)); + const char* error = ffDetectGamepad(instance, &result); if(error) diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index 92ec3fe21..9b27da159 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -55,8 +55,7 @@ static void printIp(FFLocalIpResult* ip) void ffPrintLocalIp(FFinstance* instance, FFLocalIpOptions* options) { - FF_LIST_AUTO_DESTROY results; - ffListInit(&results, sizeof(FFLocalIpResult)); + FF_LIST_AUTO_DESTROY results = ffListCreate(sizeof(FFLocalIpResult)); const char* error = ffDetectLocalIps(options, &results); diff --git a/src/modules/sound/sound.c b/src/modules/sound/sound.c index 678c47b5d..9f5e1c5a4 100644 --- a/src/modules/sound/sound.c +++ b/src/modules/sound/sound.c @@ -37,8 +37,8 @@ static void printDevice(FFinstance* instance, FFSoundOptions* options, const FFS void ffPrintSound(FFinstance* instance, FFSoundOptions* options) { - FF_LIST_AUTO_DESTROY result; - ffListInit(&result, sizeof(FFSoundDevice)); + FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFSoundDevice)); + const char* error = ffDetectSound(instance, &result); if(error) @@ -47,8 +47,7 @@ void ffPrintSound(FFinstance* instance, FFSoundOptions* options) return; } - FF_LIST_AUTO_DESTROY filtered; - ffListInit(&filtered, sizeof(FFSoundDevice*)); + FF_LIST_AUTO_DESTROY filtered = ffListCreate(sizeof(FFSoundDevice*)); FF_LIST_FOR_EACH(FFSoundDevice, device, result) { diff --git a/src/modules/users.c b/src/modules/users.c index 7fd27c36e..87503d56b 100644 --- a/src/modules/users.c +++ b/src/modules/users.c @@ -7,8 +7,7 @@ void ffPrintUsers(FFinstance* instance) { - FF_LIST_AUTO_DESTROY users; - ffListInit(&users, sizeof(FFstrbuf)); + FF_LIST_AUTO_DESTROY users = ffListCreate(sizeof(FFstrbuf)); FF_STRBUF_AUTO_DESTROY error = ffStrbufCreate(); diff --git a/src/modules/wifi.c b/src/modules/wifi.c index 06c3768fc..d78d750b4 100644 --- a/src/modules/wifi.c +++ b/src/modules/wifi.c @@ -7,8 +7,7 @@ void ffPrintWifi(FFinstance* instance) { - FF_LIST_AUTO_DESTROY result; - ffListInit(&result, sizeof(FFWifiResult)); + FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFWifiResult)); const char* error = ffDetectWifi(instance, &result); if(error) diff --git a/src/util/FFlist.c b/src/util/FFlist.c index bd643014a..59f5a8b56 100644 --- a/src/util/FFlist.c +++ b/src/util/FFlist.c @@ -55,11 +55,3 @@ bool ffListPop(FFlist* list, void* result) --list->length; return result; } - -void ffListDestroy(FFlist* list) -{ - //Avoid free-after-use. These 3 assignments are cheap so don't remove them - list->capacity = list->length = 0; - free(list->data); - list->data = NULL; -} diff --git a/src/util/FFlist.h b/src/util/FFlist.h index 58612e347..eccd30b55 100644 --- a/src/util/FFlist.h +++ b/src/util/FFlist.h @@ -31,12 +31,20 @@ bool ffListShift(FFlist* list, void* result); // Removes the last element, and copy its value to `*result` bool ffListPop(FFlist* list, void* result); -void ffListDestroy(FFlist* list); - static inline void ffListInit(FFlist* list, uint32_t elementSize) { assert(elementSize > 0); - ffListInitA(list, elementSize, 0); + list->elementSize = elementSize; + list->capacity = 0; + list->length = 0; + list->data = NULL; +} + +static inline FFlist ffListCreate(uint32_t elementSize) +{ + FFlist result; + ffListInit(&result, elementSize); + return result; } static inline void* ffListGet(const FFlist* list, uint32_t index) @@ -50,6 +58,16 @@ static inline void ffListSort(FFlist* list, int(*compar)(const void*, const void qsort(list->data, list->length, list->elementSize, compar); } +static inline void ffListDestroy(FFlist* list) +{ + if (!list->data) return; + + //Avoid free-after-use. These 3 assignments are cheap so don't remove them + list->capacity = list->length = 0; + free(list->data); + list->data = NULL; +} + #define FF_LIST_FOR_EACH(itemType, itemVarName, listVar) \ assert(sizeof(itemType) == (listVar).elementSize); \ for(itemType* itemVarName = (itemType*)(listVar).data; \ diff --git a/tests/list.c b/tests/list.c index db4db544a..4ba879097 100644 --- a/tests/list.c +++ b/tests/list.c @@ -108,6 +108,13 @@ int main(void) VERIFY(list.capacity == 0); VERIFY(list.length == 0); + { + FF_LIST_AUTO_DESTROY test = ffListCreate(1); + VERIFY(test.elementSize = 1); + VERIFY(test.capacity == 0); + VERIFY(test.length == 0); + } + //Success puts("\033[32mAll tests passed!"FASTFETCH_TEXT_MODIFIER_RESET); } From 51bc06f60ba78772524bf152d097a5e1efb97e45 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:39:35 +0800 Subject: [PATCH 44/71] Uptime: code refactor --- src/detection/uptime/uptime.h | 2 +- src/detection/uptime/uptime_bsd.c | 10 ++++++---- src/detection/uptime/uptime_linux.c | 7 ++++--- src/detection/uptime/uptime_windows.c | 5 +++-- src/modules/uptime.c | 8 +++++--- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/detection/uptime/uptime.h b/src/detection/uptime/uptime.h index 6a032b47c..447b13d5b 100644 --- a/src/detection/uptime/uptime.h +++ b/src/detection/uptime/uptime.h @@ -5,6 +5,6 @@ #include "fastfetch.h" -uint64_t ffDetectUptime(); +const char* ffDetectUptime(uint64_t* result); #endif diff --git a/src/detection/uptime/uptime_bsd.c b/src/detection/uptime/uptime_bsd.c index 375065c35..4e3a707c6 100644 --- a/src/detection/uptime/uptime_bsd.c +++ b/src/detection/uptime/uptime_bsd.c @@ -4,7 +4,7 @@ #include #include -uint64_t ffDetectUptime() +const char* ffDetectUptime(uint64_t* result) { struct timeval bootTime; size_t bootTimeSize = sizeof(bootTime); @@ -12,8 +12,10 @@ uint64_t ffDetectUptime() (int[]) {CTL_KERN, KERN_BOOTTIME}, 2, &bootTime, &bootTimeSize, NULL, 0 - ) == 0) - return (uint64_t) difftime(time(NULL), bootTime.tv_sec); + ) != 0) + return "sysctl({CTL_KERN, KERN_BOOTTIME}) failed"; - return 0; + *result = (uint64_t) difftime(time(NULL), bootTime.tv_sec); + + return NULL; } diff --git a/src/detection/uptime/uptime_linux.c b/src/detection/uptime/uptime_linux.c index cf4860771..6ba4a51a1 100644 --- a/src/detection/uptime/uptime_linux.c +++ b/src/detection/uptime/uptime_linux.c @@ -2,10 +2,11 @@ #include -uint64_t ffDetectUptime() +const char* ffDetectUptime(uint64_t* result) { struct sysinfo info; if(sysinfo(&info) != 0) - return 0; - return (uint32_t) info.uptime; + return "sysinfo() failed"; + *result = info.uptime; + return NULL; } diff --git a/src/detection/uptime/uptime_windows.c b/src/detection/uptime/uptime_windows.c index 657af033b..55053ab24 100644 --- a/src/detection/uptime/uptime_windows.c +++ b/src/detection/uptime/uptime_windows.c @@ -2,7 +2,8 @@ #include -uint64_t ffDetectUptime() +const char* ffDetectUptime(uint64_t* result) { - return GetTickCount64() / 1000; + *result = GetTickCount64() / 1000; + return NULL; } diff --git a/src/modules/uptime.c b/src/modules/uptime.c index 48d2b4f4a..6e1c81209 100644 --- a/src/modules/uptime.c +++ b/src/modules/uptime.c @@ -7,11 +7,13 @@ void ffPrintUptime(FFinstance* instance) { - uint64_t uptime = ffDetectUptime(); + uint64_t uptime; - if(uptime == 0) + const char* error = ffDetectUptime(&uptime); + + if(error) { - ffPrintError(instance, FF_UPTIME_MODULE_NAME, 0, &instance->config.uptime, "Uptime could't be detected"); + ffPrintError(instance, FF_UPTIME_MODULE_NAME, 0, &instance->config.uptime, "%s", error); return; } 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 45/71] 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 From dab5dbf75901e86054b29b99bf621b47a74335eb 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:40 +0800 Subject: [PATCH 46/71] DateTime: remove redundant function definitions --- src/fastfetch.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/fastfetch.h b/src/fastfetch.h index 8b6b374c2..482526e29 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -216,9 +216,6 @@ void ffPrintSwap(FFinstance* instance); void ffPrintPowerAdapter(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); -void ffPrintDateTime(FFinstance* instance, FFDateTimeOptions* options); -void ffPrintDate(FFinstance* instance); -void ffPrintTime(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); void ffPrintWifi(FFinstance* instance); From 31241b64d89bbb987044c57f1ee9f37cff792223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 28 Apr 2023 19:11:55 +0800 Subject: [PATCH 47/71] WMTheme: add JSON config support --- 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 | 1 + src/modules/options.h | 1 + src/modules/wmtheme.c | 29 ------------ src/modules/wmtheme/option.h | 11 +++++ src/modules/wmtheme/wmtheme.c | 72 +++++++++++++++++++++++++++++ src/modules/wmtheme/wmtheme.h | 16 +++++++ 12 files changed, 115 insertions(+), 38 deletions(-) delete mode 100644 src/modules/wmtheme.c create mode 100644 src/modules/wmtheme/option.h create mode 100644 src/modules/wmtheme/wmtheme.c create mode 100644 src/modules/wmtheme/wmtheme.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f25f85132..c6367dd45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,7 +312,7 @@ set(LIBFASTFETCH_SRC src/modules/weather.c src/modules/wifi.c src/modules/wm.c - src/modules/wmtheme.c + src/modules/wmtheme/wmtheme.c src/modules/jsonconfig/jsonconfig.c src/util/FFlist.c src/util/FFstrbuf.c diff --git a/src/common/init.c b/src/common/init.c index 5a1f57ce2..b09f7bc05 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -74,7 +74,7 @@ static void defaultConfig(FFinstance* instance) ffInitDisplayOptions(&instance->config.display); initModuleArg(&instance->config.de); initModuleArg(&instance->config.wm); - initModuleArg(&instance->config.wmTheme); + ffInitWMThemeOptions(&instance->config.wmTheme); initModuleArg(&instance->config.theme); initModuleArg(&instance->config.icons); ffInitFontOptions(&instance->config.font); @@ -296,7 +296,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyDisplayOptions(&instance->config.display); destroyModuleArg(&instance->config.de); destroyModuleArg(&instance->config.wm); - destroyModuleArg(&instance->config.wmTheme); + ffDestroyWMThemeOptions(&instance->config.wmTheme); destroyModuleArg(&instance->config.theme); destroyModuleArg(&instance->config.icons); ffDestroyFontOptions(&instance->config.font); diff --git a/src/fastfetch.c b/src/fastfetch.c index fc7066f1f..3500d9553 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -991,7 +991,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "de", &instance->config.de)) {} else if(optionParseModuleArgs(key, value, "wifi", &instance->config.wifi)) {} else if(optionParseModuleArgs(key, value, "wm", &instance->config.wm)) {} - else if(optionParseModuleArgs(key, value, "wm-theme", &instance->config.wmTheme)) {} + else if(ffParseWMThemeCommandOptions(&instance->config.wmTheme, key, value)) {} else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} else if(optionParseModuleArgs(key, value, "icons", &instance->config.icons)) {} else if(optionParseModuleArgs(key, value, "wallpaper", &instance->config.wallpaper)) {} @@ -1202,8 +1202,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintWM(instance); else if(strcasecmp(line, "theme") == 0) ffPrintTheme(instance); - else if(strcasecmp(line, "wmtheme") == 0) - ffPrintWMTheme(instance); + else if(strcasecmp(line, FF_WMTHEME_MODULE_NAME) == 0) + ffPrintWMTheme(instance, &instance->config.wmTheme); else if(strcasecmp(line, "icons") == 0) ffPrintIcons(instance); else if(strcasecmp(line, "wallpaper") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 482526e29..2ba69c847 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -74,7 +74,7 @@ typedef struct FFconfig FFModuleArgs wallpaper; FFModuleArgs wifi; FFModuleArgs wm; - FFModuleArgs wmTheme; + FFWMThemeOptions wmTheme; FFModuleArgs theme; FFModuleArgs icons; FFFontOptions font; @@ -205,7 +205,6 @@ void ffPrintPackages(FFinstance* instance); void ffPrintShell(FFinstance* instance); void ffPrintDesktopEnvironment(FFinstance* instance); void ffPrintWM(FFinstance* instance); -void ffPrintWMTheme(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index a30b9c528..5a72a214a 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -36,7 +36,7 @@ int main(int argc, char** argv) // ffPrintBrightness(&instance); ffPrintDesktopEnvironment(&instance); ffPrintWM(&instance); - ffPrintWMTheme(&instance); + ffPrintWMTheme(&instance, &instance.config.wmTheme); ffPrintTheme(&instance); ffPrintIcons(&instance); ffPrintFont(&instance, &instance.config.font); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 4029c0a7d..b03fe7dca 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -113,6 +113,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'W': { + return + tryModule(instance, type, module, FF_WMTHEME_MODULE_NAME, ffParseWMThemeJsonObject) || + false; + } + default: return false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 0736365c4..07180f83b 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -30,3 +30,4 @@ #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" #include "modules/uptime/uptime.h" +#include "modules/wmtheme/wmtheme.h" diff --git a/src/modules/options.h b/src/modules/options.h index 1947123e5..4bd339b16 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -27,3 +27,4 @@ #include "modules/sound/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" +#include "modules/wmtheme/option.h" diff --git a/src/modules/wmtheme.c b/src/modules/wmtheme.c deleted file mode 100644 index 91e46911c..000000000 --- a/src/modules/wmtheme.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/wmtheme/wmtheme.h" - -#define FF_WMTHEME_MODULE_NAME "WM Theme" -#define FF_WMTHEME_NUM_FORMAT_ARGS 1 - -void ffPrintWMTheme(FFinstance* instance) -{ - FF_STRBUF_AUTO_DESTROY themeOrError = ffStrbufCreate(); - if(ffDetectWmTheme(instance, &themeOrError)) - { - if(instance->config.wmTheme.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmTheme.key); - puts(themeOrError.chars); - } - else - { - ffPrintFormat(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmTheme, FF_WMTHEME_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &themeOrError} - }); - } - } - else - { - ffPrintError(instance, FF_WMTHEME_MODULE_NAME, 0, &instance->config.wmTheme, "%*s", themeOrError.length, themeOrError.chars); - } -} diff --git a/src/modules/wmtheme/option.h b/src/modules/wmtheme/option.h new file mode 100644 index 000000000..11b14458b --- /dev/null +++ b/src/modules/wmtheme/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 FFWMThemeOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFWMThemeOptions; diff --git a/src/modules/wmtheme/wmtheme.c b/src/modules/wmtheme/wmtheme.c new file mode 100644 index 000000000..4a2ffbcd2 --- /dev/null +++ b/src/modules/wmtheme/wmtheme.c @@ -0,0 +1,72 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/wmtheme/wmtheme.h" +#include "modules/wmtheme/wmtheme.h" + +#define FF_WMTHEME_DISPLAY_NAME "WM Theme" +#define FF_WMTHEME_NUM_FORMAT_ARGS 1 + +void ffPrintWMTheme(FFinstance* instance, FFWMThemeOptions* options) +{ + FF_STRBUF_AUTO_DESTROY themeOrError = ffStrbufCreate(); + if(ffDetectWmTheme(instance, &themeOrError)) + { + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_WMTHEME_DISPLAY_NAME, 0, &options->moduleArgs.key); + puts(themeOrError.chars); + } + else + { + ffPrintFormat(instance, FF_WMTHEME_DISPLAY_NAME, 0, &options->moduleArgs, FF_WMTHEME_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &themeOrError} + }); + } + } + else + { + ffPrintError(instance, FF_WMTHEME_DISPLAY_NAME, 0, &options->moduleArgs, "%*s", themeOrError.length, themeOrError.chars); + } +} + +void ffInitWMThemeOptions(FFWMThemeOptions* options) +{ + options->moduleName = FF_WMTHEME_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseWMThemeCommandOptions(FFWMThemeOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_WMTHEME_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyWMThemeOptions(FFWMThemeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseWMThemeJsonObject(FFinstance* instance, json_object* module) +{ + FFWMThemeOptions __attribute__((__cleanup__(ffDestroyWMThemeOptions))) options; + ffInitWMThemeOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_WMTHEME_DISPLAY_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintWMTheme(instance, &options); +} +#endif diff --git a/src/modules/wmtheme/wmtheme.h b/src/modules/wmtheme/wmtheme.h new file mode 100644 index 000000000..c1f95312d --- /dev/null +++ b/src/modules/wmtheme/wmtheme.h @@ -0,0 +1,16 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/wmtheme/option.h" + +#define FF_WMTHEME_MODULE_NAME "WMTheme" + +void ffPrintWMTheme(FFinstance* instance, FFWMThemeOptions* options); +void ffInitWMThemeOptions(FFWMThemeOptions* options); +bool ffParseWMThemeCommandOptions(FFWMThemeOptions* options, const char* key, const char* value); +void ffDestroyWMThemeOptions(FFWMThemeOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseWMThemeJsonObject(FFinstance* instance, json_object* module); +#endif From f3190b8979527d05ff5d8f49c02465f124b4effe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 11 May 2023 21:07:04 +0800 Subject: [PATCH 48/71] Memory / Swap: add JSON config support --- CMakeLists.txt | 4 +-- src/common/init.c | 8 ++--- src/fastfetch.c | 12 +++---- src/fastfetch.h | 6 ++-- src/flashfetch.c | 4 +-- src/modules/jsonconfig/jsonconfig.c | 7 ++++ src/modules/{ => memory}/memory.c | 54 +++++++++++++++++++++++++---- src/modules/memory/memory.h | 15 ++++++++ src/modules/memory/option.h | 11 ++++++ src/modules/modules.h | 2 ++ src/modules/options.h | 2 ++ src/modules/swap/option.h | 11 ++++++ src/modules/{ => swap}/swap.c | 54 +++++++++++++++++++++++++---- src/modules/swap/swap.h | 15 ++++++++ 14 files changed, 175 insertions(+), 30 deletions(-) rename src/modules/{ => memory}/memory.c (52%) create mode 100644 src/modules/memory/memory.h create mode 100644 src/modules/memory/option.h create mode 100644 src/modules/swap/option.h rename src/modules/{ => swap}/swap.c (52%) create mode 100644 src/modules/swap/swap.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c6367dd45..2dba0e869 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -286,7 +286,7 @@ set(LIBFASTFETCH_SRC src/modules/kernel/kernel.c src/modules/locale/locale.c src/modules/localip/localip.c - src/modules/memory.c + src/modules/memory/memory.c src/modules/opencl.c src/modules/opengl.c src/modules/os/os.c @@ -299,7 +299,7 @@ set(LIBFASTFETCH_SRC src/modules/separator/separator.c src/modules/shell.c src/modules/sound/sound.c - src/modules/swap.c + src/modules/swap/swap.c src/modules/media.c src/modules/terminal.c src/modules/terminalfont.c diff --git a/src/common/init.c b/src/common/init.c index b09f7bc05..587664fe8 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -84,8 +84,8 @@ static void defaultConfig(FFinstance* instance) ffInitCPUOptions(&instance->config.cpu); ffInitCPUUsageOptions(&instance->config.cpuUsage); ffInitGPUOptions(&instance->config.gpu); - initModuleArg(&instance->config.memory); - initModuleArg(&instance->config.swap); + ffInitMemoryOptions(&instance->config.memory); + ffInitSwapOptions(&instance->config.swap); ffInitDiskOptions(&instance->config.disk); ffInitBatteryOptions(&instance->config.battery); initModuleArg(&instance->config.powerAdapter); @@ -306,8 +306,8 @@ static void destroyConfig(FFinstance* instance) ffDestroyCPUOptions(&instance->config.cpu); ffDestroyCPUUsageOptions(&instance->config.cpuUsage); ffDestroyGPUOptions(&instance->config.gpu); - destroyModuleArg(&instance->config.memory); - destroyModuleArg(&instance->config.swap); + ffDestroyMemoryOptions(&instance->config.memory); + ffDestroySwapOptions(&instance->config.swap); ffDestroyDiskOptions(&instance->config.disk); ffDestroyBatteryOptions(&instance->config.battery); destroyModuleArg(&instance->config.powerAdapter); diff --git a/src/fastfetch.c b/src/fastfetch.c index 3500d9553..58eca8995 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1002,8 +1002,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseCPUCommandOptions(&instance->config.cpu, key, value)) {} else if(ffParseCPUUsageCommandOptions(&instance->config.cpuUsage, key, value)) {} else if(ffParseGPUCommandOptions(&instance->config.gpu, key, value)) {} - else if(optionParseModuleArgs(key, value, "memory", &instance->config.memory)) {} - else if(optionParseModuleArgs(key, value, "swap", &instance->config.swap)) {} + else if(ffParseMemoryCommandOptions(&instance->config.memory, key, value)) {} + else if(ffParseSwapCommandOptions(&instance->config.swap, key, value)) {} else if(ffParseDiskCommandOptions(&instance->config.disk, key, value)) {} else if(ffParseBatteryCommandOptions(&instance->config.battery, key, value)) {} else if(optionParseModuleArgs(key, value, "poweradapter", &instance->config.powerAdapter)) {} @@ -1224,10 +1224,10 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintCustom(instance, &instance->config.custom); else if(strcasecmp(line, FF_GPU_MODULE_NAME) == 0) ffPrintGPU(instance, &instance->config.gpu); - else if(strcasecmp(line, "memory") == 0) - ffPrintMemory(instance); - else if(strcasecmp(line, "swap") == 0) - ffPrintSwap(instance); + else if(strcasecmp(line, FF_MEMORY_MODULE_NAME) == 0) + ffPrintMemory(instance, &instance->config.memory); + else if(strcasecmp(line, FF_SWAP_MODULE_NAME) == 0) + ffPrintSwap(instance, &instance->config.swap); else if(strcasecmp(line, FF_DISK_MODULE_NAME) == 0) ffPrintDisk(instance, &instance->config.disk); else if(strcasecmp(line, FF_BATTERY_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 2ba69c847..cf8562d86 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -85,8 +85,8 @@ typedef struct FFconfig FFCPUUsageOptions cpuUsage; FFCustomOptions custom; FFGPUOptions gpu; - FFModuleArgs memory; - FFModuleArgs swap; + FFMemoryOptions memory; + FFSwapOptions swap; FFDiskOptions disk; FFBatteryOptions battery; FFModuleArgs powerAdapter; @@ -210,8 +210,6 @@ void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); void ffPrintTerminal(FFinstance* instance); void ffPrintTerminalFont(FFinstance* instance); -void ffPrintMemory(FFinstance* instance); -void ffPrintSwap(FFinstance* instance); void ffPrintPowerAdapter(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 5a72a214a..7d91d9eec 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -45,8 +45,8 @@ int main(int argc, char** argv) ffPrintTerminalFont(&instance); ffPrintCPU(&instance, &instance.config.cpu); ffPrintGPU(&instance, &instance.config.gpu); - ffPrintMemory(&instance); - //ffPrintSwap(&instance); + ffPrintMemory(&instance, &instance.config.memory); + ffPrintSwap(&instance, &instance.config.swap); ffPrintDisk(&instance, &instance.config.disk); ffPrintBattery(&instance, &instance.config.battery); ffPrintPowerAdapter(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index b03fe7dca..7e27ddc43 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -88,6 +88,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'M': { + return + tryModule(instance, type, module, FF_MEMORY_MODULE_NAME, ffParseMemoryJsonObject) || + false; + } + case 'O': { return tryModule(instance, type, module, FF_OS_MODULE_NAME, ffParseOSJsonObject) || @@ -98,6 +104,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o return tryModule(instance, type, module, FF_SEPARATOR_MODULE_NAME, ffParseSeparatorJsonObject) || tryModule(instance, type, module, FF_SOUND_MODULE_NAME, ffParseSoundJsonObject) || + tryModule(instance, type, module, FF_SWAP_MODULE_NAME, ffParseSwapJsonObject) || false; } diff --git a/src/modules/memory.c b/src/modules/memory/memory.c similarity index 52% rename from src/modules/memory.c rename to src/modules/memory/memory.c index 729ffc777..552a0dc44 100644 --- a/src/modules/memory.c +++ b/src/modules/memory/memory.c @@ -3,18 +3,18 @@ #include "common/parsing.h" #include "common/bar.h" #include "detection/memory/memory.h" +#include "modules/memory/memory.h" -#define FF_MEMORY_MODULE_NAME "Memory" #define FF_MEMORY_NUM_FORMAT_ARGS 3 -void ffPrintMemory(FFinstance* instance) +void ffPrintMemory(FFinstance* instance, FFMemoryOptions* options) { FFMemoryResult storage; const char* error = ffDetectMemory(&storage); if(error) { - ffPrintError(instance, FF_MEMORY_MODULE_NAME, 0, &instance->config.memory, "%s", error); + ffPrintError(instance, FF_MEMORY_MODULE_NAME, 0, &options->moduleArgs, "%s", error); return; } @@ -28,9 +28,9 @@ void ffPrintMemory(FFinstance* instance) ? 0 : (uint8_t) (((long double) storage.bytesUsed / (long double) storage.bytesTotal) * 100.0); - if(instance->config.memory.outputFormat.length == 0) + if(options->moduleArgs.outputFormat.length == 0) { - ffPrintLogoAndKey(instance, FF_MEMORY_MODULE_NAME, 0, &instance->config.memory.key); + ffPrintLogoAndKey(instance, FF_MEMORY_MODULE_NAME, 0, &options->moduleArgs.key); if (storage.bytesTotal == 0) puts("Disabled"); else @@ -55,10 +55,52 @@ void ffPrintMemory(FFinstance* instance) } else { - ffPrintFormat(instance, FF_MEMORY_MODULE_NAME, 0, &instance->config.memory, FF_MEMORY_NUM_FORMAT_ARGS, (FFformatarg[]){ + ffPrintFormat(instance, FF_MEMORY_MODULE_NAME, 0, &options->moduleArgs, FF_MEMORY_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &usedPretty}, {FF_FORMAT_ARG_TYPE_STRBUF, &totalPretty}, {FF_FORMAT_ARG_TYPE_UINT8, &percentage}, }); } } + +void ffInitMemoryOptions(FFMemoryOptions* options) +{ + options->moduleName = FF_MEMORY_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseMemoryCommandOptions(FFMemoryOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_MEMORY_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyMemoryOptions(FFMemoryOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseMemoryJsonObject(FFinstance* instance, json_object* module) +{ + FFMemoryOptions __attribute__((__cleanup__(ffDestroyMemoryOptions))) options; + ffInitMemoryOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_MEMORY_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintMemory(instance, &options); +} +#endif diff --git a/src/modules/memory/memory.h b/src/modules/memory/memory.h new file mode 100644 index 000000000..e500d8532 --- /dev/null +++ b/src/modules/memory/memory.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_MEMORY_MODULE_NAME "Memory" + +void ffPrintMemory(FFinstance* instance, FFMemoryOptions* options); +void ffInitMemoryOptions(FFMemoryOptions* options); +bool ffParseMemoryCommandOptions(FFMemoryOptions* options, const char* key, const char* value); +void ffDestroyMemoryOptions(FFMemoryOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseMemoryJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/memory/option.h b/src/modules/memory/option.h new file mode 100644 index 000000000..1f8b30bf1 --- /dev/null +++ b/src/modules/memory/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 FFMemoryOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFMemoryOptions; diff --git a/src/modules/modules.h b/src/modules/modules.h index 07180f83b..abf78d850 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -25,8 +25,10 @@ #include "modules/kernel/kernel.h" #include "modules/locale/locale.h" #include "modules/localip/localip.h" +#include "modules/memory/memory.h" #include "modules/separator/separator.h" #include "modules/sound/sound.h" +#include "modules/swap/swap.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 4bd339b16..e6fec4bd4 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -22,9 +22,11 @@ #include "modules/kernel/option.h" #include "modules/locale/option.h" #include "modules/localip/option.h" +#include "modules/memory/option.h" #include "modules/os/option.h" #include "modules/separator/option.h" #include "modules/sound/option.h" +#include "modules/swap/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" #include "modules/wmtheme/option.h" diff --git a/src/modules/swap/option.h b/src/modules/swap/option.h new file mode 100644 index 000000000..4053cfbe1 --- /dev/null +++ b/src/modules/swap/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 FFSwapOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFSwapOptions; diff --git a/src/modules/swap.c b/src/modules/swap/swap.c similarity index 52% rename from src/modules/swap.c rename to src/modules/swap/swap.c index 37ba2a12b..d3029878e 100644 --- a/src/modules/swap.c +++ b/src/modules/swap/swap.c @@ -3,18 +3,18 @@ #include "common/parsing.h" #include "common/bar.h" #include "detection/swap/swap.h" +#include "modules/swap/swap.h" -#define FF_SWAP_MODULE_NAME "Swap" #define FF_SWAP_NUM_FORMAT_ARGS 3 -void ffPrintSwap(FFinstance* instance) +void ffPrintSwap(FFinstance* instance, FFSwapOptions* options) { FFSwapResult storage; const char* error = ffDetectSwap(&storage); if(error) { - ffPrintError(instance, FF_SWAP_MODULE_NAME, 0, &instance->config.swap, "%s", error); + ffPrintError(instance, FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, "%s", error); return; } @@ -28,9 +28,9 @@ void ffPrintSwap(FFinstance* instance) ? 0 : (uint8_t) (((long double) storage.bytesUsed / (long double) storage.bytesTotal) * 100.0); - if(instance->config.swap.outputFormat.length == 0) + if(options->moduleArgs.outputFormat.length == 0) { - ffPrintLogoAndKey(instance, FF_SWAP_MODULE_NAME, 0, &instance->config.swap.key); + ffPrintLogoAndKey(instance, FF_SWAP_MODULE_NAME, 0, &options->moduleArgs.key); if (storage.bytesTotal == 0) puts("Disabled"); else @@ -55,10 +55,52 @@ void ffPrintSwap(FFinstance* instance) } else { - ffPrintFormat(instance, FF_SWAP_MODULE_NAME, 0, &instance->config.swap, FF_SWAP_NUM_FORMAT_ARGS, (FFformatarg[]){ + ffPrintFormat(instance, FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_SWAP_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &usedPretty}, {FF_FORMAT_ARG_TYPE_STRBUF, &totalPretty}, {FF_FORMAT_ARG_TYPE_UINT8, &percentage}, }); } } + +void ffInitSwapOptions(FFSwapOptions* options) +{ + options->moduleName = FF_SWAP_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseSwapCommandOptions(FFSwapOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_SWAP_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroySwapOptions(FFSwapOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseSwapJsonObject(FFinstance* instance, json_object* module) +{ + FFSwapOptions __attribute__((__cleanup__(ffDestroySwapOptions))) options; + ffInitSwapOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_SWAP_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintSwap(instance, &options); +} +#endif diff --git a/src/modules/swap/swap.h b/src/modules/swap/swap.h new file mode 100644 index 000000000..7326d14da --- /dev/null +++ b/src/modules/swap/swap.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_SWAP_MODULE_NAME "Swap" + +void ffPrintSwap(FFinstance* instance, FFSwapOptions* options); +void ffInitSwapOptions(FFSwapOptions* options); +bool ffParseSwapCommandOptions(FFSwapOptions* options, const char* key, const char* value); +void ffDestroySwapOptions(FFSwapOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseSwapJsonObject(FFinstance* instance, json_object* module); +#endif From 2f5c198a81ffe46ecbcaf81bd602b41bf4ab172f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 23 May 2023 15:30:59 +0800 Subject: [PATCH 49/71] Wifi: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 4 +-- src/fastfetch.c | 6 ++-- src/fastfetch.h | 3 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/wifi/option.h | 11 ++++++ src/modules/{ => wifi}/wifi.c | 56 +++++++++++++++++++++++++---- src/modules/wifi/wifi.h | 16 +++++++++ 10 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 src/modules/wifi/option.h rename src/modules/{ => wifi}/wifi.c (58%) create mode 100644 src/modules/wifi/wifi.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2dba0e869..fd57c3ff3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -310,7 +310,7 @@ set(LIBFASTFETCH_SRC src/modules/vulkan.c src/modules/wallpaper.c src/modules/weather.c - src/modules/wifi.c + src/modules/wifi/wifi.c src/modules/wm.c src/modules/wmtheme/wmtheme.c src/modules/jsonconfig/jsonconfig.c diff --git a/src/common/init.c b/src/common/init.c index 587664fe8..3c17d8207 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -93,7 +93,7 @@ static void defaultConfig(FFinstance* instance) ffInitLocalIpOptions(&instance->config.localIP); initModuleArg(&instance->config.publicIP); initModuleArg(&instance->config.weather); - initModuleArg(&instance->config.wifi); + ffInitWifiOptions(&instance->config.wifi); initModuleArg(&instance->config.player); initModuleArg(&instance->config.media); ffInitDateTimeOptions(&instance->config.dateTime); @@ -316,7 +316,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.publicIP); destroyModuleArg(&instance->config.wallpaper); destroyModuleArg(&instance->config.weather); - destroyModuleArg(&instance->config.wifi); + ffDestroyWifiOptions(&instance->config.wifi); destroyModuleArg(&instance->config.player); destroyModuleArg(&instance->config.media); ffDestroyDateTimeOptions(&instance->config.dateTime); diff --git a/src/fastfetch.c b/src/fastfetch.c index 58eca8995..7701b57e1 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -989,7 +989,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseDisplayCommandOptions(&instance->config.display, key, value)) {} else if(ffParseBrightnessCommandOptions(&instance->config.brightness, key, value)) {} else if(optionParseModuleArgs(key, value, "de", &instance->config.de)) {} - else if(optionParseModuleArgs(key, value, "wifi", &instance->config.wifi)) {} + else if(ffParseWifiCommandOptions(&instance->config.wifi, key, value)) {} else if(optionParseModuleArgs(key, value, "wm", &instance->config.wm)) {} else if(ffParseWMThemeCommandOptions(&instance->config.wmTheme, key, value)) {} else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} @@ -1240,8 +1240,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintLocalIp(instance, &instance->config.localIP); else if(strcasecmp(line, "publicip") == 0) ffPrintPublicIp(instance); - else if(strcasecmp(line, "wifi") == 0) - ffPrintWifi(instance); + else if(strcasecmp(line, FF_WIFI_MODULE_NAME) == 0) + ffPrintWifi(instance, &instance->config.wifi); else if(strcasecmp(line, "weather") == 0) ffPrintWeather(instance); else if(strcasecmp(line, "player") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index cf8562d86..e1f394daf 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -72,7 +72,7 @@ typedef struct FFconfig FFDisplayOptions display; FFModuleArgs de; FFModuleArgs wallpaper; - FFModuleArgs wifi; + FFWifiOptions wifi; FFModuleArgs wm; FFWMThemeOptions wmTheme; FFModuleArgs theme; @@ -215,7 +215,6 @@ void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); -void ffPrintWifi(FFinstance* instance); void ffPrintColors(FFinstance* instance); void ffPrintVulkan(FFinstance* instance); void ffPrintOpenGL(FFinstance* instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 7e27ddc43..6bbb99c69 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -122,6 +122,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'W': { return + tryModule(instance, type, module, FF_WIFI_MODULE_NAME, ffParseWifiJsonObject) || tryModule(instance, type, module, FF_WMTHEME_MODULE_NAME, ffParseWMThemeJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index abf78d850..7b1011537 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -32,4 +32,5 @@ #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" #include "modules/uptime/uptime.h" +#include "modules/wifi/wifi.h" #include "modules/wmtheme/wmtheme.h" diff --git a/src/modules/options.h b/src/modules/options.h index e6fec4bd4..117bdb6e4 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -29,4 +29,5 @@ #include "modules/swap/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" +#include "modules/wifi/option.h" #include "modules/wmtheme/option.h" diff --git a/src/modules/wifi/option.h b/src/modules/wifi/option.h new file mode 100644 index 000000000..4d713b5d8 --- /dev/null +++ b/src/modules/wifi/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 FFWifiOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFWifiOptions; diff --git a/src/modules/wifi.c b/src/modules/wifi/wifi.c similarity index 58% rename from src/modules/wifi.c rename to src/modules/wifi/wifi.c index d78d750b4..cd35eb5f9 100644 --- a/src/modules/wifi.c +++ b/src/modules/wifi/wifi.c @@ -1,23 +1,23 @@ #include "fastfetch.h" #include "common/printing.h" #include "detection/wifi/wifi.h" +#include "modules/wifi/wifi.h" -#define FF_WIFI_MODULE_NAME "Wifi" #define FF_WIFI_NUM_FORMAT_ARGS 10 -void ffPrintWifi(FFinstance* instance) +void ffPrintWifi(FFinstance* instance, FFWifiOptions* options) { FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFWifiResult)); const char* error = ffDetectWifi(instance, &result); if(error) { - ffPrintError(instance, FF_WIFI_MODULE_NAME, 0, &instance->config.wifi, "%s", error); + ffPrintError(instance, FF_WIFI_MODULE_NAME, 0, &options->moduleArgs, "%s", error); return; } if(!result.length) { - ffPrintError(instance, FF_WIFI_MODULE_NAME, 0, &instance->config.wifi, "No Wifi interfaces found"); + ffPrintError(instance, FF_WIFI_MODULE_NAME, 0, &options->moduleArgs, "No Wifi interfaces found"); return; } @@ -26,9 +26,9 @@ void ffPrintWifi(FFinstance* instance) FFWifiResult* item = (FFWifiResult*)ffListGet(&result, index); uint8_t moduleIndex = result.length == 1 ? 0 : (uint8_t)(index + 1); - if(instance->config.wifi.outputFormat.length == 0) + if(options->moduleArgs.outputFormat.length == 0) { - ffPrintLogoAndKey(instance, FF_WIFI_MODULE_NAME, moduleIndex, &instance->config.wifi.key); + ffPrintLogoAndKey(instance, FF_WIFI_MODULE_NAME, moduleIndex, &options->moduleArgs.key); if(item->conn.ssid.length) { ffStrbufWriteTo(&item->conn.ssid, stdout); @@ -45,7 +45,7 @@ void ffPrintWifi(FFinstance* instance) } else { - ffPrintFormat(instance, FF_WIFI_MODULE_NAME, moduleIndex, &instance->config.wifi, FF_WIFI_NUM_FORMAT_ARGS, (FFformatarg[]){ + ffPrintFormat(instance, FF_WIFI_MODULE_NAME, moduleIndex, &options->moduleArgs, FF_WIFI_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &item->inf.description}, {FF_FORMAT_ARG_TYPE_STRBUF, &item->inf.status}, {FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.status}, @@ -68,3 +68,45 @@ void ffPrintWifi(FFinstance* instance) ffStrbufDestroy(&item->conn.security); } } + +void ffInitWifiOptions(FFWifiOptions* options) +{ + options->moduleName = FF_WIFI_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseWifiCommandOptions(FFWifiOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_WIFI_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyWifiOptions(FFWifiOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseWifiJsonObject(FFinstance* instance, json_object* module) +{ + FFWifiOptions __attribute__((__cleanup__(ffDestroyWifiOptions))) options; + ffInitWifiOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_WIFI_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintWifi(instance, &options); +} +#endif diff --git a/src/modules/wifi/wifi.h b/src/modules/wifi/wifi.h new file mode 100644 index 000000000..bb6aa1884 --- /dev/null +++ b/src/modules/wifi/wifi.h @@ -0,0 +1,16 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/wifi/option.h" + +#define FF_WIFI_MODULE_NAME "Wifi" + +void ffPrintWifi(FFinstance* instance, FFWifiOptions* options); +void ffInitWifiOptions(FFWifiOptions* options); +bool ffParseWifiCommandOptions(FFWifiOptions* options, const char* key, const char* value); +void ffDestroyWifiOptions(FFWifiOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseWifiJsonObject(FFinstance* instance, json_object* module); +#endif 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 50/71] 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 From 786d538276f7fbc5de55123f7c8cf618a5792279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 1 Jun 2023 11:37:52 +0800 Subject: [PATCH 51/71] Shell: add JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 5 +- .../terminalshell/terminalshell_linux.c | 2 +- .../terminalshell/terminalshell_windows.c | 2 +- src/fastfetch.c | 8 +- src/fastfetch.h | 4 +- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/shell.c | 43 -------- src/modules/shell/option.h | 13 +++ src/modules/shell/shell.c | 99 +++++++++++++++++++ src/modules/shell/shell.h | 15 +++ 14 files changed, 140 insertions(+), 58 deletions(-) delete mode 100644 src/modules/shell.c create mode 100644 src/modules/shell/option.h create mode 100644 src/modules/shell/shell.c create mode 100644 src/modules/shell/shell.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f947d1c40..c85e70f42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -297,7 +297,7 @@ set(LIBFASTFETCH_SRC src/modules/publicip.c src/modules/display/display.c src/modules/separator/separator.c - src/modules/shell.c + src/modules/shell/shell.c src/modules/sound/sound.c src/modules/swap/swap.c src/modules/media.c diff --git a/src/common/init.c b/src/common/init.c index 20b5f0945..cb2352155 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -70,7 +70,7 @@ static void defaultConfig(FFinstance* instance) ffInitUptimeOptions(&instance->config.uptime); initModuleArg(&instance->config.processes); ffInitPackagesOptions(&instance->config.packages); - initModuleArg(&instance->config.shell); + ffInitShellOptions(&instance->config.shell); ffInitDisplayOptions(&instance->config.display); initModuleArg(&instance->config.de); initModuleArg(&instance->config.wm); @@ -133,7 +133,6 @@ static void defaultConfig(FFinstance* instance) ffStrbufInit(&instance->config.libwlanapi); ffStrbufInit(&instance->config.libnm); - instance->config.shellVersion = true; instance->config.terminalVersion = true; instance->config.publicIpTimeout = 0; @@ -292,7 +291,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyUptimeOptions(&instance->config.uptime); destroyModuleArg(&instance->config.processes); ffDestroyPackagesOptions(&instance->config.packages); - destroyModuleArg(&instance->config.shell); + ffDestroyShellOptions(&instance->config.shell); ffDestroyDisplayOptions(&instance->config.display); destroyModuleArg(&instance->config.de); destroyModuleArg(&instance->config.wm); diff --git a/src/detection/terminalshell/terminalshell_linux.c b/src/detection/terminalshell/terminalshell_linux.c index 45bf0091e..931ffdee2 100644 --- a/src/detection/terminalshell/terminalshell_linux.c +++ b/src/detection/terminalshell/terminalshell_linux.c @@ -353,7 +353,7 @@ const FFTerminalShellResult* ffDetectTerminalShell(const FFinstance* instance) getUserShellFromEnv(instance, &result); ffStrbufClear(&result.shellVersion); - if(instance->config.shellVersion) + if(instance->config.shell.version) { getShellVersion(&result.shellExe, result.shellExeName, &result.shellVersion); diff --git a/src/detection/terminalshell/terminalshell_windows.c b/src/detection/terminalshell/terminalshell_windows.c index 9af70f8ca..6b5c9b9c1 100644 --- a/src/detection/terminalshell/terminalshell_windows.c +++ b/src/detection/terminalshell/terminalshell_windows.c @@ -152,7 +152,7 @@ static uint32_t getShellInfo(const FFinstance* instance, FFTerminalShellResult* } ffStrbufClear(&result->shellVersion); - if(instance->config.shellVersion) + if(instance->config.shell.version) fftsGetShellVersion(&result->shellExe, result->shellPrettyName.chars, &result->shellVersion); result->shellPid = pid; diff --git a/src/fastfetch.c b/src/fastfetch.c index 46189fcb2..da2526d74 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -985,7 +985,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseUptimeCommandOptions(&instance->config.uptime, key, value)) {} else if(optionParseModuleArgs(key, value, "processes", &instance->config.processes)) {} else if(ffParsePackagesCommandOptions(&instance->config.packages, key, value)) {} - else if(optionParseModuleArgs(key, value, "shell", &instance->config.shell)) {} + else if(ffParseShellCommandOptions(&instance->config.shell, key, value)) {} else if(ffParseDisplayCommandOptions(&instance->config.display, key, value)) {} else if(ffParseBrightnessCommandOptions(&instance->config.brightness, key, value)) {} else if(optionParseModuleArgs(key, value, "de", &instance->config.de)) {} @@ -1088,8 +1088,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Module options// ////////////////// - else if(strcasecmp(key, "--shell-version") == 0) - instance->config.shellVersion = optionParseBoolean(value); else if(strcasecmp(key, "--terminal-version") == 0) instance->config.terminalVersion = optionParseBoolean(value); else if(strcasecmp(key, "--player-name") == 0) @@ -1192,8 +1190,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintUptime(instance, &instance->config.uptime); 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_SHELL_MODULE_NAME) == 0) + ffPrintShell(instance, &instance->config.shell); else if(strcasecmp(line, FF_DISPLAY_MODULE_NAME) == 0) ffPrintDisplay(instance, &instance->config.display); else if(strcasecmp(line, "desktopenvironment") == 0 || strcasecmp(line, "de") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 94aa5d436..1a3498521 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -68,7 +68,7 @@ typedef struct FFconfig FFUptimeOptions uptime; FFModuleArgs processes; FFPackagesOptions packages; - FFModuleArgs shell; + FFShellOptions shell; FFDisplayOptions display; FFModuleArgs de; FFModuleArgs wallpaper; @@ -132,7 +132,6 @@ typedef struct FFconfig FFstrbuf libwlanapi; FFstrbuf libnm; - bool shellVersion; bool terminalVersion; FFstrbuf publicIpUrl; @@ -201,7 +200,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); -void ffPrintShell(FFinstance* instance); void ffPrintDesktopEnvironment(FFinstance* instance); void ffPrintWM(FFinstance* instance); void ffPrintTheme(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index be0016643..49b48fc71 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -31,7 +31,7 @@ int main(int argc, char** argv) //ffPrintProcesses(&instance); ffPrintUptime(&instance, &instance.config.uptime); ffPrintPackages(&instance, &instance.config.packages); - ffPrintShell(&instance); + ffPrintShell(&instance, &instance.config.shell); ffPrintDisplay(&instance, &instance.config.display); // ffPrintBrightness(&instance); ffPrintDesktopEnvironment(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index fdf5cdc18..3b15bacd3 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -109,6 +109,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'S': { return tryModule(instance, type, module, FF_SEPARATOR_MODULE_NAME, ffParseSeparatorJsonObject) || + tryModule(instance, type, module, FF_SHELL_MODULE_NAME, ffParseShellJsonObject) || tryModule(instance, type, module, FF_SOUND_MODULE_NAME, ffParseSoundJsonObject) || tryModule(instance, type, module, FF_SWAP_MODULE_NAME, ffParseSwapJsonObject) || false; diff --git a/src/modules/modules.h b/src/modules/modules.h index 3357c1f1d..08c4a8598 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -28,6 +28,7 @@ #include "modules/os/os.h" #include "modules/packages/packages.h" #include "modules/separator/separator.h" +#include "modules/shell/shell.h" #include "modules/sound/sound.h" #include "modules/swap/swap.h" #include "modules/title/title.h" diff --git a/src/modules/options.h b/src/modules/options.h index fe13e1cc1..522036be8 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -26,6 +26,7 @@ #include "modules/os/option.h" #include "modules/packages/option.h" #include "modules/separator/option.h" +#include "modules/shell/option.h" #include "modules/sound/option.h" #include "modules/swap/option.h" #include "modules/title/option.h" diff --git a/src/modules/shell.c b/src/modules/shell.c deleted file mode 100644 index 607f5ec69..000000000 --- a/src/modules/shell.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/terminalshell/terminalshell.h" - -#define FF_SHELL_MODULE_NAME "Shell" -#define FF_SHELL_NUM_FORMAT_ARGS 7 - -void ffPrintShell(FFinstance* instance) -{ - const FFTerminalShellResult* result = ffDetectTerminalShell(instance); - - if(result->shellProcessName.length == 0) - { - ffPrintError(instance, FF_SHELL_MODULE_NAME, 0, &instance->config.shell, "Couldn't detect shell"); - return; - } - - if(instance->config.shell.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_SHELL_MODULE_NAME, 0, &instance->config.shell.key); - ffStrbufWriteTo(&result->shellPrettyName, stdout); - - if(result->shellVersion.length > 0) - { - putchar(' '); - ffStrbufWriteTo(&result->shellVersion, stdout); - } - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_SHELL_MODULE_NAME, 0, &instance->config.shell, FF_SHELL_NUM_FORMAT_ARGS, (FFformatarg[]) { - {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/shell/option.h b/src/modules/shell/option.h new file mode 100644 index 000000000..dd6223a36 --- /dev/null +++ b/src/modules/shell/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 FFShellOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + bool version; +} FFShellOptions; diff --git a/src/modules/shell/shell.c b/src/modules/shell/shell.c new file mode 100644 index 000000000..ca5a22cab --- /dev/null +++ b/src/modules/shell/shell.c @@ -0,0 +1,99 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/terminalshell/terminalshell.h" +#include "modules/shell/shell.h" + +#define FF_SHELL_NUM_FORMAT_ARGS 7 + +void ffPrintShell(FFinstance* instance, FFShellOptions* options) +{ + const FFTerminalShellResult* result = ffDetectTerminalShell(instance); + + if(result->shellProcessName.length == 0) + { + ffPrintError(instance, FF_SHELL_MODULE_NAME, 0, &options->moduleArgs, "Couldn't detect shell"); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_SHELL_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufWriteTo(&result->shellPrettyName, stdout); + + if(result->shellVersion.length > 0) + { + putchar(' '); + ffStrbufWriteTo(&result->shellVersion, stdout); + } + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_SHELL_MODULE_NAME, 0, &options->moduleArgs, FF_SHELL_NUM_FORMAT_ARGS, (FFformatarg[]) { + {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 ffInitShellOptions(FFShellOptions* options) +{ + options->moduleName = FF_SHELL_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + options->version = true; +} + +bool ffParseShellCommandOptions(FFShellOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_SHELL_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 ffDestroyShellOptions(FFShellOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseShellJsonObject(FFinstance* instance, json_object* module) +{ + FFShellOptions __attribute__((__cleanup__(ffDestroyShellOptions))) options; + ffInitShellOptions(&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_SHELL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintShell(instance, &options); +} +#endif diff --git a/src/modules/shell/shell.h b/src/modules/shell/shell.h new file mode 100644 index 000000000..210d17dbf --- /dev/null +++ b/src/modules/shell/shell.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_SHELL_MODULE_NAME "Shell" + +void ffPrintShell(FFinstance* instance, FFShellOptions* options); +void ffInitShellOptions(FFShellOptions* options); +bool ffParseShellCommandOptions(FFShellOptions* options, const char* key, const char* value); +void ffDestroyShellOptions(FFShellOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseShellJsonObject(FFinstance* instance, json_object* module); +#endif 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 52/71] 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 From 100ce5844db2d7c58b05da6ec2a7c6eaabaad045 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:28:58 +0800 Subject: [PATCH 53/71] TerminalFont: 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 | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/terminalfont.c | 32 ----------- src/modules/terminalfont/option.h | 11 ++++ src/modules/terminalfont/terminalfont.c | 75 +++++++++++++++++++++++++ src/modules/terminalfont/terminalfont.h | 15 +++++ 12 files changed, 112 insertions(+), 41 deletions(-) delete mode 100644 src/modules/terminalfont.c create mode 100644 src/modules/terminalfont/option.h create mode 100644 src/modules/terminalfont/terminalfont.c create mode 100644 src/modules/terminalfont/terminalfont.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0faf474aa..db2b4a4d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -302,7 +302,7 @@ set(LIBFASTFETCH_SRC src/modules/swap/swap.c src/modules/media.c src/modules/terminal/terminal.c - src/modules/terminalfont.c + src/modules/terminalfont/terminalfont.c src/modules/theme.c src/modules/title/title.c src/modules/uptime/uptime.c diff --git a/src/common/init.c b/src/common/init.c index 916e95de8..ae90b2406 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -80,7 +80,7 @@ static void defaultConfig(FFinstance* instance) ffInitFontOptions(&instance->config.font); ffInitCursorOptions(&instance->config.cursor); ffInitTerminalOptions(&instance->config.terminal); - initModuleArg(&instance->config.terminalFont); + ffInitTerminalFontOptions(&instance->config.terminalFont); ffInitCPUOptions(&instance->config.cpu); ffInitCPUUsageOptions(&instance->config.cpuUsage); ffInitGPUOptions(&instance->config.gpu); @@ -299,7 +299,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyFontOptions(&instance->config.font); ffDestroyCursorOptions(&instance->config.cursor); ffDestroyTerminalOptions(&instance->config.terminal); - destroyModuleArg(&instance->config.terminalFont); + ffDestroyTerminalFontOptions(&instance->config.terminalFont); ffDestroyCPUOptions(&instance->config.cpu); ffDestroyCPUUsageOptions(&instance->config.cpuUsage); ffDestroyGPUOptions(&instance->config.gpu); diff --git a/src/fastfetch.c b/src/fastfetch.c index f0eda06af..4596d3fac 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -998,7 +998,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseFontCommandOptions(&instance->config.font, key, value)) {} else if(ffParseCursorCommandOptions(&instance->config.cursor, key, value)) {} else if(ffParseTerminalCommandOptions(&instance->config.terminal, key, value)) {} - else if(optionParseModuleArgs(key, value, "terminal-font", &instance->config.terminalFont)) {} + else if(ffParseTerminalFontCommandOptions(&instance->config.terminalFont, key, value)) {} else if(ffParseCPUCommandOptions(&instance->config.cpu, key, value)) {} else if(ffParseCPUUsageCommandOptions(&instance->config.cpuUsage, key, value)) {} else if(ffParseGPUCommandOptions(&instance->config.gpu, key, value)) {} @@ -1210,8 +1210,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintCursor(instance, &instance->config.cursor); 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_TERMINALFONT_MODULE_NAME) == 0) + ffPrintTerminalFont(instance, &instance->config.terminalFont); else if(strcasecmp(line, FF_CPU_MODULE_NAME) == 0) ffPrintCPU(instance, &instance->config.cpu); else if(strcasecmp(line, FF_CPUUSAGE_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index fa226c008..694dbce09 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -80,7 +80,7 @@ typedef struct FFconfig FFFontOptions font; FFCursorOptions cursor; FFTerminalOptions terminal; - FFModuleArgs terminalFont; + FFTerminalFontOptions terminalFont; FFCPUOptions cpu; FFCPUUsageOptions cpuUsage; FFCustomOptions custom; @@ -203,7 +203,6 @@ void ffPrintWM(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); -void ffPrintTerminalFont(FFinstance* instance); void ffPrintPowerAdapter(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 94a16fa54..aa27f20e7 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -42,7 +42,7 @@ int main(int argc, char** argv) ffPrintFont(&instance, &instance.config.font); ffPrintCursor(&instance, &instance.config.cursor); ffPrintTerminal(&instance, &instance.config.terminal); - ffPrintTerminalFont(&instance); + ffPrintTerminalFont(&instance, &instance.config.terminalFont); ffPrintCPU(&instance, &instance.config.cpu); ffPrintGPU(&instance, &instance.config.gpu); ffPrintMemory(&instance, &instance.config.memory); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index d9aaf2a85..336bc606a 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -118,6 +118,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_TERMINALFONT_MODULE_NAME, ffParseTerminalFontJsonObject) || tryModule(instance, type, module, FF_TITLE_MODULE_NAME, ffParseTitleJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 090d45fcd..b1f06153d 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -32,6 +32,7 @@ #include "modules/sound/sound.h" #include "modules/swap/swap.h" #include "modules/terminal/terminal.h" +#include "modules/terminalfont/terminalfont.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 6a9690343..99c69dd4b 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -30,6 +30,7 @@ #include "modules/sound/option.h" #include "modules/swap/option.h" #include "modules/terminal/option.h" +#include "modules/terminalfont/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" #include "modules/wifi/option.h" diff --git a/src/modules/terminalfont.c b/src/modules/terminalfont.c deleted file mode 100644 index 1809c4f39..000000000 --- a/src/modules/terminalfont.c +++ /dev/null @@ -1,32 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/terminalfont/terminalfont.h" - -#define FF_TERMFONT_MODULE_NAME "Terminal Font" -#define FF_TERMFONT_NUM_FORMAT_ARGS 4 - -void ffPrintTerminalFont(FFinstance* instance) -{ - const FFTerminalFontResult* terminalFont = ffDetectTerminalFont(instance); - - if(terminalFont->error.length > 0) - { - ffPrintError(instance, FF_TERMFONT_MODULE_NAME, 0, &instance->config.terminalFont, "%s", terminalFont->error.chars); - return; - } - - if(instance->config.terminalFont.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_TERMFONT_MODULE_NAME, 0, &instance->config.terminalFont.key); - ffStrbufPutTo(&terminalFont->font.pretty, stdout); - } - else - { - ffPrintFormat(instance, FF_TERMFONT_MODULE_NAME, 0, &instance->config.terminalFont, FF_TERMFONT_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &terminalFont->font.pretty}, - {FF_FORMAT_ARG_TYPE_STRBUF, &terminalFont->font.name}, - {FF_FORMAT_ARG_TYPE_STRBUF, &terminalFont->font.size}, - {FF_FORMAT_ARG_TYPE_LIST, &terminalFont->font.styles} - }); - } -} diff --git a/src/modules/terminalfont/option.h b/src/modules/terminalfont/option.h new file mode 100644 index 000000000..ba62efbb5 --- /dev/null +++ b/src/modules/terminalfont/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 FFTerminalFontOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFTerminalFontOptions; diff --git a/src/modules/terminalfont/terminalfont.c b/src/modules/terminalfont/terminalfont.c new file mode 100644 index 000000000..afeb46919 --- /dev/null +++ b/src/modules/terminalfont/terminalfont.c @@ -0,0 +1,75 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/terminalfont/terminalfont.h" +#include "modules/terminalfont/terminalfont.h" + +#define FF_TERMINALFONT_DISPLAY_NAME "Terminal Font" +#define FF_TERMINALFONT_NUM_FORMAT_ARGS 4 + +void ffPrintTerminalFont(FFinstance* instance, FFTerminalFontOptions* options) +{ + const FFTerminalFontResult* terminalFont = ffDetectTerminalFont(instance); + + if(terminalFont->error.length > 0) + { + ffPrintError(instance, FF_TERMINALFONT_DISPLAY_NAME, 0, &options->moduleArgs, "%s", terminalFont->error.chars); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_TERMINALFONT_DISPLAY_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&terminalFont->font.pretty, stdout); + } + else + { + ffPrintFormat(instance, FF_TERMINALFONT_DISPLAY_NAME, 0, &options->moduleArgs, FF_TERMINALFONT_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &terminalFont->font.pretty}, + {FF_FORMAT_ARG_TYPE_STRBUF, &terminalFont->font.name}, + {FF_FORMAT_ARG_TYPE_STRBUF, &terminalFont->font.size}, + {FF_FORMAT_ARG_TYPE_LIST, &terminalFont->font.styles} + }); + } +} + +void ffInitTerminalFontOptions(FFTerminalFontOptions* options) +{ + options->moduleName = FF_TERMINALFONT_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseTerminalFontCommandOptions(FFTerminalFontOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_TERMINALFONT_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyTerminalFontOptions(FFTerminalFontOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseTerminalFontJsonObject(FFinstance* instance, json_object* module) +{ + FFTerminalFontOptions __attribute__((__cleanup__(ffDestroyTerminalFontOptions))) options; + ffInitTerminalFontOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_TERMINALFONT_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintTerminalFont(instance, &options); +} +#endif diff --git a/src/modules/terminalfont/terminalfont.h b/src/modules/terminalfont/terminalfont.h new file mode 100644 index 000000000..336732917 --- /dev/null +++ b/src/modules/terminalfont/terminalfont.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_TERMINALFONT_MODULE_NAME "TerminalFont" + +void ffPrintTerminalFont(FFinstance* instance, FFTerminalFontOptions* options); +void ffInitTerminalFontOptions(FFTerminalFontOptions* options); +bool ffParseTerminalFontCommandOptions(FFTerminalFontOptions* options, const char* key, const char* value); +void ffDestroyTerminalFontOptions(FFTerminalFontOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseTerminalFontJsonObject(FFinstance* instance, json_object* module); +#endif From d5557976d5e875a2b0eca1a7774e1fdcfeff6529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 4 Jun 2023 01:30:01 +0800 Subject: [PATCH 54/71] JSON: inline json-c function wrappers --- src/common/json.c | 98 ---------------------------------------- src/common/json.h | 112 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 98 deletions(-) diff --git a/src/common/json.c b/src/common/json.c index 053854675..8ca285d5b 100644 --- a/src/common/json.c +++ b/src/common/json.c @@ -2,28 +2,8 @@ #ifdef FF_HAVE_JSONC -#include "common/library.h" #include "common/thread.h" -#include - -typedef struct FFJsonLibrary -{ - FF_LIBRARY_SYMBOL(json_tokener_parse) - FF_LIBRARY_SYMBOL(json_object_is_type) - FF_LIBRARY_SYMBOL(json_object_get_array) - FF_LIBRARY_SYMBOL(json_object_get_boolean) - FF_LIBRARY_SYMBOL(json_object_get_double) - FF_LIBRARY_SYMBOL(json_object_get_int) - FF_LIBRARY_SYMBOL(json_object_get_string_len) - FF_LIBRARY_SYMBOL(json_object_get_string) - FF_LIBRARY_SYMBOL(json_object_get_object) - FF_LIBRARY_SYMBOL(json_object_object_del) - FF_LIBRARY_SYMBOL(json_object_object_get) - FF_LIBRARY_SYMBOL(json_object_object_length) - FF_LIBRARY_SYMBOL(json_object_put) -} FFJsonLibrary; - static const FFJsonLibrary* loadLibSymbols(const FFinstance* instance) { assert(instance); @@ -74,82 +54,4 @@ bool ffJsonLoadLibrary(const FFinstance* instance) return !!ffJsonLib; } -struct json_object *json_tokener_parse(const char *str) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_tokener_parse(str); -} - -int json_object_is_type(const json_object *obj, enum json_type type) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_is_type(obj, type); -} - -struct array_list *json_object_get_array(const json_object *obj) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_get_array(obj); -} - -json_bool json_object_get_boolean(const json_object *obj) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_get_boolean(obj); -} - -double json_object_get_double(const json_object *obj) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_get_double(obj); -} - -int32_t json_object_get_int(const json_object *obj) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_get_int(obj); -} - -int json_object_get_string_len(const json_object *obj) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_get_string_len(obj); -} - -const char *json_object_get_string(json_object *obj) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_get_string(obj); -} - -struct lh_table *json_object_get_object(const json_object *obj) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_get_object(obj); -} - -void json_object_object_del(struct json_object *obj, const char *key) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_object_del(obj, key); -} - -struct json_object *json_object_object_get(const json_object *obj, const char *key) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_object_get(obj, key); -} - -int json_object_object_length(const json_object *obj) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_object_length(obj); -} - -int json_object_put(json_object *obj) -{ - assert(ffJsonLib); - return ffJsonLib->ffjson_object_put(obj); -} - #endif diff --git a/src/common/json.h b/src/common/json.h index e1bb3ad59..cf4ffe14f 100644 --- a/src/common/json.h +++ b/src/common/json.h @@ -3,9 +3,30 @@ #ifdef FF_HAVE_JSONC #include "fastfetch.h" +#include "common/library.h" +#include #include +typedef struct FFJsonLibrary +{ + FF_LIBRARY_SYMBOL(json_tokener_parse) + FF_LIBRARY_SYMBOL(json_object_is_type) + FF_LIBRARY_SYMBOL(json_object_get_array) + FF_LIBRARY_SYMBOL(json_object_get_boolean) + FF_LIBRARY_SYMBOL(json_object_get_double) + FF_LIBRARY_SYMBOL(json_object_get_int) + FF_LIBRARY_SYMBOL(json_object_get_string_len) + FF_LIBRARY_SYMBOL(json_object_get_string) + FF_LIBRARY_SYMBOL(json_object_get_object) + FF_LIBRARY_SYMBOL(json_object_object_del) + FF_LIBRARY_SYMBOL(json_object_object_get) + FF_LIBRARY_SYMBOL(json_object_object_length) + FF_LIBRARY_SYMBOL(json_object_put) +} FFJsonLibrary; + +extern const FFJsonLibrary* ffJsonLib; + bool ffJsonLoadLibrary(const FFinstance* instance); static inline void wrapJsoncFree(json_object** root) @@ -15,4 +36,95 @@ static inline void wrapJsoncFree(json_object** root) json_object_put(*root); } +extern inline __attribute__((__gnu_inline__, __always_inline__)) +struct json_object *json_tokener_parse(const char *str) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_tokener_parse(str); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +int json_object_is_type(const json_object *obj, enum json_type type) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_is_type(obj, type); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +struct array_list *json_object_get_array(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_array(obj); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +json_bool json_object_get_boolean(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_boolean(obj); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +double json_object_get_double(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_double(obj); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +int32_t json_object_get_int(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_int(obj); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +int json_object_get_string_len(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_string_len(obj); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +const char *json_object_get_string(json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_string(obj); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +struct lh_table *json_object_get_object(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_get_object(obj); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +void json_object_object_del(struct json_object *obj, const char *key) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_object_del(obj, key); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +struct json_object *json_object_object_get(const json_object *obj, const char *key) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_object_get(obj, key); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +int json_object_object_length(const json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_object_length(obj); +} + +extern inline __attribute__((__gnu_inline__, __always_inline__)) +int json_object_put(json_object *obj) +{ + assert(ffJsonLib); + return ffJsonLib->ffjson_object_put(obj); +} + #endif From 823f773e267d4a22b83cc15393061a55f67a8068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 5 Jun 2023 16:57:55 +0800 Subject: [PATCH 55/71] PowerAdapter: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/detection/poweradapter/poweradapter.h | 4 +- .../poweradapter/poweradapter_apple.c | 4 +- src/fastfetch.c | 6 +- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/poweradapter.c | 66 ----------- src/modules/poweradapter/option.h | 11 ++ src/modules/poweradapter/poweradapter.c | 105 ++++++++++++++++++ src/modules/poweradapter/poweradapter.h | 15 +++ 14 files changed, 146 insertions(+), 79 deletions(-) delete mode 100644 src/modules/poweradapter.c create mode 100644 src/modules/poweradapter/option.h create mode 100644 src/modules/poweradapter/poweradapter.c create mode 100644 src/modules/poweradapter/poweradapter.h diff --git a/CMakeLists.txt b/CMakeLists.txt index db2b4a4d7..342f305f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -292,8 +292,8 @@ set(LIBFASTFETCH_SRC src/modules/os/os.c src/modules/packages/packages.c src/modules/player.c - src/modules/poweradapter.c src/modules/processes.c + src/modules/poweradapter/poweradapter.c src/modules/publicip.c src/modules/display/display.c src/modules/separator/separator.c diff --git a/src/common/init.c b/src/common/init.c index ae90b2406..c73d7dfb5 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -88,7 +88,7 @@ static void defaultConfig(FFinstance* instance) ffInitSwapOptions(&instance->config.swap); ffInitDiskOptions(&instance->config.disk); ffInitBatteryOptions(&instance->config.battery); - initModuleArg(&instance->config.powerAdapter); + ffInitPowerAdapterOptions(&instance->config.powerAdapter); ffInitLocaleOptions(&instance->config.locale); ffInitLocalIpOptions(&instance->config.localIP); initModuleArg(&instance->config.publicIP); @@ -307,7 +307,7 @@ static void destroyConfig(FFinstance* instance) ffDestroySwapOptions(&instance->config.swap); ffDestroyDiskOptions(&instance->config.disk); ffDestroyBatteryOptions(&instance->config.battery); - destroyModuleArg(&instance->config.powerAdapter); + ffDestroyPowerAdapterOptions(&instance->config.powerAdapter); ffDestroyLocaleOptions(&instance->config.locale); ffDestroyLocalIpOptions(&instance->config.localIP); destroyModuleArg(&instance->config.publicIP); diff --git a/src/detection/poweradapter/poweradapter.h b/src/detection/poweradapter/poweradapter.h index c7f5ee7dc..1b9abd513 100644 --- a/src/detection/poweradapter/poweradapter.h +++ b/src/detection/poweradapter/poweradapter.h @@ -16,7 +16,7 @@ typedef struct PowerAdapterResult const char* ffDetectPowerAdapterImpl(FFinstance* instance, FFlist* results); -#define FF_POWER_ADAPTER_UNSET -2 -#define FF_POWER_ADAPTER_NOT_CONNECTED -1 +#define FF_POWERADAPTER_UNSET -2 +#define FF_POWERADAPTER_NOT_CONNECTED -1 #endif diff --git a/src/detection/poweradapter/poweradapter_apple.c b/src/detection/poweradapter/poweradapter_apple.c index c14ff8c4e..9c550d95d 100644 --- a/src/detection/poweradapter/poweradapter_apple.c +++ b/src/detection/poweradapter/poweradapter_apple.c @@ -32,14 +32,14 @@ const char* ffDetectPowerAdapterImpl(FFinstance* instance, FFlist* results) ffStrbufInit(&adapter->description); ffStrbufInit(&adapter->manufacturer); ffStrbufInit(&adapter->modelName); - adapter->watts = FF_POWER_ADAPTER_UNSET; + adapter->watts = FF_POWERADAPTER_UNSET; CFDictionaryRef adapterDict; if(!ffCfDictGetDict(properties, CFSTR("AdapterDetails"), &adapterDict)) { if (ffCfDictGetInt(adapterDict, CFSTR("Watts"), &adapter->watts)) { - adapter->watts = FF_POWER_ADAPTER_NOT_CONNECTED; + adapter->watts = FF_POWERADAPTER_NOT_CONNECTED; continue; } ffCfDictGetString(adapterDict, CFSTR("Name"), &adapter->name); diff --git a/src/fastfetch.c b/src/fastfetch.c index 4596d3fac..94b530a4a 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1006,7 +1006,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseSwapCommandOptions(&instance->config.swap, key, value)) {} else if(ffParseDiskCommandOptions(&instance->config.disk, key, value)) {} else if(ffParseBatteryCommandOptions(&instance->config.battery, key, value)) {} - else if(optionParseModuleArgs(key, value, "poweradapter", &instance->config.powerAdapter)) {} + else if(ffParsePowerAdapterCommandOptions(&instance->config.powerAdapter, key, value)) {} else if(ffParseLocaleCommandOptions(&instance->config.locale, key, value)) {} else if(ffParseLocalIpCommandOptions(&instance->config.localIP, key, value)) {} else if(optionParseModuleArgs(key, value, "publicip", &instance->config.publicIP)) {} @@ -1228,8 +1228,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintDisk(instance, &instance->config.disk); else if(strcasecmp(line, FF_BATTERY_MODULE_NAME) == 0) ffPrintBattery(instance, &instance->config.battery); - else if(strcasecmp(line, "poweradapter") == 0) - ffPrintPowerAdapter(instance); + else if(strcasecmp(line, FF_POWERADAPTER_MODULE_NAME) == 0) + ffPrintPowerAdapter(instance, &instance->config.powerAdapter); else if(strcasecmp(line, FF_LOCALE_MODULE_NAME) == 0) ffPrintLocale(instance, &instance->config.locale); else if(strcasecmp(line, "localip") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 694dbce09..27f68e15a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -89,7 +89,7 @@ typedef struct FFconfig FFSwapOptions swap; FFDiskOptions disk; FFBatteryOptions battery; - FFModuleArgs powerAdapter; + FFPowerAdapterOptions powerAdapter; FFLocaleOptions locale; FFLocalIpOptions localIP; FFModuleArgs publicIP; @@ -203,7 +203,6 @@ void ffPrintWM(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); -void ffPrintPowerAdapter(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index aa27f20e7..cc5579d8f 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -49,7 +49,7 @@ int main(int argc, char** argv) ffPrintSwap(&instance, &instance.config.swap); ffPrintDisk(&instance, &instance.config.disk); ffPrintBattery(&instance, &instance.config.battery); - ffPrintPowerAdapter(&instance); + ffPrintPowerAdapter(&instance, &instance.config.powerAdapter); //ffPrintPlayer(&instance); //ffPrintMedia(&instance); //ffPrintLocalIp(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 336bc606a..de9ea27e6 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -103,6 +103,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'P': { return tryModule(instance, type, module, FF_PACKAGES_MODULE_NAME, ffParsePackagesJsonObject) || + tryModule(instance, type, module, FF_POWERADAPTER_MODULE_NAME, ffParsePowerAdapterJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index b1f06153d..1df0a9293 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -27,6 +27,7 @@ #include "modules/memory/memory.h" #include "modules/os/os.h" #include "modules/packages/packages.h" +#include "modules/poweradapter/poweradapter.h" #include "modules/separator/separator.h" #include "modules/shell/shell.h" #include "modules/sound/sound.h" diff --git a/src/modules/options.h b/src/modules/options.h index 99c69dd4b..f89032fa5 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -25,6 +25,7 @@ #include "modules/memory/option.h" #include "modules/os/option.h" #include "modules/packages/option.h" +#include "modules/poweradapter/option.h" #include "modules/separator/option.h" #include "modules/shell/option.h" #include "modules/sound/option.h" diff --git a/src/modules/poweradapter.c b/src/modules/poweradapter.c deleted file mode 100644 index c2cd7550d..000000000 --- a/src/modules/poweradapter.c +++ /dev/null @@ -1,66 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/poweradapter/poweradapter.h" - -#define FF_POWER_ADAPTER_MODULE_NAME "Power Adapter" -#define FF_POWER_ADAPTER_MODULE_ARGS 5 - -static void printPowerAdapter(FFinstance* instance, const PowerAdapterResult* result, uint8_t index) -{ - if(result->watts != FF_POWER_ADAPTER_UNSET) - { - if(instance->config.powerAdapter.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_POWER_ADAPTER_MODULE_NAME, index, &instance->config.powerAdapter.key); - - if(result->name.length > 0) - puts(result->name.chars); - else if(result->watts == FF_POWER_ADAPTER_NOT_CONNECTED) - puts("not connected"); - else - printf("%dW\n", result->watts); - } - else - { - ffPrintFormat(instance, FF_POWER_ADAPTER_MODULE_NAME, index, &instance->config.powerAdapter, FF_POWER_ADAPTER_MODULE_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_INT, &result->watts}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->name}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->manufacturer}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->modelName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->description}, - }); - } - } -} - -void ffPrintPowerAdapter(FFinstance* instance) -{ - FFlist results; - ffListInitA(&results, sizeof(PowerAdapterResult), 0); - - const char* error = ffDetectPowerAdapterImpl(instance, &results); - - if (error) - { - ffPrintError(instance, FF_POWER_ADAPTER_MODULE_NAME, 0, &instance->config.powerAdapter, "%s", error); - } - else if(results.length == 0) - { - ffPrintError(instance, FF_POWER_ADAPTER_MODULE_NAME, 0, &instance->config.powerAdapter, "No power adapters found"); - } - else - { - for(uint8_t i = 0; i < (uint8_t) results.length; i++) - { - PowerAdapterResult* result = ffListGet(&results, i); - printPowerAdapter(instance, result, i); - - ffStrbufDestroy(&result->manufacturer); - ffStrbufDestroy(&result->description); - ffStrbufDestroy(&result->modelName); - ffStrbufDestroy(&result->name); - } - } - - ffListDestroy(&results); -} diff --git a/src/modules/poweradapter/option.h b/src/modules/poweradapter/option.h new file mode 100644 index 000000000..7acaf29ee --- /dev/null +++ b/src/modules/poweradapter/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 FFPowerAdapterOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFPowerAdapterOptions; diff --git a/src/modules/poweradapter/poweradapter.c b/src/modules/poweradapter/poweradapter.c new file mode 100644 index 000000000..12e78395b --- /dev/null +++ b/src/modules/poweradapter/poweradapter.c @@ -0,0 +1,105 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/poweradapter/poweradapter.h" +#include "modules/poweradapter/poweradapter.h" + +#define FF_POWERADAPTER_DISPLAY_NAME "Power Adapter" +#define FF_POWERADAPTER_MODULE_ARGS 5 + +void ffPrintPowerAdapter(FFinstance* instance, FFPowerAdapterOptions* options) +{ + FFlist results; + ffListInit(&results, sizeof(PowerAdapterResult)); + + const char* error = ffDetectPowerAdapterImpl(instance, &results); + + if (error) + { + ffPrintError(instance, FF_POWERADAPTER_DISPLAY_NAME, 0, &options->moduleArgs, "%s", error); + } + else if(results.length == 0) + { + ffPrintError(instance, FF_POWERADAPTER_DISPLAY_NAME, 0, &options->moduleArgs, "No power adapters found"); + } + else + { + for(uint8_t i = 0; i < (uint8_t) results.length; i++) + { + PowerAdapterResult* result = ffListGet(&results, i); + + if(result->watts != FF_POWERADAPTER_UNSET) + { + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_POWERADAPTER_DISPLAY_NAME, i, &options->moduleArgs.key); + + if(result->name.length > 0) + puts(result->name.chars); + else if(result->watts == FF_POWERADAPTER_NOT_CONNECTED) + puts("not connected"); + else + printf("%dW\n", result->watts); + } + else + { + ffPrintFormat(instance, FF_POWERADAPTER_DISPLAY_NAME, i, &options->moduleArgs, FF_POWERADAPTER_MODULE_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_INT, &result->watts}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->name}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->manufacturer}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->modelName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->description}, + }); + } + } + + ffStrbufDestroy(&result->manufacturer); + ffStrbufDestroy(&result->description); + ffStrbufDestroy(&result->modelName); + ffStrbufDestroy(&result->name); + } + } + + ffListDestroy(&results); +} + +void ffInitPowerAdapterOptions(FFPowerAdapterOptions* options) +{ + options->moduleName = FF_POWERADAPTER_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParsePowerAdapterCommandOptions(FFPowerAdapterOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_POWERADAPTER_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyPowerAdapterOptions(FFPowerAdapterOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParsePowerAdapterJsonObject(FFinstance* instance, json_object* module) +{ + FFPowerAdapterOptions __attribute__((__cleanup__(ffDestroyPowerAdapterOptions))) options; + ffInitPowerAdapterOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_POWERADAPTER_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintPowerAdapter(instance, &options); +} +#endif diff --git a/src/modules/poweradapter/poweradapter.h b/src/modules/poweradapter/poweradapter.h new file mode 100644 index 000000000..4c11d1976 --- /dev/null +++ b/src/modules/poweradapter/poweradapter.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_POWERADAPTER_MODULE_NAME "PowerAdapter" + +void ffPrintPowerAdapter(FFinstance* instance, FFPowerAdapterOptions* options); +void ffInitPowerAdapterOptions(FFPowerAdapterOptions* options); +bool ffParsePowerAdapterCommandOptions(FFPowerAdapterOptions* options, const char* key, const char* value); +void ffDestroyPowerAdapterOptions(FFPowerAdapterOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParsePowerAdapterJsonObject(FFinstance* instance, json_object* module); +#endif From a3524c3af1b7a70a41e73ff933fe4ea8526fd4b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 09:49:38 +0800 Subject: [PATCH 56/71] Icons: add JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 6 +-- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/icons.c | 30 ------------ src/modules/icons/icons.c | 72 +++++++++++++++++++++++++++++ src/modules/icons/icons.h | 15 ++++++ src/modules/icons/option.h | 11 +++++ src/modules/jsonconfig/jsonconfig.c | 6 +++ src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 114 insertions(+), 39 deletions(-) delete mode 100644 src/modules/icons.c create mode 100644 src/modules/icons/icons.c create mode 100644 src/modules/icons/icons.h create mode 100644 src/modules/icons/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 342f305f2..255eefbb0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -281,7 +281,7 @@ set(LIBFASTFETCH_SRC src/modules/font/font.c src/modules/gpu/gpu.c src/modules/host/host.c - src/modules/icons.c + src/modules/icons/icons.c src/modules/gamepad/gamepad.c src/modules/kernel/kernel.c src/modules/locale/locale.c diff --git a/src/common/init.c b/src/common/init.c index c73d7dfb5..926f779ce 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -76,7 +76,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.wm); ffInitWMThemeOptions(&instance->config.wmTheme); initModuleArg(&instance->config.theme); - initModuleArg(&instance->config.icons); + ffInitIconsOptions(&instance->config.icons); ffInitFontOptions(&instance->config.font); ffInitCursorOptions(&instance->config.cursor); ffInitTerminalOptions(&instance->config.terminal); @@ -295,7 +295,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.wm); ffDestroyWMThemeOptions(&instance->config.wmTheme); destroyModuleArg(&instance->config.theme); - destroyModuleArg(&instance->config.icons); + ffDestroyIconsOptions(&instance->config.icons); ffDestroyFontOptions(&instance->config.font); ffDestroyCursorOptions(&instance->config.cursor); ffDestroyTerminalOptions(&instance->config.terminal); diff --git a/src/fastfetch.c b/src/fastfetch.c index 94b530a4a..78787d5c5 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -993,7 +993,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "wm", &instance->config.wm)) {} else if(ffParseWMThemeCommandOptions(&instance->config.wmTheme, key, value)) {} else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} - else if(optionParseModuleArgs(key, value, "icons", &instance->config.icons)) {} + else if(ffParseIconsCommandOptions(&instance->config.icons, key, value)) {} 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)) {} @@ -1200,8 +1200,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintTheme(instance); else if(strcasecmp(line, FF_WMTHEME_MODULE_NAME) == 0) ffPrintWMTheme(instance, &instance->config.wmTheme); - else if(strcasecmp(line, "icons") == 0) - ffPrintIcons(instance); + else if(strcasecmp(line, FF_ICONS_MODULE_NAME) == 0) + ffPrintIcons(instance, &instance->config.icons); else if(strcasecmp(line, "wallpaper") == 0) ffPrintWallpaper(instance); else if(strcasecmp(line, FF_FONT_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 27f68e15a..28201a36e 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -76,7 +76,7 @@ typedef struct FFconfig FFModuleArgs wm; FFWMThemeOptions wmTheme; FFModuleArgs theme; - FFModuleArgs icons; + FFIconsOptions icons; FFFontOptions font; FFCursorOptions cursor; FFTerminalOptions terminal; @@ -201,7 +201,6 @@ void ffPrintProcesses(FFinstance* instance); void ffPrintDesktopEnvironment(FFinstance* instance); void ffPrintWM(FFinstance* instance); void ffPrintTheme(FFinstance* instance); -void ffPrintIcons(FFinstance* instance); void ffPrintWallpaper(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index cc5579d8f..f676da276 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -38,7 +38,7 @@ int main(int argc, char** argv) ffPrintWM(&instance); ffPrintWMTheme(&instance, &instance.config.wmTheme); ffPrintTheme(&instance); - ffPrintIcons(&instance); + ffPrintIcons(&instance, &instance.config.icons); ffPrintFont(&instance, &instance.config.font); ffPrintCursor(&instance, &instance.config.cursor); ffPrintTerminal(&instance, &instance.config.terminal); diff --git a/src/modules/icons.c b/src/modules/icons.c deleted file mode 100644 index 02bc10368..000000000 --- a/src/modules/icons.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/icons/icons.h" - -#define FF_ICONS_MODULE_NAME "Icons" -#define FF_ICONS_NUM_FORMAT_ARGS 1 - -void ffPrintIcons(FFinstance* instance) -{ - FF_STRBUF_AUTO_DESTROY icons = ffStrbufCreate(); - const char* error = ffDetectIcons(instance, &icons); - - if(error) - { - ffPrintError(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons, "%s", error); - return; - } - - if(instance->config.icons.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons.key); - ffStrbufPutTo(&icons, stdout); - } - else - { - ffPrintFormat(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons, FF_ICONS_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &icons} - }); - } -} diff --git a/src/modules/icons/icons.c b/src/modules/icons/icons.c new file mode 100644 index 000000000..e6ebbb8e2 --- /dev/null +++ b/src/modules/icons/icons.c @@ -0,0 +1,72 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/icons/icons.h" +#include "modules/icons/icons.h" + +#define FF_ICONS_NUM_FORMAT_ARGS 1 + +void ffPrintIcons(FFinstance* instance, FFIconsOptions* options) +{ + FF_STRBUF_AUTO_DESTROY icons = ffStrbufCreate(); + const char* error = ffDetectIcons(instance, &icons); + + if(error) + { + ffPrintError(instance, FF_ICONS_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_ICONS_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&icons, stdout); + } + else + { + ffPrintFormat(instance, FF_ICONS_MODULE_NAME, 0, &options->moduleArgs, FF_ICONS_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &icons} + }); + } +} + +void ffInitIconsOptions(FFIconsOptions* options) +{ + options->moduleName = FF_ICONS_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseIconsCommandOptions(FFIconsOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_ICONS_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyIconsOptions(FFIconsOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseIconsJsonObject(FFinstance* instance, json_object* module) +{ + FFIconsOptions __attribute__((__cleanup__(ffDestroyIconsOptions))) options; + ffInitIconsOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_ICONS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintIcons(instance, &options); +} +#endif diff --git a/src/modules/icons/icons.h b/src/modules/icons/icons.h new file mode 100644 index 000000000..780f9c352 --- /dev/null +++ b/src/modules/icons/icons.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_ICONS_MODULE_NAME "Icons" + +void ffPrintIcons(FFinstance* instance, FFIconsOptions* options); +void ffInitIconsOptions(FFIconsOptions* options); +bool ffParseIconsCommandOptions(FFIconsOptions* options, const char* key, const char* value); +void ffDestroyIconsOptions(FFIconsOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseIconsJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/icons/option.h b/src/modules/icons/option.h new file mode 100644 index 000000000..fc6427aa4 --- /dev/null +++ b/src/modules/icons/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 FFIconsOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFIconsOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index de9ea27e6..334bdb17d 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -75,6 +75,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'I': { + return + tryModule(instance, type, module, FF_ICONS_MODULE_NAME, ffParseIconsJsonObject) || + false; + } + case 'K': { return tryModule(instance, type, module, FF_KERNEL_MODULE_NAME, ffParseKernelJsonObject) || diff --git a/src/modules/modules.h b/src/modules/modules.h index 1df0a9293..ef6750ecd 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -21,6 +21,7 @@ #include "modules/gamepad/gamepad.h" #include "modules/gpu/gpu.h" #include "modules/host/host.h" +#include "modules/icons/icons.h" #include "modules/kernel/kernel.h" #include "modules/locale/locale.h" #include "modules/localip/localip.h" diff --git a/src/modules/options.h b/src/modules/options.h index f89032fa5..06f7bffc5 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -19,6 +19,7 @@ #include "modules/host/option.h" #include "modules/gamepad/option.h" #include "modules/gpu/option.h" +#include "modules/icons/option.h" #include "modules/kernel/option.h" #include "modules/locale/option.h" #include "modules/localip/option.h" From 54a1890aca2d10d5c2055a2a8a930bc235cc1939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 10:14:08 +0800 Subject: [PATCH 57/71] Wallpaper: add JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 6 +-- src/fastfetch.h | 3 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/wallpaper.c | 30 ------------ src/modules/wallpaper/option.h | 11 +++++ src/modules/wallpaper/wallpaper.c | 72 +++++++++++++++++++++++++++++ src/modules/wallpaper/wallpaper.h | 15 ++++++ 11 files changed, 108 insertions(+), 38 deletions(-) delete mode 100644 src/modules/wallpaper.c create mode 100644 src/modules/wallpaper/option.h create mode 100644 src/modules/wallpaper/wallpaper.c create mode 100644 src/modules/wallpaper/wallpaper.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 255eefbb0..2e1dfe677 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -308,7 +308,7 @@ set(LIBFASTFETCH_SRC src/modules/uptime/uptime.c src/modules/users.c src/modules/vulkan.c - src/modules/wallpaper.c + src/modules/wallpaper/wallpaper.c src/modules/weather.c src/modules/wifi/wifi.c src/modules/wm.c diff --git a/src/common/init.c b/src/common/init.c index 926f779ce..32392623a 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -98,7 +98,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.media); ffInitDateTimeOptions(&instance->config.dateTime); initModuleArg(&instance->config.vulkan); - initModuleArg(&instance->config.wallpaper); + ffInitWallpaperOptions(&instance->config.wallpaper); initModuleArg(&instance->config.openGL); initModuleArg(&instance->config.openCL); initModuleArg(&instance->config.users); @@ -311,7 +311,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyLocaleOptions(&instance->config.locale); ffDestroyLocalIpOptions(&instance->config.localIP); destroyModuleArg(&instance->config.publicIP); - destroyModuleArg(&instance->config.wallpaper); + ffDestroyWallpaperOptions(&instance->config.wallpaper); destroyModuleArg(&instance->config.weather); ffDestroyWifiOptions(&instance->config.wifi); destroyModuleArg(&instance->config.player); diff --git a/src/fastfetch.c b/src/fastfetch.c index 78787d5c5..532656160 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -994,7 +994,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseWMThemeCommandOptions(&instance->config.wmTheme, key, value)) {} else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} else if(ffParseIconsCommandOptions(&instance->config.icons, key, value)) {} - else if(optionParseModuleArgs(key, value, "wallpaper", &instance->config.wallpaper)) {} + else if(ffParseWallpaperCommandOptions(&instance->config.wallpaper, key, value)) {} else if(ffParseFontCommandOptions(&instance->config.font, key, value)) {} else if(ffParseCursorCommandOptions(&instance->config.cursor, key, value)) {} else if(ffParseTerminalCommandOptions(&instance->config.terminal, key, value)) {} @@ -1202,8 +1202,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintWMTheme(instance, &instance->config.wmTheme); else if(strcasecmp(line, FF_ICONS_MODULE_NAME) == 0) ffPrintIcons(instance, &instance->config.icons); - else if(strcasecmp(line, "wallpaper") == 0) - ffPrintWallpaper(instance); + else if(strcasecmp(line, FF_WALLPAPER_MODULE_NAME) == 0) + ffPrintWallpaper(instance, &instance->config.wallpaper); else if(strcasecmp(line, FF_FONT_MODULE_NAME) == 0) ffPrintFont(instance, &instance->config.font); else if(strcasecmp(line, FF_CURSOR_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 28201a36e..684417b8a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -71,7 +71,7 @@ typedef struct FFconfig FFShellOptions shell; FFDisplayOptions display; FFModuleArgs de; - FFModuleArgs wallpaper; + FFWallpaperOptions wallpaper; FFWifiOptions wifi; FFModuleArgs wm; FFWMThemeOptions wmTheme; @@ -201,7 +201,6 @@ void ffPrintProcesses(FFinstance* instance); void ffPrintDesktopEnvironment(FFinstance* instance); void ffPrintWM(FFinstance* instance); void ffPrintTheme(FFinstance* instance); -void ffPrintWallpaper(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 334bdb17d..bde0382d7 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -138,6 +138,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'W': { return + tryModule(instance, type, module, FF_WALLPAPER_MODULE_NAME, ffParseWallpaperJsonObject) || tryModule(instance, type, module, FF_WIFI_MODULE_NAME, ffParseWifiJsonObject) || tryModule(instance, type, module, FF_WMTHEME_MODULE_NAME, ffParseWMThemeJsonObject) || false; diff --git a/src/modules/modules.h b/src/modules/modules.h index ef6750ecd..fcde11156 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -38,5 +38,6 @@ #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" #include "modules/uptime/uptime.h" +#include "modules/wallpaper/wallpaper.h" #include "modules/wifi/wifi.h" #include "modules/wmtheme/wmtheme.h" diff --git a/src/modules/options.h b/src/modules/options.h index 06f7bffc5..2e3eab4f3 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -35,5 +35,6 @@ #include "modules/terminalfont/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" +#include "modules/wallpaper/option.h" #include "modules/wifi/option.h" #include "modules/wmtheme/option.h" diff --git a/src/modules/wallpaper.c b/src/modules/wallpaper.c deleted file mode 100644 index d17aef323..000000000 --- a/src/modules/wallpaper.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/wallpaper/wallpaper.h" - -#define FF_WALLPAPER_MODULE_NAME "Wallpaper" -#define FF_WALLPAPER_NUM_FORMAT_ARGS 1 - -void ffPrintWallpaper(FFinstance* instance) -{ - FF_STRBUF_AUTO_DESTROY wallpaper = ffStrbufCreate(); - const char* error = ffDetectWallpaper(instance, &wallpaper); - - if(error) - { - ffPrintError(instance, FF_WALLPAPER_MODULE_NAME, 0, &instance->config.wallpaper, "%s", error); - return; - } - - if(instance->config.wallpaper.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_WALLPAPER_MODULE_NAME, 0, &instance->config.wallpaper.key); - ffStrbufPutTo(&wallpaper, stdout); - } - else - { - ffPrintFormat(instance, FF_WALLPAPER_MODULE_NAME, 0, &instance->config.wallpaper, FF_WALLPAPER_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &wallpaper} - }); - } -} diff --git a/src/modules/wallpaper/option.h b/src/modules/wallpaper/option.h new file mode 100644 index 000000000..ff7aa55fe --- /dev/null +++ b/src/modules/wallpaper/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 FFWallpaperOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFWallpaperOptions; diff --git a/src/modules/wallpaper/wallpaper.c b/src/modules/wallpaper/wallpaper.c new file mode 100644 index 000000000..aeff9eb30 --- /dev/null +++ b/src/modules/wallpaper/wallpaper.c @@ -0,0 +1,72 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/wallpaper/wallpaper.h" +#include "modules/wallpaper/wallpaper.h" + +#define FF_WALLPAPER_NUM_FORMAT_ARGS 1 + +void ffPrintWallpaper(FFinstance* instance, FFWallpaperOptions* options) +{ + FF_STRBUF_AUTO_DESTROY wallpaper = ffStrbufCreate(); + const char* error = ffDetectWallpaper(instance, &wallpaper); + + if(error) + { + ffPrintError(instance, FF_WALLPAPER_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_WALLPAPER_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&wallpaper, stdout); + } + else + { + ffPrintFormat(instance, FF_WALLPAPER_MODULE_NAME, 0, &options->moduleArgs, FF_WALLPAPER_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &wallpaper} + }); + } +} + +void ffInitWallpaperOptions(FFWallpaperOptions* options) +{ + options->moduleName = FF_WALLPAPER_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseWallpaperCommandOptions(FFWallpaperOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_WALLPAPER_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyWallpaperOptions(FFWallpaperOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseWallpaperJsonObject(FFinstance* instance, json_object* module) +{ + FFWallpaperOptions __attribute__((__cleanup__(ffDestroyWallpaperOptions))) options; + ffInitWallpaperOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_WALLPAPER_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintWallpaper(instance, &options); +} +#endif diff --git a/src/modules/wallpaper/wallpaper.h b/src/modules/wallpaper/wallpaper.h new file mode 100644 index 000000000..efb0f17c0 --- /dev/null +++ b/src/modules/wallpaper/wallpaper.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_WALLPAPER_MODULE_NAME "Wallpaper" + +void ffPrintWallpaper(FFinstance* instance, FFWallpaperOptions* options); +void ffInitWallpaperOptions(FFWallpaperOptions* options); +bool ffParseWallpaperCommandOptions(FFWallpaperOptions* options, const char* key, const char* value); +void ffDestroyWallpaperOptions(FFWallpaperOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseWallpaperJsonObject(FFinstance* instance, json_object* module); +#endif From 11d8142cea991f2be3ed4f395aacf329006694c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 10:39:53 +0800 Subject: [PATCH 58/71] DE: 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/de.c | 45 ---------------- src/modules/de/de.c | 82 +++++++++++++++++++++++++++++ src/modules/de/de.h | 15 ++++++ src/modules/de/option.h | 11 ++++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 119 insertions(+), 54 deletions(-) delete mode 100644 src/modules/de.c create mode 100644 src/modules/de/de.c create mode 100644 src/modules/de/de.h create mode 100644 src/modules/de/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e1dfe677..67e4808d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -276,7 +276,7 @@ set(LIBFASTFETCH_SRC src/modules/custom/custom.c src/modules/command/command.c src/modules/datetime/datetime.c - src/modules/de.c + src/modules/de/de.c src/modules/disk/disk.c src/modules/font/font.c src/modules/gpu/gpu.c diff --git a/src/common/init.c b/src/common/init.c index 32392623a..25407f2e8 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -72,7 +72,7 @@ static void defaultConfig(FFinstance* instance) ffInitPackagesOptions(&instance->config.packages); ffInitShellOptions(&instance->config.shell); ffInitDisplayOptions(&instance->config.display); - initModuleArg(&instance->config.de); + ffInitDEOptions(&instance->config.de); initModuleArg(&instance->config.wm); ffInitWMThemeOptions(&instance->config.wmTheme); initModuleArg(&instance->config.theme); @@ -291,7 +291,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyPackagesOptions(&instance->config.packages); ffDestroyShellOptions(&instance->config.shell); ffDestroyDisplayOptions(&instance->config.display); - destroyModuleArg(&instance->config.de); + ffDestroyDEOptions(&instance->config.de); destroyModuleArg(&instance->config.wm); ffDestroyWMThemeOptions(&instance->config.wmTheme); destroyModuleArg(&instance->config.theme); diff --git a/src/fastfetch.c b/src/fastfetch.c index 532656160..310c26881 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -988,7 +988,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseShellCommandOptions(&instance->config.shell, key, value)) {} else if(ffParseDisplayCommandOptions(&instance->config.display, key, value)) {} else if(ffParseBrightnessCommandOptions(&instance->config.brightness, key, value)) {} - else if(optionParseModuleArgs(key, value, "de", &instance->config.de)) {} + else if(ffParseDECommandOptions(&instance->config.de, key, value)) {} else if(ffParseWifiCommandOptions(&instance->config.wifi, key, value)) {} else if(optionParseModuleArgs(key, value, "wm", &instance->config.wm)) {} else if(ffParseWMThemeCommandOptions(&instance->config.wmTheme, key, value)) {} @@ -1192,8 +1192,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintShell(instance, &instance->config.shell); else if(strcasecmp(line, FF_DISPLAY_MODULE_NAME) == 0) ffPrintDisplay(instance, &instance->config.display); - else if(strcasecmp(line, "desktopenvironment") == 0 || strcasecmp(line, "de") == 0) - ffPrintDesktopEnvironment(instance); + else if(strcasecmp(line, FF_DE_MODULE_NAME) == 0) + ffPrintDE(instance, &instance->config.de); else if(strcasecmp(line, "windowmanager") == 0 || strcasecmp(line, "wm") == 0) ffPrintWM(instance); else if(strcasecmp(line, "theme") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 684417b8a..53a43d80a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -70,7 +70,7 @@ typedef struct FFconfig FFPackagesOptions packages; FFShellOptions shell; FFDisplayOptions display; - FFModuleArgs de; + FFDEOptions de; FFWallpaperOptions wallpaper; FFWifiOptions wifi; FFModuleArgs wm; @@ -198,7 +198,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); -void ffPrintDesktopEnvironment(FFinstance* instance); void ffPrintWM(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index f676da276..320357e65 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -34,7 +34,7 @@ int main(int argc, char** argv) ffPrintShell(&instance, &instance.config.shell); ffPrintDisplay(&instance, &instance.config.display); // ffPrintBrightness(&instance); - ffPrintDesktopEnvironment(&instance); + ffPrintDE(&instance, &instance.config.de); ffPrintWM(&instance); ffPrintWMTheme(&instance, &instance.config.wmTheme); ffPrintTheme(&instance); diff --git a/src/modules/de.c b/src/modules/de.c deleted file mode 100644 index eb2cb5062..000000000 --- a/src/modules/de.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/displayserver/displayserver.h" - -#define FF_DE_MODULE_NAME "DE" -#define FF_DE_NUM_FORMAT_ARGS 3 - -void ffPrintDesktopEnvironment(FFinstance* instance) -{ - #ifdef __ANDROID__ - ffPrintError(instance, FF_DE_MODULE_NAME, 0, &instance->config.de, "DE detection is not supported on Android"); - return; - #endif - - const FFDisplayServerResult* result = ffConnectDisplayServer(instance); - - if(result->dePrettyName.length == 0) - { - ffPrintError(instance, FF_DE_MODULE_NAME, 0, &instance->config.de, "No DE found"); - return; - } - - if(instance->config.de.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_DE_MODULE_NAME, 0, &instance->config.de.key); - - ffStrbufWriteTo(&result->dePrettyName, stdout); - - if(result->deVersion.length > 0) - { - putchar(' '); - ffStrbufWriteTo(&result->deVersion, stdout); - } - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_DE_MODULE_NAME, 0, &instance->config.de, FF_DE_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &result->deProcessName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->dePrettyName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->deVersion} - }); - } -} diff --git a/src/modules/de/de.c b/src/modules/de/de.c new file mode 100644 index 000000000..1a0310a33 --- /dev/null +++ b/src/modules/de/de.c @@ -0,0 +1,82 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/displayserver/displayserver.h" +#include "modules/de/de.h" + +#define FF_DE_NUM_FORMAT_ARGS 3 + +void ffPrintDE(FFinstance* instance, FFDEOptions* options) +{ + const FFDisplayServerResult* result = ffConnectDisplayServer(instance); + + if(result->dePrettyName.length == 0) + { + ffPrintError(instance, FF_DE_MODULE_NAME, 0, &options->moduleArgs, "No DE found"); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_DE_MODULE_NAME, 0, &options->moduleArgs.key); + + ffStrbufWriteTo(&result->dePrettyName, stdout); + + if(result->deVersion.length > 0) + { + putchar(' '); + ffStrbufWriteTo(&result->deVersion, stdout); + } + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_DE_MODULE_NAME, 0, &options->moduleArgs, FF_DE_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &result->deProcessName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->dePrettyName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->deVersion} + }); + } +} + +void ffInitDEOptions(FFDEOptions* options) +{ + options->moduleName = FF_DE_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseDECommandOptions(FFDEOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_DE_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyDEOptions(FFDEOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseDEJsonObject(FFinstance* instance, json_object* module) +{ + FFDEOptions __attribute__((__cleanup__(ffDestroyDEOptions))) options; + ffInitDEOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_DE_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintDE(instance, &options); +} +#endif diff --git a/src/modules/de/de.h b/src/modules/de/de.h new file mode 100644 index 000000000..ee393e225 --- /dev/null +++ b/src/modules/de/de.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_DE_MODULE_NAME "DE" + +void ffPrintDE(FFinstance* instance, FFDEOptions* options); +void ffInitDEOptions(FFDEOptions* options); +bool ffParseDECommandOptions(FFDEOptions* options, const char* key, const char* value); +void ffDestroyDEOptions(FFDEOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseDEJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/de/option.h b/src/modules/de/option.h new file mode 100644 index 000000000..52b8954e7 --- /dev/null +++ b/src/modules/de/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 FFDEOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFDEOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index bde0382d7..5c0769dc9 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -53,6 +53,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o tryModule(instance, type, module, FF_DATETIME_MODULE_NAME, ffParseDateTimeJsonObject) || tryModule(instance, type, module, FF_DISPLAY_MODULE_NAME, ffParseDisplayJsonObject) || tryModule(instance, type, module, FF_DISK_MODULE_NAME, ffParseDiskJsonObject) || + tryModule(instance, type, module, FF_DE_MODULE_NAME, ffParseDEJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index fcde11156..d6dd4eb6c 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -17,6 +17,7 @@ #include "modules/datetime/datetime.h" #include "modules/disk/disk.h" #include "modules/display/display.h" +#include "modules/de/de.h" #include "modules/font/font.h" #include "modules/gamepad/gamepad.h" #include "modules/gpu/gpu.h" diff --git a/src/modules/options.h b/src/modules/options.h index 2e3eab4f3..01d13a26c 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -13,6 +13,7 @@ #include "modules/custom/option.h" #include "modules/command/option.h" #include "modules/datetime/option.h" +#include "modules/de/option.h" #include "modules/disk/option.h" #include "modules/display/option.h" #include "modules/font/option.h" From d731051cb73233fb1dc284655c81680fe4f8d846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 10:50:52 +0800 Subject: [PATCH 59/71] WM: add JSON config support --- 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 | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/wm.c | 46 ---------------- src/modules/wm/option.h | 11 ++++ src/modules/wm/wm.c | 83 +++++++++++++++++++++++++++++ src/modules/wm/wm.h | 15 ++++++ 12 files changed, 120 insertions(+), 55 deletions(-) delete mode 100644 src/modules/wm.c create mode 100644 src/modules/wm/option.h create mode 100644 src/modules/wm/wm.c create mode 100644 src/modules/wm/wm.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 67e4808d9..b908fcaf8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -311,7 +311,7 @@ set(LIBFASTFETCH_SRC src/modules/wallpaper/wallpaper.c src/modules/weather.c src/modules/wifi/wifi.c - src/modules/wm.c + src/modules/wm/wm.c src/modules/wmtheme/wmtheme.c src/modules/jsonconfig/jsonconfig.c src/util/FFlist.c diff --git a/src/common/init.c b/src/common/init.c index 25407f2e8..4e952ca26 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -73,7 +73,7 @@ static void defaultConfig(FFinstance* instance) ffInitShellOptions(&instance->config.shell); ffInitDisplayOptions(&instance->config.display); ffInitDEOptions(&instance->config.de); - initModuleArg(&instance->config.wm); + ffInitWMOptions(&instance->config.wm); ffInitWMThemeOptions(&instance->config.wmTheme); initModuleArg(&instance->config.theme); ffInitIconsOptions(&instance->config.icons); @@ -292,7 +292,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyShellOptions(&instance->config.shell); ffDestroyDisplayOptions(&instance->config.display); ffDestroyDEOptions(&instance->config.de); - destroyModuleArg(&instance->config.wm); + ffDestroyWMOptions(&instance->config.wm); ffDestroyWMThemeOptions(&instance->config.wmTheme); destroyModuleArg(&instance->config.theme); ffDestroyIconsOptions(&instance->config.icons); diff --git a/src/fastfetch.c b/src/fastfetch.c index 310c26881..b0714a9c8 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -990,7 +990,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseBrightnessCommandOptions(&instance->config.brightness, key, value)) {} else if(ffParseDECommandOptions(&instance->config.de, key, value)) {} else if(ffParseWifiCommandOptions(&instance->config.wifi, key, value)) {} - else if(optionParseModuleArgs(key, value, "wm", &instance->config.wm)) {} + else if(ffParseWMCommandOptions(&instance->config.wm, key, value)) {} else if(ffParseWMThemeCommandOptions(&instance->config.wmTheme, key, value)) {} else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} else if(ffParseIconsCommandOptions(&instance->config.icons, key, value)) {} @@ -1194,8 +1194,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintDisplay(instance, &instance->config.display); else if(strcasecmp(line, FF_DE_MODULE_NAME) == 0) ffPrintDE(instance, &instance->config.de); - else if(strcasecmp(line, "windowmanager") == 0 || strcasecmp(line, "wm") == 0) - ffPrintWM(instance); + else if(strcasecmp(line, FF_WM_MODULE_NAME) == 0) + ffPrintWM(instance, &instance->config.wm); else if(strcasecmp(line, "theme") == 0) ffPrintTheme(instance); else if(strcasecmp(line, FF_WMTHEME_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 53a43d80a..e3941f719 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -73,7 +73,7 @@ typedef struct FFconfig FFDEOptions de; FFWallpaperOptions wallpaper; FFWifiOptions wifi; - FFModuleArgs wm; + FFWMOptions wm; FFWMThemeOptions wmTheme; FFModuleArgs theme; FFIconsOptions icons; @@ -198,7 +198,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); -void ffPrintWM(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 320357e65..0af047407 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -35,7 +35,7 @@ int main(int argc, char** argv) ffPrintDisplay(&instance, &instance.config.display); // ffPrintBrightness(&instance); ffPrintDE(&instance, &instance.config.de); - ffPrintWM(&instance); + ffPrintWM(&instance, &instance.config.wm); ffPrintWMTheme(&instance, &instance.config.wmTheme); ffPrintTheme(&instance); ffPrintIcons(&instance, &instance.config.icons); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 5c0769dc9..7e6253da9 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -140,6 +140,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'W': { return tryModule(instance, type, module, FF_WALLPAPER_MODULE_NAME, ffParseWallpaperJsonObject) || + tryModule(instance, type, module, FF_WM_MODULE_NAME, ffParseWMJsonObject) || tryModule(instance, type, module, FF_WIFI_MODULE_NAME, ffParseWifiJsonObject) || tryModule(instance, type, module, FF_WMTHEME_MODULE_NAME, ffParseWMThemeJsonObject) || false; diff --git a/src/modules/modules.h b/src/modules/modules.h index d6dd4eb6c..48a7ee415 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -41,4 +41,5 @@ #include "modules/uptime/uptime.h" #include "modules/wallpaper/wallpaper.h" #include "modules/wifi/wifi.h" +#include "modules/wm/wm.h" #include "modules/wmtheme/wmtheme.h" diff --git a/src/modules/options.h b/src/modules/options.h index 01d13a26c..40cef1062 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -38,4 +38,5 @@ #include "modules/uptime/option.h" #include "modules/wallpaper/option.h" #include "modules/wifi/option.h" +#include "modules/wm/option.h" #include "modules/wmtheme/option.h" diff --git a/src/modules/wm.c b/src/modules/wm.c deleted file mode 100644 index 38cf9f5a3..000000000 --- a/src/modules/wm.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/displayserver/displayserver.h" - -#define FF_WM_MODULE_NAME "WM" -#define FF_WM_NUM_FORMAT_ARGS 3 - -void ffPrintWM(FFinstance* instance) -{ - #ifdef __ANDROID__ - ffPrintError(instance, FF_WM_MODULE_NAME, 0, &instance->config.wm, "WM detection is not supported on Android"); - return; - #endif - - const FFDisplayServerResult* result = ffConnectDisplayServer(instance); - - if(result->wmPrettyName.length == 0) - { - ffPrintError(instance, FF_WM_MODULE_NAME, 0, &instance->config.wm, "No WM found"); - return; - } - - if(instance->config.wm.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_WM_MODULE_NAME, 0, &instance->config.wm.key); - - ffStrbufWriteTo(&result->wmPrettyName, stdout); - - if(result->wmProtocolName.length > 0) - { - fputs(" (", stdout); - ffStrbufWriteTo(&result->wmProtocolName, stdout); - putchar(')'); - } - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_WM_MODULE_NAME, 0, &instance->config.wm, FF_WM_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmProcessName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmPrettyName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmProtocolName} - }); - } -} diff --git a/src/modules/wm/option.h b/src/modules/wm/option.h new file mode 100644 index 000000000..fcc7b0231 --- /dev/null +++ b/src/modules/wm/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 FFWMOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFWMOptions; diff --git a/src/modules/wm/wm.c b/src/modules/wm/wm.c new file mode 100644 index 000000000..172066fe8 --- /dev/null +++ b/src/modules/wm/wm.c @@ -0,0 +1,83 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/displayserver/displayserver.h" +#include "modules/wm/wm.h" + +#define FF_WM_NUM_FORMAT_ARGS 3 + +void ffPrintWM(FFinstance* instance, FFWMOptions* options) +{ + const FFDisplayServerResult* result = ffConnectDisplayServer(instance); + + if(result->wmPrettyName.length == 0) + { + ffPrintError(instance, FF_WM_MODULE_NAME, 0, &options->moduleArgs, "No WM found"); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_WM_MODULE_NAME, 0, &options->moduleArgs.key); + + ffStrbufWriteTo(&result->wmPrettyName, stdout); + + if(result->wmProtocolName.length > 0) + { + fputs(" (", stdout); + ffStrbufWriteTo(&result->wmProtocolName, stdout); + putchar(')'); + } + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_WM_MODULE_NAME, 0, &options->moduleArgs, FF_WM_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmProcessName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmPrettyName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmProtocolName} + }); + } +} + +void ffInitWMOptions(FFWMOptions* options) +{ + options->moduleName = FF_WM_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseWMCommandOptions(FFWMOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_WM_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyWMOptions(FFWMOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseWMJsonObject(FFinstance* instance, json_object* module) +{ + FFWMOptions __attribute__((__cleanup__(ffDestroyWMOptions))) options; + ffInitWMOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_WM_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintWM(instance, &options); +} +#endif diff --git a/src/modules/wm/wm.h b/src/modules/wm/wm.h new file mode 100644 index 000000000..86214a3dc --- /dev/null +++ b/src/modules/wm/wm.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_WM_MODULE_NAME "WM" + +void ffPrintWM(FFinstance* instance, FFWMOptions* options); +void ffInitWMOptions(FFWMOptions* options); +bool ffParseWMCommandOptions(FFWMOptions* options, const char* key, const char* value); +void ffDestroyWMOptions(FFWMOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseWMJsonObject(FFinstance* instance, json_object* module); +#endif From e484c6cdfc2cc485a0fc4ede398b62fab2cd29f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 14:44:27 +0800 Subject: [PATCH 60/71] OpenGL: add JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 5 +- src/detection/opengl/opengl_linux.c | 6 +- src/fastfetch.c | 16 +--- src/fastfetch.h | 12 +-- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/opengl.c | 42 ---------- src/modules/opengl/opengl.c | 117 ++++++++++++++++++++++++++++ src/modules/opengl/opengl.h | 15 ++++ src/modules/opengl/option.h | 25 ++++++ src/modules/options.h | 1 + 13 files changed, 171 insertions(+), 74 deletions(-) delete mode 100644 src/modules/opengl.c create mode 100644 src/modules/opengl/opengl.c create mode 100644 src/modules/opengl/opengl.h create mode 100644 src/modules/opengl/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b908fcaf8..41a6aa113 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -288,7 +288,7 @@ set(LIBFASTFETCH_SRC src/modules/localip/localip.c src/modules/memory/memory.c src/modules/opencl.c - src/modules/opengl.c + src/modules/opengl/opengl.c src/modules/os/os.c src/modules/packages/packages.c src/modules/player.c diff --git a/src/common/init.c b/src/common/init.c index 4e952ca26..a96984042 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -52,7 +52,6 @@ static void defaultConfig(FFinstance* instance) instance->config.hideCursor = true; instance->config.escapeBedrock = true; instance->config.binaryPrefixType = FF_BINARY_PREFIX_TYPE_IEC; - instance->config.glType = FF_GL_TYPE_AUTO; instance->config.pipe = false; instance->config.multithreading = true; instance->config.stat = false; @@ -99,7 +98,7 @@ static void defaultConfig(FFinstance* instance) ffInitDateTimeOptions(&instance->config.dateTime); initModuleArg(&instance->config.vulkan); ffInitWallpaperOptions(&instance->config.wallpaper); - initModuleArg(&instance->config.openGL); + ffInitOpenGLOptions(&instance->config.openGL); initModuleArg(&instance->config.openCL); initModuleArg(&instance->config.users); ffInitBluetoothOptions(&instance->config.bluetooth); @@ -318,7 +317,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.media); ffDestroyDateTimeOptions(&instance->config.dateTime); destroyModuleArg(&instance->config.vulkan); - destroyModuleArg(&instance->config.openGL); + ffDestroyOpenGLOptions(&instance->config.openGL); destroyModuleArg(&instance->config.openCL); destroyModuleArg(&instance->config.users); ffDestroyBluetoothOptions(&instance->config.bluetooth); diff --git a/src/detection/opengl/opengl_linux.c b/src/detection/opengl/opengl_linux.c index a959578f8..8a274e68f 100644 --- a/src/detection/opengl/opengl_linux.c +++ b/src/detection/opengl/opengl_linux.c @@ -315,7 +315,7 @@ const char* ffDetectOpenGL(FFinstance* instance, FFOpenGLResult* result) { #if FF_HAVE_GL - if(instance->config.glType == FF_GL_TYPE_GLX) + if(instance->config.openGL.type == FF_OPENGL_TYPE_GLX) { #ifdef FF_HAVE_GLX return glxPrint(instance, result); @@ -324,7 +324,7 @@ const char* ffDetectOpenGL(FFinstance* instance, FFOpenGLResult* result) #endif } - if(instance->config.glType == FF_GL_TYPE_EGL) + if(instance->config.openGL.type == FF_OPENGL_TYPE_EGL) { #ifdef FF_HAVE_EGL return eglPrint(instance, result); @@ -333,7 +333,7 @@ const char* ffDetectOpenGL(FFinstance* instance, FFOpenGLResult* result) #endif } - if(instance->config.glType == FF_GL_TYPE_OSMESA) + if(instance->config.openGL.type == FF_OPENGL_TYPE_OSMESA) { #ifdef FF_HAVE_OSMESA return osMesaPrint(instance, result); diff --git a/src/fastfetch.c b/src/fastfetch.c index b0714a9c8..1ae686a41 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1015,7 +1015,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "media", &instance->config.media)) {} else if(ffParseDateTimeCommandOptions(&instance->config.dateTime, key, value)) {} else if(optionParseModuleArgs(key, value, "vulkan", &instance->config.vulkan)) {} - else if(optionParseModuleArgs(key, value, "opengl", &instance->config.openGL)) {} + else if(ffParseOpenGLCommandOptions(&instance->config.openGL, key, value)) {} else if(optionParseModuleArgs(key, value, "opencl", &instance->config.openCL)) {} else if(optionParseModuleArgs(key, value, "users", &instance->config.users)) {} else if(ffParseBluetoothCommandOptions(&instance->config.bluetooth, key, value)) {} @@ -1098,16 +1098,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseString(key, value, &instance->config.weatherOutputFormat); else if(strcasecmp(key, "--weather-timeout") == 0) instance->config.weatherTimeout = optionParseUInt32(key, value); - else if(strcasecmp(key, "--gl") == 0) - { - optionParseEnum(key, value, &instance->config.glType, - "auto", FF_GL_TYPE_AUTO, - "egl", FF_GL_TYPE_EGL, - "glx", FF_GL_TYPE_GLX, - "osmesa", FF_GL_TYPE_OSMESA, - NULL - ); - } else if(strcasecmp(key, "--percent-type") == 0) instance->config.percentType = optionParseUInt32(key, value); @@ -1250,8 +1240,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintColors(instance); else if(strcasecmp(line, "vulkan") == 0) ffPrintVulkan(instance); - else if(strcasecmp(line, "opengl") == 0) - ffPrintOpenGL(instance); + else if(strcasecmp(line, FF_OPENGL_MODULE_NAME) == 0) + ffPrintOpenGL(instance, &instance->config.openGL); else if(strcasecmp(line, "opencl") == 0) ffPrintOpenCL(instance); else if(strcasecmp(line, "users") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index e3941f719..a7d9f90c6 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -26,14 +26,6 @@ typedef enum FFBinaryPrefixType FF_BINARY_PREFIX_TYPE_JEDEC, // 1024 Bytes = 1 kB, 1024 K = 1 MB, ... } FFBinaryPrefixType; -typedef enum FFGLType -{ - FF_GL_TYPE_AUTO, - FF_GL_TYPE_EGL, - FF_GL_TYPE_GLX, - FF_GL_TYPE_OSMESA -} FFGLType; - typedef struct FFconfig { FFLogoOptions logo; @@ -51,7 +43,6 @@ typedef struct FFconfig bool hideCursor; bool escapeBedrock; FFBinaryPrefixType binaryPrefixType; - FFGLType glType; bool pipe; //disables logo and all escape sequences bool multithreading; bool stat; @@ -98,7 +89,7 @@ typedef struct FFconfig FFModuleArgs media; FFDateTimeOptions dateTime; FFModuleArgs vulkan; - FFModuleArgs openGL; + FFOpenGLOptions openGL; FFModuleArgs openCL; FFModuleArgs users; FFBluetoothOptions bluetooth; @@ -205,7 +196,6 @@ void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); void ffPrintColors(FFinstance* instance); void ffPrintVulkan(FFinstance* instance); -void ffPrintOpenGL(FFinstance* instance); void ffPrintOpenCL(FFinstance* instance); void ffPrintUsers(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 0af047407..bd876fb9c 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -61,7 +61,7 @@ int main(int argc, char** argv) //ffPrintDate(&instance); //ffPrintTime(&instance); //ffPrintVulkan(&instance); - //ffPrintOpenGL(&instance); + //ffPrintOpenGL(&instance, &instance.config.openGL); //ffPrintOpenCL(&instance); //ffPrintUsers(&instance); //ffPrintWeather(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 7e6253da9..d6f4a6060 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -103,6 +103,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'O': { return + tryModule(instance, type, module, FF_OPENGL_MODULE_NAME, ffParseOpenGLJsonObject) || tryModule(instance, type, module, FF_OS_MODULE_NAME, ffParseOSJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 48a7ee415..e05b959a2 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -27,6 +27,7 @@ #include "modules/locale/locale.h" #include "modules/localip/localip.h" #include "modules/memory/memory.h" +#include "modules/opengl/opengl.h" #include "modules/os/os.h" #include "modules/packages/packages.h" #include "modules/poweradapter/poweradapter.h" diff --git a/src/modules/opengl.c b/src/modules/opengl.c deleted file mode 100644 index 61e78451b..000000000 --- a/src/modules/opengl.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/opengl/opengl.h" - -#define FF_OPENGL_MODULE_NAME "OpenGL" -#define FF_OPENGL_NUM_FORMAT_ARGS 4 - -void ffPrintOpenGL(FFinstance* instance) -{ - FFOpenGLResult result; - ffStrbufInit(&result.version); - ffStrbufInit(&result.renderer); - ffStrbufInit(&result.vendor); - ffStrbufInit(&result.slv); - - const char* error = ffDetectOpenGL(instance, &result); - if(error) - { - ffPrintError(instance, FF_OPENGL_MODULE_NAME, 0, &instance->config.openGL, "%s", error); - return; - } - - if(instance->config.openGL.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_OPENGL_MODULE_NAME, 0, &instance->config.openGL.key); - puts(result.version.chars); - } - else - { - ffPrintFormat(instance, FF_OPENGL_MODULE_NAME, 0, &instance->config.openGL, FF_OPENGL_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &result.version}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.renderer}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.vendor}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.slv} - }); - } - - ffStrbufDestroy(&result.version); - ffStrbufDestroy(&result.renderer); - ffStrbufDestroy(&result.vendor); - ffStrbufDestroy(&result.slv); -} diff --git a/src/modules/opengl/opengl.c b/src/modules/opengl/opengl.c new file mode 100644 index 000000000..ae551fb35 --- /dev/null +++ b/src/modules/opengl/opengl.c @@ -0,0 +1,117 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/opengl/opengl.h" +#include "modules/opengl/opengl.h" + +#define FF_OPENGL_NUM_FORMAT_ARGS 4 + +void ffPrintOpenGL(FFinstance* instance, FFOpenGLOptions* options) +{ + FFOpenGLResult result; + ffStrbufInit(&result.version); + ffStrbufInit(&result.renderer); + ffStrbufInit(&result.vendor); + ffStrbufInit(&result.slv); + + const char* error = ffDetectOpenGL(instance, &result); + if(error) + { + ffPrintError(instance, FF_OPENGL_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_OPENGL_MODULE_NAME, 0, &options->moduleArgs.key); + puts(result.version.chars); + } + else + { + ffPrintFormat(instance, FF_OPENGL_MODULE_NAME, 0, &options->moduleArgs, FF_OPENGL_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &result.version}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.renderer}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.vendor}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.slv} + }); + } + + ffStrbufDestroy(&result.version); + ffStrbufDestroy(&result.renderer); + ffStrbufDestroy(&result.vendor); + ffStrbufDestroy(&result.slv); +} + +void ffInitOpenGLOptions(FFOpenGLOptions* options) +{ + options->moduleName = FF_OPENGL_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + #if defined(__linux__) || defined(__FreeBSD__) + options->type = FF_OPENGL_TYPE_AUTO; + #endif +} + +bool ffParseOpenGLCommandOptions(FFOpenGLOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_OPENGL_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + #if defined(__linux__) || defined(__FreeBSD__) + options->type = (FFOpenGLType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { + { "auto", FF_OPENGL_TYPE_AUTO }, + { "egl", FF_OPENGL_TYPE_EGL }, + { "glx", FF_OPENGL_TYPE_GLX }, + { "osmesa", FF_OPENGL_TYPE_OSMESA }, + {} + }); + #endif + + return false; +} + +void ffDestroyOpenGLOptions(FFOpenGLOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseOpenGLJsonObject(FFinstance* instance, json_object* module) +{ + FFOpenGLOptions __attribute__((__cleanup__(ffDestroyOpenGLOptions))) options; + ffInitOpenGLOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + #if defined(__linux__) || defined(__FreeBSD__) + if (strcasecmp(key, "type") == 0) + { + int value; + const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { + { "auto", FF_OPENGL_TYPE_AUTO }, + { "egl", FF_OPENGL_TYPE_EGL }, + { "glx", FF_OPENGL_TYPE_GLX }, + { "osmesa", FF_OPENGL_TYPE_OSMESA }, + {}, + }); + if (error) + ffPrintError(instance, FF_OPENGL_MODULE_NAME, 0, &options.moduleArgs, "Invalid %s value: %s", key, error); + else + options.type = (FFOpenGLType) value; + continue; + } + #endif + + ffPrintError(instance, FF_OPENGL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintOpenGL(instance, &options); +} +#endif diff --git a/src/modules/opengl/opengl.h b/src/modules/opengl/opengl.h new file mode 100644 index 000000000..d2322addf --- /dev/null +++ b/src/modules/opengl/opengl.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_OPENGL_MODULE_NAME "OpenGL" + +void ffPrintOpenGL(FFinstance* instance, FFOpenGLOptions* options); +void ffInitOpenGLOptions(FFOpenGLOptions* options); +bool ffParseOpenGLCommandOptions(FFOpenGLOptions* options, const char* key, const char* value); +void ffDestroyOpenGLOptions(FFOpenGLOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseOpenGLJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/opengl/option.h b/src/modules/opengl/option.h new file mode 100644 index 000000000..72e29c980 --- /dev/null +++ b/src/modules/opengl/option.h @@ -0,0 +1,25 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +#if defined(__linux__) || defined(__FreeBSD__) +typedef enum FFOpenGLType +{ + FF_OPENGL_TYPE_AUTO, + FF_OPENGL_TYPE_EGL, + FF_OPENGL_TYPE_GLX, + FF_OPENGL_TYPE_OSMESA +} FFOpenGLType; +#endif + +typedef struct FFOpenGLOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + #if defined(__linux__) || defined(__FreeBSD__) + FFOpenGLType type; + #endif +} FFOpenGLOptions; diff --git a/src/modules/options.h b/src/modules/options.h index 40cef1062..fa40194dc 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -25,6 +25,7 @@ #include "modules/locale/option.h" #include "modules/localip/option.h" #include "modules/memory/option.h" +#include "modules/opengl/option.h" #include "modules/os/option.h" #include "modules/packages/option.h" #include "modules/poweradapter/option.h" From 692dd841e36a192f673ae8eb6efb79715d2c1156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 15:10:44 +0800 Subject: [PATCH 61/71] OpenCL: add JSON config support --- 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 | 1 + src/modules/modules.h | 1 + src/modules/opencl.c | 39 -------------- src/modules/opencl/opencl.c | 81 +++++++++++++++++++++++++++++ src/modules/opencl/opencl.h | 15 ++++++ src/modules/opencl/option.h | 11 ++++ src/modules/options.h | 1 + 12 files changed, 118 insertions(+), 48 deletions(-) delete mode 100644 src/modules/opencl.c create mode 100644 src/modules/opencl/opencl.c create mode 100644 src/modules/opencl/opencl.h create mode 100644 src/modules/opencl/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 41a6aa113..47e2fd6af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -287,7 +287,7 @@ set(LIBFASTFETCH_SRC src/modules/locale/locale.c src/modules/localip/localip.c src/modules/memory/memory.c - src/modules/opencl.c + src/modules/opencl/opencl.c src/modules/opengl/opengl.c src/modules/os/os.c src/modules/packages/packages.c diff --git a/src/common/init.c b/src/common/init.c index a96984042..c5e9fbf60 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -99,7 +99,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.vulkan); ffInitWallpaperOptions(&instance->config.wallpaper); ffInitOpenGLOptions(&instance->config.openGL); - initModuleArg(&instance->config.openCL); + ffInitOpenCLOptions(&instance->config.openCL); initModuleArg(&instance->config.users); ffInitBluetoothOptions(&instance->config.bluetooth); ffInitSoundOptions(&instance->config.sound); @@ -318,7 +318,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyDateTimeOptions(&instance->config.dateTime); destroyModuleArg(&instance->config.vulkan); ffDestroyOpenGLOptions(&instance->config.openGL); - destroyModuleArg(&instance->config.openCL); + ffDestroyOpenCLOptions(&instance->config.openCL); destroyModuleArg(&instance->config.users); ffDestroyBluetoothOptions(&instance->config.bluetooth); ffDestroySeparatorOptions(&instance->config.separator); diff --git a/src/fastfetch.c b/src/fastfetch.c index 1ae686a41..d7fb796a8 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1016,7 +1016,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseDateTimeCommandOptions(&instance->config.dateTime, key, value)) {} else if(optionParseModuleArgs(key, value, "vulkan", &instance->config.vulkan)) {} else if(ffParseOpenGLCommandOptions(&instance->config.openGL, key, value)) {} - else if(optionParseModuleArgs(key, value, "opencl", &instance->config.openCL)) {} + else if(ffParseOpenCLCommandOptions(&instance->config.openCL, key, value)) {} else if(optionParseModuleArgs(key, value, "users", &instance->config.users)) {} else if(ffParseBluetoothCommandOptions(&instance->config.bluetooth, key, value)) {} else if(ffParseSeparatorCommandOptions(&instance->config.separator, key, value)) {} @@ -1242,8 +1242,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintVulkan(instance); else if(strcasecmp(line, FF_OPENGL_MODULE_NAME) == 0) ffPrintOpenGL(instance, &instance->config.openGL); - else if(strcasecmp(line, "opencl") == 0) - ffPrintOpenCL(instance); + else if(strcasecmp(line, FF_OPENCL_MODULE_NAME) == 0) + ffPrintOpenCL(instance, &instance->config.openCL); else if(strcasecmp(line, "users") == 0) ffPrintUsers(instance); else if(strcasecmp(line, FF_COMMAND_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index a7d9f90c6..50dcc11d9 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -90,7 +90,7 @@ typedef struct FFconfig FFDateTimeOptions dateTime; FFModuleArgs vulkan; FFOpenGLOptions openGL; - FFModuleArgs openCL; + FFOpenCLOptions openCL; FFModuleArgs users; FFBluetoothOptions bluetooth; FFSeparatorOptions separator; @@ -196,7 +196,6 @@ void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); void ffPrintColors(FFinstance* instance); void ffPrintVulkan(FFinstance* instance); -void ffPrintOpenCL(FFinstance* instance); void ffPrintUsers(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index bd876fb9c..74ebbeb53 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -62,7 +62,7 @@ int main(int argc, char** argv) //ffPrintTime(&instance); //ffPrintVulkan(&instance); //ffPrintOpenGL(&instance, &instance.config.openGL); - //ffPrintOpenCL(&instance); + //ffPrintOpenCL(&instance, &instance.config.openCL); //ffPrintUsers(&instance); //ffPrintWeather(&instance); //ffPrintBluetooth(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index d6f4a6060..b3f24d48d 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -103,6 +103,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'O': { return + tryModule(instance, type, module, FF_OPENCL_MODULE_NAME, ffParseOpenCLJsonObject) || tryModule(instance, type, module, FF_OPENGL_MODULE_NAME, ffParseOpenGLJsonObject) || tryModule(instance, type, module, FF_OS_MODULE_NAME, ffParseOSJsonObject) || false; diff --git a/src/modules/modules.h b/src/modules/modules.h index e05b959a2..990d190b2 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -28,6 +28,7 @@ #include "modules/localip/localip.h" #include "modules/memory/memory.h" #include "modules/opengl/opengl.h" +#include "modules/opencl/opencl.h" #include "modules/os/os.h" #include "modules/packages/packages.h" #include "modules/poweradapter/poweradapter.h" diff --git a/src/modules/opencl.c b/src/modules/opencl.c deleted file mode 100644 index c9d33b10d..000000000 --- a/src/modules/opencl.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/opencl/opencl.h" - -#define FF_OPENCL_MODULE_NAME "OpenCL" -#define FF_OPENCL_NUM_FORMAT_ARGS 3 - -void ffPrintOpenCL(FFinstance* instance) -{ - FFOpenCLResult opencl; - ffStrbufInit(&opencl.version); - ffStrbufInit(&opencl.device); - ffStrbufInit(&opencl.vendor); - - const char* error = ffDetectOpenCL(instance, &opencl); - - if(error != NULL) - ffPrintError(instance, FF_OPENCL_MODULE_NAME, 0, &instance->config.openCL, "%s", error); - else - { - if(instance->config.openCL.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_OPENCL_MODULE_NAME, 0, &instance->config.openCL.key); - ffStrbufPutTo(&opencl.version, stdout); - } - else - { - ffPrintFormat(instance, FF_OPENCL_MODULE_NAME, 0, &instance->config.openCL, FF_OPENCL_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &opencl.version}, - {FF_FORMAT_ARG_TYPE_STRBUF, &opencl.device}, - {FF_FORMAT_ARG_TYPE_STRBUF, &opencl.vendor}, - }); - } - } - - ffStrbufDestroy(&opencl.version); - ffStrbufDestroy(&opencl.device); - ffStrbufDestroy(&opencl.vendor); -} diff --git a/src/modules/opencl/opencl.c b/src/modules/opencl/opencl.c new file mode 100644 index 000000000..169aaec7f --- /dev/null +++ b/src/modules/opencl/opencl.c @@ -0,0 +1,81 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/opencl/opencl.h" +#include "modules/opencl/opencl.h" + +#define FF_OPENCL_NUM_FORMAT_ARGS 3 + +void ffPrintOpenCL(FFinstance* instance, FFOpenCLOptions* options) +{ + FFOpenCLResult opencl; + ffStrbufInit(&opencl.version); + ffStrbufInit(&opencl.device); + ffStrbufInit(&opencl.vendor); + + const char* error = ffDetectOpenCL(instance, &opencl); + + if(error != NULL) + ffPrintError(instance, FF_OPENCL_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + else + { + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_OPENCL_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&opencl.version, stdout); + } + else + { + ffPrintFormat(instance, FF_OPENCL_MODULE_NAME, 0, &options->moduleArgs, FF_OPENCL_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &opencl.version}, + {FF_FORMAT_ARG_TYPE_STRBUF, &opencl.device}, + {FF_FORMAT_ARG_TYPE_STRBUF, &opencl.vendor}, + }); + } + } + + ffStrbufDestroy(&opencl.version); + ffStrbufDestroy(&opencl.device); + ffStrbufDestroy(&opencl.vendor); +} + +void ffInitOpenCLOptions(FFOpenCLOptions* options) +{ + options->moduleName = FF_OPENCL_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseOpenCLCommandOptions(FFOpenCLOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_OPENCL_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyOpenCLOptions(FFOpenCLOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseOpenCLJsonObject(FFinstance* instance, json_object* module) +{ + FFOpenCLOptions __attribute__((__cleanup__(ffDestroyOpenCLOptions))) options; + ffInitOpenCLOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_OPENCL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintOpenCL(instance, &options); +} +#endif diff --git a/src/modules/opencl/opencl.h b/src/modules/opencl/opencl.h new file mode 100644 index 000000000..21843c41d --- /dev/null +++ b/src/modules/opencl/opencl.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_OPENCL_MODULE_NAME "OpenCL" + +void ffPrintOpenCL(FFinstance* instance, FFOpenCLOptions* options); +void ffInitOpenCLOptions(FFOpenCLOptions* options); +bool ffParseOpenCLCommandOptions(FFOpenCLOptions* options, const char* key, const char* value); +void ffDestroyOpenCLOptions(FFOpenCLOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseOpenCLJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/opencl/option.h b/src/modules/opencl/option.h new file mode 100644 index 000000000..addac5245 --- /dev/null +++ b/src/modules/opencl/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 FFOpenCLOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFOpenCLOptions; diff --git a/src/modules/options.h b/src/modules/options.h index fa40194dc..5a5d9fb4a 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -26,6 +26,7 @@ #include "modules/localip/option.h" #include "modules/memory/option.h" #include "modules/opengl/option.h" +#include "modules/opencl/option.h" #include "modules/os/option.h" #include "modules/packages/option.h" #include "modules/poweradapter/option.h" From 748a67d47a4477fbcb54687c3f70a8877cd6721a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 15:16:09 +0800 Subject: [PATCH 62/71] Vulkan: add JSON config support --- 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 | 1 + src/modules/options.h | 1 + src/modules/vulkan.c | 43 --------------- src/modules/vulkan/option.h | 11 ++++ src/modules/vulkan/vulkan.c | 85 +++++++++++++++++++++++++++++ src/modules/vulkan/vulkan.h | 15 +++++ 12 files changed, 127 insertions(+), 52 deletions(-) delete mode 100644 src/modules/vulkan.c create mode 100644 src/modules/vulkan/option.h create mode 100644 src/modules/vulkan/vulkan.c create mode 100644 src/modules/vulkan/vulkan.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 47e2fd6af..80f5d4b97 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -307,7 +307,7 @@ set(LIBFASTFETCH_SRC src/modules/title/title.c src/modules/uptime/uptime.c src/modules/users.c - src/modules/vulkan.c + src/modules/vulkan/vulkan.c src/modules/wallpaper/wallpaper.c src/modules/weather.c src/modules/wifi/wifi.c diff --git a/src/common/init.c b/src/common/init.c index c5e9fbf60..6113f56b1 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -96,7 +96,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.player); initModuleArg(&instance->config.media); ffInitDateTimeOptions(&instance->config.dateTime); - initModuleArg(&instance->config.vulkan); + ffInitVulkanOptions(&instance->config.vulkan); ffInitWallpaperOptions(&instance->config.wallpaper); ffInitOpenGLOptions(&instance->config.openGL); ffInitOpenCLOptions(&instance->config.openCL); @@ -316,7 +316,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.player); destroyModuleArg(&instance->config.media); ffDestroyDateTimeOptions(&instance->config.dateTime); - destroyModuleArg(&instance->config.vulkan); + ffDestroyVulkanOptions(&instance->config.vulkan); ffDestroyOpenGLOptions(&instance->config.openGL); ffDestroyOpenCLOptions(&instance->config.openCL); destroyModuleArg(&instance->config.users); diff --git a/src/fastfetch.c b/src/fastfetch.c index d7fb796a8..0e0994b29 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1014,7 +1014,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "player", &instance->config.player)) {} else if(optionParseModuleArgs(key, value, "media", &instance->config.media)) {} else if(ffParseDateTimeCommandOptions(&instance->config.dateTime, key, value)) {} - else if(optionParseModuleArgs(key, value, "vulkan", &instance->config.vulkan)) {} + else if(ffParseVulkanCommandOptions(&instance->config.vulkan, key, value)) {} else if(ffParseOpenGLCommandOptions(&instance->config.openGL, key, value)) {} else if(ffParseOpenCLCommandOptions(&instance->config.openCL, key, value)) {} else if(optionParseModuleArgs(key, value, "users", &instance->config.users)) {} @@ -1238,8 +1238,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintDateTime(instance, &instance->config.dateTime); else if(strcasecmp(line, FF_COLORS_MODULE_NAME) == 0) ffPrintColors(instance); - else if(strcasecmp(line, "vulkan") == 0) - ffPrintVulkan(instance); + else if(strcasecmp(line, FF_VULKAN_MODULE_NAME) == 0) + ffPrintVulkan(instance, &instance->config.vulkan); else if(strcasecmp(line, FF_OPENGL_MODULE_NAME) == 0) ffPrintOpenGL(instance, &instance->config.openGL); else if(strcasecmp(line, FF_OPENCL_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 50dcc11d9..f40833a9a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -88,7 +88,7 @@ typedef struct FFconfig FFModuleArgs player; FFModuleArgs media; FFDateTimeOptions dateTime; - FFModuleArgs vulkan; + FFVulkanOptions vulkan; FFOpenGLOptions openGL; FFOpenCLOptions openCL; FFModuleArgs users; @@ -195,7 +195,6 @@ void ffPrintMedia(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); void ffPrintColors(FFinstance* instance); -void ffPrintVulkan(FFinstance* instance); void ffPrintUsers(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index 74ebbeb53..e17cef0a3 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -60,7 +60,7 @@ int main(int argc, char** argv) //ffPrintDateTime(&instance); //ffPrintDate(&instance); //ffPrintTime(&instance); - //ffPrintVulkan(&instance); + //ffPrintVulkan(&instance, &instance.config.vulkan); //ffPrintOpenGL(&instance, &instance.config.openGL); //ffPrintOpenCL(&instance, &instance.config.openCL); //ffPrintUsers(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index b3f24d48d..d5fc55ea2 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -139,6 +139,12 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o false; } + case 'V': { + return + tryModule(instance, type, module, FF_VULKAN_MODULE_NAME, ffParseVulkanJsonObject) || + false; + } + case 'W': { return tryModule(instance, type, module, FF_WALLPAPER_MODULE_NAME, ffParseWallpaperJsonObject) || diff --git a/src/modules/modules.h b/src/modules/modules.h index 990d190b2..6f80f8bdf 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -41,6 +41,7 @@ #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" #include "modules/uptime/uptime.h" +#include "modules/vulkan/vulkan.h" #include "modules/wallpaper/wallpaper.h" #include "modules/wifi/wifi.h" #include "modules/wm/wm.h" diff --git a/src/modules/options.h b/src/modules/options.h index 5a5d9fb4a..c591a3953 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -38,6 +38,7 @@ #include "modules/terminalfont/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" +#include "modules/vulkan/option.h" #include "modules/wallpaper/option.h" #include "modules/wifi/option.h" #include "modules/wm/option.h" diff --git a/src/modules/vulkan.c b/src/modules/vulkan.c deleted file mode 100644 index 23c6f60df..000000000 --- a/src/modules/vulkan.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/vulkan/vulkan.h" - -#define FF_VULKAN_MODULE_NAME "Vulkan" -#define FF_VULKAN_NUM_FORMAT_ARGS 3 - -void ffPrintVulkan(FFinstance* instance) -{ - const FFVulkanResult* vulkan = ffDetectVulkan(instance); - - if(vulkan->error) - { - ffPrintError(instance, FF_VULKAN_MODULE_NAME, 0, &instance->config.vulkan, "%s", vulkan->error); - return; - } - - if(instance->config.vulkan.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_VULKAN_MODULE_NAME, 0, &instance->config.vulkan.key); - - if(vulkan->apiVersion.length > 0) - { - ffStrbufWriteTo(&vulkan->apiVersion, stdout); - - if(vulkan->driver.length > 0) - fputs(" - ", stdout); - } - - if(vulkan->driver.length > 0) - ffStrbufWriteTo(&vulkan->driver, stdout); - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_VULKAN_MODULE_NAME, 0, &instance->config.vulkan, FF_VULKAN_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &vulkan->driver}, - {FF_FORMAT_ARG_TYPE_STRBUF, &vulkan->apiVersion}, - {FF_FORMAT_ARG_TYPE_STRBUF, &vulkan->conformanceVersion} - }); - } -} diff --git a/src/modules/vulkan/option.h b/src/modules/vulkan/option.h new file mode 100644 index 000000000..c5efd077b --- /dev/null +++ b/src/modules/vulkan/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 FFVulkanOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFVulkanOptions; diff --git a/src/modules/vulkan/vulkan.c b/src/modules/vulkan/vulkan.c new file mode 100644 index 000000000..a33c40553 --- /dev/null +++ b/src/modules/vulkan/vulkan.c @@ -0,0 +1,85 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/vulkan/vulkan.h" +#include "modules/vulkan/vulkan.h" + +#define FF_VULKAN_NUM_FORMAT_ARGS 3 + +void ffPrintVulkan(FFinstance* instance, FFVulkanOptions* options) +{ + const FFVulkanResult* vulkan = ffDetectVulkan(instance); + + if(vulkan->error) + { + ffPrintError(instance, FF_VULKAN_MODULE_NAME, 0, &options->moduleArgs, "%s", vulkan->error); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_VULKAN_MODULE_NAME, 0, &options->moduleArgs.key); + + if(vulkan->apiVersion.length > 0) + { + ffStrbufWriteTo(&vulkan->apiVersion, stdout); + + if(vulkan->driver.length > 0) + fputs(" - ", stdout); + } + + if(vulkan->driver.length > 0) + ffStrbufWriteTo(&vulkan->driver, stdout); + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_VULKAN_MODULE_NAME, 0, &options->moduleArgs, FF_VULKAN_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &vulkan->driver}, + {FF_FORMAT_ARG_TYPE_STRBUF, &vulkan->apiVersion}, + {FF_FORMAT_ARG_TYPE_STRBUF, &vulkan->conformanceVersion} + }); + } +} + +void ffInitVulkanOptions(FFVulkanOptions* options) +{ + options->moduleName = FF_VULKAN_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseVulkanCommandOptions(FFVulkanOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_VULKAN_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyVulkanOptions(FFVulkanOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseVulkanJsonObject(FFinstance* instance, json_object* module) +{ + FFVulkanOptions __attribute__((__cleanup__(ffDestroyVulkanOptions))) options; + ffInitVulkanOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_VULKAN_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintVulkan(instance, &options); +} +#endif diff --git a/src/modules/vulkan/vulkan.h b/src/modules/vulkan/vulkan.h new file mode 100644 index 000000000..04145d678 --- /dev/null +++ b/src/modules/vulkan/vulkan.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_VULKAN_MODULE_NAME "Vulkan" + +void ffPrintVulkan(FFinstance* instance, FFVulkanOptions* options); +void ffInitVulkanOptions(FFVulkanOptions* options); +bool ffParseVulkanCommandOptions(FFVulkanOptions* options, const char* key, const char* value); +void ffDestroyVulkanOptions(FFVulkanOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseVulkanJsonObject(FFinstance* instance, json_object* module); +#endif From 969c787ff8250dd68e2a6859a6a22b8ac1b8ee2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 15:23:01 +0800 Subject: [PATCH 63/71] Users: add JSON config support --- 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 | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/users.c | 43 --------------- src/modules/users/option.h | 11 ++++ src/modules/users/users.c | 85 +++++++++++++++++++++++++++++ src/modules/users/users.h | 15 +++++ 12 files changed, 122 insertions(+), 52 deletions(-) delete mode 100644 src/modules/users.c create mode 100644 src/modules/users/option.h create mode 100644 src/modules/users/users.c create mode 100644 src/modules/users/users.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 80f5d4b97..329c1dfc0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -306,7 +306,7 @@ set(LIBFASTFETCH_SRC src/modules/theme.c src/modules/title/title.c src/modules/uptime/uptime.c - src/modules/users.c + src/modules/users/users.c src/modules/vulkan/vulkan.c src/modules/wallpaper/wallpaper.c src/modules/weather.c diff --git a/src/common/init.c b/src/common/init.c index 6113f56b1..bc9dbb11d 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -100,7 +100,7 @@ static void defaultConfig(FFinstance* instance) ffInitWallpaperOptions(&instance->config.wallpaper); ffInitOpenGLOptions(&instance->config.openGL); ffInitOpenCLOptions(&instance->config.openCL); - initModuleArg(&instance->config.users); + ffInitUsersOptions(&instance->config.users); ffInitBluetoothOptions(&instance->config.bluetooth); ffInitSoundOptions(&instance->config.sound); ffInitSeparatorOptions(&instance->config.separator); @@ -319,7 +319,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyVulkanOptions(&instance->config.vulkan); ffDestroyOpenGLOptions(&instance->config.openGL); ffDestroyOpenCLOptions(&instance->config.openCL); - destroyModuleArg(&instance->config.users); + ffDestroyUsersOptions(&instance->config.users); ffDestroyBluetoothOptions(&instance->config.bluetooth); ffDestroySeparatorOptions(&instance->config.separator); ffDestroySoundOptions(&instance->config.sound); diff --git a/src/fastfetch.c b/src/fastfetch.c index 0e0994b29..0622c78f4 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1017,7 +1017,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseVulkanCommandOptions(&instance->config.vulkan, key, value)) {} else if(ffParseOpenGLCommandOptions(&instance->config.openGL, key, value)) {} else if(ffParseOpenCLCommandOptions(&instance->config.openCL, key, value)) {} - else if(optionParseModuleArgs(key, value, "users", &instance->config.users)) {} + else if(ffParseUsersCommandOptions(&instance->config.users, key, value)) {} else if(ffParseBluetoothCommandOptions(&instance->config.bluetooth, key, value)) {} else if(ffParseSeparatorCommandOptions(&instance->config.separator, key, value)) {} else if(ffParseSoundCommandOptions(&instance->config.sound, key, value)) {} @@ -1244,8 +1244,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintOpenGL(instance, &instance->config.openGL); else if(strcasecmp(line, FF_OPENCL_MODULE_NAME) == 0) ffPrintOpenCL(instance, &instance->config.openCL); - else if(strcasecmp(line, "users") == 0) - ffPrintUsers(instance); + else if(strcasecmp(line, FF_USERS_MODULE_NAME) == 0) + ffPrintUsers(instance, &instance->config.users); else if(strcasecmp(line, FF_COMMAND_MODULE_NAME) == 0) ffPrintCommand(instance, &instance->config.command); else if(strcasecmp(line, FF_BLUETOOTH_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index f40833a9a..9bdb73797 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -91,7 +91,7 @@ typedef struct FFconfig FFVulkanOptions vulkan; FFOpenGLOptions openGL; FFOpenCLOptions openCL; - FFModuleArgs users; + FFUsersOptions users; FFBluetoothOptions bluetooth; FFSeparatorOptions separator; FFSoundOptions sound; @@ -195,6 +195,5 @@ void ffPrintMedia(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); void ffPrintColors(FFinstance* instance); -void ffPrintUsers(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index e17cef0a3..dd11217a1 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -63,7 +63,7 @@ int main(int argc, char** argv) //ffPrintVulkan(&instance, &instance.config.vulkan); //ffPrintOpenGL(&instance, &instance.config.openGL); //ffPrintOpenCL(&instance, &instance.config.openCL); - //ffPrintUsers(&instance); + //ffPrintUsers(&instance, &instance.config.users); //ffPrintWeather(&instance); //ffPrintBluetooth(&instance); //ffPrintSound(&instance, &instance.config.sound); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index d5fc55ea2..852ea6c8e 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -136,6 +136,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'U': { return tryModule(instance, type, module, FF_UPTIME_MODULE_NAME, ffParseUptimeJsonObject) || + tryModule(instance, type, module, FF_USERS_MODULE_NAME, ffParseUsersJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 6f80f8bdf..2c893f5a6 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -41,6 +41,7 @@ #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" #include "modules/uptime/uptime.h" +#include "modules/users/users.h" #include "modules/vulkan/vulkan.h" #include "modules/wallpaper/wallpaper.h" #include "modules/wifi/wifi.h" diff --git a/src/modules/options.h b/src/modules/options.h index c591a3953..142aaebf8 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -38,6 +38,7 @@ #include "modules/terminalfont/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" +#include "modules/users/option.h" #include "modules/vulkan/option.h" #include "modules/wallpaper/option.h" #include "modules/wifi/option.h" diff --git a/src/modules/users.c b/src/modules/users.c deleted file mode 100644 index 87503d56b..000000000 --- a/src/modules/users.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/users/users.h" - -#define FF_USERS_MODULE_NAME "Users" -#define FF_USERS_NUM_FORMAT_ARGS 1 - -void ffPrintUsers(FFinstance* instance) -{ - FF_LIST_AUTO_DESTROY users = ffListCreate(sizeof(FFstrbuf)); - - FF_STRBUF_AUTO_DESTROY error = ffStrbufCreate(); - - ffDetectUsers(&users, &error); - - if(error.length > 0) - { - ffPrintError(instance, FF_USERS_MODULE_NAME, 0, &instance->config.users, "%*s", error.length, error.chars); - return; - } - - FF_STRBUF_AUTO_DESTROY result = ffStrbufCreate(); - for(uint32_t i = 0; i < users.length; ++i) - { - if(i > 0) - ffStrbufAppendS(&result, ", "); - FFstrbuf* user = (FFstrbuf*)ffListGet(&users, i); - ffStrbufAppend(&result, user); - ffStrbufDestroy(user); - } - - if(instance->config.users.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_USERS_MODULE_NAME, 0, &instance->config.users.key); - puts(result.chars); - } - else - { - ffPrintFormat(instance, FF_USERS_MODULE_NAME, 0, &instance->config.users, FF_USERS_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &result}, - }); - } -} diff --git a/src/modules/users/option.h b/src/modules/users/option.h new file mode 100644 index 000000000..f7f0b099e --- /dev/null +++ b/src/modules/users/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 FFUsersOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFUsersOptions; diff --git a/src/modules/users/users.c b/src/modules/users/users.c new file mode 100644 index 000000000..82698d6a8 --- /dev/null +++ b/src/modules/users/users.c @@ -0,0 +1,85 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/users/users.h" +#include "modules/users/users.h" + +#define FF_USERS_NUM_FORMAT_ARGS 1 + +void ffPrintUsers(FFinstance* instance, FFUsersOptions* options) +{ + FF_LIST_AUTO_DESTROY users = ffListCreate(sizeof(FFstrbuf)); + + FF_STRBUF_AUTO_DESTROY error = ffStrbufCreate(); + + ffDetectUsers(&users, &error); + + if(error.length > 0) + { + ffPrintError(instance, FF_USERS_MODULE_NAME, 0, &options->moduleArgs, "%*s", error.length, error.chars); + return; + } + + FF_STRBUF_AUTO_DESTROY result = ffStrbufCreate(); + for(uint32_t i = 0; i < users.length; ++i) + { + if(i > 0) + ffStrbufAppendS(&result, ", "); + FFstrbuf* user = (FFstrbuf*)ffListGet(&users, i); + ffStrbufAppend(&result, user); + ffStrbufDestroy(user); + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_USERS_MODULE_NAME, 0, &options->moduleArgs.key); + puts(result.chars); + } + else + { + ffPrintFormat(instance, FF_USERS_MODULE_NAME, 0, &options->moduleArgs, FF_USERS_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &result}, + }); + } +} + +void ffInitUsersOptions(FFUsersOptions* options) +{ + options->moduleName = FF_USERS_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseUsersCommandOptions(FFUsersOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_USERS_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyUsersOptions(FFUsersOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseUsersJsonObject(FFinstance* instance, json_object* module) +{ + FFUsersOptions __attribute__((__cleanup__(ffDestroyUsersOptions))) options; + ffInitUsersOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_USERS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintUsers(instance, &options); +} +#endif diff --git a/src/modules/users/users.h b/src/modules/users/users.h new file mode 100644 index 000000000..233391f17 --- /dev/null +++ b/src/modules/users/users.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_USERS_MODULE_NAME "Users" + +void ffPrintUsers(FFinstance* instance, FFUsersOptions* options); +void ffInitUsersOptions(FFUsersOptions* options); +bool ffParseUsersCommandOptions(FFUsersOptions* options, const char* key, const char* value); +void ffDestroyUsersOptions(FFUsersOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseUsersJsonObject(FFinstance* instance, json_object* module); +#endif From 0adecd3cb06462535366608544913fad24a1c285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 15:23:12 +0800 Subject: [PATCH 64/71] Fastfetch: remove a useless function definition --- src/fastfetch.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/fastfetch.h b/src/fastfetch.h index 9bdb73797..16c496657 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -194,6 +194,5 @@ void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); -void ffPrintColors(FFinstance* instance); #endif From fde86657f28698a7ca43a98f5faf79940a93d15a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 16:10:14 +0800 Subject: [PATCH 65/71] Media: add JSON config support --- 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 | 1 + src/modules/{ => media}/media.c | 60 ++++++++++++++++++++++++----- src/modules/media/media.h | 15 ++++++++ src/modules/media/option.h | 11 ++++++ src/modules/modules.h | 1 + src/modules/options.h | 1 + 11 files changed, 88 insertions(+), 18 deletions(-) rename src/modules/{ => media}/media.c (62%) create mode 100644 src/modules/media/media.h create mode 100644 src/modules/media/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 329c1dfc0..e2853d537 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -300,7 +300,7 @@ set(LIBFASTFETCH_SRC src/modules/shell/shell.c src/modules/sound/sound.c src/modules/swap/swap.c - src/modules/media.c + src/modules/media/media.c src/modules/terminal/terminal.c src/modules/terminalfont/terminalfont.c src/modules/theme.c diff --git a/src/common/init.c b/src/common/init.c index bc9dbb11d..55167ad97 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -94,7 +94,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.weather); ffInitWifiOptions(&instance->config.wifi); initModuleArg(&instance->config.player); - initModuleArg(&instance->config.media); + ffInitMediaOptions(&instance->config.media); ffInitDateTimeOptions(&instance->config.dateTime); ffInitVulkanOptions(&instance->config.vulkan); ffInitWallpaperOptions(&instance->config.wallpaper); @@ -314,7 +314,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.weather); ffDestroyWifiOptions(&instance->config.wifi); destroyModuleArg(&instance->config.player); - destroyModuleArg(&instance->config.media); + ffDestroyMediaOptions(&instance->config.media); ffDestroyDateTimeOptions(&instance->config.dateTime); ffDestroyVulkanOptions(&instance->config.vulkan); ffDestroyOpenGLOptions(&instance->config.openGL); diff --git a/src/fastfetch.c b/src/fastfetch.c index 0622c78f4..89f692119 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1012,7 +1012,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "publicip", &instance->config.publicIP)) {} else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {} else if(optionParseModuleArgs(key, value, "player", &instance->config.player)) {} - else if(optionParseModuleArgs(key, value, "media", &instance->config.media)) {} + else if(ffParseMediaCommandOptions(&instance->config.media, key, value)) {} else if(ffParseDateTimeCommandOptions(&instance->config.dateTime, key, value)) {} else if(ffParseVulkanCommandOptions(&instance->config.vulkan, key, value)) {} else if(ffParseOpenGLCommandOptions(&instance->config.openGL, key, value)) {} @@ -1232,8 +1232,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintWeather(instance); else if(strcasecmp(line, "player") == 0) ffPrintPlayer(instance); - else if(strcasecmp(line, "media") == 0) - ffPrintMedia(instance); + else if(strcasecmp(line, FF_MEDIA_MODULE_NAME) == 0) + ffPrintMedia(instance, &instance->config.media); else if(strcasecmp(line, FF_DATETIME_MODULE_NAME) == 0) ffPrintDateTime(instance, &instance->config.dateTime); else if(strcasecmp(line, FF_COLORS_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 16c496657..3c17da838 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -86,7 +86,7 @@ typedef struct FFconfig FFModuleArgs publicIP; FFModuleArgs weather; FFModuleArgs player; - FFModuleArgs media; + FFMediaOptions media; FFDateTimeOptions dateTime; FFVulkanOptions vulkan; FFOpenGLOptions openGL; @@ -191,7 +191,6 @@ void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); -void ffPrintMedia(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index dd11217a1..4a286181a 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -51,7 +51,7 @@ int main(int argc, char** argv) ffPrintBattery(&instance, &instance.config.battery); ffPrintPowerAdapter(&instance, &instance.config.powerAdapter); //ffPrintPlayer(&instance); - //ffPrintMedia(&instance); + //ffPrintMedia(&instance, &instance.config.media); //ffPrintLocalIp(&instance); //ffPrintPublicIp(&instance); //ffPrintWifi(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 852ea6c8e..489d7f718 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -97,6 +97,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'M': { return + tryModule(instance, type, module, FF_MEDIA_MODULE_NAME, ffParseMediaJsonObject) || tryModule(instance, type, module, FF_MEMORY_MODULE_NAME, ffParseMemoryJsonObject) || false; } diff --git a/src/modules/media.c b/src/modules/media/media.c similarity index 62% rename from src/modules/media.c rename to src/modules/media/media.c index 74be335e0..9021aaf7c 100644 --- a/src/modules/media.c +++ b/src/modules/media/media.c @@ -1,13 +1,13 @@ #include "fastfetch.h" #include "common/printing.h" #include "detection/media/media.h" +#include "modules/media/media.h" #include -#define FF_MEDIA_MODULE_NAME "Media" #define FF_MEDIA_NUM_FORMAT_ARGS 5 -static bool shouldIgoreChar(char c) +static inline bool shouldIgnoreChar(char c) { return isblank(c) || c == '-' || c == '.'; } @@ -19,10 +19,10 @@ static bool artistInSongTitle(const FFstrbuf* song, const FFstrbuf* artist) while(true) { - while(shouldIgoreChar(song->chars[songIndex])) + while(shouldIgnoreChar(song->chars[songIndex])) ++songIndex; - while(shouldIgoreChar(artist->chars[artistIndex])) + while(shouldIgnoreChar(artist->chars[artistIndex])) ++artistIndex; if(artist->chars[artistIndex] == '\0') @@ -42,13 +42,13 @@ static bool artistInSongTitle(const FFstrbuf* song, const FFstrbuf* artist) return false; } -void ffPrintMedia(FFinstance* instance) +void ffPrintMedia(FFinstance* instance, FFMediaOptions* options) { const FFMediaResult* media = ffDetectMedia(instance); if(media->error.length > 0) { - ffPrintError(instance, FF_MEDIA_MODULE_NAME, 0, &instance->config.media, "%s", media->error.chars); + ffPrintError(instance, FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs, "%s", media->error.chars); return; } @@ -68,7 +68,7 @@ void ffPrintMedia(FFinstance* instance) if(songPretty.length == 0) ffStrbufAppend(&songPretty, &media->song); - if(instance->config.media.outputFormat.length == 0) + if(options->moduleArgs.outputFormat.length == 0) { //We don't expose artistPretty to the format, as it might be empty (when the think that the artist is already in the song title) FF_STRBUF_AUTO_DESTROY artistPretty = ffStrbufCreateCopy(&media->artist); @@ -79,7 +79,7 @@ void ffPrintMedia(FFinstance* instance) if(artistInSongTitle(&songPretty, &artistPretty)) ffStrbufClear(&artistPretty); - ffPrintLogoAndKey(instance, FF_MEDIA_MODULE_NAME, 0, &instance->config.media.key); + ffPrintLogoAndKey(instance, FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs.key); if(artistPretty.length > 0) { @@ -94,7 +94,7 @@ void ffPrintMedia(FFinstance* instance) } else { - ffPrintFormat(instance, FF_MEDIA_MODULE_NAME, 0, &instance->config.media, FF_MEDIA_NUM_FORMAT_ARGS, (FFformatarg[]){ + ffPrintFormat(instance, FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs, FF_MEDIA_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &songPretty}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->song}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->artist}, @@ -103,3 +103,45 @@ void ffPrintMedia(FFinstance* instance) }); } } + +void ffInitMediaOptions(FFMediaOptions* options) +{ + options->moduleName = FF_MEDIA_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseMediaCommandOptions(FFMediaOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_MEDIA_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyMediaOptions(FFMediaOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseMediaJsonObject(FFinstance* instance, json_object* module) +{ + FFMediaOptions __attribute__((__cleanup__(ffDestroyMediaOptions))) options; + ffInitMediaOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_MEDIA_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintMedia(instance, &options); +} +#endif diff --git a/src/modules/media/media.h b/src/modules/media/media.h new file mode 100644 index 000000000..59c6cbb42 --- /dev/null +++ b/src/modules/media/media.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_MEDIA_MODULE_NAME "Media" + +void ffPrintMedia(FFinstance* instance, FFMediaOptions* options); +void ffInitMediaOptions(FFMediaOptions* options); +bool ffParseMediaCommandOptions(FFMediaOptions* options, const char* key, const char* value); +void ffDestroyMediaOptions(FFMediaOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseMediaJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/media/option.h b/src/modules/media/option.h new file mode 100644 index 000000000..8498c6e9b --- /dev/null +++ b/src/modules/media/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 FFMediaOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFMediaOptions; diff --git a/src/modules/modules.h b/src/modules/modules.h index 2c893f5a6..2966d52c1 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -26,6 +26,7 @@ #include "modules/kernel/kernel.h" #include "modules/locale/locale.h" #include "modules/localip/localip.h" +#include "modules/media/media.h" #include "modules/memory/memory.h" #include "modules/opengl/opengl.h" #include "modules/opencl/opencl.h" diff --git a/src/modules/options.h b/src/modules/options.h index 142aaebf8..e20258d2d 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -24,6 +24,7 @@ #include "modules/kernel/option.h" #include "modules/locale/option.h" #include "modules/localip/option.h" +#include "modules/media/option.h" #include "modules/memory/option.h" #include "modules/opengl/option.h" #include "modules/opencl/option.h" From a4a801d83ad8e4c42a56289eb3a41f849029972a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 16:19:07 +0800 Subject: [PATCH 66/71] Player: add JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 7 +--- src/detection/media/media_linux.c | 8 ++-- 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/player/option.h | 13 +++++++ src/modules/{ => player}/player.c | 59 ++++++++++++++++++++++++++--- src/modules/player/player.h | 16 ++++++++ 12 files changed, 97 insertions(+), 26 deletions(-) create mode 100644 src/modules/player/option.h rename src/modules/{ => player}/player.c (55%) create mode 100644 src/modules/player/player.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e2853d537..8d7b52cd2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -291,8 +291,8 @@ set(LIBFASTFETCH_SRC src/modules/opengl/opengl.c src/modules/os/os.c src/modules/packages/packages.c - src/modules/player.c src/modules/processes.c + src/modules/player/player.c src/modules/poweradapter/poweradapter.c src/modules/publicip.c src/modules/display/display.c diff --git a/src/common/init.c b/src/common/init.c index 55167ad97..fe8388384 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -93,7 +93,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.publicIP); initModuleArg(&instance->config.weather); ffInitWifiOptions(&instance->config.wifi); - initModuleArg(&instance->config.player); + ffInitPlayerOptions(&instance->config.player); ffInitMediaOptions(&instance->config.media); ffInitDateTimeOptions(&instance->config.dateTime); ffInitVulkanOptions(&instance->config.vulkan); @@ -138,8 +138,6 @@ static void defaultConfig(FFinstance* instance) instance->config.weatherTimeout = 0; ffStrbufInitS(&instance->config.weatherOutputFormat, "%t+-+%C+(%l)"); - ffStrbufInit(&instance->config.playerName); - instance->config.percentType = 1; } @@ -313,7 +311,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyWallpaperOptions(&instance->config.wallpaper); destroyModuleArg(&instance->config.weather); ffDestroyWifiOptions(&instance->config.wifi); - destroyModuleArg(&instance->config.player); + ffDestroyPlayerOptions(&instance->config.player); ffDestroyMediaOptions(&instance->config.media); ffDestroyDateTimeOptions(&instance->config.dateTime); ffDestroyVulkanOptions(&instance->config.vulkan); @@ -353,7 +351,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.publicIpUrl); ffStrbufDestroy(&instance->config.weatherOutputFormat); - ffStrbufDestroy(&instance->config.playerName); } static void destroyState(FFinstance* instance) diff --git a/src/detection/media/media_linux.c b/src/detection/media/media_linux.c index f4e8c9ea2..23564588a 100644 --- a/src/detection/media/media_linux.c +++ b/src/detection/media/media_linux.c @@ -101,14 +101,14 @@ static bool getBusProperties(FFDBusData* data, const char* busName, FFMediaResul static void getCustomBus(FFDBusData* data, const FFinstance* instance, FFMediaResult* result) { - if(ffStrbufStartsWithS(&instance->config.playerName, FF_DBUS_MPRIS_PREFIX)) + if(ffStrbufStartsWithS(&instance->config.player.name, FF_DBUS_MPRIS_PREFIX)) { - getBusProperties(data, instance->config.playerName.chars, result); + getBusProperties(data, instance->config.player.name.chars, result); return; } FF_STRBUF_AUTO_DESTROY busName = ffStrbufCreateS(FF_DBUS_MPRIS_PREFIX); - ffStrbufAppend(&busName, &instance->config.playerName); + ffStrbufAppend(&busName, &instance->config.player.name); getBusProperties(data, busName.chars, result); } @@ -158,7 +158,7 @@ static const char* getMedia(const FFinstance* instance, FFMediaResult* result) if(error != NULL) return error; - if(instance->config.playerName.length > 0) + if(instance->config.player.name.length > 0) getCustomBus(&data, instance, result); else getBestBus(&data, result); diff --git a/src/fastfetch.c b/src/fastfetch.c index 89f692119..66672c322 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1011,7 +1011,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseLocalIpCommandOptions(&instance->config.localIP, key, value)) {} else if(optionParseModuleArgs(key, value, "publicip", &instance->config.publicIP)) {} else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {} - else if(optionParseModuleArgs(key, value, "player", &instance->config.player)) {} + else if(ffParsePlayerCommandOptions(&instance->config.player, key, value)) {} else if(ffParseMediaCommandOptions(&instance->config.media, key, value)) {} else if(ffParseDateTimeCommandOptions(&instance->config.dateTime, key, value)) {} else if(ffParseVulkanCommandOptions(&instance->config.vulkan, key, value)) {} @@ -1088,8 +1088,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Module options// ////////////////// - else if(strcasecmp(key, "--player-name") == 0) - optionParseString(key, value, &instance->config.playerName); else if(strcasecmp(key, "--publicip-url") == 0) optionParseString(key, value, &instance->config.publicIpUrl); else if(strcasecmp(key, "--publicip-timeout") == 0) @@ -1230,8 +1228,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintWifi(instance, &instance->config.wifi); else if(strcasecmp(line, "weather") == 0) ffPrintWeather(instance); - else if(strcasecmp(line, "player") == 0) - ffPrintPlayer(instance); + else if(strcasecmp(line, FF_PLAYER_MODULE_NAME) == 0) + ffPrintPlayer(instance, &instance->config.player); else if(strcasecmp(line, FF_MEDIA_MODULE_NAME) == 0) ffPrintMedia(instance, &instance->config.media); else if(strcasecmp(line, FF_DATETIME_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 3c17da838..606ce08c3 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -85,7 +85,7 @@ typedef struct FFconfig FFLocalIpOptions localIP; FFModuleArgs publicIP; FFModuleArgs weather; - FFModuleArgs player; + FFPlayerOptions player; FFMediaOptions media; FFDateTimeOptions dateTime; FFVulkanOptions vulkan; @@ -129,8 +129,6 @@ typedef struct FFconfig FFstrbuf weatherOutputFormat; uint32_t weatherTimeout; - FFstrbuf playerName; - uint32_t percentType; bool jsonConfig; @@ -190,7 +188,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintTheme(FFinstance* instance); -void ffPrintPlayer(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 4a286181a..ec2d209ec 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -50,7 +50,7 @@ int main(int argc, char** argv) ffPrintDisk(&instance, &instance.config.disk); ffPrintBattery(&instance, &instance.config.battery); ffPrintPowerAdapter(&instance, &instance.config.powerAdapter); - //ffPrintPlayer(&instance); + //ffPrintPlayer(&instance, &instance.config.player); //ffPrintMedia(&instance, &instance.config.media); //ffPrintLocalIp(&instance); //ffPrintPublicIp(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 489d7f718..e056bf218 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -113,6 +113,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'P': { return tryModule(instance, type, module, FF_PACKAGES_MODULE_NAME, ffParsePackagesJsonObject) || + tryModule(instance, type, module, FF_PLAYER_MODULE_NAME, ffParsePlayerJsonObject) || tryModule(instance, type, module, FF_POWERADAPTER_MODULE_NAME, ffParsePowerAdapterJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 2966d52c1..b31c2af65 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -32,6 +32,7 @@ #include "modules/opencl/opencl.h" #include "modules/os/os.h" #include "modules/packages/packages.h" +#include "modules/player/player.h" #include "modules/poweradapter/poweradapter.h" #include "modules/separator/separator.h" #include "modules/shell/shell.h" diff --git a/src/modules/options.h b/src/modules/options.h index e20258d2d..bd57642ca 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -30,6 +30,7 @@ #include "modules/opencl/option.h" #include "modules/os/option.h" #include "modules/packages/option.h" +#include "modules/player/option.h" #include "modules/poweradapter/option.h" #include "modules/separator/option.h" #include "modules/shell/option.h" diff --git a/src/modules/player/option.h b/src/modules/player/option.h new file mode 100644 index 000000000..8fa057a47 --- /dev/null +++ b/src/modules/player/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 FFPlayerOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFstrbuf name; +} FFPlayerOptions; diff --git a/src/modules/player.c b/src/modules/player/player.c similarity index 55% rename from src/modules/player.c rename to src/modules/player/player.c index 6f4ab0df2..f461044a1 100644 --- a/src/modules/player.c +++ b/src/modules/player/player.c @@ -1,19 +1,20 @@ #include "fastfetch.h" #include "common/printing.h" #include "detection/media/media.h" +#include "modules/player/player.h" #include -#define FF_PLAYER_MODULE_NAME "Media Player" +#define FF_PLAYER_DISPLAY_NAME "Media Player" #define FF_PLAYER_NUM_FORMAT_ARGS 4 -void ffPrintPlayer(FFinstance* instance) +void ffPrintPlayer(FFinstance* instance, FFPlayerOptions* options) { const FFMediaResult* media = ffDetectMedia(instance); if(media->error.length > 0) { - ffPrintError(instance, FF_PLAYER_MODULE_NAME, 0, &instance->config.player, "%s", media->error.chars); + ffPrintError(instance, FF_PLAYER_DISPLAY_NAME, 0, &options->moduleArgs, "%s", media->error.chars); return; } @@ -55,14 +56,14 @@ void ffPrintPlayer(FFinstance* instance) if(playerPrettyIsCustom) ffStrbufAppendC(&playerPretty, ')'); - if(instance->config.player.outputFormat.length == 0) + if(options->moduleArgs.outputFormat.length == 0) { - ffPrintLogoAndKey(instance, FF_PLAYER_MODULE_NAME, 0, &instance->config.player.key); + ffPrintLogoAndKey(instance, FF_PLAYER_DISPLAY_NAME, 0, &options->moduleArgs.key); ffStrbufPutTo(&playerPretty, stdout); } else { - ffPrintFormat(instance, FF_PLAYER_MODULE_NAME, 0, &instance->config.player, FF_PLAYER_NUM_FORMAT_ARGS, (FFformatarg[]){ + ffPrintFormat(instance, FF_PLAYER_DISPLAY_NAME, 0, &options->moduleArgs, FF_PLAYER_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &playerPretty}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->player}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->playerId}, @@ -70,3 +71,49 @@ void ffPrintPlayer(FFinstance* instance) }); } } + +void ffInitPlayerOptions(FFPlayerOptions* options) +{ + options->moduleName = FF_PLAYER_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + ffStrbufInit(&options->name); +} + +bool ffParsePlayerCommandOptions(FFPlayerOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_PLAYER_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyPlayerOptions(FFPlayerOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + + ffStrbufDestroy(&options->name); +} + +#ifdef FF_HAVE_JSONC +void ffParsePlayerJsonObject(FFinstance* instance, json_object* module) +{ + FFPlayerOptions __attribute__((__cleanup__(ffDestroyPlayerOptions))) options; + ffInitPlayerOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_PLAYER_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintPlayer(instance, &options); +} +#endif diff --git a/src/modules/player/player.h b/src/modules/player/player.h new file mode 100644 index 000000000..9b19d67cd --- /dev/null +++ b/src/modules/player/player.h @@ -0,0 +1,16 @@ + +#pragma once + +#include "fastfetch.h" + +#define FF_PLAYER_MODULE_NAME "Player" + +void ffPrintPlayer(FFinstance* instance, FFPlayerOptions* options); +void ffInitPlayerOptions(FFPlayerOptions* options); +bool ffParsePlayerCommandOptions(FFPlayerOptions* options, const char* key, const char* value); +void ffDestroyPlayerOptions(FFPlayerOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParsePlayerJsonObject(FFinstance* instance, json_object* module); +#endif From 7f9ff587ce8e2b603eb6decb4fd455fefedd4b68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 8 Jun 2023 09:41:22 +0800 Subject: [PATCH 67/71] PublicIP: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 8 +- src/fastfetch.c | 14 +-- src/fastfetch.h | 7 +- src/flashfetch.c | 4 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/publicip.c | 65 ------------- src/modules/publicip/option.h | 14 +++ src/modules/publicip/publicip.c | 137 ++++++++++++++++++++++++++++ src/modules/publicip/publicip.h | 17 ++++ 12 files changed, 182 insertions(+), 89 deletions(-) delete mode 100644 src/modules/publicip.c create mode 100644 src/modules/publicip/option.h create mode 100644 src/modules/publicip/publicip.c create mode 100644 src/modules/publicip/publicip.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d7b52cd2..2d756b71e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -294,7 +294,7 @@ set(LIBFASTFETCH_SRC src/modules/processes.c src/modules/player/player.c src/modules/poweradapter/poweradapter.c - src/modules/publicip.c + src/modules/publicip/publicip.c src/modules/display/display.c src/modules/separator/separator.c src/modules/shell/shell.c diff --git a/src/common/init.c b/src/common/init.c index fe8388384..20354358c 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -90,7 +90,7 @@ static void defaultConfig(FFinstance* instance) ffInitPowerAdapterOptions(&instance->config.powerAdapter); ffInitLocaleOptions(&instance->config.locale); ffInitLocalIpOptions(&instance->config.localIP); - initModuleArg(&instance->config.publicIP); + ffInitPublicIpOptions(&instance->config.publicIP); initModuleArg(&instance->config.weather); ffInitWifiOptions(&instance->config.wifi); ffInitPlayerOptions(&instance->config.player); @@ -132,9 +132,6 @@ static void defaultConfig(FFinstance* instance) ffStrbufInit(&instance->config.libwlanapi); ffStrbufInit(&instance->config.libnm); - instance->config.publicIpTimeout = 0; - ffStrbufInit(&instance->config.publicIpUrl); - instance->config.weatherTimeout = 0; ffStrbufInitS(&instance->config.weatherOutputFormat, "%t+-+%C+(%l)"); @@ -307,7 +304,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyPowerAdapterOptions(&instance->config.powerAdapter); ffDestroyLocaleOptions(&instance->config.locale); ffDestroyLocalIpOptions(&instance->config.localIP); - destroyModuleArg(&instance->config.publicIP); + ffDestroyPublicIpOptions(&instance->config.publicIP); ffDestroyWallpaperOptions(&instance->config.wallpaper); destroyModuleArg(&instance->config.weather); ffDestroyWifiOptions(&instance->config.wifi); @@ -349,7 +346,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.libwlanapi); ffStrbufDestroy(&instance->config.libnm); - ffStrbufDestroy(&instance->config.publicIpUrl); ffStrbufDestroy(&instance->config.weatherOutputFormat); } diff --git a/src/fastfetch.c b/src/fastfetch.c index 66672c322..1744bd57c 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1009,7 +1009,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParsePowerAdapterCommandOptions(&instance->config.powerAdapter, key, value)) {} else if(ffParseLocaleCommandOptions(&instance->config.locale, key, value)) {} else if(ffParseLocalIpCommandOptions(&instance->config.localIP, key, value)) {} - else if(optionParseModuleArgs(key, value, "publicip", &instance->config.publicIP)) {} + else if(ffParsePublicIpCommandOptions(&instance->config.publicIP, key, value)) {} else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {} else if(ffParsePlayerCommandOptions(&instance->config.player, key, value)) {} else if(ffParseMediaCommandOptions(&instance->config.media, key, value)) {} @@ -1088,10 +1088,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Module options// ////////////////// - else if(strcasecmp(key, "--publicip-url") == 0) - optionParseString(key, value, &instance->config.publicIpUrl); - else if(strcasecmp(key, "--publicip-timeout") == 0) - instance->config.publicIpTimeout = optionParseUInt32(key, value); else if(strcasecmp(key, "--weather-output-format") == 0) optionParseString(key, value, &instance->config.weatherOutputFormat); else if(strcasecmp(key, "--weather-timeout") == 0) @@ -1222,8 +1218,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintLocale(instance, &instance->config.locale); else if(strcasecmp(line, "localip") == 0) ffPrintLocalIp(instance, &instance->config.localIP); - else if(strcasecmp(line, "publicip") == 0) - ffPrintPublicIp(instance); + else if(strcasecmp(line, FF_PUBLICIP_MODULE_NAME) == 0) + ffPrintPublicIp(instance, &instance->config.publicIP); else if(strcasecmp(line, FF_WIFI_MODULE_NAME) == 0) ffPrintWifi(instance, &instance->config.wifi); else if(strcasecmp(line, "weather") == 0) @@ -1281,8 +1277,8 @@ int main(int argc, const char** argv) if(instance.config.multithreading) { - if(ffStrbufContainIgnCaseS(&data.structure, "PublicIp")) - ffPreparePublicIp(&instance); + if(ffStrbufContainIgnCaseS(&data.structure, FF_PUBLICIP_MODULE_NAME)) + ffPreparePublicIp(&instance.config.publicIP); if(ffStrbufContainIgnCaseS(&data.structure, "Weather")) ffPrepareWeather(&instance); diff --git a/src/fastfetch.h b/src/fastfetch.h index 606ce08c3..2c159059f 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -83,7 +83,7 @@ typedef struct FFconfig FFPowerAdapterOptions powerAdapter; FFLocaleOptions locale; FFLocalIpOptions localIP; - FFModuleArgs publicIP; + FFPublicIpOptions publicIP; FFModuleArgs weather; FFPlayerOptions player; FFMediaOptions media; @@ -123,9 +123,6 @@ typedef struct FFconfig FFstrbuf libwlanapi; FFstrbuf libnm; - FFstrbuf publicIpUrl; - uint32_t publicIpTimeout; - FFstrbuf weatherOutputFormat; uint32_t weatherTimeout; @@ -180,7 +177,6 @@ void ffLogoBuiltinListAutocompletion(); //Common -void ffPreparePublicIp(FFinstance* instance); void ffPrepareWeather(FFinstance* instance); //Printing @@ -188,7 +184,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintTheme(FFinstance* instance); -void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index ec2d209ec..e00d2b48b 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -13,7 +13,7 @@ int main(int argc, char** argv) //Modify instance.config here // ffPrepareCPUUsage(); - // ffPreparePublicIp(&instance); + // ffPreparePublicIp(&instance.config.publicIP); // ffPrepareWeather(&instance); //Does things like starting detection threads, disabling line wrap, etc @@ -53,7 +53,7 @@ int main(int argc, char** argv) //ffPrintPlayer(&instance, &instance.config.player); //ffPrintMedia(&instance, &instance.config.media); //ffPrintLocalIp(&instance); - //ffPrintPublicIp(&instance); + //ffPrintPublicIp(&instance, &instance.config.publicIp); //ffPrintWifi(&instance); //ffPrintCPUUsage(&instance, &instance.config.cpuUsage); ffPrintLocale(&instance, &instance.config.locale); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index e056bf218..c248d0114 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -115,6 +115,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o tryModule(instance, type, module, FF_PACKAGES_MODULE_NAME, ffParsePackagesJsonObject) || tryModule(instance, type, module, FF_PLAYER_MODULE_NAME, ffParsePlayerJsonObject) || tryModule(instance, type, module, FF_POWERADAPTER_MODULE_NAME, ffParsePowerAdapterJsonObject) || + tryModule(instance, type, module, FF_PUBLICIP_MODULE_NAME, ffParsePublicIpJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index b31c2af65..b28e1d1e4 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -34,6 +34,7 @@ #include "modules/packages/packages.h" #include "modules/player/player.h" #include "modules/poweradapter/poweradapter.h" +#include "modules/publicip/publicip.h" #include "modules/separator/separator.h" #include "modules/shell/shell.h" #include "modules/sound/sound.h" diff --git a/src/modules/options.h b/src/modules/options.h index bd57642ca..cfdefd52b 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -32,6 +32,7 @@ #include "modules/packages/option.h" #include "modules/player/option.h" #include "modules/poweradapter/option.h" +#include "modules/publicip/option.h" #include "modules/separator/option.h" #include "modules/shell/option.h" #include "modules/sound/option.h" diff --git a/src/modules/publicip.c b/src/modules/publicip.c deleted file mode 100644 index 2483be9d9..000000000 --- a/src/modules/publicip.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "common/networking.h" - -#define FF_PUBLICIP_MODULE_NAME "Public IP" -#define FF_PUBLICIP_NUM_FORMAT_ARGS 1 - -static FFNetworkingState state; -static int status = -1; - -void ffPreparePublicIp(FFinstance* instance) -{ - if(instance->config.publicIpUrl.length == 0) - status = ffNetworkingSendHttpRequest(&state, "ipinfo.io", "/ip", NULL); - else - { - FF_STRBUF_AUTO_DESTROY host = ffStrbufCreateCopy(&instance->config.publicIpUrl); - ffStrbufSubstrAfterFirstS(&host, "://"); - uint32_t pathStartIndex = ffStrbufFirstIndexC(&host, '/'); - - FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); - if(pathStartIndex != host.length) - { - ffStrbufAppendNS(&path, pathStartIndex, host.chars + (host.length - pathStartIndex)); - host.length = pathStartIndex; - host.chars[pathStartIndex] = '\0'; - } - - status = ffNetworkingSendHttpRequest(&state, host.chars, path.length == 0 ? "/" : path.chars, NULL); - } -} - -void ffPrintPublicIp(FFinstance* instance) -{ - if(status == -1) - ffPreparePublicIp(instance); - - if(status == 0) - { - ffPrintError(instance, FF_PUBLICIP_MODULE_NAME, 0, &instance->config.publicIP, "Failed to connect to an IP detection server"); - return; - } - - FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(4096); - bool success = ffNetworkingRecvHttpResponse(&state, &result, instance->config.publicIpTimeout); - if(success) ffStrbufSubstrAfterFirstS(&result, "\r\n\r\n"); - - if(!success || result.length == 0) - { - ffPrintError(instance, FF_PUBLICIP_MODULE_NAME, 0, &instance->config.publicIP, "Failed to receive the server response"); - return; - } - - if(instance->config.publicIP.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_PUBLICIP_MODULE_NAME, 0, &instance->config.publicIP.key); - ffStrbufPutTo(&result, stdout); - } - else - { - ffPrintFormat(instance, FF_PUBLICIP_MODULE_NAME, 0, &instance->config.publicIP, FF_PUBLICIP_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &result} - }); - } -} diff --git a/src/modules/publicip/option.h b/src/modules/publicip/option.h new file mode 100644 index 000000000..aef383fc5 --- /dev/null +++ b/src/modules/publicip/option.h @@ -0,0 +1,14 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFPublicIpOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFstrbuf url; + uint32_t timeout; +} FFPublicIpOptions; diff --git a/src/modules/publicip/publicip.c b/src/modules/publicip/publicip.c new file mode 100644 index 000000000..a1ebc8819 --- /dev/null +++ b/src/modules/publicip/publicip.c @@ -0,0 +1,137 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "common/networking.h" +#include "modules/publicip/publicip.h" + +#define FF_PUBLICIP_DISPLAY_NAME "Public IP" +#define FF_PUBLICIP_NUM_FORMAT_ARGS 1 + +static FFNetworkingState state; +static int status = -1; + +void ffPreparePublicIp(FFPublicIpOptions* options) +{ + if (options->url.length == 0) + status = ffNetworkingSendHttpRequest(&state, "ipinfo.io", "/ip", NULL); + else + { + FF_STRBUF_AUTO_DESTROY host = ffStrbufCreateCopy(&options->url); + ffStrbufSubstrAfterFirstS(&host, "://"); + uint32_t pathStartIndex = ffStrbufFirstIndexC(&host, '/'); + + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); + if(pathStartIndex != host.length) + { + ffStrbufAppendNS(&path, pathStartIndex, host.chars + (host.length - pathStartIndex)); + host.length = pathStartIndex; + host.chars[pathStartIndex] = '\0'; + } + + status = ffNetworkingSendHttpRequest(&state, host.chars, path.length == 0 ? "/" : path.chars, NULL); + } +} + +void ffPrintPublicIp(FFinstance* instance, FFPublicIpOptions* options) +{ + if (status == -1) + ffPreparePublicIp(options); + + if (status == 0) + { + ffPrintError(instance, FF_PUBLICIP_DISPLAY_NAME, 0, &options->moduleArgs, "Failed to connect to an IP detection server"); + return; + } + + FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(4096); + bool success = ffNetworkingRecvHttpResponse(&state, &result, options->timeout); + if (success) ffStrbufSubstrAfterFirstS(&result, "\r\n\r\n"); + + if (!success || result.length == 0) + { + ffPrintError(instance, FF_PUBLICIP_DISPLAY_NAME, 0, &options->moduleArgs, "Failed to receive the server response"); + return; + } + + if (options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_PUBLICIP_DISPLAY_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&result, stdout); + } + else + { + ffPrintFormat(instance, FF_PUBLICIP_DISPLAY_NAME, 0, &options->moduleArgs, FF_PUBLICIP_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &result} + }); + } +} + +void ffInitPublicIpOptions(FFPublicIpOptions* options) +{ + options->moduleName = FF_PUBLICIP_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + ffStrbufInit(&options->url); + options->timeout = 0; +} + +bool ffParsePublicIpCommandOptions(FFPublicIpOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_PUBLICIP_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "url") == 0) + { + ffOptionParseString(key, value, &options->url); + return true; + } + + if (strcasecmp(subKey, "timeout") == 0) + { + options->timeout = ffOptionParseUInt32(key, value); + return true; + } + + return false; +} + +void ffDestroyPublicIpOptions(FFPublicIpOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + + ffStrbufDestroy(&options->url); +} + +#ifdef FF_HAVE_JSONC +void ffParsePublicIpJsonObject(FFinstance* instance, json_object* module) +{ + FFPublicIpOptions __attribute__((__cleanup__(ffDestroyPublicIpOptions))) options; + ffInitPublicIpOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "url") == 0) + { + ffStrbufSetS(&options.url, json_object_get_string(val)); + continue; + } + + if (strcasecmp(key, "timeout") == 0) + { + options.timeout = (uint32_t) json_object_get_int(val); + continue; + } + + ffPrintError(instance, FF_PUBLICIP_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintPublicIp(instance, &options); +} +#endif diff --git a/src/modules/publicip/publicip.h b/src/modules/publicip/publicip.h new file mode 100644 index 000000000..2306ddcf4 --- /dev/null +++ b/src/modules/publicip/publicip.h @@ -0,0 +1,17 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_PUBLICIP_MODULE_NAME "PublicIp" + +void ffPreparePublicIp(FFPublicIpOptions* options); + +void ffPrintPublicIp(FFinstance* instance, FFPublicIpOptions* options); +void ffInitPublicIpOptions(FFPublicIpOptions* options); +bool ffParsePublicIpCommandOptions(FFPublicIpOptions* options, const char* key, const char* value); +void ffDestroyPublicIpOptions(FFPublicIpOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParsePublicIpJsonObject(FFinstance* instance, json_object* module); +#endif From db98e406c21c025c1c5b2c7235333bc311d5911f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 8 Jun 2023 11:33:33 +0800 Subject: [PATCH 68/71] Weather: add JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 9 +- src/fastfetch.c | 14 ++-- src/fastfetch.h | 10 +-- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/weather.c | 50 ------------ src/modules/weather/option.h | 14 ++++ src/modules/weather/weather.c | 122 ++++++++++++++++++++++++++++ src/modules/weather/weather.h | 17 ++++ 12 files changed, 166 insertions(+), 77 deletions(-) delete mode 100644 src/modules/weather.c create mode 100644 src/modules/weather/option.h create mode 100644 src/modules/weather/weather.c create mode 100644 src/modules/weather/weather.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d756b71e..83e9d6d53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -309,7 +309,7 @@ set(LIBFASTFETCH_SRC src/modules/users/users.c src/modules/vulkan/vulkan.c src/modules/wallpaper/wallpaper.c - src/modules/weather.c + src/modules/weather/weather.c src/modules/wifi/wifi.c src/modules/wm/wm.c src/modules/wmtheme/wmtheme.c diff --git a/src/common/init.c b/src/common/init.c index 20354358c..1437bf584 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -91,7 +91,7 @@ static void defaultConfig(FFinstance* instance) ffInitLocaleOptions(&instance->config.locale); ffInitLocalIpOptions(&instance->config.localIP); ffInitPublicIpOptions(&instance->config.publicIP); - initModuleArg(&instance->config.weather); + ffInitWeatherOptions(&instance->config.weather); ffInitWifiOptions(&instance->config.wifi); ffInitPlayerOptions(&instance->config.player); ffInitMediaOptions(&instance->config.media); @@ -132,9 +132,6 @@ static void defaultConfig(FFinstance* instance) ffStrbufInit(&instance->config.libwlanapi); ffStrbufInit(&instance->config.libnm); - instance->config.weatherTimeout = 0; - ffStrbufInitS(&instance->config.weatherOutputFormat, "%t+-+%C+(%l)"); - instance->config.percentType = 1; } @@ -306,7 +303,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyLocalIpOptions(&instance->config.localIP); ffDestroyPublicIpOptions(&instance->config.publicIP); ffDestroyWallpaperOptions(&instance->config.wallpaper); - destroyModuleArg(&instance->config.weather); + ffDestroyWeatherOptions(&instance->config.weather); ffDestroyWifiOptions(&instance->config.wifi); ffDestroyPlayerOptions(&instance->config.player); ffDestroyMediaOptions(&instance->config.media); @@ -345,8 +342,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.libPulse); ffStrbufDestroy(&instance->config.libwlanapi); ffStrbufDestroy(&instance->config.libnm); - - ffStrbufDestroy(&instance->config.weatherOutputFormat); } static void destroyState(FFinstance* instance) diff --git a/src/fastfetch.c b/src/fastfetch.c index 1744bd57c..e52b6693b 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1010,7 +1010,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseLocaleCommandOptions(&instance->config.locale, key, value)) {} else if(ffParseLocalIpCommandOptions(&instance->config.localIP, key, value)) {} else if(ffParsePublicIpCommandOptions(&instance->config.publicIP, key, value)) {} - else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {} + else if(ffParseWeatherCommandOptions(&instance->config.weather, key, value)) {} else if(ffParsePlayerCommandOptions(&instance->config.player, key, value)) {} else if(ffParseMediaCommandOptions(&instance->config.media, key, value)) {} else if(ffParseDateTimeCommandOptions(&instance->config.dateTime, key, value)) {} @@ -1088,10 +1088,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Module options// ////////////////// - else if(strcasecmp(key, "--weather-output-format") == 0) - optionParseString(key, value, &instance->config.weatherOutputFormat); - else if(strcasecmp(key, "--weather-timeout") == 0) - instance->config.weatherTimeout = optionParseUInt32(key, value); else if(strcasecmp(key, "--percent-type") == 0) instance->config.percentType = optionParseUInt32(key, value); @@ -1222,8 +1218,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintPublicIp(instance, &instance->config.publicIP); else if(strcasecmp(line, FF_WIFI_MODULE_NAME) == 0) ffPrintWifi(instance, &instance->config.wifi); - else if(strcasecmp(line, "weather") == 0) - ffPrintWeather(instance); + else if(strcasecmp(line, FF_WEATHER_MODULE_NAME) == 0) + ffPrintWeather(instance, &instance->config.weather); else if(strcasecmp(line, FF_PLAYER_MODULE_NAME) == 0) ffPrintPlayer(instance, &instance->config.player); else if(strcasecmp(line, FF_MEDIA_MODULE_NAME) == 0) @@ -1280,8 +1276,8 @@ int main(int argc, const char** argv) if(ffStrbufContainIgnCaseS(&data.structure, FF_PUBLICIP_MODULE_NAME)) ffPreparePublicIp(&instance.config.publicIP); - if(ffStrbufContainIgnCaseS(&data.structure, "Weather")) - ffPrepareWeather(&instance); + if(ffStrbufContainIgnCaseS(&data.structure, FF_WEATHER_MODULE_NAME)) + ffPrepareWeather(&instance.config.weather); } ffStart(&instance); diff --git a/src/fastfetch.h b/src/fastfetch.h index 2c159059f..1818934b6 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -84,7 +84,7 @@ typedef struct FFconfig FFLocaleOptions locale; FFLocalIpOptions localIP; FFPublicIpOptions publicIP; - FFModuleArgs weather; + FFWeatherOptions weather; FFPlayerOptions player; FFMediaOptions media; FFDateTimeOptions dateTime; @@ -123,9 +123,6 @@ typedef struct FFconfig FFstrbuf libwlanapi; FFstrbuf libnm; - FFstrbuf weatherOutputFormat; - uint32_t weatherTimeout; - uint32_t percentType; bool jsonConfig; @@ -175,15 +172,10 @@ void ffLogoBuiltinListAutocompletion(); // Module functions // ////////////////////// -//Common - -void ffPrepareWeather(FFinstance* instance); - //Printing void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintTheme(FFinstance* instance); -void ffPrintWeather(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index e00d2b48b..ffa0a9040 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -64,7 +64,7 @@ int main(int argc, char** argv) //ffPrintOpenGL(&instance, &instance.config.openGL); //ffPrintOpenCL(&instance, &instance.config.openCL); //ffPrintUsers(&instance, &instance.config.users); - //ffPrintWeather(&instance); + //ffPrintWeather(&instance, &instance.config.weather); //ffPrintBluetooth(&instance); //ffPrintSound(&instance, &instance.config.sound); //ffPrintGamepad(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index c248d0114..ba297c633 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -152,6 +152,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'W': { return tryModule(instance, type, module, FF_WALLPAPER_MODULE_NAME, ffParseWallpaperJsonObject) || + tryModule(instance, type, module, FF_WEATHER_MODULE_NAME, ffParseWeatherJsonObject) || tryModule(instance, type, module, FF_WM_MODULE_NAME, ffParseWMJsonObject) || tryModule(instance, type, module, FF_WIFI_MODULE_NAME, ffParseWifiJsonObject) || tryModule(instance, type, module, FF_WMTHEME_MODULE_NAME, ffParseWMThemeJsonObject) || diff --git a/src/modules/modules.h b/src/modules/modules.h index b28e1d1e4..c4b8af7b3 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -47,6 +47,7 @@ #include "modules/users/users.h" #include "modules/vulkan/vulkan.h" #include "modules/wallpaper/wallpaper.h" +#include "modules/weather/weather.h" #include "modules/wifi/wifi.h" #include "modules/wm/wm.h" #include "modules/wmtheme/wmtheme.h" diff --git a/src/modules/options.h b/src/modules/options.h index cfdefd52b..159f41e10 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -44,6 +44,7 @@ #include "modules/users/option.h" #include "modules/vulkan/option.h" #include "modules/wallpaper/option.h" +#include "modules/weather/option.h" #include "modules/wifi/option.h" #include "modules/wm/option.h" #include "modules/wmtheme/option.h" diff --git a/src/modules/weather.c b/src/modules/weather.c deleted file mode 100644 index f26cd4de9..000000000 --- a/src/modules/weather.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "common/networking.h" - -#define FF_WEATHER_MODULE_NAME "Weather" -#define FF_WEATHER_NUM_FORMAT_ARGS 1 - -static FFNetworkingState state; -static int status = -1; - -void ffPrepareWeather(FFinstance* instance) -{ - FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateS("/?format="); - ffStrbufAppend(&path, &instance->config.weatherOutputFormat); - status = ffNetworkingSendHttpRequest(&state, "wttr.in", path.chars, "User-Agent: curl/0.0.0\r\n"); -} - -void ffPrintWeather(FFinstance* instance) -{ - if(status == -1) - ffPrepareWeather(instance); - - if(status == 0) - { - ffPrintError(instance, FF_WEATHER_MODULE_NAME, 0, &instance->config.weather, "Failed to connect to 'wttr.in'"); - return; - } - - FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(4096); - bool success = ffNetworkingRecvHttpResponse(&state, &result, instance->config.weatherTimeout); - if (success) ffStrbufSubstrAfterFirstS(&result, "\r\n\r\n"); - - if(!success || result.length == 0) - { - ffPrintError(instance, FF_WEATHER_MODULE_NAME, 0, &instance->config.weather, "Failed to receive the server response"); - return; - } - - if(instance->config.weather.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_WEATHER_MODULE_NAME, 0, &instance->config.weather.key); - ffStrbufPutTo(&result, stdout); - } - else - { - ffPrintFormat(instance, FF_WEATHER_MODULE_NAME, 0, &instance->config.weather, FF_WEATHER_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &result} - }); - } -} diff --git a/src/modules/weather/option.h b/src/modules/weather/option.h new file mode 100644 index 000000000..d481fb6b7 --- /dev/null +++ b/src/modules/weather/option.h @@ -0,0 +1,14 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFWeatherOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFstrbuf outputFormat; + uint32_t timeout; +} FFWeatherOptions; diff --git a/src/modules/weather/weather.c b/src/modules/weather/weather.c new file mode 100644 index 000000000..579cdf1cb --- /dev/null +++ b/src/modules/weather/weather.c @@ -0,0 +1,122 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "common/networking.h" +#include "modules/weather/weather.h" + +#define FF_WEATHER_MODULE_NAME "Weather" +#define FF_WEATHER_NUM_FORMAT_ARGS 1 + +static FFNetworkingState state; +static int status = -1; + +void ffPrepareWeather(FFWeatherOptions* options) +{ + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateS("/?format="); + ffStrbufAppend(&path, &options->outputFormat); + status = ffNetworkingSendHttpRequest(&state, "wttr.in", path.chars, "User-Agent: curl/0.0.0\r\n"); +} + +void ffPrintWeather(FFinstance* instance, FFWeatherOptions* options) +{ + if(status == -1) + ffPrepareWeather(options); + + if(status == 0) + { + ffPrintError(instance, FF_WEATHER_MODULE_NAME, 0, &options->moduleArgs, "Failed to connect to 'wttr.in'"); + return; + } + + FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(4096); + bool success = ffNetworkingRecvHttpResponse(&state, &result, options->timeout); + if (success) ffStrbufSubstrAfterFirstS(&result, "\r\n\r\n"); + + if(!success || result.length == 0) + { + ffPrintError(instance, FF_WEATHER_MODULE_NAME, 0, &options->moduleArgs, "Failed to receive the server response"); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_WEATHER_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&result, stdout); + } + else + { + ffPrintFormat(instance, FF_WEATHER_MODULE_NAME, 0, &options->moduleArgs, FF_WEATHER_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &result} + }); + } +} + +void ffInitWeatherOptions(FFWeatherOptions* options) +{ + options->moduleName = FF_WEATHER_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + ffStrbufInitS(&options->outputFormat, "%t+-+%C+(%l)"); + options->timeout = 0; +} + +bool ffParseWeatherCommandOptions(FFWeatherOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_WEATHER_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "output-format") == 0) + { + ffOptionParseString(key, value, &options->outputFormat); + return true; + } + + if (strcasecmp(subKey, "timeout") == 0) + { + options->timeout = ffOptionParseUInt32(key, value); + return true; + } + + return false; +} + +void ffDestroyWeatherOptions(FFWeatherOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + + ffStrbufDestroy(&options->outputFormat); +} + +#ifdef FF_HAVE_JSONC +void ffParseWeatherJsonObject(FFinstance* instance, json_object* module) +{ + FFWeatherOptions __attribute__((__cleanup__(ffDestroyWeatherOptions))) options; + ffInitWeatherOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "outputFormat") == 0) + { + ffStrbufSetS(&options.outputFormat, json_object_get_string(val)); + continue; + } + + if (strcasecmp(key, "timeout") == 0) + { + options.timeout = (uint32_t) json_object_get_int(val); + continue; + } + + ffPrintError(instance, FF_WEATHER_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintWeather(instance, &options); +} +#endif diff --git a/src/modules/weather/weather.h b/src/modules/weather/weather.h new file mode 100644 index 000000000..476a1586d --- /dev/null +++ b/src/modules/weather/weather.h @@ -0,0 +1,17 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_WEATHER_MODULE_NAME "Weather" + +void ffPrepareWeather(FFWeatherOptions* options); + +void ffPrintWeather(FFinstance* instance, FFWeatherOptions* options); +void ffInitWeatherOptions(FFWeatherOptions* options); +bool ffParseWeatherCommandOptions(FFWeatherOptions* options, const char* key, const char* value); +void ffDestroyWeatherOptions(FFWeatherOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseWeatherJsonObject(FFinstance* instance, json_object* module); +#endif From e3ec136cad51d9fdf4ad74cb0b64917c69771ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 9 Jun 2023 08:48:46 +0800 Subject: [PATCH 69/71] Theme: add JSON config support --- 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 | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/theme.c | 30 ------------ src/modules/theme/option.h | 11 +++++ src/modules/theme/theme.c | 72 +++++++++++++++++++++++++++++ src/modules/theme/theme.h | 15 ++++++ 12 files changed, 109 insertions(+), 39 deletions(-) delete mode 100644 src/modules/theme.c create mode 100644 src/modules/theme/option.h create mode 100644 src/modules/theme/theme.c create mode 100644 src/modules/theme/theme.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 83e9d6d53..5cf008a8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -303,7 +303,7 @@ set(LIBFASTFETCH_SRC src/modules/media/media.c src/modules/terminal/terminal.c src/modules/terminalfont/terminalfont.c - src/modules/theme.c + src/modules/theme/theme.c src/modules/title/title.c src/modules/uptime/uptime.c src/modules/users/users.c diff --git a/src/common/init.c b/src/common/init.c index 1437bf584..7497b979d 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -74,7 +74,7 @@ static void defaultConfig(FFinstance* instance) ffInitDEOptions(&instance->config.de); ffInitWMOptions(&instance->config.wm); ffInitWMThemeOptions(&instance->config.wmTheme); - initModuleArg(&instance->config.theme); + ffInitThemeOptions(&instance->config.theme); ffInitIconsOptions(&instance->config.icons); ffInitFontOptions(&instance->config.font); ffInitCursorOptions(&instance->config.cursor); @@ -285,7 +285,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyDEOptions(&instance->config.de); ffDestroyWMOptions(&instance->config.wm); ffDestroyWMThemeOptions(&instance->config.wmTheme); - destroyModuleArg(&instance->config.theme); + ffDestroyThemeOptions(&instance->config.theme); ffDestroyIconsOptions(&instance->config.icons); ffDestroyFontOptions(&instance->config.font); ffDestroyCursorOptions(&instance->config.cursor); diff --git a/src/fastfetch.c b/src/fastfetch.c index e52b6693b..a59ff5468 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -992,7 +992,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseWifiCommandOptions(&instance->config.wifi, key, value)) {} else if(ffParseWMCommandOptions(&instance->config.wm, key, value)) {} else if(ffParseWMThemeCommandOptions(&instance->config.wmTheme, key, value)) {} - else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} + else if(ffParseThemeCommandOptions(&instance->config.theme, key, value)) {} else if(ffParseIconsCommandOptions(&instance->config.icons, key, value)) {} else if(ffParseWallpaperCommandOptions(&instance->config.wallpaper, key, value)) {} else if(ffParseFontCommandOptions(&instance->config.font, key, value)) {} @@ -1176,8 +1176,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintDE(instance, &instance->config.de); else if(strcasecmp(line, FF_WM_MODULE_NAME) == 0) ffPrintWM(instance, &instance->config.wm); - else if(strcasecmp(line, "theme") == 0) - ffPrintTheme(instance); + else if(strcasecmp(line, FF_THEME_MODULE_NAME) == 0) + ffPrintTheme(instance, &instance->config.theme); else if(strcasecmp(line, FF_WMTHEME_MODULE_NAME) == 0) ffPrintWMTheme(instance, &instance->config.wmTheme); else if(strcasecmp(line, FF_ICONS_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 1818934b6..557e2121a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -66,7 +66,7 @@ typedef struct FFconfig FFWifiOptions wifi; FFWMOptions wm; FFWMThemeOptions wmTheme; - FFModuleArgs theme; + FFThemeOptions theme; FFIconsOptions icons; FFFontOptions font; FFCursorOptions cursor; @@ -176,6 +176,5 @@ void ffLogoBuiltinListAutocompletion(); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); -void ffPrintTheme(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index ffa0a9040..0aad4532c 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -37,7 +37,7 @@ int main(int argc, char** argv) ffPrintDE(&instance, &instance.config.de); ffPrintWM(&instance, &instance.config.wm); ffPrintWMTheme(&instance, &instance.config.wmTheme); - ffPrintTheme(&instance); + ffPrintTheme(&instance, &instance.config.theme); ffPrintIcons(&instance, &instance.config.icons); ffPrintFont(&instance, &instance.config.font); ffPrintCursor(&instance, &instance.config.cursor); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index ba297c633..aca52158d 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -133,6 +133,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o tryModule(instance, type, module, FF_TERMINAL_MODULE_NAME, ffParseTerminalJsonObject) || tryModule(instance, type, module, FF_TERMINALFONT_MODULE_NAME, ffParseTerminalFontJsonObject) || tryModule(instance, type, module, FF_TITLE_MODULE_NAME, ffParseTitleJsonObject) || + tryModule(instance, type, module, FF_THEME_MODULE_NAME, ffParseThemeJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index c4b8af7b3..3c9b98c3c 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -41,6 +41,7 @@ #include "modules/swap/swap.h" #include "modules/terminal/terminal.h" #include "modules/terminalfont/terminalfont.h" +#include "modules/theme/theme.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 159f41e10..392a6f1fa 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -39,6 +39,7 @@ #include "modules/swap/option.h" #include "modules/terminal/option.h" #include "modules/terminalfont/option.h" +#include "modules/theme/option.h" #include "modules/title/option.h" #include "modules/uptime/option.h" #include "modules/users/option.h" diff --git a/src/modules/theme.c b/src/modules/theme.c deleted file mode 100644 index b89f093d4..000000000 --- a/src/modules/theme.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/theme/theme.h" - -#define FF_THEME_MODULE_NAME "Theme" -#define FF_THEME_NUM_FORMAT_ARGS 1 - -void ffPrintTheme(FFinstance* instance) -{ - FF_STRBUF_AUTO_DESTROY theme; - ffStrbufInit(&theme); - const char* error = ffDetectTheme(instance, &theme); - if (error) - { - ffPrintError(instance, FF_THEME_MODULE_NAME, 0, &instance->config.theme, "%s", error); - return; - } - - if(instance->config.theme.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_THEME_MODULE_NAME, 0, &instance->config.theme.key); - ffStrbufPutTo(&theme, stdout); - } - else - { - ffPrintFormat(instance, FF_THEME_MODULE_NAME, 0, &instance->config.theme, FF_THEME_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &theme} - }); - } -} diff --git a/src/modules/theme/option.h b/src/modules/theme/option.h new file mode 100644 index 000000000..f322c3a62 --- /dev/null +++ b/src/modules/theme/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 FFThemeOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFThemeOptions; diff --git a/src/modules/theme/theme.c b/src/modules/theme/theme.c new file mode 100644 index 000000000..bb348e10e --- /dev/null +++ b/src/modules/theme/theme.c @@ -0,0 +1,72 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/theme/theme.h" +#include "modules/theme/theme.h" + +#define FF_THEME_NUM_FORMAT_ARGS 1 + +void ffPrintTheme(FFinstance* instance, FFThemeOptions* options) +{ + FF_STRBUF_AUTO_DESTROY theme = ffStrbufCreate(); + const char* error = ffDetectTheme(instance, &theme); + + if(error) + { + ffPrintError(instance, FF_THEME_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_THEME_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&theme, stdout); + } + else + { + ffPrintFormat(instance, FF_THEME_MODULE_NAME, 0, &options->moduleArgs, FF_THEME_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &theme} + }); + } +} + +void ffInitThemeOptions(FFThemeOptions* options) +{ + options->moduleName = FF_THEME_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseThemeCommandOptions(FFThemeOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_THEME_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyThemeOptions(FFThemeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseThemeJsonObject(FFinstance* instance, json_object* module) +{ + FFThemeOptions __attribute__((__cleanup__(ffDestroyThemeOptions))) options; + ffInitThemeOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_THEME_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintTheme(instance, &options); +} +#endif diff --git a/src/modules/theme/theme.h b/src/modules/theme/theme.h new file mode 100644 index 000000000..3c13ca467 --- /dev/null +++ b/src/modules/theme/theme.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_THEME_MODULE_NAME "Theme" + +void ffPrintTheme(FFinstance* instance, FFThemeOptions* options); +void ffInitThemeOptions(FFThemeOptions* options); +bool ffParseThemeCommandOptions(FFThemeOptions* options, const char* key, const char* value); +void ffDestroyThemeOptions(FFThemeOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseThemeJsonObject(FFinstance* instance, json_object* module); +#endif From 0021219f421496d59aefa922cb1a39f349019b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 9 Jun 2023 10:08:04 +0800 Subject: [PATCH 70/71] Chassis: add JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 6 +- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/chassis.c | 50 ---------------- src/modules/chassis/chassis.c | 92 +++++++++++++++++++++++++++++ src/modules/chassis/chassis.h | 15 +++++ src/modules/chassis/option.h | 11 ++++ src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 129 insertions(+), 59 deletions(-) delete mode 100644 src/modules/chassis.c create mode 100644 src/modules/chassis/chassis.c create mode 100644 src/modules/chassis/chassis.h create mode 100644 src/modules/chassis/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cf008a8b..9f4e26ad0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -268,7 +268,7 @@ set(LIBFASTFETCH_SRC src/modules/board/board.c src/modules/brightness/brightness.c src/modules/break/break.c - src/modules/chassis.c + src/modules/chassis/chassis.c src/modules/colors/colors.c src/modules/cpu/cpu.c src/modules/cpuusage/cpuusage.c diff --git a/src/common/init.c b/src/common/init.c index 7497b979d..e800a685d 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -62,7 +62,7 @@ static void defaultConfig(FFinstance* instance) ffInitBiosOptions(&instance->config.bios); ffInitBoardOptions(&instance->config.board); ffInitBrightnessOptions(&instance->config.brightness); - initModuleArg(&instance->config.chassis); + ffInitChassisOptions(&instance->config.chassis); ffInitCommandOptions(&instance->config.command); ffInitCustomOptions(&instance->config.custom); ffInitKernelOptions(&instance->config.kernel); @@ -273,7 +273,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyBiosOptions(&instance->config.bios); ffDestroyBoardOptions(&instance->config.board); ffDestroyBrightnessOptions(&instance->config.brightness); - destroyModuleArg(&instance->config.chassis); + ffDestroyChassisOptions(&instance->config.chassis); ffDestroyCommandOptions(&instance->config.command); ffDestroyCustomOptions(&instance->config.custom); ffDestroyKernelOptions(&instance->config.kernel); diff --git a/src/fastfetch.c b/src/fastfetch.c index a59ff5468..345852989 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -978,7 +978,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseOSCommandOptions(&instance->config.os, key, value)) {} else if(ffParseBiosCommandOptions(&instance->config.bios, key, value)) {} else if(ffParseBoardCommandOptions(&instance->config.board, key, value)) {} - else if(optionParseModuleArgs(key, value, "chassis", &instance->config.chassis)) {} + else if(ffParseChassisCommandOptions(&instance->config.chassis, key, value)) {} else if(ffParseCommandCommandOptions(&instance->config.command, key, value)) {} else if(ffParseCustomCommandOptions(&instance->config.custom, key, value)) {} else if(ffParseKernelCommandOptions(&instance->config.kernel, key, value)) {} @@ -1158,8 +1158,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintBoard(instance, &instance->config.board); else if(strcasecmp(line, FF_BRIGHTNESS_MODULE_NAME) == 0) ffPrintBrightness(instance, &instance->config.brightness); - else if(strcasecmp(line, "chassis") == 0) - ffPrintChassis(instance); + else if(strcasecmp(line, FF_CHASSIS_MODULE_NAME) == 0) + ffPrintChassis(instance, &instance->config.chassis); else if(strcasecmp(line, FF_KERNEL_MODULE_NAME) == 0) ffPrintKernel(instance, &instance->config.kernel); else if(strcasecmp(line, "processes") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 557e2121a..2a6b5b350 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -53,7 +53,7 @@ typedef struct FFconfig FFBiosOptions bios; FFBoardOptions board; FFBrightnessOptions brightness; - FFModuleArgs chassis; + FFChassisOptions chassis; FFCommandOptions command; FFKernelOptions kernel; FFUptimeOptions uptime; @@ -174,7 +174,6 @@ void ffLogoBuiltinListAutocompletion(); //Printing -void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index 0aad4532c..e6358c03f 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -26,7 +26,7 @@ int main(int argc, char** argv) ffPrintHost(&instance, &instance.config.host); //ffPrintBios(&instance, &instance.config.bios); //ffPrintBoard(&instance, &instance.config.board); - //ffPrintChassis(&instance); + //ffPrintChassis(&instance, &instance.config.chassis); ffPrintKernel(&instance, &instance.config.kernel); //ffPrintProcesses(&instance); ffPrintUptime(&instance, &instance.config.uptime); diff --git a/src/modules/chassis.c b/src/modules/chassis.c deleted file mode 100644 index 4932ecc69..000000000 --- a/src/modules/chassis.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/chassis/chassis.h" - -#define FF_CHASSIS_MODULE_NAME "Chassis" -#define FF_CHASSIS_NUM_FORMAT_ARGS 3 - -void ffPrintChassis(FFinstance* instance) -{ - FFChassisResult result; - ffDetectChassis(&result); - - if(result.error.length > 0) - { - ffPrintError(instance, FF_CHASSIS_MODULE_NAME, 0, &instance->config.chassis, "%*s", result.error.length, result.error.chars); - goto exit; - } - - if(result.chassisType.length == 0) - { - ffPrintError(instance, FF_CHASSIS_MODULE_NAME, 0, &instance->config.chassis, "chassis_type is not set by O.E.M."); - return; - } - - if(instance->config.chassis.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_CHASSIS_MODULE_NAME, 0, &instance->config.chassis.key); - - FF_STRBUF_AUTO_DESTROY output = ffStrbufCreateCopy(&result.chassisType); - - if(result.chassisVersion.length > 0) - ffStrbufAppendF(&output, " (%s)", result.chassisVersion.chars); - - ffStrbufPutTo(&output, stdout); - } - else - { - ffPrintFormat(instance, FF_CHASSIS_MODULE_NAME, 0, &instance->config.chassis, FF_CHASSIS_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &result.chassisType}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.chassisVendor}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.chassisVersion}, - }); - } - -exit: - ffStrbufDestroy(&result.chassisType); - ffStrbufDestroy(&result.chassisVendor); - ffStrbufDestroy(&result.chassisVersion); - ffStrbufDestroy(&result.error); -} diff --git a/src/modules/chassis/chassis.c b/src/modules/chassis/chassis.c new file mode 100644 index 000000000..72beac3c0 --- /dev/null +++ b/src/modules/chassis/chassis.c @@ -0,0 +1,92 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/chassis/chassis.h" +#include "modules/chassis/chassis.h" + +#define FF_CHASSIS_NUM_FORMAT_ARGS 3 + +void ffPrintChassis(FFinstance* instance, FFChassisOptions* options) +{ + FFChassisResult result; + ffDetectChassis(&result); + + if(result.error.length > 0) + { + ffPrintError(instance, FF_CHASSIS_MODULE_NAME, 0, &options->moduleArgs, "%*s", result.error.length, result.error.chars); + goto exit; + } + + if(result.chassisType.length == 0) + { + ffPrintError(instance, FF_CHASSIS_MODULE_NAME, 0, &options->moduleArgs, "chassis_type is not set by O.E.M."); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_CHASSIS_MODULE_NAME, 0, &options->moduleArgs.key); + + FF_STRBUF_AUTO_DESTROY output = ffStrbufCreateCopy(&result.chassisType); + + if(result.chassisVersion.length > 0) + ffStrbufAppendF(&output, " (%s)", result.chassisVersion.chars); + + ffStrbufPutTo(&output, stdout); + } + else + { + ffPrintFormat(instance, FF_CHASSIS_MODULE_NAME, 0, &options->moduleArgs, FF_CHASSIS_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &result.chassisType}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.chassisVendor}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.chassisVersion}, + }); + } + +exit: + ffStrbufDestroy(&result.chassisType); + ffStrbufDestroy(&result.chassisVendor); + ffStrbufDestroy(&result.chassisVersion); + ffStrbufDestroy(&result.error); +} + +void ffInitChassisOptions(FFChassisOptions* options) +{ + options->moduleName = FF_CHASSIS_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseChassisCommandOptions(FFChassisOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_CHASSIS_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyChassisOptions(FFChassisOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseChassisJsonObject(FFinstance* instance, json_object* module) +{ + FFChassisOptions __attribute__((__cleanup__(ffDestroyChassisOptions))) options; + ffInitChassisOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_CHASSIS_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintChassis(instance, &options); +} +#endif diff --git a/src/modules/chassis/chassis.h b/src/modules/chassis/chassis.h new file mode 100644 index 000000000..2eb9af900 --- /dev/null +++ b/src/modules/chassis/chassis.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_CHASSIS_MODULE_NAME "Chassis" + +void ffPrintChassis(FFinstance* instance, FFChassisOptions* options); +void ffInitChassisOptions(FFChassisOptions* options); +bool ffParseChassisCommandOptions(FFChassisOptions* options, const char* key, const char* value); +void ffDestroyChassisOptions(FFChassisOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseChassisJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/chassis/option.h b/src/modules/chassis/option.h new file mode 100644 index 000000000..939fd165d --- /dev/null +++ b/src/modules/chassis/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 FFChassisOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFChassisOptions; diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index aca52158d..fa17afb29 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -39,6 +39,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'C': { return + tryModule(instance, type, module, FF_CHASSIS_MODULE_NAME, ffParseChassisJsonObject) || tryModule(instance, type, module, FF_CPU_MODULE_NAME, ffParseCPUJsonObject) || tryModule(instance, type, module, FF_CPUUSAGE_MODULE_NAME, ffParseCPUUsageJsonObject) || tryModule(instance, type, module, FF_COMMAND_MODULE_NAME, ffParseCommandJsonObject) || diff --git a/src/modules/modules.h b/src/modules/modules.h index 3c9b98c3c..fac24537f 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -8,6 +8,7 @@ #include "modules/brightness/brightness.h" #include "modules/board/board.h" #include "modules/break/break.h" +#include "modules/chassis/chassis.h" #include "modules/cpu/cpu.h" #include "modules/cpuusage/cpuusage.h" #include "modules/command/command.h" diff --git a/src/modules/options.h b/src/modules/options.h index 392a6f1fa..62b53f4da 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -7,6 +7,7 @@ #include "modules/bluetooth/option.h" #include "modules/board/option.h" #include "modules/brightness/option.h" +#include "modules/chassis/option.h" #include "modules/cpu/option.h" #include "modules/cpuusage/option.h" #include "modules/cursor/option.h" From 3227eee0800ca57d10a6ef89ed029a4b9bee5a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 9 Jun 2023 10:24:20 +0800 Subject: [PATCH 71/71] Processes: add JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 18 +------ src/fastfetch.c | 40 ++-------------- src/fastfetch.h | 10 +--- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/modules.h | 1 + src/modules/options.h | 1 + src/modules/processes.c | 31 ------------ src/modules/processes/option.h | 11 +++++ src/modules/processes/processes.c | 73 +++++++++++++++++++++++++++++ src/modules/processes/processes.h | 15 ++++++ 12 files changed, 110 insertions(+), 95 deletions(-) delete mode 100644 src/modules/processes.c create mode 100644 src/modules/processes/option.h create mode 100644 src/modules/processes/processes.c create mode 100644 src/modules/processes/processes.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f4e26ad0..1ee8d861c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -291,7 +291,7 @@ set(LIBFASTFETCH_SRC src/modules/opengl/opengl.c src/modules/os/os.c src/modules/packages/packages.c - src/modules/processes.c + src/modules/processes/processes.c src/modules/player/player.c src/modules/poweradapter/poweradapter.c src/modules/publicip/publicip.c diff --git a/src/common/init.c b/src/common/init.c index e800a685d..d478d518e 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -28,13 +28,6 @@ static void initState(FFstate* state) ffPlatformInit(&state->platform); } -static void initModuleArg(FFModuleArgs* args) -{ - ffStrbufInit(&args->key); - ffStrbufInit(&args->outputFormat); - ffStrbufInit(&args->errorFormat); -} - static void defaultConfig(FFinstance* instance) { ffInitLogoOptions(&instance->config.logo); @@ -67,7 +60,7 @@ static void defaultConfig(FFinstance* instance) ffInitCustomOptions(&instance->config.custom); ffInitKernelOptions(&instance->config.kernel); ffInitUptimeOptions(&instance->config.uptime); - initModuleArg(&instance->config.processes); + ffInitProcessesOptions(&instance->config.processes); ffInitPackagesOptions(&instance->config.packages); ffInitShellOptions(&instance->config.shell); ffInitDisplayOptions(&instance->config.display); @@ -252,13 +245,6 @@ void ffFinish(FFinstance* instance) resetConsole(); } -static void destroyModuleArg(FFModuleArgs* args) -{ - ffStrbufDestroy(&args->key); - ffStrbufDestroy(&args->outputFormat); - ffStrbufDestroy(&args->errorFormat); -} - static void destroyConfig(FFinstance* instance) { ffDestroyLogoOptions(&instance->config.logo); @@ -278,7 +264,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyCustomOptions(&instance->config.custom); ffDestroyKernelOptions(&instance->config.kernel); ffDestroyUptimeOptions(&instance->config.uptime); - destroyModuleArg(&instance->config.processes); + ffDestroyProcessesOptions(&instance->config.processes); ffDestroyPackagesOptions(&instance->config.packages); ffDestroyShellOptions(&instance->config.shell); ffDestroyDisplayOptions(&instance->config.display); diff --git a/src/fastfetch.c b/src/fastfetch.c index 345852989..66c5ae5b5 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -746,40 +746,6 @@ static void optionParseEnum(const char* argumentKey, const char* requestedKey, v exit(478); } -static bool optionParseModuleArgs(const char* argumentKey, const char* value, const char* moduleName, struct FFModuleArgs* result) -{ - const char* pkey = argumentKey; - if(!(pkey[0] == '-' && pkey[1] == '-')) - return false; - - pkey += 2; - uint32_t moduleNameLen = (uint32_t)strlen(moduleName); - if(strncasecmp(pkey, moduleName, moduleNameLen) != 0) - return false; - - pkey += moduleNameLen; - if(pkey[0] != '-') - return false; - - pkey += 1; - if(strcasecmp(pkey, "key") == 0) - { - optionParseString(argumentKey, value, &result->key); - return true; - } - else if(strcasecmp(pkey, "format") == 0) - { - optionParseString(argumentKey, value, &result->outputFormat); - return true; - } - else if(strcasecmp(pkey, "error") == 0) - { - optionParseString(argumentKey, value, &result->errorFormat); - return true; - } - return false; -} - static void parseOption(FFinstance* instance, FFdata* data, const char* key, const char* value) { /////////////////////// @@ -983,7 +949,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseCustomCommandOptions(&instance->config.custom, key, value)) {} 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(ffParseProcessesCommandOptions(&instance->config.processes, key, value)) {} else if(ffParsePackagesCommandOptions(&instance->config.packages, key, value)) {} else if(ffParseShellCommandOptions(&instance->config.shell, key, value)) {} else if(ffParseDisplayCommandOptions(&instance->config.display, key, value)) {} @@ -1162,8 +1128,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintChassis(instance, &instance->config.chassis); else if(strcasecmp(line, FF_KERNEL_MODULE_NAME) == 0) ffPrintKernel(instance, &instance->config.kernel); - else if(strcasecmp(line, "processes") == 0) - ffPrintProcesses(instance); + else if(strcasecmp(line, FF_PROCESSES_MODULE_NAME) == 0) + ffPrintProcesses(instance, &instance->config.processes); else if(strcasecmp(line, FF_UPTIME_MODULE_NAME) == 0) ffPrintUptime(instance, &instance->config.uptime); else if(strcasecmp(line, FF_PACKAGES_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 2a6b5b350..68506ede7 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -57,7 +57,7 @@ typedef struct FFconfig FFCommandOptions command; FFKernelOptions kernel; FFUptimeOptions uptime; - FFModuleArgs processes; + FFProcessesOptions processes; FFPackagesOptions packages; FFShellOptions shell; FFDisplayOptions display; @@ -168,12 +168,4 @@ void ffLogoBuiltinPrint(FFinstance* instance); void ffLogoBuiltinList(); void ffLogoBuiltinListAutocompletion(); -////////////////////// -// Module functions // -////////////////////// - -//Printing - -void ffPrintProcesses(FFinstance* instance); - #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index e6358c03f..d09a7c2f4 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -28,7 +28,7 @@ int main(int argc, char** argv) //ffPrintBoard(&instance, &instance.config.board); //ffPrintChassis(&instance, &instance.config.chassis); ffPrintKernel(&instance, &instance.config.kernel); - //ffPrintProcesses(&instance); + //ffPrintProcesses(&instance, &instance.config.processes); ffPrintUptime(&instance, &instance.config.uptime); ffPrintPackages(&instance, &instance.config.packages); ffPrintShell(&instance, &instance.config.shell); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index fa17afb29..c9f4b6efc 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -116,6 +116,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o tryModule(instance, type, module, FF_PACKAGES_MODULE_NAME, ffParsePackagesJsonObject) || tryModule(instance, type, module, FF_PLAYER_MODULE_NAME, ffParsePlayerJsonObject) || tryModule(instance, type, module, FF_POWERADAPTER_MODULE_NAME, ffParsePowerAdapterJsonObject) || + tryModule(instance, type, module, FF_PROCESSES_MODULE_NAME, ffParseProcessesJsonObject) || tryModule(instance, type, module, FF_PUBLICIP_MODULE_NAME, ffParsePublicIpJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index fac24537f..99a2130e3 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -35,6 +35,7 @@ #include "modules/packages/packages.h" #include "modules/player/player.h" #include "modules/poweradapter/poweradapter.h" +#include "modules/processes/processes.h" #include "modules/publicip/publicip.h" #include "modules/separator/separator.h" #include "modules/shell/shell.h" diff --git a/src/modules/options.h b/src/modules/options.h index 62b53f4da..f9ae625b9 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -33,6 +33,7 @@ #include "modules/packages/option.h" #include "modules/player/option.h" #include "modules/poweradapter/option.h" +#include "modules/processes/option.h" #include "modules/publicip/option.h" #include "modules/separator/option.h" #include "modules/shell/option.h" diff --git a/src/modules/processes.c b/src/modules/processes.c deleted file mode 100644 index 70a64ad83..000000000 --- a/src/modules/processes.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/processes/processes.h" - -#define FF_PROCESSES_MODULE_NAME "Processes" -#define FF_PROCESSES_NUM_FORMAT_ARGS 1 - -void ffPrintProcesses(FFinstance* instance) -{ - uint32_t numProcesses = 0; - const char* error = ffDetectProcesses(&numProcesses); - - if(error) - { - ffPrintError(instance, FF_PROCESSES_MODULE_NAME, 0, &instance->config.processes, "%s", error); - return; - } - - if(instance->config.processes.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_PROCESSES_MODULE_NAME, 0, &instance->config.processes.key); - - printf("%u\n", numProcesses); - } - else - { - ffPrintFormat(instance, FF_PROCESSES_MODULE_NAME, 0, &instance->config.processes, FF_PROCESSES_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_UINT, &numProcesses} - }); - } -} diff --git a/src/modules/processes/option.h b/src/modules/processes/option.h new file mode 100644 index 000000000..9d2cd8086 --- /dev/null +++ b/src/modules/processes/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 FFProcessesOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFProcessesOptions; diff --git a/src/modules/processes/processes.c b/src/modules/processes/processes.c new file mode 100644 index 000000000..719bb45f5 --- /dev/null +++ b/src/modules/processes/processes.c @@ -0,0 +1,73 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/processes/processes.h" +#include "modules/processes/processes.h" + +#define FF_PROCESSES_NUM_FORMAT_ARGS 1 + +void ffPrintProcesses(FFinstance* instance, FFProcessesOptions* options) +{ + uint32_t numProcesses = 0; + const char* error = ffDetectProcesses(&numProcesses); + + if(error) + { + ffPrintError(instance, FF_PROCESSES_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_PROCESSES_MODULE_NAME, 0, &options->moduleArgs.key); + + printf("%u\n", numProcesses); + } + else + { + ffPrintFormat(instance, FF_PROCESSES_MODULE_NAME, 0, &options->moduleArgs, FF_PROCESSES_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_UINT, &numProcesses} + }); + } +} + +void ffInitProcessesOptions(FFProcessesOptions* options) +{ + options->moduleName = FF_PROCESSES_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseProcessesCommandOptions(FFProcessesOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_PROCESSES_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyProcessesOptions(FFProcessesOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseProcessesJsonObject(FFinstance* instance, json_object* module) +{ + FFProcessesOptions __attribute__((__cleanup__(ffDestroyProcessesOptions))) options; + ffInitProcessesOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_PROCESSES_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintProcesses(instance, &options); +} +#endif diff --git a/src/modules/processes/processes.h b/src/modules/processes/processes.h new file mode 100644 index 000000000..34abb7ef8 --- /dev/null +++ b/src/modules/processes/processes.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_PROCESSES_MODULE_NAME "Processes" + +void ffPrintProcesses(FFinstance* instance, FFProcessesOptions* options); +void ffInitProcessesOptions(FFProcessesOptions* options); +bool ffParseProcessesCommandOptions(FFProcessesOptions* options, const char* key, const char* value); +void ffDestroyProcessesOptions(FFProcessesOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseProcessesJsonObject(FFinstance* instance, json_object* module); +#endif