From c9c2526f0899a322e117be55acfb72537c2818dc Mon Sep 17 00:00:00 2001 From: AloneER0 Date: Wed, 21 Dec 2022 17:27:00 +0100 Subject: [PATCH 1/3] Added OpenMandriva --- src/logo/builtin.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/logo/builtin.c b/src/logo/builtin.c index 720d21ede..d876cc5ac 100644 --- a/src/logo/builtin.c +++ b/src/logo/builtin.c @@ -1726,6 +1726,45 @@ static const FFlogo* getLogoOpenSuseTumbleweed() FF_LOGO_RETURN } +static const FFlogo* getLogoOpenMandriva() +{ + FF_LOGO_INIT + FF_LOGO_NAMES("openmandriva", "open-mandriva", "open_mandriva") + FF_LOGO_LINES( + " ``````\n" + " `-:/+++++++//:-.`\n" + " .:+++oooo+/:.`` ``\n" + " `:+ooooooo+:. `-:/++++++/:.`\n" + " -+oooooooo:` `-++o+/::::://+o+/-\n" + " `/ooooooooo- -+oo/.` `-/oo+.\n" + " `+ooooooooo. :os/` .+so:\n" + " +sssssssss/ :ss/ `+ss-\n" + " :ssssssssss` sss` .sso\n" + " ossssssssss `yyo sys\n" + "`sssssssssss` `yys `yys\n" + "`sssssssssss: +yy/ +yy:\n" + " oyyyyyyyyyys. `oyy/` `+yy+\n" + " :yyyyyyyyyyyo. `+yhs:. `./shy/\n" + " oyyyyyyyyyyys:` .oyhys+:----/+syhy+. `\n" + " `syyyyyyyyyyyyo-` .:osyhhhhhyys+:``.:`\n" + " `oyyyyyyyyyyyyys+-`` `.----.```./oo.\n" + " /yhhhhhhhhhhhhhhyso+//://+osyhy/`\n" + " `/yhhhhhhhhhhhhhhhhhhhhhhhhy/`\n" + " `:oyhhhhhhhhhhhhhhhhhhyo:`\n" + " .:+syhhhhhhhhys+:-`\n" + " ``....``" + + + + ) + FF_LOGO_COLORS( + "34" //blue + ) + FF_LOGO_COLOR_KEYS("34"); //blue + FF_LOGO_COLOR_TITLE("34"); //blue + FF_LOGO_RETURN +} + static const FFlogo* getLogoPop() { FF_LOGO_INIT @@ -2353,6 +2392,7 @@ GetLogoMethod* ffLogoBuiltinGetAll() getLogoOpenSuseSmall, getLogoOpenSuseLeap, getLogoOpenSuseTumbleweed, + getLogoOpenMandriva, getLogoPop, getLogoPopSmall, getLogoParabola, From 0cacedfc5ddce74824fba6bbee6de7c6afe9250b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 22 Dec 2022 02:07:35 +0800 Subject: [PATCH 2/3] Image: enable Chafa on Windows It's not built by default, as imagemagick requires too many dlls. --- CMakeLists.txt | 2 +- src/common/init.c | 4 ++++ src/data/help.txt | 2 ++ src/fastfetch.c | 8 ++++++++ src/fastfetch.h | 3 +++ src/logo/image/im7.c | 6 +++++- src/logo/image/image.c | 27 ++++++++++++++++++++++++--- 7 files changed, 47 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 148d21e5f..4e6361229 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,7 +59,7 @@ cmake_dependent_option(ENABLE_DBUS "Enable dbus-1" ON "LINUX OR BSD" OFF) cmake_dependent_option(ENABLE_XFCONF "Enable libxfconf-0" ON "LINUX OR BSD" OFF) cmake_dependent_option(ENABLE_SQLITE3 "Enable sqlite3" ON "LINUX OR BSD" OFF) cmake_dependent_option(ENABLE_RPM "Enable rpm" ON "LINUX" OFF) -cmake_dependent_option(ENABLE_IMAGEMAGICK7 "Enable imagemagick 7" ON "LINUX OR BSD OR APPLE" OFF) +cmake_dependent_option(ENABLE_IMAGEMAGICK7 "Enable imagemagick 7" ON "LINUX OR BSD OR APPLE OR WIN32" OFF) cmake_dependent_option(ENABLE_IMAGEMAGICK6 "Enable imagemagick 6" ON "LINUX OR BSD OR APPLE" OFF) cmake_dependent_option(ENABLE_CHAFA "Enable chafa" ON "ENABLE_IMAGEMAGICK6 OR ENABLE_IMAGEMAGICK7" OFF) cmake_dependent_option(ENABLE_ZLIB "Enable zlib" ON "ENABLE_IMAGEMAGICK6 OR ENABLE_IMAGEMAGICK7" OFF) diff --git a/src/common/init.c b/src/common/init.c index 3f8915377..68f123fbe 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -138,6 +138,9 @@ static void defaultConfig(FFinstance* instance) instance->config.logo.paddingRight = 4; instance->config.logo.printRemaining = true; + instance->config.logo.chafaFgOnly = true; + ffStrbufInitS(&instance->config.logo.chafaSymbols, "block+border+space-wide-inverted"); // Chafa default + ffStrbufInit(&instance->config.colorKeys); ffStrbufInit(&instance->config.colorTitle); @@ -381,6 +384,7 @@ static void destroyModuleArg(FFModuleArgs* args) static void destroyConfig(FFinstance* instance) { ffStrbufDestroy(&instance->config.logo.source); + ffStrbufDestroy(&instance->config.logo.chafaSymbols); for(uint8_t i = 0; i < (uint8_t) FASTFETCH_LOGO_MAX_COLORS; ++i) ffStrbufDestroy(&instance->config.logo.colors[i]); ffStrbufDestroy(&instance->config.colorKeys); diff --git a/src/data/help.txt b/src/data/help.txt index d65071462..ca4edde2f 100644 --- a/src/data/help.txt +++ b/src/data/help.txt @@ -38,6 +38,8 @@ Logo options: --sixel : short for --logo-type sixel --logo --kitty : short for --logo-type kitty --logo --chafa : short for --logo-type chafa --logo + --chafa-symbols : specify character symbols to employ in final output. See chafa document for detail + --chafa-fg-only : produces character-cell output using foreground colors only. See chafa document for detail Display options: -s,--structure : sets the structure of the fetch. Must be a colon separated list of keys. Use "fastfetch --list-modules" to see the ones available. diff --git a/src/fastfetch.c b/src/fastfetch.c index be62bb4ad..27dd55b2f 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1017,6 +1017,14 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseString(key, value, &instance->config.logo.source); instance->config.logo.type = FF_LOGO_TYPE_IMAGE_CHAFA; } + else if(strcasecmp(key, "--chafa-fg-only") == 0) + { + instance->config.logo.chafaFgOnly = optionParseBoolean(value); + } + else if(strcasecmp(key, "--chafa-symbols") == 0) + { + optionParseString(key, value, &instance->config.logo.chafaSymbols); + } /////////////////// //Display options// diff --git a/src/fastfetch.h b/src/fastfetch.h index 1198b4fcf..81c4bb05a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -75,6 +75,9 @@ typedef struct FFconfig uint32_t paddingLeft; uint32_t paddingRight; bool printRemaining; + + bool chafaFgOnly; + FFstrbuf chafaSymbols; } logo; //If one of those is empty, ffLogoPrint will set them diff --git a/src/logo/image/im7.c b/src/logo/image/im7.c index 2d1408f23..d7cf4b6d0 100644 --- a/src/logo/image/im7.c +++ b/src/logo/image/im7.c @@ -14,7 +14,11 @@ static void* logoResize(const void* image, size_t width, size_t height, void* ex FFLogoImageResult ffLogoPrintImageIM7(FFinstance* instance, FFLogoRequestData* requestData) { - FF_LIBRARY_LOAD(imageMagick, &instance->config.libImageMagick, FF_LOGO_IMAGE_RESULT_INIT_ERROR, "libMagickCore-7.Q16HDRI" FF_LIBRARY_EXTENSION, 11, "libMagickCore-7.Q16" FF_LIBRARY_EXTENSION, 11) + FF_LIBRARY_LOAD(imageMagick, &instance->config.libImageMagick, FF_LOGO_IMAGE_RESULT_INIT_ERROR, + "libMagickCore-7.Q16HDRI" FF_LIBRARY_EXTENSION, 11, + "libMagickCore-7.Q16" FF_LIBRARY_EXTENSION, 11, + "libMagickCore-7.Q16HDRI-10" FF_LIBRARY_EXTENSION, -1 // Required for Windows + ) FF_LIBRARY_LOAD_SYMBOL_ADDRESS(imageMagick, ffResizeImage, ResizeImage, FF_LOGO_IMAGE_RESULT_INIT_ERROR); FFIMData imData; diff --git a/src/logo/image/image.c b/src/logo/image/image.c index ccbaae7df..fe888ccc2 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -226,19 +226,30 @@ static bool printImageKitty(FFinstance* instance, FFLogoRequestData* requestData #include static bool printImageChafa(FFinstance* instance, FFLogoRequestData* requestData, const ImageData* imageData) { - FF_LIBRARY_LOAD(chafa, &instance->config.libChafa, false, "libchafa" FF_LIBRARY_EXTENSION, 1) + FF_LIBRARY_LOAD(chafa, &instance->config.libChafa, false, + "libchafa" FF_LIBRARY_EXTENSION, 1, + "libchafa-0" FF_LIBRARY_EXTENSION, -1 // Required for Windows + ) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_symbol_map_new, false) - FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_symbol_map_add_by_tags, false) + FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_symbol_map_apply_selectors, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_new, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_set_geometry, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_set_symbol_map, false) + FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_set_color_space, false) + FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_set_canvas_mode, false) + FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_set_fg_only_enabled, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_new, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_draw_all_pixels, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_print, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_unref, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_unref, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_symbol_map_unref, false) + + #ifndef _WIN32 + // FIXME: These functions must be imported from `libglib` dlls. Leak them for now FF_LIBRARY_LOAD_SYMBOL(chafa, g_string_free, false) + FF_LIBRARY_LOAD_SYMBOL(chafa, g_error_free, false) + #endif imageData->ffCopyMagickString(imageData->imageInfo->magick, "RGBA", 5); size_t length; @@ -250,11 +261,17 @@ static bool printImageChafa(FFinstance* instance, FFLogoRequestData* requestData } ChafaSymbolMap* symbolMap = ffchafa_symbol_map_new(); - ffchafa_symbol_map_add_by_tags(symbolMap, CHAFA_SYMBOL_TAG_ALL); + GError* error = NULL; + if(!ffchafa_symbol_map_apply_selectors(symbolMap, instance->config.logo.chafaSymbols.chars, &error)) + fputs(error->message, stderr); ChafaCanvasConfig* canvasConfig = ffchafa_canvas_config_new(); ffchafa_canvas_config_set_geometry(canvasConfig, (gint) requestData->logoCharacterWidth, (gint) requestData->logoCharacterHeight); ffchafa_canvas_config_set_symbol_map(canvasConfig, symbolMap); + ffchafa_canvas_config_set_color_space(canvasConfig, CHAFA_COLOR_SPACE_DIN99D); + ffchafa_canvas_config_set_canvas_mode(canvasConfig, CHAFA_CANVAS_MODE_TRUECOLOR); + ffchafa_canvas_config_set_fg_only_enabled(canvasConfig, instance->config.logo.chafaFgOnly); + // TODO: expose more chafa configs to fastfetch flags ChafaCanvas* canvas = ffchafa_canvas_new(canvasConfig); ffchafa_canvas_draw_all_pixels( @@ -275,7 +292,11 @@ static bool printImageChafa(FFinstance* instance, FFLogoRequestData* requestData ffLogoPrintChars(instance, result.chars, false); writeCacheStrbuf(requestData, &result, FF_CACHE_FILE_CHAFA); + #ifndef _WIN32 ffg_string_free(str, TRUE); + ffg_error_free(error); + #endif + ffchafa_canvas_unref(canvas); ffchafa_canvas_config_unref(canvasConfig); ffchafa_symbol_map_unref(symbolMap); From f50b4789668797547928110d6f6c742b2de795f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 22 Dec 2022 02:40:56 +0800 Subject: [PATCH 3/3] Image: try fixing caching --- src/common/init.c | 2 +- src/fastfetch.h | 1 - src/logo/image/image.c | 23 ++++++++++++++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/common/init.c b/src/common/init.c index 68f123fbe..5acd02581 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -138,7 +138,7 @@ static void defaultConfig(FFinstance* instance) instance->config.logo.paddingRight = 4; instance->config.logo.printRemaining = true; - instance->config.logo.chafaFgOnly = true; + instance->config.logo.chafaFgOnly = false; ffStrbufInitS(&instance->config.logo.chafaSymbols, "block+border+space-wide-inverted"); // Chafa default ffStrbufInit(&instance->config.colorKeys); diff --git a/src/fastfetch.h b/src/fastfetch.h index 81c4bb05a..632a23daa 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -210,7 +210,6 @@ typedef struct FFstate #endif FFlist configDirs; - FFstrbuf cacheDir; } FFstate; typedef struct FFinstance diff --git a/src/logo/image/image.c b/src/logo/image/image.c index fe888ccc2..13cdbcf1f 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -24,7 +24,12 @@ static inline char* realpath(const char* restrict file_name, char* restrict resolved_name) { - return _fullpath(resolved_name, file_name, _MAX_PATH); + char* result = _fullpath(resolved_name, file_name, _MAX_PATH); + if(result) + { + resolved_name[1] = resolved_name[0]; // Drive Name + resolved_name[0] = '/'; + } } #endif @@ -270,7 +275,7 @@ static bool printImageChafa(FFinstance* instance, FFLogoRequestData* requestData ffchafa_canvas_config_set_symbol_map(canvasConfig, symbolMap); ffchafa_canvas_config_set_color_space(canvasConfig, CHAFA_COLOR_SPACE_DIN99D); ffchafa_canvas_config_set_canvas_mode(canvasConfig, CHAFA_CANVAS_MODE_TRUECOLOR); - ffchafa_canvas_config_set_fg_only_enabled(canvasConfig, instance->config.logo.chafaFgOnly); + // ffchafa_canvas_config_set_fg_only_enabled(canvasConfig, instance->config.logo.chafaFgOnly); // TODO: expose more chafa configs to fastfetch flags ChafaCanvas* canvas = ffchafa_canvas_new(canvasConfig); @@ -587,7 +592,19 @@ bool ffLogoPrintImageIfExists(FFinstance* instance, FFLogoType type) requestData.logoPixelHeight = simpleCeil((double) instance->config.logo.height * requestData.characterPixelHeight); ffStrbufInitA(&requestData.cacheDir, PATH_MAX * 2); - ffStrbufAppend(&requestData.cacheDir, &instance->state.cacheDir); + + #if !(defined(_WIN32) || defined(__APPLE__) || defined(__ANDROID__)) + ffStrbufAppendS(&requestData.cacheDir, getenv("XDG_CACHE_HOME")); + #endif + + if(requestData.cacheDir.length == 0) + { + ffStrbufAppendS(&requestData.cacheDir, instance->state.passwd->pw_dir); + ffStrbufAppendS(&requestData.cacheDir, "/.cache/"); + } + else + ffStrbufEnsureEndsWithC(&requestData.cacheDir, '/'); + ffStrbufAppendS(&requestData.cacheDir, "images"); ffStrbufEnsureFree(&requestData.cacheDir, PATH_MAX);