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"