Merge pull request #1 from LinusDierheimer/dev

Update dev
This commit is contained in:
CSoellinger
2023-02-02 11:25:06 +01:00
committed by GitHub
41 changed files with 411 additions and 64 deletions
+4 -1
View File
@@ -3,11 +3,14 @@
Features:
* Bluetooth module
* Sound module
* Support colored percentage numbers output
* Gamepad module
* Support colored percentage numbers output (#409)
* Support `--localip-compact-type` option (#408)
Bugfixes:
* Fix a rare case that fails to detect terminal
* Fix Muffin detection (@Zerogiven, #411)
Other:
+8
View File
@@ -274,6 +274,7 @@ set(LIBFASTFETCH_SRC
src/modules/gpu.c
src/modules/host.c
src/modules/icons.c
src/modules/gamepad.c
src/modules/kernel.c
src/modules/locale.c
src/modules/localip.c
@@ -307,6 +308,7 @@ set(LIBFASTFETCH_SRC
src/util/FFstrbuf.c
src/util/FFvaluestore.c
src/util/platform/FFPlatform.c
src/util/stringUtils.c
)
if(LINUX)
@@ -335,6 +337,7 @@ if(LINUX)
src/detection/gtk.c
src/detection/host/host_linux.c
src/detection/localip/localip_linux.c
src/detection/gamepad/gamepad_linux.c
src/detection/media/media_linux.c
src/detection/memory/memory_linux.c
src/detection/opengl/opengl_linux.c
@@ -374,6 +377,7 @@ elseif(ANDROID)
src/detection/gpu/gpu_nosupport.c
src/detection/host/host_android.c
src/detection/localip/localip_linux.c
src/detection/gamepad/gamepad_nosupport.c
src/detection/media/media_nosupport.c
src/detection/memory/memory_linux.c
src/detection/opengl/opengl_linux.c
@@ -419,6 +423,7 @@ elseif(BSD)
src/detection/gtk.c
src/detection/host/host_bsd.c
src/detection/localip/localip_linux.c
src/detection/gamepad/gamepad_nosupport.c
src/detection/media/media_linux.c
src/detection/memory/memory_bsd.c
src/detection/opengl/opengl_linux.c
@@ -460,6 +465,7 @@ elseif(APPLE)
src/detection/gpu/gpu_apple.c
src/detection/host/host_apple.c
src/detection/localip/localip_linux.c
src/detection/gamepad/gamepad_apple.c
src/detection/media/media_apple.m
src/detection/memory/memory_apple.c
src/detection/opengl/opengl_apple.c
@@ -500,6 +506,7 @@ elseif(WIN32)
src/detection/gpu/gpu_windows.cpp
src/detection/host/host_windows.c
src/detection/localip/localip_windows.c
src/detection/gamepad/gamepad_windows.cpp
src/detection/media/media_nosupport.c
src/detection/memory/memory_windows.c
src/detection/opengl/opengl_windows.c
@@ -712,6 +719,7 @@ elseif(WIN32)
PRIVATE "version"
PRIVATE "setupapi"
PRIVATE "dxgi"
PRIVATE "dinput8"
PRIVATE "wtsapi32"
PRIVATE "powrprof"
)
+1 -1
View File
@@ -89,7 +89,7 @@ All categories not listed here should work without needing a specific implementa
##### Available Modules
```
Battery, Bios, Bluetooth, Board, Break, Brightness, Colors, Command, CPU, CPUUsage, Cursor, Custom, Date, DateTime, DE, Disk, Display, Font, GPU, Host, Icons, Kernel, Locale, LocalIP, Media, Memory, OpenCL, OpenGL, Packages, Player, Power Adapter, Processes, PublicIP, Separator, OS, Shell, Sound, Swap, Terminal, Terminal Font, Theme, Time, Title, Uptime, Vulkan, Wifi, WM, WMTheme
Battery, Bios, Bluetooth, Board, Break, Brightness, Colors, Command, CPU, CPUUsage, Cursor, Custom, Date, DateTime, DE, Disk, Display, Font, Gamepad, GPU, Host, Icons, Kernel, Locale, LocalIP, Media, Memory, OpenCL, OpenGL, Packages, Player, Power Adapter, Processes, PublicIP, Separator, OS, Shell, Sound, Swap, Terminal, Terminal Font, Theme, Time, Title, Uptime, Vulkan, Wifi, WM, WMTheme
```
##### Builtin logos
+1
View File
@@ -186,6 +186,7 @@ __fastfetch_completion()
"--localip-show-ipv6"
"--localip-show-loop"
"--localip-name-prefix"
"--localip-compact-type"
"--escape-bedrock"
"--pipe"
"--title-fqdn"
+1 -1
View File
@@ -1 +1 @@
--structure Title:Separator:OS:Host:Bios:Board:Chassis:Kernel:Uptime:Processes:Packages:Shell:Display:Brightness:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:CPUUsage:GPU:Memory:Swap:Disk:Battery:PowerAdapter:Player:Media:PublicIP:LocalIP:Wifi:DateTime:Locale:Vulkan:OpenGL:OpenCL:Users:Bluetooth:Sound:Weather:Break:Colors
--structure Title:Separator:OS:Host:Bios:Board:Chassis:Kernel:Uptime:Processes:Packages:Shell:Display:Brightness:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:CPUUsage:GPU:Memory:Swap:Disk:Battery:PowerAdapter:Player:Media:PublicIP:LocalIP:Wifi:DateTime:Locale:Vulkan:OpenGL:OpenCL:Users:Bluetooth:Sound:Gamepad:Weather:Break:Colors
+1
View File
@@ -3,6 +3,7 @@
#ifdef FF_HAVE_DBUS
#include "common/thread.h"
#include "util/stringUtils.h"
static bool loadLibSymbols(const FFinstance* instance, FFDBusLibrary* lib)
{
+1
View File
@@ -2,6 +2,7 @@
#include "common/format.h"
#include "common/parsing.h"
#include "util/textModifier.h"
#include "util/stringUtils.h"
#include <inttypes.h>
+4
View File
@@ -117,6 +117,7 @@ static void defaultConfig(FFinstance* instance)
initModuleArg(&instance->config.users);
initModuleArg(&instance->config.bluetooth);
initModuleArg(&instance->config.sound);
initModuleArg(&instance->config.gamepad);
ffStrbufInitA(&instance->config.libPCI, 0);
ffStrbufInitA(&instance->config.libVulkan, 0);
@@ -174,6 +175,7 @@ static void defaultConfig(FFinstance* instance)
instance->config.localIpShowIpV6 = false;
instance->config.localIpShowLoop = false;
ffStrbufInit(&instance->config.localIpNamePrefix);
instance->config.localIpCompactType = FF_LOCALIP_COMPACT_TYPE_NONE;
instance->config.publicIpTimeout = 0;
ffStrbufInit(&instance->config.publicIpUrl);
@@ -385,6 +387,8 @@ static void destroyConfig(FFinstance* instance)
destroyModuleArg(&instance->config.openCL);
destroyModuleArg(&instance->config.users);
destroyModuleArg(&instance->config.bluetooth);
destroyModuleArg(&instance->config.sound);
destroyModuleArg(&instance->config.gamepad);
ffStrbufDestroy(&instance->config.libPCI);
ffStrbufDestroy(&instance->config.libVulkan);
+6 -3
View File
@@ -255,9 +255,9 @@
# Sound show all option
# Sets if all sound devices should be printed
# Must be either true or false
# Default is false ( only main device should be printed ).
#--sound-show-all false
# Must be either main, active or all. Default is main
# Default is main.
#--sound-type main
# Percentage output type option
# Applies to all modules that prints percentage values. Currently memory, swap, disk, battery and CPU usage are supported.
@@ -309,6 +309,7 @@
#--users-key Users
#--bluetooth-key Bluetooth
#--sound-key Sound
#--gamepad-key Gamepad
# Format options:
# Sets the format string for module values.
@@ -355,6 +356,7 @@
#--users-format
#--bluetooth-format
#--sound-format
#--gamepad-format
# Error options:
# Sets the format string to use if an error occured
@@ -401,6 +403,7 @@
#--users-error
#--bluetooth-error
#--sound-error
#--gamepad-error
# Library options:
# Sets an user specific path to a library to load.
+1
View File
@@ -124,6 +124,7 @@ Module specific options:
--localip-show-ipv6 <?value>: Show IPv6 addresses in local ip module. Default is false
--localip-show-loop <?value>: Show loop back addresses (127.0.0.1) in local ip module. Default is false
--localip-name-prefix <str>: Show IPs with given name prefix only. Default is empty
--localip-compact-type <str>: Show IPs in one line. Should be either none (disable one-line mode), default (don't sort the result), v4first (print ipv4 first) and v6first. Default is none
--public-ip-timeout: Time in milliseconds to wait for the public ip server to respond. Default is disabled (0)
--public-ip-url: The URL of public IP detection server to be used.
--weather-timeout: Time in milliseconds to wait for the weather server to respond. Default is disabled (0)
+1
View File
@@ -5,6 +5,7 @@
#include "common/settings.h"
#include "detection/gtk.h"
#include "detection/displayserver/displayserver.h"
#include "util/stringUtils.h"
#include <stdlib.h>
+12
View File
@@ -1,5 +1,7 @@
#include "disk.h"
#include "util/stringUtils.h"
#include <limits.h>
#include <ctype.h>
#include <dirent.h>
@@ -19,6 +21,10 @@ static bool isPhysicalDevice(const char* device)
if(strcmp(device, "drvfs") == 0)
return true;
//ZFS root pool. The format is rpool/<POOL_NAME>/<VOLUME_NAME>/<SUBVOLUME_NAME>
if(strncmp(device, "rpool/", 6) == 0)
return true;
//Pseudo filesystems don't have a device in /dev
const char* devPrefix = "/dev/";
if(strncmp(device, devPrefix, strlen(devPrefix)) != 0)
@@ -141,6 +147,7 @@ static bool isSubvolume(const FFlist* devices)
{
const FFstrbuf* currentDevie = ffListGet(devices, devices->length - 1);
//Filter all disks which device was already found. This catches BTRFS subvolumes.
for(uint32_t i = 0; i < devices->length - 1; i++)
{
const FFstrbuf* otherDevice = ffListGet(devices, i);
@@ -149,6 +156,11 @@ static bool isSubvolume(const FFlist* devices)
return true;
}
//ZFS subvolumes: rpool/<POOL_NAME>/<VOLUME_NAME>/<SUBVOLUME_NAME>.
//Test if the third slash is present.
if(strncmp(currentDevie->chars, "rpool/", 6) == 0 && ffStrHasNChars(currentDevie->chars, '/', 3))
return true;
return false;
}
+3 -1
View File
@@ -3,6 +3,7 @@
#include "common/properties.h"
#include "common/parsing.h"
#include "common/processing.h"
#include "util/stringUtils.h"
#include <stdlib.h>
#include <ctype.h>
@@ -74,7 +75,8 @@ static void applyPrettyNameIfWM(FFDisplayServerResult* result, const char* proce
) ffStrbufSetS(&result->wmPrettyName, FF_WM_PRETTY_MUTTER);
else if(
strcasecmp(processName, "cinnamon-session") == 0 ||
strcasecmp(processName, "Muffin") == 0
strcasecmp(processName, "Muffin") == 0 ||
strcasecmp(processName, "Mutter (Muffin)") == 0
) ffStrbufSetS(&result->wmPrettyName, FF_WM_PRETTY_MUFFIN);
else if(strcasecmp(processName, "sway") == 0)
ffStrbufSetS(&result->wmPrettyName, FF_WM_PRETTY_SWAY);
+1
View File
@@ -3,6 +3,7 @@
#ifdef FF_HAVE_X11
#include "common/library.h"
#include "common/parsing.h"
#include "util/stringUtils.h"
#include <X11/Xlib.h>
typedef struct X11PropertyData
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#ifndef FF_INCLUDED_detection_gamepad_gamepad
#define FF_INCLUDED_detection_gamepad_gamepad
#include "fastfetch.h"
typedef struct FFGamepadDevice
{
FFstrbuf identifier;
FFstrbuf name;
} FFGamepadDevice;
const char* ffDetectGamepad(const FFinstance* instance, FFlist* devices /* List of FFGamepadDevice */);
#endif
+41
View File
@@ -0,0 +1,41 @@
#include "gamepad.h"
#include "util/apple/cf_helpers.h"
#include <IOKit/IOKitLib.h>
#include <IOKit/hid/IOHIDLib.h>
static void enumSet(const void* value, void *context)
{
CFStringRef product = IOHIDDeviceGetProperty((IOHIDDeviceRef) value, CFSTR(kIOHIDProductKey));
CFStringRef serialNumber = IOHIDDeviceGetProperty((IOHIDDeviceRef) value, CFSTR(kIOHIDSerialNumberKey));
FFGamepadDevice* device = (FFGamepadDevice*) ffListAdd((FFlist*) context);
ffStrbufInit(&device->identifier);
ffCfStrGetString(serialNumber, &device->identifier);
ffStrbufInit(&device->name);
ffCfStrGetString(product, &device->name);
}
const char* ffDetectGamepad(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* devices /* List of FFGamepadDevice */)
{
IOHIDManagerRef FF_CFTYPE_AUTO_RELEASE manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
if (IOHIDManagerOpen(manager, kIOHIDOptionsTypeNone) != kIOReturnSuccess)
return "IOHIDManagerOpen() failed";
CFNumberRef FF_CFTYPE_AUTO_RELEASE genericDesktop = ffCfCreateInt(kHIDPage_GenericDesktop);
CFNumberRef FF_CFTYPE_AUTO_RELEASE gamePad = ffCfCreateInt(kHIDUsage_GD_GamePad);
CFDictionaryRef FF_CFTYPE_AUTO_RELEASE matching = CFDictionaryCreate(kCFAllocatorDefault, (const void **)(CFStringRef[]){
CFSTR(kIOHIDDeviceUsagePageKey),
CFSTR(kIOHIDDeviceUsageKey)
}, (const void **)(CFNumberRef[]){
genericDesktop,
gamePad
}, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
IOHIDManagerSetDeviceMatching(manager, matching);
CFSetRef FF_CFTYPE_AUTO_RELEASE set = IOHIDManagerCopyDevices(manager);
if (set)
CFSetApplyFunction(set, &enumSet, devices);
IOHIDManagerClose(manager, 0);
return NULL;
}
+42
View File
@@ -0,0 +1,42 @@
#include "gamepad.h"
#include "common/io/io.h"
#include <dirent.h>
#include <ctype.h>
const char* ffDetectGamepad(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* devices /* List of FFGamepadDevice */)
{
DIR* dirp = opendir("/sys/class/input/");
if(dirp == NULL)
return "opendir(\"/sys/class/input/\") == NULL";
FF_STRBUF_AUTO_DESTROY path;
ffStrbufInitS(&path, "/sys/class/input/");
uint32_t baseLen = path.length;
struct dirent* entry;
while((entry = readdir(dirp)) != NULL)
{
if(strncmp(entry->d_name, "js", 2) != 0)
continue;
if(!isdigit(entry->d_name[2]))
continue;
ffStrbufAppendS(&path, entry->d_name);
ffStrbufAppendS(&path, "/device/name");
if (ffPathExists(path.chars, FF_PATHTYPE_FILE))
{
FFGamepadDevice* device = (FFGamepadDevice*) ffListAdd(devices);
ffStrbufInitS(&device->identifier, entry->d_name);
ffStrbufInit(&device->name);
ffAppendFileBuffer(path.chars, &device->name);
}
ffStrbufSubstrBefore(&path, baseLen);
}
closedir(dirp);
return NULL;
}
@@ -0,0 +1,6 @@
#include "gamepad.h"
const char* ffDetectGamepad(FF_MAYBE_UNUSED const FFinstance* instance, FF_MAYBE_UNUSED FFlist* devices /* List of FFGamepadDevice */)
{
return "Not supported on this platform";
}
+32
View File
@@ -0,0 +1,32 @@
extern "C" {
#include "gamepad.h"
}
#include <initguid.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
CALLBACK BOOL DIEnumDevicesCallback(LPCDIDEVICEINSTANCEA lpddi, LPVOID pvRef)
{
FFlist* devices = (FFlist*) pvRef;
FFGamepadDevice* device = (FFGamepadDevice*) ffListAdd(devices);
ffStrbufInitF(&device->identifier, "{%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}",
lpddi->guidInstance.Data1, lpddi->guidInstance.Data2, lpddi->guidInstance.Data3,
lpddi->guidInstance.Data4[0], lpddi->guidInstance.Data4[1], lpddi->guidInstance.Data4[2], lpddi->guidInstance.Data4[3],
lpddi->guidInstance.Data4[4], lpddi->guidInstance.Data4[5], lpddi->guidInstance.Data4[6], lpddi->guidInstance.Data4[7]);
ffStrbufInitS(&device->name, lpddi->tszInstanceName);
return DIENUM_CONTINUE;
}
extern "C"
const char* ffDetectGamepad(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* devices /* List of FFGamepadDevice */)
{
IDirectInput8A* dinput;
if (!SUCCEEDED(DirectInput8Create(GetModuleHandleW(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8A, (void**)&dinput, NULL)))
return "DirectInput8Create() failed";
dinput->EnumDevices(DI8DEVCLASS_GAMECTRL, DIEnumDevicesCallback, devices, DIEDFL_ALLDEVICES);
dinput->Release();
return NULL;
}
+1
View File
@@ -6,6 +6,7 @@
#include "common/properties.h"
#include "common/parsing.h"
#include "detection/temps/temps_linux.h"
#include "util/stringUtils.h"
#include <string.h>
#include <unistd.h>
#include <pci/pci.h>
+1
View File
@@ -1,6 +1,7 @@
#include "os.h"
#include "common/properties.h"
#include "common/parsing.h"
#include "util/stringUtils.h"
#include <string.h>
#include <stdlib.h>
+1
View File
@@ -1,5 +1,6 @@
#include "packages.h"
#include "common/parsing.h"
#include "util/stringUtils.h"
#include <dirent.h>
+1 -1
View File
@@ -385,7 +385,7 @@ const FFTerminalFontResult* ffDetectTerminalFont(const FFinstance* instance)
const FFTerminalShellResult* terminalShell = ffDetectTerminalShell(instance);
if(terminalShell->terminalProcessName.length == 0)
ffStrbufAppendS(&result.error, "Terminal font needs successfull terminal detection");
ffStrbufAppendS(&result.error, "Terminal font needs successful terminal detection");
else if(!detectTerminalFontCommon(instance, terminalShell, &result))
ffDetectTerminalFontPlatform(instance, terminalShell, &result);
@@ -4,6 +4,7 @@
#include "common/parsing.h"
#include "detection/terminalshell/terminalshell.h"
#include "detection/displayserver/displayserver.h"
#include "util/stringUtils.h"
static const char* getSystemMonospaceFont(const FFinstance* instance)
{
@@ -1,9 +1,9 @@
#include "fastfetch.h"
#include "terminalshell.h"
#include "common/io/io.h"
#include "common/parsing.h"
#include "common/processing.h"
#include "common/thread.h"
#include "terminalshell.h"
#include "util/stringUtils.h"
#include <ctype.h>
#include <string.h>
+1
View File
@@ -7,6 +7,7 @@
#include "common/library.h"
#include "common/io/io.h"
#include "common/parsing.h"
#include "util/stringUtils.h"
#include <stdlib.h>
#include <vulkan/vulkan.h>
+2
View File
@@ -3,6 +3,8 @@
#ifndef FASTFETCH_INCLUDED_detection_wmtheme
#define FASTFETCH_INCLUDED_detection_wmtheme
#include "fastfetch.h"
bool ffDetectWmTheme(FFinstance* instance, FFstrbuf* themeOrError);
#endif
+5 -3
View File
@@ -1,10 +1,10 @@
#include "fastfetch.h"
#include "wmtheme.h"
#include "common/properties.h"
#include "common/parsing.h"
#include "common/settings.h"
#include "detection/gtk.h"
#include "detection/displayserver/displayserver.h"
#include "wmtheme.h"
#include "util/stringUtils.h"
static bool detectWMThemeFromConfigFile(FFinstance* instance, const char* configFile, const char* themeRegex, const char* defaultValue, FFstrbuf* themeOrError)
{
@@ -104,11 +104,13 @@ static bool detectMuffin(FFinstance* instance, FFstrbuf* themeOrError)
ffStrbufAppendS(themeOrError, theme);
return true;
}
if(theme == NULL)
{
ffStrbufAppendS(themeOrError, theme);
ffStrbufAppendS(themeOrError, name);
return true;
}
ffStrbufAppendF(themeOrError, "%s (%s)", name, theme);
return true;
}
+22 -1
View File
@@ -1,9 +1,10 @@
#include "fastfetch.h"
#include "util/FFvaluestore.h"
#include "common/printing.h"
#include "common/parsing.h"
#include "common/io/io.h"
#include "common/time.h"
#include "util/FFvaluestore.h"
#include "util/stringUtils.h"
#include <stdlib.h>
#include <ctype.h>
@@ -463,6 +464,13 @@ static inline void printCommandHelp(const char* command)
"Identifier"
);
}
else if(strcasecmp(command, "gamepad-format") == 0)
{
constructAndPrintCommandHelpFormat("gamepad", "{1}", 1,
"Name",
"Identifier"
);
}
else
fprintf(stderr, "No specific help for command %s provided\n", command);
}
@@ -1166,6 +1174,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
else if(optionParseModuleArgs(key, value, "users", &instance->config.users)) {}
else if(optionParseModuleArgs(key, value, "bluetooth", &instance->config.bluetooth)) {}
else if(optionParseModuleArgs(key, value, "sound", &instance->config.sound)) {}
else if(optionParseModuleArgs(key, value, "gamepad", &instance->config.gamepad)) {}
///////////////////
//Library options//
@@ -1281,6 +1290,16 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
instance->config.localIpShowLoop = optionParseBoolean(value);
else if(strcasecmp(key, "--localip-name-prefix") == 0)
optionParseString(key, value, &instance->config.localIpNamePrefix);
else if(strcasecmp(key, "--localip-compact-type") == 0)
{
optionParseEnum(key, value, &instance->config.localIpCompactType,
"none", FF_LOCALIP_COMPACT_TYPE_NONE,
"default", FF_LOCALIP_COMPACT_TYPE_DEFAULT,
"v4first", FF_LOCALIP_COMPACT_TYPE_V4FIRST,
"v6first", FF_LOCALIP_COMPACT_TYPE_V6FIRST,
NULL
);
}
else if(strcasecmp(key, "--os-file") == 0)
optionParseString(key, value, &instance->config.osFile);
else if(strcasecmp(key, "--player-name") == 0)
@@ -1478,6 +1497,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char
ffPrintBluetooth(instance);
else if(strcasecmp(line, "sound") == 0)
ffPrintSound(instance);
else if(strcasecmp(line, "gamepad") == 0)
ffPrintGamepad(instance);
else
ffPrintErrorString(instance, line, 0, NULL, NULL, "<no implementation provided>");
}
+11
View File
@@ -41,6 +41,14 @@ typedef enum FFSoundType
FF_SOUND_TYPE_ALL,
} FFSoundType;
typedef enum FFLocalIpCompactType
{
FF_LOCALIP_COMPACT_TYPE_NONE,
FF_LOCALIP_COMPACT_TYPE_DEFAULT,
FF_LOCALIP_COMPACT_TYPE_V4FIRST,
FF_LOCALIP_COMPACT_TYPE_V6FIRST,
} FFLocalIpCompactType;
typedef enum FFBinaryPrefixType
{
FF_BINARY_PREFIX_TYPE_IEC, // 1024 Bytes = 1 KiB, 1024 KiB = 1 MiB, ... (standard)
@@ -148,6 +156,7 @@ typedef struct FFconfig
FFModuleArgs users;
FFModuleArgs bluetooth;
FFModuleArgs sound;
FFModuleArgs gamepad;
FFstrbuf libPCI;
FFstrbuf libVulkan;
@@ -203,6 +212,7 @@ typedef struct FFconfig
bool localIpShowIpV4;
bool localIpShowIpV6;
FFstrbuf localIpNamePrefix;
FFLocalIpCompactType localIpCompactType;
FFstrbuf publicIpUrl;
uint32_t publicIpTimeout;
@@ -326,5 +336,6 @@ void ffPrintUsers(FFinstance* instance);
void ffPrintCommand(FFinstance* instance);
void ffPrintBluetooth(FFinstance* instance);
void ffPrintSound(FFinstance* instance);
void ffPrintGamepad(FFinstance* instance);
#endif
+3
View File
@@ -63,6 +63,9 @@ int main(int argc, char** argv)
//ffPrintOpenCL(&instance);
//ffPrintUsers(&instance);
//ffPrintWeather(&instance);
//ffPrintBluetooth(&instance);
//ffPrintSound(&instance);
//ffPrintGamepad(&instance);
ffPrintBreak(&instance);
ffPrintColors(&instance);
+48
View File
@@ -0,0 +1,48 @@
#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.sound.outputFormat.length == 0)
{
ffPrintLogoAndKey(instance, FF_GAMEPAD_MODULE_NAME, index, &instance->config.sound.key);
ffStrbufPutTo(&device->name, stdout);
}
else
{
ffPrintFormat(instance, FF_GAMEPAD_MODULE_NAME, index, &instance->config.sound, 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.sound, "%s", error);
return;
}
if(!result.length)
{
ffPrintError(instance, FF_GAMEPAD_MODULE_NAME, 0, &instance->config.sound, "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);
}
}
+73 -36
View File
@@ -5,9 +5,25 @@
#define FF_LOCALIP_MODULE_NAME "Local IP"
#define FF_LOCALIP_NUM_FORMAT_ARGS 2
static int sortIpsV4First(const FFLocalIpResult* left, const FFLocalIpResult* right)
{
if (left->ipv6 != right->ipv6)
return left->ipv6 == false ? -1 : 1;
return ffStrbufComp(&left->addr, &right->addr);
}
static int sortIpsV6First(const FFLocalIpResult* left, const FFLocalIpResult* right)
{
if (left->ipv6 != right->ipv6)
return left->ipv6 == true ? -1 : 1;
return ffStrbufComp(&left->addr, &right->addr);
}
void ffPrintLocalIp(FFinstance* instance)
{
FFlist results;
FF_LIST_AUTO_DESTROY results;
ffListInit(&results, sizeof(FFLocalIpResult));
const char* error = ffDetectLocalIps(instance, &results);
@@ -15,56 +31,77 @@ void ffPrintLocalIp(FFinstance* instance)
if(error)
{
ffPrintError(instance, FF_LOCALIP_MODULE_NAME, 0, &instance->config.localIP, "%s", error);
goto exit;
return;
}
if(results.length == 0)
{
ffPrintError(instance, FF_LOCALIP_MODULE_NAME, 0, &instance->config.localIP, "Failed to detect any IPs");
goto exit;
return;
}
FFstrbuf key;
ffStrbufInit(&key);
for(uint32_t i = 0; i < results.length; ++i)
if (instance->config.localIpCompactType != FF_LOCALIP_COMPACT_TYPE_NONE)
{
FFLocalIpResult* ip = (FFLocalIpResult*) ffListGet(&results, i);
ffPrintLogoAndKey(instance, FF_LOCALIP_MODULE_NAME, 0, &instance->config.localIP.key);
if(instance->config.localIP.key.length == 0)
switch (instance->config.localIpCompactType)
{
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}
});
case FF_LOCALIP_COMPACT_TYPE_V4FIRST:
ffListSort(&results, (void*) sortIpsV4First);
break;
case FF_LOCALIP_COMPACT_TYPE_V6FIRST:
ffListSort(&results, (void*) sortIpsV6First);
break;
default:
break;
}
if(instance->config.localIP.outputFormat.length == 0)
uint32_t index = 0;
FF_LIST_FOR_EACH(FFLocalIpResult, ip, results)
{
ffPrintLogoAndKey(instance, key.chars, 0, NULL);
ffStrbufPutTo(&ip->addr, stdout);
if (index++ > 0)
putchar(' ');
ffStrbufWriteTo(&ip->addr, stdout);
}
else
{
ffPrintFormatString(instance, key.chars, 0, NULL, &instance->config.localIP.outputFormat, FF_LOCALIP_NUM_FORMAT_ARGS, (FFformatarg[]){
{FF_FORMAT_ARG_TYPE_STRBUF, &ip->addr},
{FF_FORMAT_ARG_TYPE_STRING, ip->ipv6 ? "IPv6" : "IPv4"}
});
}
ffStrbufDestroy(&ip->name);
ffStrbufDestroy(&ip->addr);
putchar('\n');
}
else
{
FF_STRBUF_AUTO_DESTROY key;
ffStrbufInit(&key);
ffStrbufDestroy(&key);
FF_LIST_FOR_EACH(FFLocalIpResult, ip, results)
{
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}
});
}
exit:
ffListDestroy(&results);
if(instance->config.localIP.outputFormat.length == 0)
{
ffPrintLogoAndKey(instance, key.chars, 0, NULL);
ffStrbufPutTo(&ip->addr, stdout);
}
else
{
ffPrintFormatString(instance, key.chars, 0, NULL, &instance->config.localIP.outputFormat, FF_LOCALIP_NUM_FORMAT_ARGS, (FFformatarg[]){
{FF_FORMAT_ARG_TYPE_STRBUF, &ip->addr},
{FF_FORMAT_ARG_TYPE_STRING, ip->ipv6 ? "IPv6" : "IPv4"}
});
}
ffStrbufDestroy(&ip->name);
ffStrbufDestroy(&ip->addr);
}
}
}
+1
View File
@@ -7,6 +7,7 @@
#if defined(FF_HAVE_OPENCL) || defined(__APPLE__)
#include "common/library.h"
#include "common/parsing.h"
#include "util/stringUtils.h"
#include <string.h>
#define CL_TARGET_OPENCL_VERSION 100
-11
View File
@@ -3,17 +3,6 @@
#include <ctype.h>
#include <inttypes.h>
bool ffStrSet(const char* str)
{
if(str == NULL)
return false;
while(isspace(*str))
str++;
return *str != '\0';
}
static char* CHAR_NULL_PTR = "";
void ffStrbufInitA(FFstrbuf* strbuf, uint32_t allocate)
-2
View File
@@ -18,8 +18,6 @@
#define strcasestr StrStrIA
#endif
bool ffStrSet(const char* str);
#define FASTFETCH_STRBUF_DEFAULT_ALLOC 32
typedef struct FFstrbuf
+13
View File
@@ -13,4 +13,17 @@ 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);
static inline CFNumberRef ffCfCreateInt(int value)
{
return CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &value);
}
static inline void cfReleaseWrapper(void* type)
{
if (*(CFTypeRef*) type)
CFRelease(*(CFTypeRef*) type);
}
#define FF_CFTYPE_AUTO_RELEASE __attribute__((__cleanup__(cfReleaseWrapper)))
#endif
+1
View File
@@ -1,4 +1,5 @@
#include "FFPlatform_private.h"
#include "util/stringUtils.h"
void ffPlatformInit(FFPlatform* platform)
{
+1 -1
View File
@@ -1,5 +1,5 @@
#include "FFPlatform_private.h"
#include "util/stringUtils.h"
#include "fastfetch_config.h"
#include <unistd.h>
+29
View File
@@ -0,0 +1,29 @@
#include "stringUtils.h"
#include <string.h>
#include <ctype.h>
bool ffStrSet(const char* str)
{
if(str == NULL)
return false;
while(isspace(*str))
str++;
return *str != '\0';
}
bool ffStrHasNChars(const char* str, char c, uint32_t n)
{
for(uint32_t i = 0; i < n; i++)
{
char* current = strchr(str, c);
if(current == NULL)
return false;
str = current + 1;
}
return true;
}
+12
View File
@@ -0,0 +1,12 @@
#pragma once
#ifndef FF_INCLUDED_util_stringUtils_h
#define FF_INCLUDED_util_stringUtils_h
#include <stdbool.h>
#include <stdint.h>
bool ffStrSet(const char* str);
bool ffStrHasNChars(const char* str, char c, uint32_t n);
#endif