diff --git a/src/common/init.c b/src/common/init.c index 9daab5da8..0ef3b700b 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -72,6 +72,7 @@ static void initConfigDirs(FFstate* state) startIndex = colonIndex + 1; } + ffStrbufDestroy(&xdgConfigDirs); FFstrbuf* systemConfigHome = ffListAdd(&state->configDirs); ffStrbufInitA(systemConfigHome, 64); @@ -183,6 +184,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.swap); initModuleArg(&instance->config.disk); initModuleArg(&instance->config.battery); + initModuleArg(&instance->config.powerAdapter); initModuleArg(&instance->config.locale); initModuleArg(&instance->config.localIP); initModuleArg(&instance->config.publicIP); @@ -381,6 +383,17 @@ void ffFinish(FFinstance* instance) ffLogoPrintRemaining(instance); resetConsole(); + + for(uint32_t i = 0; i < instance->state.configDirs.length; ++i) + ffStrbufDestroy((FFstrbuf*)ffListGet(&instance->state.configDirs, i)); + ffListDestroy(&instance->state.configDirs); + ffStrbufDestroy(&instance->state.cacheDir); + for(uint8_t i = 0; i < (uint8_t) FASTFETCH_LOGO_MAX_COLORS; ++i) + ffStrbufDestroy(&instance->config.logo.colors[i]); + ffStrbufDestroy(&instance->config.colorKeys); + ffStrbufDestroy(&instance->config.colorTitle); + ffStrbufDestroy(&instance->config.separator); + ffStrbufDestroy(&instance->config.logo.source); } //Must be in a file compiled with the libfastfetch target, because the FF_HAVE* macros are not defined for the executable targets diff --git a/src/detection/battery/battery.h b/src/detection/battery/battery.h index e7c2a859a..f1d6c6c28 100644 --- a/src/detection/battery/battery.h +++ b/src/detection/battery/battery.h @@ -12,6 +12,8 @@ typedef struct BatteryResult FFstrbuf technology; FFstrbuf capacity; FFstrbuf status; + FFstrbuf adapterName; + int adapterWatts; } BatteryResult; const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results); diff --git a/src/detection/battery/battery_apple.c b/src/detection/battery/battery_apple.c index 8fa956c77..f918b075f 100644 --- a/src/detection/battery/battery_apple.c +++ b/src/detection/battery/battery_apple.c @@ -69,6 +69,16 @@ const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) else ffStrbufAppendS(&battery->status, ""); + ffStrbufInit(&battery->adapterName); + battery->adapterWatts = -1; + + CFDictionaryRef adapter; + if(!ffCfDictGetDict(properties, CFSTR("AdapterDetails"), &adapter)) + { + ffCfDictGetInt(adapter, CFSTR("Watts"), &battery->adapterWatts); + ffCfDictGetString(adapter, CFSTR("Name"), &battery->adapterName); + } + CFRelease(properties); IOObjectRelease(registryEntry); } diff --git a/src/detection/battery/battery_linux.c b/src/detection/battery/battery_linux.c index 909ed493f..d3de381b4 100644 --- a/src/detection/battery/battery_linux.c +++ b/src/detection/battery/battery_linux.c @@ -70,6 +70,9 @@ static void parseBattery(FFstrbuf* dir, FFlist* results) ffStrbufAppendS(dir, "/status"); ffReadFileBuffer(dir->chars, &result->status); ffStrbufSubstrBefore(dir, dirLength); + + ffStrbufInitA(&result->adapterName, 0); + result->adapterWatts = -1; } const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) { diff --git a/src/fastfetch.c b/src/fastfetch.c index e27d12799..be259a70b 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1117,6 +1117,12 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseString(key, value, &instance->config.battery.outputFormat); else if(strcasecmp(key, "--battery-error") == 0) optionParseString(key, value, &instance->config.battery.errorFormat); + else if(strcasecmp(key, "--power-adapter-key") == 0) + optionParseString(key, value, &instance->config.powerAdapter.key); + else if(strcasecmp(key, "--power-adapter-format") == 0) + optionParseString(key, value, &instance->config.powerAdapter.outputFormat); + else if(strcasecmp(key, "--power-adapter-error") == 0) + optionParseString(key, value, &instance->config.powerAdapter.errorFormat); else if(strcasecmp(key, "--locale-key") == 0) optionParseString(key, value, &instance->config.locale.key); else if(strcasecmp(key, "--locale-format") == 0) @@ -1442,6 +1448,8 @@ int main(int argc, const char** argv) startIndex = colonIndex + 1; } + ffStrbufDestroy(&data.structure); + ffValuestoreDestroy(&data.customValues); ffFinish(&instance); } diff --git a/src/fastfetch.h b/src/fastfetch.h index 84187d576..837d49df7 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -116,6 +116,7 @@ typedef struct FFconfig FFModuleArgs swap; FFModuleArgs disk; FFModuleArgs battery; + FFModuleArgs powerAdapter; FFModuleArgs locale; FFModuleArgs localIP; FFModuleArgs publicIP; diff --git a/src/modules/battery.c b/src/modules/battery.c index 8900ef2ec..4c1a46f92 100644 --- a/src/modules/battery.c +++ b/src/modules/battery.c @@ -5,6 +5,9 @@ #define FF_BATTERY_MODULE_NAME "Battery" #define FF_BATTERY_NUM_FORMAT_ARGS 5 +#define FF_POWER_ADAPTER_MODULE_NAME "Power Adapter" +#define FF_POWER_ADAPTER_MODULE_ARGS 2 + static void printBattery(FFinstance* instance, const BatteryResult* result, uint8_t index) { if(instance->config.battery.outputFormat.length == 0) @@ -44,6 +47,26 @@ static void printBattery(FFinstance* instance, const BatteryResult* result, uint {FF_FORMAT_ARG_TYPE_STRBUF, &result->status} }); } + + if(result->adapterWatts != -1) + { + if(instance->config.powerAdapter.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_POWER_ADAPTER_MODULE_NAME, index, &instance->config.powerAdapter.key); + + if(result->adapterName.length > 0) + puts(result->adapterName.chars); + else + printf("%dW\n", result->adapterWatts); + } + else + { + ffPrintFormat(instance, FF_POWER_ADAPTER_MODULE_NAME, index, &instance->config.powerAdapter, FF_POWER_ADAPTER_MODULE_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_INT, &result->adapterWatts}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->adapterName}, + }); + } + } } void ffPrintBattery(FFinstance* instance) diff --git a/src/modules/locale.c b/src/modules/locale.c index 444ed5a11..1d1c27456 100644 --- a/src/modules/locale.c +++ b/src/modules/locale.c @@ -6,6 +6,7 @@ #include "common/parsing.h" #include +#include #define FF_LOCALE_MODULE_NAME "Locale" #define FF_LOCALE_NUM_FORMAT_ARGS 1 @@ -25,27 +26,11 @@ static void getLocaleFromEnv(FFstrbuf* locale) static void getLocaleFromCmd(FFstrbuf* locale) { - FFstrbuf buffer; - ffStrbufInitA(&buffer, 0); - char* args[] = { "locale", NULL }; - if(ffProcessAppendStdOut(&buffer, args) == NULL) - { - ffParsePropLines(buffer.chars, "LANG=\"", locale); - ffStrbufTrimRight(locale, '"'); + ffStrbufAppendS(locale, setlocale(LC_ALL, NULL)); + if(locale->length > 0) + return; - if(locale->length == 0) - { - ffParsePropLines(buffer.chars, "LC_ALL=\"", locale); - ffStrbufTrimRight(locale, '"'); - - if(locale->length == 0) - { - ffParsePropLines(buffer.chars, "LC_MESSAGES=\"", locale); - ffStrbufTrimRight(locale, '"'); - } - } - } - ffStrbufDestroy(&buffer); + ffStrbufAppendS(locale, setlocale(LC_MESSAGES, NULL)); } void ffPrintLocale(FFinstance* instance) diff --git a/src/modules/publicip.c b/src/modules/publicip.c index aacb0537c..4ff5e59b4 100644 --- a/src/modules/publicip.c +++ b/src/modules/publicip.c @@ -15,6 +15,7 @@ void ffPrintPublicIp(FFinstance* instance) if(result.length == 0) { ffPrintError(instance, FF_PUBLICIP_MODULE_NAME, 0, &instance->config.publicIP, "Failed to connect to an IP detection server"); + ffStrbufDestroy(&result); return; } @@ -29,4 +30,6 @@ void ffPrintPublicIp(FFinstance* instance) {FF_FORMAT_ARG_TYPE_STRBUF, &result} }); } + + ffStrbufDestroy(&result); } diff --git a/src/util/apple/cf_helpers.c b/src/util/apple/cf_helpers.c index 574ce92d3..32acc486c 100644 --- a/src/util/apple/cf_helpers.c +++ b/src/util/apple/cf_helpers.c @@ -57,3 +57,13 @@ const char* ffCfDictGetInt(CFDictionaryRef dict, CFStringRef key, int* result) return "Number type is not SInt32"; return NULL; } + +const char* ffCfDictGetDict(CFDictionaryRef dict, CFStringRef key, CFDictionaryRef* result) +{ + CFDictionaryRef cf = (CFDictionaryRef)CFDictionaryGetValue(dict, key); + if (cf == NULL || CFGetTypeID(cf) != CFDictionaryGetTypeID()) + return "TypeID is not 'CFDictionary'"; + + *result = cf; + return NULL; +} diff --git a/src/util/apple/cf_helpers.h b/src/util/apple/cf_helpers.h index 49aa405f9..d3cb66d43 100644 --- a/src/util/apple/cf_helpers.h +++ b/src/util/apple/cf_helpers.h @@ -11,5 +11,6 @@ const char* ffCfStrGetString(CFStringRef str, FFstrbuf* result); const char* ffCfDictGetString(CFDictionaryRef dict, CFStringRef key, FFstrbuf* result); const char* ffCfDictGetBool(CFDictionaryRef dict, CFStringRef key, bool* result); const char* ffCfDictGetInt(CFDictionaryRef dict, CFStringRef key, int* result); +const char* ffCfDictGetDict(CFDictionaryRef dict, CFStringRef key, CFDictionaryRef* result); #endif