Merge pull request #251 from CarterLi/master

PowerAdapter: make it a seperated module ( macOS )
This commit is contained in:
Linus Dierheimer
2022-09-23 10:46:56 +02:00
committed by GitHub
21 changed files with 192 additions and 44 deletions
+3
View File
@@ -209,6 +209,7 @@
#--swap-key Swap
#--disk-key Disk ({1})
#--battery-key Battery {1}
#--poweradapter-key Power Adapter {1}
#--locale-key Locale
#--local-ip-key Local IP ({1})
#--public-ip-key Public IP
@@ -248,6 +249,7 @@
#--swap-format
#--disk-format
#--battery-format
#--poweradapter-format
#--locale-format
#--local-ip-format
#--public-ip-format
@@ -287,6 +289,7 @@
#--swap-error
#--disk-error
#--battery-error
#--poweradapter-error
#--locale-error
#--local-ip-error
#--public-ip-error
+1
View File
@@ -24,6 +24,7 @@ Packages
Player
Processes
PublicIP
PowerAdapter
Resolution
Separator
Shell
+1 -1
View File
@@ -1 +1 @@
Title:Separator:OS:Host:Kernel:Uptime:Packages:Shell:Resolution:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:GPU:Memory:Disk:Battery:Locale:Break:Colors
Title:Separator:OS:Host:Kernel:Uptime:Packages:Shell:Resolution:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:GPU:Memory:Disk:Battery:PowerAdapter:Locale:Break:Colors
-2
View File
@@ -12,8 +12,6 @@ typedef struct BatteryResult
FFstrbuf technology;
FFstrbuf capacity;
FFstrbuf status;
FFstrbuf adapterName;
int adapterWatts;
} BatteryResult;
const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results);
-10
View File
@@ -69,16 +69,6 @@ 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);
}
-3
View File
@@ -70,9 +70,6 @@ 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) {
+22
View File
@@ -0,0 +1,22 @@
#pragma once
#ifndef FF_INCLUDED_detection_poweradapter_poweradapter
#define FF_INCLUDED_detection_poweradapter_poweradapter
#include "fastfetch.h"
typedef struct PowerAdapterResult
{
FFstrbuf description;
FFstrbuf name;
FFstrbuf modelName;
FFstrbuf manufacturer;
int watts;
} PowerAdapterResult;
const char* ffDetectPowerAdapterImpl(FFinstance* instance, FFlist* results);
#define FF_POWER_ADAPTER_UNSET -2
#define FF_POWER_ADAPTER_NOT_CONNECTED -1
#endif
@@ -0,0 +1,58 @@
#include "fastfetch.h"
#include "poweradapter.h"
#include "util/apple/cf_helpers.h"
#include <IOKit/IOKitLib.h>
const char* ffDetectPowerAdapterImpl(FFinstance* instance, FFlist* results)
{
FF_UNUSED(instance);
CFMutableDictionaryRef matchDict = IOServiceMatching("AppleSmartBattery");
if (matchDict == NULL)
return "IOServiceMatching(\"AppleSmartBattery\") failed";
io_iterator_t iterator;
if(IOServiceGetMatchingServices(MACH_PORT_NULL, matchDict, &iterator) != kIOReturnSuccess)
return "IOServiceGetMatchingServices() failed";
io_registry_entry_t registryEntry;
while((registryEntry = IOIteratorNext(iterator)) != 0)
{
CFMutableDictionaryRef properties;
if(IORegistryEntryCreateCFProperties(registryEntry, &properties, kCFAllocatorDefault, kNilOptions) != kIOReturnSuccess)
{
IOObjectRelease(registryEntry);
continue;
}
PowerAdapterResult* adapter = ffListAdd(results);
ffStrbufInit(&adapter->name);
ffStrbufInit(&adapter->description);
ffStrbufInit(&adapter->manufacturer);
ffStrbufInit(&adapter->modelName);
adapter->watts = FF_POWER_ADAPTER_UNSET;
CFDictionaryRef adapterDict;
if(!ffCfDictGetDict(properties, CFSTR("AdapterDetails"), &adapterDict))
{
if (ffCfDictGetInt(adapterDict, CFSTR("Watts"), &adapter->watts))
{
adapter->watts = FF_POWER_ADAPTER_NOT_CONNECTED;
continue;
}
ffCfDictGetString(adapterDict, CFSTR("Name"), &adapter->name);
ffCfDictGetString(adapterDict, CFSTR("Description"), &adapter->description);
ffCfDictGetString(adapterDict, CFSTR("Manufacturer"), &adapter->manufacturer);
ffCfDictGetString(adapterDict, CFSTR("Model"), &adapter->modelName);
}
CFRelease(properties);
IOObjectRelease(registryEntry);
}
IOObjectRelease(iterator);
return NULL;
}
@@ -0,0 +1,7 @@
#include "fastfetch.h"
const char* ffDetectPowerAdapterImpl(FFinstance* instance, FFlist* results)
{
FF_UNUSED(instance, results);
return "Unimplemented";
}
+15 -3
View File
@@ -318,6 +318,16 @@ static inline void printCommandHelp(const char* command)
"Battery status"
);
}
else if(strcasecmp(command, "poweradapter-format") == 0)
{
constructAndPrintCommandHelpFormat("poweradapter", "{}%, {}", 5,
"PowerAdapter watts",
"PowerAdapter name",
"PowerAdapter manufacturer",
"PowerAdapter model",
"PowerAdapter description"
);
}
else if(strcasecmp(command, "locale-format") == 0)
{
constructAndPrintCommandHelpFormat("locale", "{}", 1,
@@ -1117,11 +1127,11 @@ 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)
else if(strcasecmp(key, "--poweradapter-key") == 0)
optionParseString(key, value, &instance->config.powerAdapter.key);
else if(strcasecmp(key, "--power-adapter-format") == 0)
else if(strcasecmp(key, "--poweradapter-format") == 0)
optionParseString(key, value, &instance->config.powerAdapter.outputFormat);
else if(strcasecmp(key, "--power-adapter-error") == 0)
else if(strcasecmp(key, "--poweradapter-error") == 0)
optionParseString(key, value, &instance->config.powerAdapter.errorFormat);
else if(strcasecmp(key, "--locale-key") == 0)
optionParseString(key, value, &instance->config.locale.key);
@@ -1388,6 +1398,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char
ffPrintDisk(instance);
else if(strcasecmp(line, "battery") == 0)
ffPrintBattery(instance);
else if(strcasecmp(line, "poweradapter") == 0)
ffPrintPowerAdapter(instance);
else if(strcasecmp(line, "locale") == 0)
ffPrintLocale(instance);
else if(strcasecmp(line, "localip") == 0)
+1
View File
@@ -255,6 +255,7 @@ void ffPrintMemory(FFinstance* instance);
void ffPrintSwap(FFinstance* instance); //Also in modules/memory.c
void ffPrintDisk(FFinstance* instance);
void ffPrintBattery(FFinstance* instance);
void ffPrintPowerAdapter(FFinstance* instance);
void ffPrintLocale(FFinstance* instance);
void ffPrintPlayer(FFinstance* instance);
void ffPrintSong(FFinstance* instance);
+1
View File
@@ -40,6 +40,7 @@ int main(int argc, char** argv)
//ffPrintSwap(&instance);
ffPrintDisk(&instance);
ffPrintBattery(&instance);
ffPrintPowerAdapter(&instance);
//ffPrintPlayer(&instance);
//ffPrintSong(&instance);
//ffPrintLocalIp(&instance);
-23
View File
@@ -5,9 +5,6 @@
#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)
@@ -47,26 +44,6 @@ 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)
+66
View File
@@ -0,0 +1,66 @@
#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);
}
+2
View File
@@ -549,6 +549,8 @@ uint16_t ffStrbufToUInt16(const FFstrbuf* strbuf, uint16_t defaultValue)
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);