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
+4
View File
@@ -229,6 +229,7 @@ set(LIBFASTFETCH_SRC
src/modules/memory.c
src/modules/disk.c
src/modules/battery.c
src/modules/poweradapter.c
src/modules/locale.c
src/modules/vulkan.c
src/modules/localip.c
@@ -259,6 +260,7 @@ endif()
if(LINUX OR ANDROID OR BSD)
list(APPEND LIBFASTFETCH_SRC
src/detection/cpuUsage/cpuUsage_linux.c
src/detection/battery/battery_linux.c
)
endif()
@@ -268,6 +270,7 @@ if(LINUX OR BSD)
src/detection/os/os_linux.c
src/detection/gpu/gpu_linux.c
src/detection/battery/battery_linux.c
src/detection/poweradapter/poweradapter_linux.c
src/detection/displayserver/linux/displayserver_linux.c
src/detection/displayserver/linux/wayland.c
src/detection/displayserver/linux/xcb.c
@@ -288,6 +291,7 @@ if(APPLE)
src/detection/cpu/cpu_apple.c
src/detection/gpu/gpu_apple.c
src/detection/battery/battery_apple.c
src/detection/poweradapter/poweradapter_apple.c
src/detection/memory/memory_apple.c
src/detection/displayserver/displayserver_apple.c
src/detection/terminalfont/terminalfont_apple.c
+1 -1
View File
@@ -51,7 +51,7 @@ All categories not listed here should work without needing a specific implementa
##### Available Modules
```
Title, Separator, OS, Host, Kernel, Uptime, Processes, Packages, Shell, Resolution, DE, WM, WMTheme, Theme, Icons, Font, Cursor, Terminal, Terminal Font, CPU, CPUUsage, GPU, Memory, Swap, Disk, Battery, Player, Media, Vulkan, OpenGL, OpenCL, LocalIP, PublicIP, DateTime, Date, Time, Locale, Colors, Break, Custom
Title, Separator, OS, Host, Kernel, Uptime, Processes, Packages, Shell, Resolution, DE, WM, WMTheme, Theme, Icons, Font, Cursor, Terminal, Terminal Font, CPU, CPUUsage, GPU, Memory, Swap, Disk, Battery, Power Adapter, Player, Media, Vulkan, OpenGL, OpenCL, LocalIP, PublicIP, DateTime, Date, Time, Locale, Colors, Break, Custom
```
##### Logos
+4
View File
@@ -30,6 +30,7 @@ __fastfetch_complete_help()
"swap-format"
"disk-format"
"battery-format"
"poweradapter-format"
"locale-format"
"local-ip-format"
"public-ip-format"
@@ -284,6 +285,9 @@ __fastfetch_completion()
"--battery-key"
"--battery-format"
"--battery-error"
"--poweradapter-key"
"--poweradapter-format"
"--poweradapter-error"
"--locale-key"
"--locale-format"
"--locale-error"
+1 -1
View File
@@ -1 +1 @@
--structure Title:Separator:OS:Host:Kernel:Uptime:Processes:Packages:Shell:Resolution:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:GPU:Memory:Swap:Disk:Battery:Player:Song:PublicIP:LocalIP:DateTime:Locale:Vulkan:OpenGL:OpenCL:Break:Colors
--structure Title:Separator:OS:Host:Kernel:Uptime:Processes:Packages:Shell:Resolution:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:GPU:Memory:Swap:Disk:Battery:PowerAdapter:Player:Song:PublicIP:LocalIP:DateTime:Locale:Vulkan:OpenGL:OpenCL:Break:Colors
+1
View File
@@ -21,6 +21,7 @@
--memory-format Used: {}; Total: {}; Percentage: {}
--disk-format Used: {}; Total: {}; Files: {}; Percentage: {}
--battery-format Manufactor: {}; Model: {}; Technology: {}; Capacity: {}; Status: {}
--poweradapter-format Watts: {}; Name: {}; Manufactor: {}; Model: {}; Description: {}
--player-format Pretty: {}; Name: {}; Bus: {}; Url: {}
--media-format Pretty: {}; Name: {}; Artist: {}; Album: {}
--datetime-format year: {}; yearShort: {}; month: {}; monthPretty: {}; monthName: {}; monthNameShort: {}; weekNumber: {}; weekday: {}; weekdayShort: {}; dayInYear: {}; dayInMonth: {}; dayInWeek: {}; hour: {}; hourPretty: {}; hour12: {}; hour12Pretty: {}; minute: {}; minutePretty: {}; second: {}; secondPretty: {}
+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);
+4
View File
@@ -24,6 +24,10 @@ int main(int argc, char** argv)
FFstrbuf strbuf;
//destroy 0
ffStrbufInitA(&strbuf, 0);
ffStrbufDestroy(&strbuf);
//initA
ffStrbufInitA(&strbuf, 0);