From 08066a76f05fbe15ae8f1d8a0ada66135c53d0e2 Mon Sep 17 00:00:00 2001 From: Linus Dierheimer Date: Sat, 3 Apr 2021 11:39:59 +0200 Subject: [PATCH] all keys can now be set! --- completions/bash | 21 ++ src/common.c | 436 +++++++++++++++++++------------------ src/fastfetch.c | 247 ++++++++++++++++++--- src/fastfetch.h | 40 +++- src/modules/battery.c | 56 ++++- src/modules/cpu.c | 6 +- src/modules/custom.c | 2 +- src/modules/de.c | 6 +- src/modules/disk.c | 43 +++- src/modules/font.c | 4 +- src/modules/gpu.c | 39 ++-- src/modules/host.c | 6 +- src/modules/icons.c | 4 +- src/modules/kernel.c | 4 +- src/modules/locale.c | 6 +- src/modules/memory.c | 6 +- src/modules/os.c | 4 +- src/modules/packages.c | 6 +- src/modules/resolution.c | 10 +- src/modules/shell.c | 6 +- src/modules/terminal.c | 6 +- src/modules/terminalfont.c | 12 +- src/modules/theme.c | 4 +- src/modules/uptime.c | 4 +- src/modules/wm.c | 8 +- src/util/FFstrbuf.c | 2 + 26 files changed, 644 insertions(+), 344 deletions(-) diff --git a/completions/bash b/completions/bash index f21c14ffc..5771dabe7 100644 --- a/completions/bash +++ b/completions/bash @@ -127,26 +127,47 @@ __fastfetch_completion() "--structure" "--set" "--os-format" + "--os-key" "--host-format" + "--host-key" "--kernel-format" + "--kernel-key" "--uptime-format" + "--uptime-key" "--packages-format" + "--packages-key" "--shell-format" + "--shell-key" "--resolution-format" + "--resolution-key" "--de-format" + "--de-key" "--wm-format" + "--wm-key" "--theme-format" + "--theme-key" "--icons-format" + "--icons-key" "--font-format" + "--font-key" "--terminal-format" + "--terminal-key" "--terminal-font-format" + "--terminal-font-key" "--cpu-format" + "--cpu-key" "--gpu-format" + "--gpu-key" "--memory-format" + "--memory-key" "--disk-format" + "--disk-key" "--battery-format" + "--battery-key" "--locale-format" + "--locale-key" "--disk-folders" + "--disk-key" ) local FF_OPTIONS_PATH=( diff --git a/src/common.c b/src/common.c index e6053a256..fcc854f3a 100644 --- a/src/common.c +++ b/src/common.c @@ -28,65 +28,60 @@ void ffDefaultConfig(FFconfig* config) config->cacheSave = true; config->printRemainingLogo = true; - ffStrbufInit(&config->osFormat); - ffStrbufInit(&config->hostFormat); - ffStrbufInit(&config->kernelFormat); - ffStrbufInit(&config->uptimeFormat); - ffStrbufInit(&config->packagesFormat); - ffStrbufInit(&config->shellFormat); - ffStrbufInit(&config->resolutionFormat); - ffStrbufInit(&config->deFormat); - ffStrbufInit(&config->wmFormat); - ffStrbufInit(&config->themeFormat); - ffStrbufInit(&config->iconsFormat); - ffStrbufInit(&config->fontFormat); - ffStrbufInit(&config->terminalFormat); - ffStrbufInit(&config->termFontFormat); - ffStrbufInit(&config->cpuFormat); - ffStrbufInit(&config->gpuFormat); - ffStrbufInit(&config->memoryFormat); - ffStrbufInit(&config->diskFormat); - ffStrbufInit(&config->batteryFormat); - ffStrbufInit(&config->localeFormat); + //Since most of these properties are unlikely to be used at once, give them minimal heap space (the \0 character) + ffStrbufInitA(&config->osFormat, 1); + ffStrbufInitA(&config->osKey, 1); + ffStrbufInitA(&config->hostFormat, 1); + ffStrbufInitA(&config->hostKey, 1); + ffStrbufInitA(&config->kernelFormat, 1); + ffStrbufInitA(&config->kernelKey, 1); + ffStrbufInitA(&config->uptimeFormat, 1); + ffStrbufInitA(&config->uptimeKey, 1); + ffStrbufInitA(&config->packagesFormat, 1); + ffStrbufInitA(&config->packagesKey, 1); + ffStrbufInitA(&config->shellFormat, 1); + ffStrbufInitA(&config->shellKey, 1); + ffStrbufInitA(&config->resolutionFormat, 1); + ffStrbufInitA(&config->resolutionKey, 1); + ffStrbufInitA(&config->deFormat, 1); + ffStrbufInitA(&config->deKey, 1); + ffStrbufInitA(&config->wmFormat, 1); + ffStrbufInitA(&config->wmKey, 1); + ffStrbufInitA(&config->themeFormat, 1); + ffStrbufInitA(&config->themeKey, 1); + ffStrbufInitA(&config->iconsFormat, 1); + ffStrbufInitA(&config->iconsKey, 1); + ffStrbufInitA(&config->fontFormat, 1); + ffStrbufInitA(&config->fontKey, 1); + ffStrbufInitA(&config->terminalFormat, 1); + ffStrbufInitA(&config->terminalKey, 1); + ffStrbufInitA(&config->termFontFormat, 1); + ffStrbufInitA(&config->termFontKey, 1); + ffStrbufInitA(&config->cpuFormat, 1); + ffStrbufInitA(&config->cpuKey, 1); + ffStrbufInitA(&config->gpuFormat, 1); + ffStrbufInitA(&config->gpuKey, 1); + ffStrbufInitA(&config->memoryFormat, 1); + ffStrbufInitA(&config->memoryKey, 1); + ffStrbufInitA(&config->diskFormat, 1); + ffStrbufInitA(&config->diskKey, 1); + ffStrbufInitA(&config->batteryFormat, 1); + ffStrbufInitA(&config->batteryKey, 1); + ffStrbufInitA(&config->localeFormat, 1); + ffStrbufInitA(&config->localeKey, 1); - ffStrbufInitA(&config->libPCI, 256); - ffStrbufInitA(&config->libX11, 256); - ffStrbufInitA(&config->libXrandr, 256); + ffStrbufInitA(&config->libPCI, 1); + ffStrbufInitA(&config->libX11, 1); + ffStrbufInitA(&config->libXrandr, 1); - ffStrbufInitA(&config->diskFolders, 128); + ffStrbufInitA(&config->diskFolders, 1); } static void ffCleanup(FFinstance* instance) { - ffStrbufDestroy(&instance->config.color); - ffStrbufDestroy(&instance->config.seperator); - - ffStrbufDestroy(&instance->config.osFormat); - ffStrbufDestroy(&instance->config.hostFormat); - ffStrbufDestroy(&instance->config.kernelFormat); - ffStrbufDestroy(&instance->config.uptimeFormat); - ffStrbufDestroy(&instance->config.packagesFormat); - ffStrbufDestroy(&instance->config.shellFormat); - ffStrbufDestroy(&instance->config.resolutionFormat); - ffStrbufDestroy(&instance->config.deFormat); - ffStrbufDestroy(&instance->config.wmFormat); - ffStrbufDestroy(&instance->config.themeFormat); - ffStrbufDestroy(&instance->config.iconsFormat); - ffStrbufDestroy(&instance->config.fontFormat); - ffStrbufDestroy(&instance->config.terminalFormat); - ffStrbufDestroy(&instance->config.termFontFormat); - ffStrbufDestroy(&instance->config.cpuFormat); - ffStrbufDestroy(&instance->config.gpuFormat); - ffStrbufDestroy(&instance->config.memoryFormat); - ffStrbufDestroy(&instance->config.diskFormat); - ffStrbufDestroy(&instance->config.batteryFormat); - ffStrbufDestroy(&instance->config.localeFormat); - - ffStrbufDestroy(&instance->config.libPCI); - ffStrbufDestroy(&instance->config.libX11); - ffStrbufDestroy(&instance->config.libXrandr); - - ffStrbufDestroy(&instance->config.diskFolders); + // Place for cleaning up + // I dont destroy the global strbufs, because the OS is typically faster doing it after the program terminates + // This eliminates one function call per strbuf + setting things like length to 0 } void ffFinish(FFinstance* instance) @@ -97,15 +92,120 @@ void ffFinish(FFinstance* instance) ffCleanup(instance); } -void ffPrintKey(FFconfig* config, const char* key) +void ffPrintKey(FFinstance* instance, FFstrbuf* customKey, const char* defKey) { - printf(FASTFETCH_TEXT_MODIFIER_BOLT"%s%s"FASTFETCH_TEXT_MODIFIER_RESET"%s", config->color.chars, key, config->seperator.chars); + printf(FASTFETCH_TEXT_MODIFIER_BOLT); + ffStrbufWriteTo(&instance->config.color, stdout); + if(customKey == NULL || customKey->length == 0) + printf(defKey); + else + ffStrbufWriteTo(customKey, stdout); + printf(FASTFETCH_TEXT_MODIFIER_RESET); + ffStrbufWriteTo(&instance->config.seperator, stdout); } -void ffPrintLogoAndKey(FFinstance* instance, const char* key) +void ffPrintLogoAndKey(FFinstance* instance, FFstrbuf* customKey, const char* defKey) { ffPrintLogoLine(instance); - ffPrintKey(&instance->config, key); + ffPrintKey(instance, customKey, defKey); +} + +void ffPrintError(FFinstance* instance, FFstrbuf* customKey, const char* defKey, const char* message, ...) +{ + if(!instance->config.showErrors) + return; + + ffPrintLogoAndKey(instance, customKey, defKey); + + va_list arguments; + va_start(arguments, message); + + printf(FASTFETCH_TEXT_MODIFIER_ERROR); + vprintf(message, arguments); + puts(FASTFETCH_TEXT_MODIFIER_RESET); + + va_end(arguments); +} + +static const FFstrbuf* getCacheDir(FFinstance* instance) +{ + static FFstrbuf cacheDir; + static bool init = false; + if(init) + return &cacheDir; + + ffStrbufInitS(&cacheDir, getenv("XDG_CACHE_HOME")); + + if(cacheDir.length == 0) + { + ffStrbufSetS(&cacheDir, instance->state.passwd->pw_dir); + ffStrbufAppendS(&cacheDir, "/.cache/"); + } + + mkdir(cacheDir.chars, S_IRWXU | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH); //I hope everybody has a cache folder but whow knews + + ffStrbufAppendS(&cacheDir, "fastfetch/"); + mkdir(cacheDir.chars, S_IRWXU | S_IRGRP | S_IROTH); + + init = true; + return &cacheDir; +} + +bool ffPrintCachedValue(FFinstance* instance, FFstrbuf* customKey, const char* defKey) +{ + if(instance->config.recache) + return false; + + FFstrbuf cacheFile; + ffStrbufInitA(&cacheFile, 128); + ffStrbufAppend(&cacheFile, getCacheDir(instance)); + ffStrbufAppendS(&cacheFile, defKey); + + FF_STRBUF_CREATE(value); + ffGetFileContent(cacheFile.chars, &value); + + ffStrbufDestroy(&cacheFile); + + if(value.length == 0) + { + ffStrbufDestroy(&value); + return false; + } + + ffPrintLogoAndKey(instance, customKey, defKey); + ffStrbufPutTo(&value, stdout); + ffStrbufDestroy(&value); + return true; +} + +void ffPrintAndSaveCachedValue(FFinstance* instance, FFstrbuf* customKey, const char* defKey, FFstrbuf* value) +{ + if(value->length == 0) + return; + + ffPrintLogoAndKey(instance, customKey, defKey); + ffStrbufPutTo(value, stdout); + + if(!instance->config.cacheSave) + return; + + FFstrbuf cacheFile; + ffStrbufInit(&cacheFile); + ffStrbufAppend(&cacheFile, getCacheDir(instance)); + ffStrbufAppendS(&cacheFile, defKey); + + int fd = open(cacheFile.chars, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if(fd == -1) + return; + + bool failed = write(fd, value->chars, value->length) != value->length; + + close(fd); + + if(failed) + unlink(cacheFile.chars); + + ffStrbufDestroy(&cacheFile); } void ffParsePropFile(const char* fileName, const char* regex, char* buffer) @@ -142,83 +242,6 @@ void ffParsePropFileHome(FFinstance* instance, const char* relativeFile, const c ffStrbufDestroy(&absolutePath); } -static inline bool strSet(const char* str) -{ - return str != NULL && str[0] != '\0'; -} - -void ffFormatGtkPretty(FFstrbuf* buffer, const char* gtk2, const char* gtk3, const char* gtk4) -{ - if(strSet(gtk2) && strSet(gtk3) && strSet(gtk4)) - { - if((strcmp(gtk2, gtk3) == 0) && (strcmp(gtk2, gtk4) == 0)) - ffStrbufSetF(buffer, "%s [GTK2/3/4]", gtk2); - else if(strcmp(gtk2, gtk3) == 0) - ffStrbufSetF(buffer, "%s [GTK2/3], %s [GTK4]", gtk2, gtk4); - else if(strcmp(gtk3, gtk4) == 0) - ffStrbufSetF(buffer, "%s [GTK2], %s [GTK3/4]", gtk2, gtk3); - else - ffStrbufSetF(buffer, "%s [GTK2], %s [GTK3], %s [GTK4]", gtk2, gtk3, gtk4); - } - else if(strSet(gtk2) && strSet(gtk3)) - { - if(strcmp(gtk2, gtk3) == 0) - ffStrbufSetF(buffer, "%s [GTK2/3]", gtk2); - else - ffStrbufSetF(buffer, "%s [GTK2], %s [GTK3]", gtk2, gtk3); - } - else if(strSet(gtk3) && strSet(gtk4)) - { - if(strcmp(gtk3, gtk4) == 0) - ffStrbufSetF(buffer, "%s [GTK3/4]", gtk3); - else - ffStrbufSetF(buffer, "%s [GTK3], %s [GTK4]", gtk3, gtk4); - } - else if(strSet(gtk2)) - { - ffStrbufSetF(buffer, "%s [GTK2]", gtk2); - } - else if(strSet(gtk3)) - { - ffStrbufSetF(buffer, "%s [GTK3]", gtk3); - } - else if(strSet(gtk4)) - { - ffStrbufSetF(buffer, "%s [GTK4]", gtk4); - } -} - -void ffParseFont(char* font, char* buffer) -{ - char name[64]; - char size[32]; - int scanned = sscanf(font, "%[^,], %[^,]", name, size); - - if(scanned == 0) - strcpy(buffer, font); - else if(scanned == 1) - strcpy(buffer, name); - else - sprintf(buffer, "%s (%spt)", name, size); -} - -void ffPrintError(FFinstance* instance, const char* key, const char* message, ...) -{ - if(!instance->config.showErrors) - return; - - ffPrintLogoAndKey(instance, key); - - va_list arguments; - va_start(arguments, message); - - printf(FASTFETCH_TEXT_MODIFIER_ERROR); - vprintf(message, arguments); - puts(FASTFETCH_TEXT_MODIFIER_RESET); - - va_end(arguments); -} - void ffAppendFileContent(const char* fileName, FFstrbuf* buffer) { int fd = open(fileName, O_RDONLY); @@ -247,87 +270,6 @@ void ffGetFileContent(const char* fileName, FFstrbuf* buffer) ffAppendFileContent(fileName, buffer); } -static const FFstrbuf* getCacheDir(FFinstance* instance) -{ - static FFstrbuf cacheDir; - static bool init = false; - if(init) - return &cacheDir; - - ffStrbufInitS(&cacheDir, getenv("XDG_CACHE_HOME")); - - if(cacheDir.length == 0) - { - ffStrbufSetS(&cacheDir, instance->state.passwd->pw_dir); - ffStrbufAppendS(&cacheDir, "/.cache/"); - } - - mkdir(cacheDir.chars, S_IRWXU | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH); //I hope everybody has a cache folder but whow knews - - ffStrbufAppendS(&cacheDir, "fastfetch/"); - mkdir(cacheDir.chars, S_IRWXU | S_IRGRP | S_IROTH); - - init = true; - return &cacheDir; -} - -bool ffPrintCachedValue(FFinstance* instance, const char* key) -{ - if(instance->config.recache) - return false; - - FFstrbuf cacheFile; - ffStrbufInitA(&cacheFile, 128); - ffStrbufAppend(&cacheFile, getCacheDir(instance)); - ffStrbufAppendS(&cacheFile, key); - - FF_STRBUF_CREATE(value); - ffGetFileContent(cacheFile.chars, &value); - - ffStrbufDestroy(&cacheFile); - - if(value.length == 0) - { - ffStrbufDestroy(&value); - return false; - } - - ffPrintLogoAndKey(instance, key); - ffStrbufPutTo(&value, stdout); - ffStrbufDestroy(&value); - return true; -} - -void ffPrintAndSaveCachedValue(FFinstance* instance, const char* key, FFstrbuf* value) -{ - if(value->length == 0) - return; - - ffPrintLogoAndKey(instance, key); - ffStrbufPutTo(value, stdout); - - if(!instance->config.cacheSave) - return; - - FFstrbuf cacheFile; - ffStrbufInit(&cacheFile); - ffStrbufAppend(&cacheFile, getCacheDir(instance)); - ffStrbufAppendS(&cacheFile, key); - - int fd = open(cacheFile.chars, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - if(fd == -1) - return; - - bool failed = write(fd, value->chars, value->length) != value->length; - - close(fd); - - if(failed) - unlink(cacheFile.chars); - - ffStrbufDestroy(&cacheFile); -} - void ffParseFormatStringV(FFstrbuf* buffer, FFstrbuf* formatstr, uint32_t numArgs, va_list argp) { FFformatarg arguments[numArgs]; @@ -431,7 +373,7 @@ void ffParseFormatString(FFstrbuf* buffer, FFstrbuf* formatstr, uint32_t numArgs va_end(argp); } -void ffPrintFormatString(FFinstance* instance, const char* key, FFstrbuf* formatstr, uint32_t numArgs, ...) +void ffPrintFormatString(FFinstance* instance, FFstrbuf* customKey, const char* defKey, FFstrbuf* formatstr, uint32_t numArgs, ...) { FFstrbuf buffer; ffStrbufInitA(&buffer, 256); @@ -445,9 +387,69 @@ void ffPrintFormatString(FFinstance* instance, const char* key, FFstrbuf* format if(buffer.length > 0) { - ffPrintLogoAndKey(instance, key); + ffPrintLogoAndKey(instance, customKey, defKey); ffStrbufPutTo(&buffer, stdout); } ffStrbufDestroy(&buffer); } + +static inline bool strSet(const char* str) +{ + return str != NULL && str[0] != '\0'; +} + +void ffFormatGtkPretty(FFstrbuf* buffer, const char* gtk2, const char* gtk3, const char* gtk4) +{ + if(strSet(gtk2) && strSet(gtk3) && strSet(gtk4)) + { + if((strcmp(gtk2, gtk3) == 0) && (strcmp(gtk2, gtk4) == 0)) + ffStrbufSetF(buffer, "%s [GTK2/3/4]", gtk2); + else if(strcmp(gtk2, gtk3) == 0) + ffStrbufSetF(buffer, "%s [GTK2/3], %s [GTK4]", gtk2, gtk4); + else if(strcmp(gtk3, gtk4) == 0) + ffStrbufSetF(buffer, "%s [GTK2], %s [GTK3/4]", gtk2, gtk3); + else + ffStrbufSetF(buffer, "%s [GTK2], %s [GTK3], %s [GTK4]", gtk2, gtk3, gtk4); + } + else if(strSet(gtk2) && strSet(gtk3)) + { + if(strcmp(gtk2, gtk3) == 0) + ffStrbufSetF(buffer, "%s [GTK2/3]", gtk2); + else + ffStrbufSetF(buffer, "%s [GTK2], %s [GTK3]", gtk2, gtk3); + } + else if(strSet(gtk3) && strSet(gtk4)) + { + if(strcmp(gtk3, gtk4) == 0) + ffStrbufSetF(buffer, "%s [GTK3/4]", gtk3); + else + ffStrbufSetF(buffer, "%s [GTK3], %s [GTK4]", gtk3, gtk4); + } + else if(strSet(gtk2)) + { + ffStrbufSetF(buffer, "%s [GTK2]", gtk2); + } + else if(strSet(gtk3)) + { + ffStrbufSetF(buffer, "%s [GTK3]", gtk3); + } + else if(strSet(gtk4)) + { + ffStrbufSetF(buffer, "%s [GTK4]", gtk4); + } +} + +void ffParseFont(char* font, char* buffer) +{ + char name[64]; + char size[32]; + int scanned = sscanf(font, "%[^,], %[^,]", name, size); + + if(scanned == 0) + strcpy(buffer, font); + else if(scanned == 1) + strcpy(buffer, name); + else + sprintf(buffer, "%s (%spt)", name, size); +} diff --git a/src/fastfetch.c b/src/fastfetch.c index e0c796c6f..e7a47d197 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -80,10 +80,33 @@ static inline void printHelp() " --battery-format \n" " --locale-format \n" "\n" + "Key options: Provide a custom key for an output\n" + " --os-key \n" + " --host-key \n" + " --kernel-key \n" + " --uptime-format \n" + " --packages-format \n" + " --shell-format \n" + " --resolution-format \n" + " --de-format \n" + " --wm-format \n" + " --theme-format \n" + " --icons-format \n" + " --font-format \n" + " --terminal-format \n" + " --terminal-font-format \n" + " --cpu-format \n" + " --gpu-format : takes the gpu index as format argument\n" + " --memory-format \n" + " --disk-format : takes the mount path as format argument\n" + " --battery-format : takes the battery index as format argument\n" + " --locale-format \n" + "\n" "Library optins: Set the path of a library to load\n" " --lib-PCI \n" " --lib-X11 \n" " --lib-Xrandr \n" + "\n" "Module specific options:\n" " --disk-folders : A colon seperated list of folder paths for the disk output. Default is \"/:/home\"\n" "\n" @@ -208,45 +231,170 @@ static inline void printCommandHelp(const char* command) ); } else if(strcasecmp(command, "host-format") == 0) - constructAndPrintCommandHelpFormat("host", "{} {} {}", 3, "Host family", "Host name", "Host version"); + { + constructAndPrintCommandHelpFormat("host", "{} {} {}", 3, + "Host family", + "Host name", + "Host version" + ); + } else if(strcasecmp(command, "kernel-format") == 0) - constructAndPrintCommandHelpFormat("kernel", "{2}", 3, "Kernel sysname", "Kernel release", "Kernel version"); + { + constructAndPrintCommandHelpFormat("kernel", "{2}", 3, + "Kernel sysname", + "Kernel release", + "Kernel version" + ); + } else if(strcasecmp(command, "uptime-format") == 0) - constructAndPrintCommandHelpFormat("uptime", "{} days {} hours {} mins", 4, "Days", "Hours", "Minutes", "Seconds"); + { + constructAndPrintCommandHelpFormat("uptime", "{} days {} hours {} mins", 4, + "Days", + "Hours", + "Minutes", + "Seconds" + ); + } else if(strcasecmp(command, "packages-format") == 0) - constructAndPrintCommandHelpFormat("packages", "{2} (pacman), {3} (flatpak)", 3, "Number of all packages", "Number of pacman packages", "Number of flatpak packages"); + { + constructAndPrintCommandHelpFormat("packages", "{2} (pacman), {3} (flatpak)", 3, + "Number of all packages", + "Number of pacman packages", + "Number of flatpak packages" + ); + } else if(strcasecmp(command, "shell-format") == 0) - constructAndPrintCommandHelpFormat("shell", "{2}", 2, "Shell path (without name)", "Shell name"); + { + constructAndPrintCommandHelpFormat("shell", "{2}", 2, + "Shell path (without name)", + "Shell name" + ); + } else if(strcasecmp(command, "resolution-format") == 0) - constructAndPrintCommandHelpFormat("resolution", "{}x{} @ {}Hz", 3, "Screen width", "Screen height", "Screen refresh rate"); + { + constructAndPrintCommandHelpFormat("resolution", "{}x{} @ {}Hz", 3, + "Screen width", + "Screen height", + "Screen refresh rate" + ); + } else if(strcasecmp(command, "de-format") == 0) - constructAndPrintCommandHelpFormat("de", "{} {} ({})", 3, "DE name", "DE version", "Name of display server"); + { + constructAndPrintCommandHelpFormat("de", "{} {} ({})", 3, + "DE name", + "DE version", + "Name of display server" + ); + } else if(strcasecmp(command, "wm-format") == 0) - constructAndPrintCommandHelpFormat("wm", "{2}", 2, "WM process name", "WM pretty name"); + { + constructAndPrintCommandHelpFormat("wm", "{2}", 2, + "WM process name", + "WM pretty name" + ); + } else if(strcasecmp(command, "theme-format") == 0) - constructAndPrintCommandHelpFormat("theme", "{} [Plasma], {5}", 5, "Plasma theme", "GTK2 theme", "GTK3 theme", "GTK4 theme", "Combined GTK themes"); + { + constructAndPrintCommandHelpFormat("theme", "{} [Plasma], {5}", 5, + "Plasma theme", + "GTK2 theme", + "GTK3 theme", + "GTK4 theme", + "Combined GTK themes" + ); + } else if(strcasecmp(command, "icons-format") == 0) - constructAndPrintCommandHelpFormat("icons", "{} [Plasma], {5}", 5, "Plasma icons", "GTK2 icons", "GTK3 icons", "GTK4 icons", "Combined GTK icons"); + { + constructAndPrintCommandHelpFormat("icons", "{} [Plasma], {5}", 5, + "Plasma icons", + "GTK2 icons", + "GTK3 icons", + "GTK4 icons", + "Combined GTK icons" + ); + } else if(strcasecmp(command, "font-format") == 0) - constructAndPrintCommandHelpFormat("font", "{} [Plasma], {5}", 5, "Plasma font", "GTK2 font", "GTK3 font", "GTK4 font", "Combined GTK fonts"); + { + constructAndPrintCommandHelpFormat("font", "{} [Plasma], {5}", 5, + "Plasma font", + "GTK2 font", + "GTK3 font", + "GTK4 font", + "Combined GTK fonts" + ); + } else if(strcasecmp(command, "terminal-format") == 0) - constructAndPrintCommandHelpFormat("terminal", "{3}", 3, "Terminal executable name", "Terminal process name", "Terminal name"); + { + constructAndPrintCommandHelpFormat("terminal", "{3}", 3, + "Terminal executable name", + "Terminal process name", + "Terminal name" + ); + } else if(strcasecmp(command, "terminal-font-format") == 0) - constructAndPrintCommandHelpFormat("terminal-font", "{}", 1, "Terminal font name"); + { + constructAndPrintCommandHelpFormat("terminal-font", "{}", 1, + "Terminal font name" + ); + } else if(strcasecmp(command, "cpu-format") == 0) - constructAndPrintCommandHelpFormat("cpu", "{2} ({4}) @ {7}GHz", 11, "CPU name", "Prettified CPU name", "CPU Vendor name (Vendor ID)", "CPU logical core count online", "CPU logical core count configured", "CPU physical core count", "frequency bios limit", "frequency scaling max", "frequency scaling min", "frequency info max", "frequency info min"); + { + constructAndPrintCommandHelpFormat("cpu", "{2} ({4}) @ {7}GHz", 11, + "CPU name", + "Prettified CPU name", + "CPU Vendor name (Vendor ID)", + "CPU logical core count online", + "CPU logical core count configured", + "CPU physical core count", + "frequency bios limit", + "frequency scaling max", + "frequency scaling min", + "frequency info max", + "frequency info min" + ); + } else if(strcasecmp(command, "gpu-format") == 0) - constructAndPrintCommandHelpFormat("gpu", "{} {}", 2, "GPU vendor", "GPU name"); + { + constructAndPrintCommandHelpFormat("gpu", "{} {}", 2, + "GPU vendor", + "GPU name" + ); + } else if(strcasecmp(command, "memory-format") == 0) - constructAndPrintCommandHelpFormat("memory", "{}MiB / {}MiB ({}%)", 3, "Used memory", "Total memory", "Used memory percentage"); + { + constructAndPrintCommandHelpFormat("memory", "{}MiB / {}MiB ({}%)", 3, + "Used memory", + "Total memory", + "Used memory percentage" + ); + } else if(strcasecmp(command, "disk-format") == 0) - constructAndPrintCommandHelpFormat("disk", "{}GB / {}GB ({4}%)", 4, "Used disk space", "Total disk space", "Number of files", "Used disk space percentage"); + { + constructAndPrintCommandHelpFormat("disk", "{}GB / {}GB ({4}%)", 4, + "Used disk space", + "Total disk space", + "Number of files", + "Used disk space percentage" + ); + } else if(strcasecmp(command, "battery-format") == 0) - constructAndPrintCommandHelpFormat("battery", "{} {} ({}) [{}%; {}]", 5, "Battery manufactor", "Battery model", "Battery technology", "Battery capacity", "Battery status"); + { + constructAndPrintCommandHelpFormat("battery", "{} {} ({}) [{}%; {}]", 5, + "Battery manufactor", + "Battery model", + "Battery technology", + "Battery capacity", + "Battery status" + ); + } else if(strcasecmp(command, "locale-format") == 0) - constructAndPrintCommandHelpFormat("locale", "{}", 1, "Locale code"); + { + constructAndPrintCommandHelpFormat("locale", "{}", 1, + "Locale code" + ); + } else - printf("No specific help for command %s provided\n", command); + fprintf(stderr, "No specific help for command %s provided\n", command); } static inline bool optionParseBoolean(const char* str) @@ -265,9 +413,10 @@ static inline void optionParseString(const char* key, const char* value, FFstrbu { if(value == NULL) { - printf("Error: usage: %s \n", key); + fprintf(stderr, "Error: usage: %s \n", key); exit(477); } + ffStrbufEnsureCapacity(buffer, 64); //This is not needed as ffStrbufSetS will resize capacity if needed, but giving an higher start should improve performance ffStrbufSetS(buffer, value); } @@ -316,12 +465,12 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con { if(value == NULL) { - printf("Error: usage: %s \n", key); + fprintf(stderr, "Error: usage: %s \n", key); exit(404); } if(sscanf(value, "%hd", &instance->config.logo_spacing) != 1) { - printf("Error: couldn't parse %s to uint16_t\n", value); + fprintf(stderr, "Error: couldn't parse %s to uint16_t\n", value); exit(405); } } @@ -329,12 +478,12 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con { if(value == NULL) { - printf("Error: usage: %s \n", key); + fprintf(stderr, "Error: usage: %s \n", key); exit(408); } if(sscanf(value, "%hi", &instance->config.offsetx) != 1) { - printf("Error: couldn't parse %s to int16_t\n", value); + fprintf(stderr, "Error: couldn't parse %s to int16_t\n", value); exit(409); } } @@ -342,7 +491,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con { if(value == NULL) { - printf("Error: usage: %s \n", key); + fprintf(stderr, "Error: usage: %s \n", key); exit(411); } @@ -350,7 +499,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con if(seperator == NULL) { - printf("Error: usage: %s , '=' missing\n", key); + fprintf(stderr, "Error: usage: %s , '=' missing\n", key); exit(412); } @@ -380,44 +529,84 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseString(key, value, &instance->config.color); else if(strcasecmp(key, "--os-format") == 0) optionParseString(key, value, &instance->config.osFormat); + else if(strcasecmp(key, "--os-key") == 0) + optionParseString(key, value, &instance->config.osKey); else if(strcasecmp(key, "--host-format") == 0) optionParseString(key, value, &instance->config.hostFormat); + else if(strcasecmp(key, "--host-key") == 0) + optionParseString(key, value, &instance->config.hostKey); else if(strcasecmp(key, "--kernel-format") == 0) optionParseString(key, value, &instance->config.kernelFormat); + else if(strcasecmp(key, "--kernel-key") == 0) + optionParseString(key, value, &instance->config.kernelKey); else if(strcasecmp(key, "--uptime-format") == 0) optionParseString(key, value, &instance->config.uptimeFormat); + else if(strcasecmp(key, "--uptime-key") == 0) + optionParseString(key, value, &instance->config.uptimeKey); else if(strcasecmp(key, "--packages-format") == 0) optionParseString(key, value, &instance->config.packagesFormat); + else if(strcasecmp(key, "--packages-key") == 0) + optionParseString(key, value, &instance->config.packagesKey); else if(strcasecmp(key, "--shell-format") == 0) optionParseString(key, value, &instance->config.shellFormat); + else if(strcasecmp(key, "--shell-key") == 0) + optionParseString(key, value, &instance->config.shellKey); else if(strcasecmp(key, "--resolution-format") == 0) optionParseString(key, value, &instance->config.resolutionFormat); + else if(strcasecmp(key, "--resolution-key") == 0) + optionParseString(key, value, &instance->config.resolutionKey); else if(strcasecmp(key, "--de-format") == 0) optionParseString(key, value, &instance->config.deFormat); + else if(strcasecmp(key, "--de-key") == 0) + optionParseString(key, value, &instance->config.deKey); else if(strcasecmp(key, "--wm-format") == 0) optionParseString(key, value, &instance->config.wmFormat); + else if(strcasecmp(key, "--wm-key") == 0) + optionParseString(key, value, &instance->config.wmKey); else if(strcasecmp(key, "--theme-format") == 0) optionParseString(key, value, &instance->config.themeFormat); + else if(strcasecmp(key, "--theme-key") == 0) + optionParseString(key, value, &instance->config.themeKey); else if(strcasecmp(key, "--icons-format") == 0) optionParseString(key, value, &instance->config.iconsFormat); + else if(strcasecmp(key, "--icons-key") == 0) + optionParseString(key, value, &instance->config.iconsKey); else if(strcasecmp(key, "--font-format") == 0) optionParseString(key, value, &instance->config.fontFormat); + else if(strcasecmp(key, "--font-key") == 0) + optionParseString(key, value, &instance->config.fontKey); else if(strcasecmp(key, "--terminal-format") == 0) optionParseString(key, value, &instance->config.terminalFormat); + else if(strcasecmp(key, "--terminal-key") == 0) + optionParseString(key, value, &instance->config.terminalKey); else if(strcasecmp(key, "--terminal-font-format") == 0) optionParseString(key, value, &instance->config.termFontFormat); + else if(strcasecmp(key, "--terminal-font-key") == 0) + optionParseString(key, value, &instance->config.termFontKey); else if(strcasecmp(key, "--cpu-format") == 0) optionParseString(key, value, &instance->config.cpuFormat); + else if(strcasecmp(key, "--cpu-key") == 0) + optionParseString(key, value, &instance->config.cpuKey); else if(strcasecmp(key, "--gpu-format") == 0) optionParseString(key, value, &instance->config.gpuFormat); + else if(strcasecmp(key, "--gpu-key") == 0) + optionParseString(key, value, &instance->config.gpuKey); else if(strcasecmp(key, "--memory-format") == 0) optionParseString(key, value, &instance->config.memoryFormat); + else if(strcasecmp(key, "--memory-key") == 0) + optionParseString(key, value, &instance->config.memoryKey); else if(strcasecmp(key, "--disk-format") == 0) optionParseString(key, value, &instance->config.diskFormat); + else if(strcasecmp(key, "--disk-key") == 0) + optionParseString(key, value, &instance->config.diskKey); else if(strcasecmp(key, "--battery-format") == 0) optionParseString(key, value, &instance->config.batteryFormat); + else if(strcasecmp(key, "--battery-key") == 0) + optionParseString(key, value, &instance->config.batteryKey); else if(strcasecmp(key, "--locale-format") == 0) optionParseString(key, value, &instance->config.localeFormat); + else if(strcasecmp(key, "--locale-key") == 0) + optionParseString(key, value, &instance->config.localeKey); else if(strcasecmp(key, "--lib-PCI") == 0) optionParseString(key, value, &instance->config.libPCI); else if(strcasecmp(key, "--lib-X11") == 0) @@ -428,7 +617,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseString(key, value, &instance->config.diskFolders); else { - printf("Error: unknown option: %s\n", key); + fprintf(stderr, "Error: unknown option: %s\n", key); exit(400); } } @@ -616,7 +805,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "colors") == 0) ffPrintColors(instance); else - ffPrintError(instance, line, ""); + ffPrintError(instance, NULL, line, ""); } static void run(FFinstance* instance, FFdata* data) diff --git a/src/fastfetch.h b/src/fastfetch.h index 886eca913..aeb83ebf4 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -47,25 +47,45 @@ typedef struct FFconfig bool printRemainingLogo; FFstrbuf osFormat; + FFstrbuf osKey; FFstrbuf hostFormat; + FFstrbuf hostKey; FFstrbuf kernelFormat; + FFstrbuf kernelKey; FFstrbuf uptimeFormat; + FFstrbuf uptimeKey; FFstrbuf packagesFormat; + FFstrbuf packagesKey; FFstrbuf shellFormat; + FFstrbuf shellKey; FFstrbuf resolutionFormat; + FFstrbuf resolutionKey; FFstrbuf deFormat; + FFstrbuf deKey; FFstrbuf wmFormat; + FFstrbuf wmKey; FFstrbuf themeFormat; + FFstrbuf themeKey; FFstrbuf iconsFormat; + FFstrbuf iconsKey; FFstrbuf fontFormat; + FFstrbuf fontKey; FFstrbuf terminalFormat; + FFstrbuf terminalKey; FFstrbuf termFontFormat; + FFstrbuf termFontKey; FFstrbuf cpuFormat; + FFstrbuf cpuKey; FFstrbuf gpuFormat; + FFstrbuf gpuKey; FFstrbuf memoryFormat; + FFstrbuf memoryKey; FFstrbuf diskFormat; + FFstrbuf diskKey; FFstrbuf batteryFormat; + FFstrbuf batteryKey; FFstrbuf localeFormat; + FFstrbuf localeKey; FFstrbuf libPCI; FFstrbuf libX11; @@ -102,26 +122,26 @@ typedef enum FFformatargtype typedef struct FFformatarg { FFformatargtype type; - void* value; + const void* value; } FFformatarg; -//Util functions +//Common functions void ffInitState(FFstate* state); void ffDefaultConfig(FFconfig* config); -void ffPrintKey(FFconfig* config, const char* key); -void ffPrintLogoAndKey(FFinstance* instance, const char* key); +void ffPrintKey(FFinstance* instance, FFstrbuf* customKey, const char* defKey); +void ffPrintLogoAndKey(FFinstance* instance, FFstrbuf* customKey, const char* defKey); +void ffPrintError(FFinstance* instance, FFstrbuf* customKey, const char* defKey, const char* message, ...); +bool ffPrintCachedValue(FFinstance* instance, FFstrbuf* customKey, const char* defKey); +void ffPrintAndSaveCachedValue(FFinstance* instance, FFstrbuf* customKey, const char* defKey, FFstrbuf* value); void ffAppendFileContent(const char* fileName, FFstrbuf* buffer); void ffGetFileContent(const char* fileName, FFstrbuf* buffer); void ffParsePropFile(const char* file, const char* regex, char* buffer); void ffParsePropFileHome(FFinstance* instance, const char* relativeFile, const char* regex, char* buffer); -void ffParseFont(char* font, char* buffer); -void ffFormatGtkPretty(FFstrbuf* buffer, const char* gtk2, const char* gtk3, const char* gtk4); -void ffPrintError(FFinstance* instance, const char* key, const char* message, ...); -bool ffPrintCachedValue(FFinstance* instance, const char* key); -void ffPrintAndSaveCachedValue(FFinstance* instance, const char* key, FFstrbuf* value); void ffParseFormatStringV(FFstrbuf* buffer, FFstrbuf* formatstr, uint32_t numArgs, va_list argp); void ffParseFormatString(FFstrbuf* buffer, FFstrbuf* formatstr, uint32_t numArgs, ...); -void ffPrintFormatString(FFinstance* instance, const char* key, FFstrbuf* formatstr, uint32_t numArgs, ...); +void ffPrintFormatString(FFinstance* instance, FFstrbuf* customKey, const char* defKey, FFstrbuf* formatstr, uint32_t numArgs, ...); +void ffParseFont(char* font, char* buffer); +void ffFormatGtkPretty(FFstrbuf* buffer, const char* gtk2, const char* gtk3, const char* gtk4); void ffFinish(FFinstance* instance); //Logo functions diff --git a/src/modules/battery.c b/src/modules/battery.c index c863a87bd..50dab6327 100644 --- a/src/modules/battery.c +++ b/src/modules/battery.c @@ -6,31 +6,42 @@ static void printBattery(FFinstance* instance, uint8_t index) { FF_STRBUF_CREATE(manufactor); char manufactorPath[42]; - sprintf(manufactorPath, "/sys/class/power_supply/BAT%i/manufacturer", index); + sprintf(manufactorPath, "/sys/class/power_supply/BAT%hhu/manufacturer", index); ffGetFileContent(manufactorPath, &manufactor); FF_STRBUF_CREATE(model); char modelPath[40]; - sprintf(modelPath, "/sys/class/power_supply/BAT%i/model_name", index); + sprintf(modelPath, "/sys/class/power_supply/BAT%hhu/model_name", index); ffGetFileContent(modelPath, &model); FF_STRBUF_CREATE(technology); char technologyPath[40]; - sprintf(technologyPath, "/sys/class/power_supply/BAT%i/technology", index); + sprintf(technologyPath, "/sys/class/power_supply/BAT%hhu/technology", index); ffGetFileContent(technologyPath, &technology); FF_STRBUF_CREATE(capacity); char capacityPath[38]; - sprintf(capacityPath, "/sys/class/power_supply/BAT%i/capacity", index); + sprintf(capacityPath, "/sys/class/power_supply/BAT%hhu/capacity", index); ffGetFileContent(capacityPath, &capacity); FF_STRBUF_CREATE(status); char statusPath[36]; - sprintf(statusPath, "/sys/class/power_supply/BAT%i/status", index); + sprintf(statusPath, "/sys/class/power_supply/BAT%hhu/status", index); ffGetFileContent(statusPath, &status); - char key[10]; - sprintf(key, "Battery %i", index); + uint8_t indexPlusOne = index + 1; + + FF_STRBUF_CREATE(key); + if(instance->config.batteryKey.length == 0) + { + ffStrbufAppendF(&key, "Battery %hhu", indexPlusOne); + } + else + { + ffParseFormatString(&key, &instance->config.batteryKey, 1, + (FFformatarg){FF_FORMAT_ARG_TYPE_UINT8, &indexPlusOne} + ); + } if(instance->config.batteryFormat.length == 0) { @@ -41,11 +52,11 @@ static void printBattery(FFinstance* instance, uint8_t index) capacity.length == 0 && status.length == 0 ) { - ffPrintError(instance, key, "No file in /sys/class/power_supply/BAT0/ could be read or all battery options are disabled"); + ffPrintError(instance, &key, NULL, "No file in /sys/class/power_supply/BAT%hhu/ could be read or all battery options are disabled", index); return; } - ffPrintLogoAndKey(instance, key); + ffPrintLogoAndKey(instance, &key, NULL); if(manufactor.length > 0) printf("%s ", manufactor.chars); @@ -75,7 +86,7 @@ static void printBattery(FFinstance* instance, uint8_t index) } else { - ffPrintFormatString(instance, key, &instance->config.batteryFormat, 5, + ffPrintFormatString(instance, &key, NULL, &instance->config.batteryFormat, 5, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, &manufactor}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, &model}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, &technology}, @@ -89,10 +100,12 @@ static void printBattery(FFinstance* instance, uint8_t index) ffStrbufDestroy(&technology); ffStrbufDestroy(&capacity); ffStrbufDestroy(&status); + ffStrbufDestroy(&key); } void ffPrintBattery(FFinstance* instance) { + uint8_t batteryCounter = 0; for(uint8_t i = 0; i < 5; i++) { char path[30]; @@ -101,8 +114,29 @@ void ffPrintBattery(FFinstance* instance) DIR* dir = opendir(path); if(dir != NULL) { - printBattery(instance, i); + printBattery(instance, batteryCounter++); closedir(dir); } } + + if(batteryCounter == 0) + { + if(!instance->config.showErrors) + return; + + FF_STRBUF_CREATE(key); + if(instance->config.batteryKey.length == 0) + { + ffStrbufSetS(&key, "Battery"); + } + else + { + ffParseFormatString(&key, &instance->config.batteryKey, 1, + (FFformatarg){FF_FORMAT_ARG_TYPE_UINT8, &batteryCounter} + ); + } + + ffPrintError(instance, &key, NULL, "No battery found in /sys/class/power_supply/"); + ffStrbufDestroy(&key); + } } diff --git a/src/modules/cpu.c b/src/modules/cpu.c index c6f08ac13..1cea08682 100644 --- a/src/modules/cpu.c +++ b/src/modules/cpu.c @@ -20,7 +20,7 @@ static double getGhz(const char* file) void ffPrintCPU(FFinstance* instance) { - if(ffPrintCachedValue(instance, "CPU")) + if(ffPrintCachedValue(instance, &instance->config.cpuKey, "CPU")) return; char name[256]; name[0] = '\0'; @@ -100,7 +100,7 @@ void ffPrintCPU(FFinstance* instance) ffStrbufAppendS(&cpu, " unknwon processor"); else { - ffPrintError(instance, "CPU", "No CPU info found in /proc/cpuinfo"); + ffPrintError(instance, &instance->config.cpuKey, "CPU", "No CPU info found in /proc/cpuinfo"); ffStrbufDestroy(&cpu); ffStrbufDestroy(&namePretty); return; @@ -129,7 +129,7 @@ void ffPrintCPU(FFinstance* instance) ); } - ffPrintAndSaveCachedValue(instance, "CPU", &cpu); + ffPrintAndSaveCachedValue(instance, &instance->config.cpuKey, "CPU", &cpu); ffStrbufDestroy(&cpu); ffStrbufDestroy(&namePretty); diff --git a/src/modules/custom.c b/src/modules/custom.c index 28fc03b7c..225bd5418 100644 --- a/src/modules/custom.c +++ b/src/modules/custom.c @@ -2,6 +2,6 @@ void ffPrintCustom(FFinstance* instance, const char* key, const char* value) { - ffPrintLogoAndKey(instance, key); + ffPrintLogoAndKey(instance, NULL, key); puts(value); } diff --git a/src/modules/de.c b/src/modules/de.c index 47b64e30d..fdc208162 100644 --- a/src/modules/de.c +++ b/src/modules/de.c @@ -42,11 +42,11 @@ void ffPrintDesktopEnvironment(FFinstance* instance) { if(sessionDesktop.length == 0 && sessionType.length == 0) { - ffPrintError(instance, "DE", "Neither DE nor Display Server could be determined"); + ffPrintError(instance, &instance->config.deKey, "DE", "Neither DE nor Display Server could be determined"); return; } - ffPrintLogoAndKey(instance, "DE"); + ffPrintLogoAndKey(instance, &instance->config.deKey, "DE"); if(sessionDesktop.length > 0) { @@ -69,7 +69,7 @@ void ffPrintDesktopEnvironment(FFinstance* instance) } else { - ffPrintFormatString(instance, "DE", &instance->config.deFormat, 3, + ffPrintFormatString(instance, &instance->config.deFormat, "DE", &instance->config.deFormat, 3, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, &sessionDesktop}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, &sessionVersion}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, &sessionType} diff --git a/src/modules/disk.c b/src/modules/disk.c index bbb11cc85..2ea9f5b11 100644 --- a/src/modules/disk.c +++ b/src/modules/disk.c @@ -2,7 +2,7 @@ #include -static void printStatvfs(FFinstance* instance, const char* key, struct statvfs* fs) +static void printStatvfs(FFinstance* instance, FFstrbuf* key, struct statvfs* fs) { const uint32_t GB = 1024 * 1024 * 1024; @@ -15,12 +15,12 @@ static void printStatvfs(FFinstance* instance, const char* key, struct statvfs* if(instance->config.diskFormat.length == 0) { - ffPrintLogoAndKey(instance, key); + ffPrintLogoAndKey(instance, key, NULL); printf("%uGB / %uGB (%u%%)\n", used, total, percentage); } else { - ffPrintFormatString(instance, key, &instance->config.diskFormat, 4, + ffPrintFormatString(instance, key, NULL, &instance->config.diskFormat, 4, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &used}, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &total}, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &files}, @@ -29,24 +29,43 @@ static void printStatvfs(FFinstance* instance, const char* key, struct statvfs* } } +static void createKey(FFinstance* instance, FFstrbuf* key, const char* folderPath) +{ + if(instance->config.diskKey.length == 0) + { + ffStrbufAppendF(key, "Disk (%s)", folderPath); + } + else + { + ffParseFormatString(key, &instance->config.diskKey, 1, + (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, folderPath} + ); + } +} + +static void printStatvfsCreateKey(FFinstance* instance, const char* folderPath, struct statvfs* fs) +{ + FF_STRBUF_CREATE(key); + createKey(instance, &key, folderPath); + printStatvfs(instance, &key, fs); + ffStrbufDestroy(&key); +} + static void printFolder(FFinstance* instance, const char* folderPath) { FF_STRBUF_CREATE(key); - ffStrbufAppendS(&key, "Disk ("); - ffStrbufAppendS(&key, folderPath); - ffStrbufAppendC(&key, ')'); + createKey(instance, &key, folderPath); struct statvfs fs; int ret = statvfs(folderPath, &fs); if(ret != 0 && instance->config.diskFormat.length == 0) { - ffPrintError(instance, key.chars, "statvfs(\"%s\", &fs) != 0", folderPath); + ffPrintError(instance, &key, NULL, "statvfs(\"%s\", &fs) != 0", folderPath); ffStrbufDestroy(&key); return; } - printStatvfs(instance, key.chars, &fs); - + printStatvfs(instance, &key, &fs); ffStrbufDestroy(&key); } @@ -62,15 +81,15 @@ void ffPrintDisk(FFinstance* instance) if(rootRet != 0 && homeRet != 0) { - ffPrintError(instance, "Disk", "statvfs failed for both / and /home"); + ffPrintError(instance, NULL, "Disk", "statvfs failed for both / and /home"); return; } if(rootRet == 0) - printStatvfs(instance, "Disk (/)", &fsRoot); + printStatvfsCreateKey(instance, "/", &fsRoot); if(homeRet == 0 && (rootRet != 0 || fsRoot.f_fsid != fsHome.f_fsid)) - printStatvfs(instance, "Disk (/home)", &fsHome); + printStatvfsCreateKey(instance, "/home", &fsHome); } else { diff --git a/src/modules/font.c b/src/modules/font.c index 14b42da6d..5a5b83c16 100644 --- a/src/modules/font.c +++ b/src/modules/font.c @@ -43,13 +43,13 @@ void ffPrintFont(FFinstance* instance) if(instance->config.fontFormat.length == 0) { - ffPrintLogoAndKey(instance, "Font"); + ffPrintLogoAndKey(instance, &instance->config.fontKey, "Font"); printf("%s [Plasma], ", plasmaPretty); ffStrbufPutTo(>kPretty, stdout); } else { - ffPrintFormatString(instance, "Font", &instance->config.fontFormat, 5, + ffPrintFormatString(instance, &instance->config.fontKey, "Font", &instance->config.fontFormat, 5, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, plasmaPretty}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, gtk2Pretty}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, gtk3Pretty}, diff --git a/src/modules/gpu.c b/src/modules/gpu.c index 5f29a114b..2e5349304 100644 --- a/src/modules/gpu.c +++ b/src/modules/gpu.c @@ -3,12 +3,24 @@ #include #include -static void handleGPU(FFinstance* instance, struct pci_access* pacc, struct pci_dev* dev, uint16_t counter, char*(*ffpci_lookup_name)(struct pci_access*, char*, int, int, ...)) +static void handleGPU(FFinstance* instance, struct pci_access* pacc, struct pci_dev* dev, uint32_t counter, char*(*ffpci_lookup_name)(struct pci_access*, char*, int, int, ...)) { - char key[8]; - sprintf(key, "GPU%hu", counter); + char cacheKey[8]; + sprintf(cacheKey, "GPU%u", counter); - if(ffPrintCachedValue(instance, key)) + FF_STRBUF_CREATE(key); + if(instance->config.gpuKey.length == 0) + { + ffStrbufAppendF(&key, "GPU %u", counter); + } + else + { + ffParseFormatString(&key, &instance->config.gpuKey, 1, + (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &counter} + ); + } + + if(ffPrintCachedValue(instance, &key, cacheKey)) return; char vendor[512]; @@ -37,8 +49,9 @@ static void handleGPU(FFinstance* instance, struct pci_access* pacc, struct pci_ ); } - ffPrintAndSaveCachedValue(instance, key, &gpu); + ffPrintAndSaveCachedValue(instance, &key, cacheKey, &gpu); ffStrbufDestroy(&gpu); + ffStrbufDestroy(&key); } void ffPrintGPU(FFinstance* instance) @@ -50,53 +63,53 @@ void ffPrintGPU(FFinstance* instance) pci = dlopen(instance->config.libPCI.chars, RTLD_LAZY); if(pci == NULL) { - ffPrintError(instance, "GPU", "dlopen(\"libpci.so\", RTLD_LAZY) == NULL"); + ffPrintError(instance, NULL, "GPU", "dlopen(\"libpci.so\", RTLD_LAZY) == NULL"); return; } struct pci_access*(*ffpci_alloc)() = dlsym(pci, "pci_alloc"); if(ffpci_alloc == NULL) { - ffPrintError(instance, "GPU", "dlsym(pci, \"pci_alloc\") == NULL"); + ffPrintError(instance, NULL, "GPU", "dlsym(pci, \"pci_alloc\") == NULL"); return; } void(*ffpci_init)(struct pci_access*) = dlsym(pci, "pci_init"); if(ffpci_init == NULL) { - ffPrintError(instance, "GPU", "dlsym(pci, \"pci_init\") == NULL"); + ffPrintError(instance, NULL, "GPU", "dlsym(pci, \"pci_init\") == NULL"); return; } void(*ffpci_scan_bus)(struct pci_access*) = dlsym(pci, "pci_scan_bus"); if(ffpci_scan_bus == NULL) { - ffPrintError(instance, "GPU", "dlsym(pci, \"pci_init\") == NULL"); + ffPrintError(instance, NULL, "GPU", "dlsym(pci, \"pci_init\") == NULL"); return; } int(*ffpci_fill_info)(struct pci_dev*, int) = dlsym(pci, "pci_fill_info"); if(ffpci_fill_info == NULL) { - ffPrintError(instance, "GPU", "dlsym(pci, \"pci_fill_info\") == NULL"); + ffPrintError(instance, NULL, "GPU", "dlsym(pci, \"pci_fill_info\") == NULL"); return; } char*(*ffpci_lookup_name)(struct pci_access*, char*, int, int, ...) = dlsym(pci, "pci_lookup_name"); if(ffpci_lookup_name == NULL) { - ffPrintError(instance, "GPU", "dlsym(pci, \"pci_lookup_name\") == NULL"); + ffPrintError(instance, NULL, "GPU", "dlsym(pci, \"pci_lookup_name\") == NULL"); return; } void(*ffpci_cleanup)(struct pci_access*) = dlsym(pci, "pci_cleanup"); if(ffpci_cleanup == NULL) { - ffPrintError(instance, "GPU", "dlsym(pci, \"pci_cleanup\") == NULL"); + ffPrintError(instance, NULL, "GPU", "dlsym(pci, \"pci_cleanup\") == NULL"); return; } - uint16_t counter = 0; + uint32_t counter = 0; struct pci_access *pacc; struct pci_dev *dev; diff --git a/src/modules/host.c b/src/modules/host.c index 358fad1d6..d1607c24c 100644 --- a/src/modules/host.c +++ b/src/modules/host.c @@ -2,7 +2,7 @@ void ffPrintHost(FFinstance* instance) { - if(ffPrintCachedValue(instance, "Host")) + if(ffPrintCachedValue(instance, &instance->config.hostKey, "Host")) return; FF_STRBUF_CREATE(family); @@ -20,7 +20,7 @@ void ffPrintHost(FFinstance* instance) { if(family.length == 0 && name.length == 0) { - ffPrintError(instance, "Host", "neither family nor name could be determined"); + ffPrintError(instance, &instance->config.hostKey, "Host", "neither family nor name could be determined"); return; } else if(name.length == 0) @@ -56,7 +56,7 @@ void ffPrintHost(FFinstance* instance) ); } - ffPrintAndSaveCachedValue(instance, "Host", &host); + ffPrintAndSaveCachedValue(instance, &instance->config.hostKey, "Host", &host); ffStrbufDestroy(&host); ffStrbufDestroy(&family); diff --git a/src/modules/icons.c b/src/modules/icons.c index df79bbf18..01c70b4c5 100644 --- a/src/modules/icons.c +++ b/src/modules/icons.c @@ -25,7 +25,7 @@ void ffPrintIcons(FFinstance* instance) if(instance->config.iconsFormat.length == 0) { - ffPrintLogoAndKey(instance, "Icons"); + ffPrintLogoAndKey(instance, &instance->config.iconsKey, "Icons"); if(plasma[0] == '\0') printf("Breeze [Plasma], "); @@ -36,7 +36,7 @@ void ffPrintIcons(FFinstance* instance) } else { - ffPrintFormatString(instance, "Icons", &instance->config.iconsFormat, 5, + ffPrintFormatString(instance, &instance->config.iconsKey, "Icons", &instance->config.iconsFormat, 5, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, plasma}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, gtk2}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, gtk3}, diff --git a/src/modules/kernel.c b/src/modules/kernel.c index 71147614a..6bb67e73f 100644 --- a/src/modules/kernel.c +++ b/src/modules/kernel.c @@ -4,12 +4,12 @@ void ffPrintKernel(FFinstance* instance) { if(instance->config.kernelFormat.length == 0) { - ffPrintLogoAndKey(instance, "Kernel"); + ffPrintLogoAndKey(instance, &instance->config.kernelKey, "Kernel"); puts(instance->state.utsname.release); } else { - ffPrintFormatString(instance, "Kernel", &instance->config.kernelFormat, 3, + ffPrintFormatString(instance, &instance->config.kernelKey, "Kernel", &instance->config.kernelFormat, 3, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, instance->state.utsname.sysname}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, instance->state.utsname.release}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, instance->state.utsname.version} diff --git a/src/modules/locale.c b/src/modules/locale.c index 636be611e..4c6d4ebb8 100644 --- a/src/modules/locale.c +++ b/src/modules/locale.c @@ -2,7 +2,7 @@ void ffPrintLocale(FFinstance* instance) { - if(ffPrintCachedValue(instance, "Locale")) + if(ffPrintCachedValue(instance, &instance->config.localeKey, "Locale")) return; char localeCode[256]; @@ -30,7 +30,7 @@ void ffPrintLocale(FFinstance* instance) strcpy(localeCode, getenv("LC_MESSAGES")); /* User has broken system */ else - ffPrintError(instance, "Locale", "Locale not found!"); + ffPrintError(instance, &instance->config.localeKey, "Locale", "Locale not found!"); /* /etc/locale.conf exists */ } else { ffParsePropFile("/etc/locale.conf", "LANG=%[^\n]", localeCode); @@ -52,6 +52,6 @@ void ffPrintLocale(FFinstance* instance) ); } - ffPrintAndSaveCachedValue(instance, "Locale", &locale); + ffPrintAndSaveCachedValue(instance, &instance->config.localeKey, "Locale", &locale); ffStrbufDestroy(&locale); } diff --git a/src/modules/memory.c b/src/modules/memory.c index 51d7f14b0..1ced5e9f4 100644 --- a/src/modules/memory.c +++ b/src/modules/memory.c @@ -5,7 +5,7 @@ void ffPrintMemory(FFinstance* instance) { FILE* meminfo = fopen("/proc/meminfo", "r"); if(meminfo == NULL) { - ffPrintError(instance, "Memory", "fopen(\"/proc/meminfo\", \"r\") == NULL"); + ffPrintError(instance, &instance->config.memoryKey, "Memory", "fopen(\"/proc/meminfo\", \"r\") == NULL"); return; } @@ -32,12 +32,12 @@ void ffPrintMemory(FFinstance* instance) if(instance->config.memoryFormat.length == 0) { - ffPrintLogoAndKey(instance, "Memory"); + ffPrintLogoAndKey(instance, &instance->config.memoryKey, "Memory"); printf("%uMiB / %uMiB (%u%%)\n", used_mem, total_mem, percentage); } else { - ffPrintFormatString(instance, "Memory", &instance->config.memoryFormat, 3, + ffPrintFormatString(instance, &instance->config.memoryKey, "Memory", &instance->config.memoryFormat, 3, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &used_mem}, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &total_mem}, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT8, &percentage} diff --git a/src/modules/os.c b/src/modules/os.c index ec4cea1ae..29fa631d1 100644 --- a/src/modules/os.c +++ b/src/modules/os.c @@ -2,7 +2,7 @@ void ffPrintOS(FFinstance* instance) { - if(ffPrintCachedValue(instance, "OS")) + if(ffPrintCachedValue(instance, &instance->config.osKey, "OS")) return; // Documentation of the fields: @@ -124,6 +124,6 @@ void ffPrintOS(FFinstance* instance) ); } - ffPrintAndSaveCachedValue(instance, "OS", &os); + ffPrintAndSaveCachedValue(instance, &instance->config.osKey, "OS", &os); ffStrbufDestroy(&os); } diff --git a/src/modules/packages.c b/src/modules/packages.c index f89e4efab..4816be109 100644 --- a/src/modules/packages.c +++ b/src/modules/packages.c @@ -34,11 +34,11 @@ void ffPrintPackages(FFinstance* instance) { if(all == 0) { - ffPrintError(instance, "Packages", "No packages from known package managers found"); + ffPrintError(instance, &instance->config.packagesKey, "Packages", "No packages from known package managers found"); return; } - ffPrintLogoAndKey(instance, "Packages"); + ffPrintLogoAndKey(instance, &instance->config.packagesKey, "Packages"); #define FF_PRINT_PACKAGE(name) \ if(name > 0) \ @@ -57,7 +57,7 @@ void ffPrintPackages(FFinstance* instance) } else { - ffPrintFormatString(instance, "Packages", &instance->config.packagesFormat, 3, + ffPrintFormatString(instance, &instance->config.packagesKey, "Packages", &instance->config.packagesFormat, 3, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &all}, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &pacman}, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &flatpak} diff --git a/src/modules/resolution.c b/src/modules/resolution.c index b512c8643..88ce44d42 100644 --- a/src/modules/resolution.c +++ b/src/modules/resolution.c @@ -40,7 +40,7 @@ static int getCurrentRate(FFinstance* instance, Display* display) void ffPrintResolution(FFinstance* instance) { - if(ffPrintCachedValue(instance, "Resolution")) + if(ffPrintCachedValue(instance, &instance->config.resolutionFormat, "Resolution")) return; void* x11; @@ -50,21 +50,21 @@ void ffPrintResolution(FFinstance* instance) x11 = dlopen(instance->config.libX11.chars, RTLD_LAZY); if(x11 == NULL) { - ffPrintError(instance, "Resolution", "dlopen(\"libX11.so\", RTLD_LAZY) == NULL"); + ffPrintError(instance, &instance->config.resolutionFormat, "Resolution", "dlopen(\"libX11.so\", RTLD_LAZY) == NULL"); return; } Display*(*ffXOpenDisplay)(const char*) = dlsym(x11, "XOpenDisplay"); if(ffXOpenDisplay == NULL) { - ffPrintError(instance, "Resolution", "dlsym(x11, \"XOpenDisplay\") == NULL"); + ffPrintError(instance, &instance->config.resolutionFormat, "Resolution", "dlsym(x11, \"XOpenDisplay\") == NULL"); return; } Display* display = ffXOpenDisplay(NULL); if(display == NULL) { - ffPrintError(instance, "Resolution", "ffXOpenDisplay(NULL) == NULL"); + ffPrintError(instance, &instance->config.resolutionFormat, "Resolution", "ffXOpenDisplay(NULL) == NULL"); return; } @@ -92,6 +92,6 @@ void ffPrintResolution(FFinstance* instance) ); } - ffPrintAndSaveCachedValue(instance, "Resolution", &resolution); + ffPrintAndSaveCachedValue(instance, &instance->config.resolutionKey, "Resolution", &resolution); ffStrbufDestroy(&resolution); } diff --git a/src/modules/shell.c b/src/modules/shell.c index ff99727c7..31907f30f 100644 --- a/src/modules/shell.c +++ b/src/modules/shell.c @@ -2,13 +2,13 @@ void ffPrintShell(FFinstance* instance) { - if(ffPrintCachedValue(instance, "Shell")) + if(ffPrintCachedValue(instance, &instance->config.shellKey, "Shell")) return; char* shellPath = getenv("SHELL"); if(shellPath == NULL) { - ffPrintError(instance, "Shell", "getenv(\"SHELL\") == NULL"); + ffPrintError(instance, &instance->config.shellKey, "Shell", "getenv(\"SHELL\") == NULL"); return; } @@ -41,6 +41,6 @@ void ffPrintShell(FFinstance* instance) ); } - ffPrintAndSaveCachedValue(instance, "Shell", &shell); + ffPrintAndSaveCachedValue(instance, &instance->config.shellKey, "Shell", &shell); ffStrbufDestroy(&shell); } diff --git a/src/modules/terminal.c b/src/modules/terminal.c index 51f73cf1e..7c5710ace 100644 --- a/src/modules/terminal.c +++ b/src/modules/terminal.c @@ -96,16 +96,16 @@ void ffPrintTerminal(FFinstance* instance) { if(error->length > 0) { - ffPrintError(instance, "Terminal", error->chars); + ffPrintError(instance, &instance->config.terminalKey, "Terminal", error->chars); return; } - ffPrintLogoAndKey(instance, "Terminal"); + ffPrintLogoAndKey(instance, &instance->config.terminalKey, "Terminal"); ffStrbufPutTo(name, stdout); } else { - ffPrintFormatString(instance, "Terminal", &instance->config.terminalFormat, 3, + ffPrintFormatString(instance, &instance->config.terminalKey, "Terminal", &instance->config.terminalFormat, 3, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, exeName}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, processName}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, name} diff --git a/src/modules/terminalfont.c b/src/modules/terminalfont.c index fc9780fce..2b24769c3 100644 --- a/src/modules/terminalfont.c +++ b/src/modules/terminalfont.c @@ -4,12 +4,12 @@ static void printTerminalFont(FFinstance* instance, char* font) { if(instance->config.termFontFormat.length == 0) { - ffPrintLogoAndKey(instance, "Terminal font"); + ffPrintLogoAndKey(instance, &instance->config.termFontKey, "Terminal font"); puts(font); } else { - ffPrintFormatString(instance, "Terminal font", &instance->config.termFontFormat, 1, + ffPrintFormatString(instance, &instance->config.termFontKey, "Terminal font", &instance->config.termFontFormat, 1, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, font} ); } @@ -21,7 +21,7 @@ static void printKonsole(FFinstance* instance) ffParsePropFileHome(instance, ".config/konsolerc", "DefaultProfile=%[^\n]", profile); if(profile[0] == '\0') { - ffPrintError(instance, "Terminal Font", "Couldn't find \"DefaultProfile=%[^\n]\" in \".config/konsolerc\""); + ffPrintError(instance, &instance->config.termFontKey, "Terminal Font", "Couldn't find \"DefaultProfile=%[^\n]\" in \".config/konsolerc\""); return; } @@ -32,7 +32,7 @@ static void printKonsole(FFinstance* instance) ffParsePropFileHome(instance, profilePath, "Font=%[^\n]", font); if(font[0] == '\0') { - ffPrintError(instance, "Terminal Font", "Couldn't find \"Font=%%[^\\n]\" in \"%s\"", profilePath); + ffPrintError(instance, &instance->config.termFontKey, "Terminal Font", "Couldn't find \"Font=%%[^\\n]\" in \"%s\"", profilePath); return; } @@ -61,7 +61,7 @@ void ffPrintTerminalFont(FFinstance* instance) if(error->length > 0) { if(instance->config.termFontFormat.length == 0) - ffPrintError(instance, "Terminal Font", "Terminal Font needs successfull terminal detection"); + ffPrintError(instance, &instance->config.termFontKey, "Terminal Font", "Terminal Font needs successfull terminal detection"); else printTerminalFont(instance, ""); @@ -77,6 +77,6 @@ void ffPrintTerminalFont(FFinstance* instance) if(instance->config.termFontFormat.length > 0) printTerminalFont(instance, ""); else - ffPrintError(instance, "Terminal Font", "Unknown terminal: %s", error->chars); + ffPrintError(instance, &instance->config.termFontKey, "Terminal Font", "Unknown terminal: %s", error->chars); } } diff --git a/src/modules/theme.c b/src/modules/theme.c index 0eaea0b20..afa5ef3bd 100644 --- a/src/modules/theme.c +++ b/src/modules/theme.c @@ -25,7 +25,7 @@ void ffPrintTheme(FFinstance* instance) if(instance->config.themeFormat.length == 0) { - ffPrintLogoAndKey(instance, "Theme"); + ffPrintLogoAndKey(instance, &instance->config.themeKey, "Theme"); if(plasma[0] != '\0') printf("%s [Plasma], ", plasma); @@ -34,7 +34,7 @@ void ffPrintTheme(FFinstance* instance) } else { - ffPrintFormatString(instance, "Theme", &instance->config.themeFormat, 5, + ffPrintFormatString(instance, &instance->config.themeKey, "Theme", &instance->config.themeFormat, 5, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, plasma}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, gtk2}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRING, gtk3}, diff --git a/src/modules/uptime.c b/src/modules/uptime.c index 15df0c513..d41ba05ff 100644 --- a/src/modules/uptime.c +++ b/src/modules/uptime.c @@ -9,7 +9,7 @@ void ffPrintUptime(FFinstance* instance) if(instance->config.uptimeFormat.length == 0) { - ffPrintLogoAndKey(instance, "Uptime"); + ffPrintLogoAndKey(instance, &instance->config.uptimeKey, "Uptime"); if(days == 0 && hours == 0 && minutes == 0) { @@ -28,7 +28,7 @@ void ffPrintUptime(FFinstance* instance) } else { - ffPrintFormatString(instance, "Uptime", &instance->config.uptimeFormat, 4, + ffPrintFormatString(instance, &instance->config.uptimeKey, "Uptime", &instance->config.uptimeFormat, 4, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &days}, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &hours}, (FFformatarg){FF_FORMAT_ARG_TYPE_UINT, &minutes}, diff --git a/src/modules/wm.c b/src/modules/wm.c index 7e32b0b56..16b296f7d 100644 --- a/src/modules/wm.c +++ b/src/modules/wm.c @@ -7,7 +7,7 @@ void ffPrintWM(FFinstance* instance) DIR* proc = opendir("/proc/"); if(proc == NULL) { - ffPrintError(instance, "WM", "opendir(\"/proc/\") == NULL"); + ffPrintError(instance, &instance->config.wmKey, "WM", "opendir(\"/proc/\") == NULL"); return; } @@ -39,16 +39,16 @@ void ffPrintWM(FFinstance* instance) { if(prettyName.length == 0) { - ffPrintError(instance, "WM", "No process name matches the name of known display managers"); + ffPrintError(instance, &instance->config.wmKey, "WM", "No process name matches the name of known display managers"); return; } - ffPrintLogoAndKey(instance, "WM"); + ffPrintLogoAndKey(instance, &instance->config.wmKey, "WM"); ffStrbufPutTo(&prettyName, stdout); } else { - ffPrintFormatString(instance, "WM", &instance->config.wmFormat, 2, + ffPrintFormatString(instance, &instance->config.wmKey, "WM", &instance->config.wmFormat, 2, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, &processName}, (FFformatarg){FF_FORMAT_ARG_TYPE_STRBUF, &prettyName} ); diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index 1d3c9a832..8c637e1fb 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -88,6 +88,8 @@ void ffStrbufEnsureCapacity(FFstrbuf* strbuf, uint32_t allocate) void ffStrbufEnsureFree(FFstrbuf* strbuf, uint32_t free) { uint32_t allocate = strbuf->allocated; + if(allocate < 2) + allocate = 2; while((strbuf->length + free) > allocate) allocate *= 2; ffStrbufEnsureCapacity(strbuf, allocate);