diff --git a/CHANGELOG.md b/CHANGELOG.md index fca281fe7..9b1115e75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Features: * Support display name, type, rotation detection on Wayland (Linux, Display) * Print more useful display name instead of intel_backlight (Linux, Brightness) * Icons module supports Windows (Windows, Icons) +* Add Wallpaper module Bugfixes: * Fix Gnome version detection on Fedora diff --git a/CMakeLists.txt b/CMakeLists.txt index e5c3d8f9f..5ace7c2d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -306,6 +306,7 @@ set(LIBFASTFETCH_SRC src/modules/uptime.c src/modules/users.c src/modules/vulkan.c + src/modules/wallpaper.c src/modules/weather.c src/modules/wifi.c src/modules/wm.c @@ -360,6 +361,7 @@ if(LINUX) src/detection/terminalshell/terminalshell_linux.c src/detection/uptime/uptime_linux.c src/detection/users/users_linux.c + src/detection/wallpaper/wallpaper_nosupport.c src/detection/wifi/wifi_linux.c src/detection/wmtheme/wmtheme_linux.c src/util/platform/FFPlatform_unix.c @@ -400,6 +402,7 @@ elseif(ANDROID) src/detection/terminalshell/terminalshell_linux.c src/detection/uptime/uptime_linux.c src/detection/users/users_linux.c + src/detection/wallpaper/wallpaper_nosupport.c src/detection/wifi/wifi_android.c src/detection/wmtheme/wmtheme_nosupport.c src/util/platform/FFPlatform_unix.c @@ -448,6 +451,7 @@ elseif(BSD) src/detection/terminalshell/terminalshell_linux.c src/detection/uptime/uptime_bsd.c src/detection/users/users_linux.c + src/detection/wallpaper/wallpaper_nosupport.c src/detection/wifi/wifi_nosupport.c src/detection/wmtheme/wmtheme_linux.c src/util/platform/FFPlatform_unix.c @@ -490,6 +494,7 @@ elseif(APPLE) src/detection/terminalshell/terminalshell_linux.c src/detection/uptime/uptime_bsd.c src/detection/users/users_linux.c + src/detection/wallpaper/wallpaper_nosupport.c src/detection/wifi/wifi_apple.m src/detection/wmtheme/wmtheme_apple.m src/util/apple/cf_helpers.c @@ -532,6 +537,7 @@ elseif(WIN32) src/detection/temps/temps_windows.cpp src/detection/uptime/uptime_windows.c src/detection/users/users_windows.c + src/detection/wallpaper/wallpaper_windows.c src/detection/wifi/wifi_windows.c src/detection/wmtheme/wmtheme_windows.c src/util/windows/getline.c diff --git a/README.md b/README.md index ad5b33583..034c05a98 100644 --- a/README.md +++ b/README.md @@ -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, 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 +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, Wallpaper, Wifi, WM, WMTheme ``` ##### Builtin logos diff --git a/src/common/init.c b/src/common/init.c index b2fc6a447..6a6cce617 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -109,6 +109,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.date); initModuleArg(&instance->config.time); initModuleArg(&instance->config.vulkan); + initModuleArg(&instance->config.wallpaper); initModuleArg(&instance->config.openGL); initModuleArg(&instance->config.openCL); initModuleArg(&instance->config.users); @@ -369,6 +370,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.locale); destroyModuleArg(&instance->config.localIP); destroyModuleArg(&instance->config.publicIP); + destroyModuleArg(&instance->config.wallpaper); destroyModuleArg(&instance->config.weather); destroyModuleArg(&instance->config.wifi); destroyModuleArg(&instance->config.player); diff --git a/src/detection/wallpaper/wallpaper.h b/src/detection/wallpaper/wallpaper.h new file mode 100644 index 000000000..72208eb5b --- /dev/null +++ b/src/detection/wallpaper/wallpaper.h @@ -0,0 +1,10 @@ +#pragma once + +#ifndef FF_INCLUDED_detection_wallpaper +#define FF_INCLUDED_detection_wallpaper + +#include "fastfetch.h" + +const char* ffDetectWallpaper(const FFinstance* instance, FFstrbuf* result); + +#endif diff --git a/src/detection/wallpaper/wallpaper_nosupport.c b/src/detection/wallpaper/wallpaper_nosupport.c new file mode 100644 index 000000000..92278511d --- /dev/null +++ b/src/detection/wallpaper/wallpaper_nosupport.c @@ -0,0 +1,6 @@ +#include "wallpaper.h" + +const char* ffDetectWallpaper(FF_MAYBE_UNUSED const FFinstance* instance, FF_MAYBE_UNUSED FFstrbuf* result) +{ + return "Not supported on this platform"; +} diff --git a/src/detection/wallpaper/wallpaper_windows.c b/src/detection/wallpaper/wallpaper_windows.c new file mode 100644 index 000000000..aa8b696ad --- /dev/null +++ b/src/detection/wallpaper/wallpaper_windows.c @@ -0,0 +1,14 @@ +#include "wallpaper.h" +#include "util/windows/registry.h" + +const char* ffDetectWallpaper(FF_MAYBE_UNUSED const FFinstance* instance, FFstrbuf* result) +{ + FF_HKEY_AUTO_DESTROY hKey = NULL; + if(!ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"Control Panel\\Desktop", &hKey, NULL)) + return "ffRegOpenKeyForRead(Control Panel\\Desktop) failed"; + + if(!ffRegReadStrbuf(hKey, L"WallPaper", result, NULL)) + return "ffRegReadStrbuf(WallPaper) failed"; + + return NULL; +} diff --git a/src/fastfetch.c b/src/fastfetch.c index fe12e414b..a76bd99a3 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -223,6 +223,12 @@ static inline void printCommandHelp(const char* command) "Combined icons" ); } + else if(strcasecmp(command, "wallpaper-format") == 0) + { + constructAndPrintCommandHelpFormat("wallpaper", "{}", 1, + "Wallpaper image file" + ); + } else if(strcasecmp(command, "font-format") == 0) { constructAndPrintCommandHelpFormat("font", "{} [QT], {} [GTK2], {} [GTK3], {} [GTK4]", 4, @@ -1145,6 +1151,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "wm-theme", &instance->config.wmTheme)) {} else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} else if(optionParseModuleArgs(key, value, "icons", &instance->config.icons)) {} + else if(optionParseModuleArgs(key, value, "wallpaper", &instance->config.wallpaper)) {} else if(optionParseModuleArgs(key, value, "font", &instance->config.font)) {} else if(optionParseModuleArgs(key, value, "cursor", &instance->config.cursor)) {} else if(optionParseModuleArgs(key, value, "terminal", &instance->config.terminal)) {} @@ -1450,6 +1457,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintWMTheme(instance); else if(strcasecmp(line, "icons") == 0) ffPrintIcons(instance); + else if(strcasecmp(line, "wallpaper") == 0) + ffPrintWallpaper(instance); else if(strcasecmp(line, "font") == 0) ffPrintFont(instance); else if(strcasecmp(line, "cursor") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index cd43cdb01..eedb3a332 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -130,6 +130,7 @@ typedef struct FFconfig FFModuleArgs shell; FFModuleArgs display; FFModuleArgs de; + FFModuleArgs wallpaper; FFModuleArgs wifi; FFModuleArgs wm; FFModuleArgs wmTheme; @@ -318,6 +319,7 @@ void ffPrintWM(FFinstance* instance); void ffPrintWMTheme(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintIcons(FFinstance* instance); +void ffPrintWallpaper(FFinstance* instance); void ffPrintFont(FFinstance* instance); void ffPrintCursor(FFinstance* instance); void ffPrintTerminal(FFinstance* instance); diff --git a/src/modules/wallpaper.c b/src/modules/wallpaper.c new file mode 100644 index 000000000..75caa5471 --- /dev/null +++ b/src/modules/wallpaper.c @@ -0,0 +1,31 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/wallpaper/wallpaper.h" + +#define FF_WALLPAPER_MODULE_NAME "Wallpaper" +#define FF_WALLPAPER_NUM_FORMAT_ARGS 1 + +void ffPrintWallpaper(FFinstance* instance) +{ + FF_STRBUF_AUTO_DESTROY wallpaper; + ffStrbufInit(&wallpaper); + const char* error = ffDetectWallpaper(instance, &wallpaper); + + if(error) + { + ffPrintError(instance, FF_WALLPAPER_MODULE_NAME, 0, &instance->config.wallpaper, "%s", error); + return; + } + + if(instance->config.wallpaper.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_WALLPAPER_MODULE_NAME, 0, &instance->config.wallpaper.key); + ffStrbufPutTo(&wallpaper, stdout); + } + else + { + ffPrintFormat(instance, FF_WALLPAPER_MODULE_NAME, 0, &instance->config.wallpaper, FF_WALLPAPER_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &wallpaper} + }); + } +}