From 38a6d07c85a7082161cf292c302e22c82b71038d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 26 Sep 2022 23:07:18 +0800 Subject: [PATCH] TerminalFont: support Termux --- CMakeLists.txt | 2 + README.md | 3 +- src/common/init.c | 1 + src/data/config_user.txt | 1 + .../terminalfont/terminalfont_android.c | 69 ++++++++++++++++++- src/fastfetch.c | 2 + src/fastfetch.h | 1 + 7 files changed, 77 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e98032b..53334074 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,7 @@ cmake_dependent_option(ENABLE_OSMESA "Enable osmesa" ON "LINUX OR BSD" OFF) cmake_dependent_option(ENABLE_OPENCL "Enable opencl" ON "LINUX OR BSD" OFF) cmake_dependent_option(ENABLE_LIBPLIST "Enable libplist" ON "APPLE" OFF) cmake_dependent_option(ENABLE_LIBCJSON "Enable libcjson" ON "LINUX" OFF) +cmake_dependent_option(ENABLE_FREETYPE "Enable freetype" ON "ANDROID" OFF) option(BUILD_TESTS "Build tests" OFF) # Also create test executables option(SET_TWEAK "Add tweak to project version" ON) # This is set to off by github actions for release builds @@ -389,6 +390,7 @@ ff_lib_enable(OSMESA osmesa) ff_lib_enable(OPENCL OpenCL) ff_lib_enable(LIBPLIST libplist-2.0) ff_lib_enable(LIBCJSON libcjson) +ff_lib_enable(FREETYPE freetype2) if(APPLE) target_link_libraries(libfastfetch diff --git a/README.md b/README.md index 41ad3fba..7542ada8 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ The following libraries are used if present at runtime: * [`librpm`](http://rpm.org/): Slower fallback for rpm package count. Needed on openSUSE. * [`libplist`](https://github.com/libimobiledevice/libplist): Binary `plist` file parser ( macOS ). Needed for iTerm2 Terminal font and WM Theme. * [`libcJSON`](https://github.com/DaveGamble/cJSON): Needed for Windows Terminal font ( WSL ). +* [`freetype`](https://www.freetype.org/): Needed for Termux font detection ( Android ). ## Support status All categories not listed here should work without needing a specific implementation. @@ -82,7 +83,7 @@ KDE Plasma, Gnome, Cinnamon, Mate, XFCE4, LXQt ##### Terminal fonts ``` -Konsole, Gnome Terminal, Tilix, XFCE4 Terminal, Alacritty, LXTerminal, iTerm2, Apple Terminal, TTY, Windows Terminal +Konsole, Gnome Terminal, Tilix, XFCE4 Terminal, Alacritty, LXTerminal, iTerm2, Apple Terminal, TTY, Windows Terminal, Termux ``` ## Building diff --git a/src/common/init.c b/src/common/init.c index 322e661c..7d630d8c 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -219,6 +219,7 @@ static void defaultConfig(FFinstance* instance) ffStrbufInitA(&instance->config.libOpenCL, 0); ffStrbufInitA(&instance->config.libplist, 0); ffStrbufInitA(&instance->config.libcJSON, 0); + ffStrbufInitA(&instance->config.libfreetype, 0); instance->config.cpuTemp = false; instance->config.gpuTemp = false; diff --git a/src/data/config_user.txt b/src/data/config_user.txt index 1ded95bf..05e1c999 100644 --- a/src/data/config_user.txt +++ b/src/data/config_user.txt @@ -325,3 +325,4 @@ #--lib-opencl /usr/lib/libOpenCL.so #--lib-plist /usr/local/bin/libplist-2.0.dylib #--lib-cjson /usr/lib/libcjson.so +#--lib-freetype /data/data/com.termux/files/usr/lib diff --git a/src/detection/terminalfont/terminalfont_android.c b/src/detection/terminalfont/terminalfont_android.c index 06eab584..8211ab1d 100644 --- a/src/detection/terminalfont/terminalfont_android.c +++ b/src/detection/terminalfont/terminalfont_android.c @@ -1,7 +1,74 @@ +#include "fastfetch.h" #include "terminalfont.h" #include "detection/terminalshell.h" +#include "common/io.h" + +#include + +#ifdef FF_HAVE_FREETYPE + #include "common/library.h" + #include + #include FT_FREETYPE_H +#endif + +#define FF_TERMUX_FONT_PATH FASTFETCH_TARGET_DIR_HOME "/.termux/font.ttf" + +const char* detectTermux(const FFinstance* instance, FFTerminalFontResult* terminalFont) +{ + #ifdef FF_HAVE_FREETYPE + + FF_LIBRARY_LOAD(freetype, &instance->config.libfreetype, "dlopen libfreetype"FF_LIBRARY_EXTENSION " failed", "libfreetype"FF_LIBRARY_EXTENSION, 2) + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(freetype, FT_Init_FreeType); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(freetype, FT_New_Face); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(freetype, FT_Done_Face); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(freetype, FT_Done_FreeType); + + FT_Library library = NULL; + FT_Face face = NULL; + const char* error = NULL; + + if(ffFT_Init_FreeType(&library)) + { + error = "FT_Init_FreeType() failed"; + goto exit; + } + + if(ffFT_New_Face(library, FF_TERMUX_FONT_PATH, 0, &face )) + { + error = "FT_NEW_Face(" FF_TERMUX_FONT_PATH ") failed"; + goto exit; + } + + ffFontInitCopy(&terminalFont->font, face->family_name); + +exit: + if(face) ffFT_Done_Face(face); + if(library) ffFT_Done_FreeType(library); + dlclose(freetype); + + return error; + + #else + + FF_UNUSED(terminalFont); + ffStrbufSetS(&terminalFont->error, "fastfetch is built without freetype2 support"); + + #endif +} void ffDetectTerminalFontPlatform(const FFinstance* instance, const FFTerminalShellResult* terminalShell, FFTerminalFontResult* terminalFont) { - FF_UNUSED(instance, terminalShell, terminalFont); + if(ffStrbufCompS(&terminalShell->terminalProcessName, "Termux") != 0) + { + ffStrbufSetS(&terminalFont->error, "Unsupported terminal"); + return; + } + + if(!ffFileExists(FF_TERMUX_FONT_PATH, S_IFREG)) + { + ffFontInitCopy(&terminalFont->font, "monospace"); + return; + } + + ffStrbufSetS(&terminalFont->error, detectTermux(instance, terminalFont)); } diff --git a/src/fastfetch.c b/src/fastfetch.c index cbf56a96..2254f30c 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1208,6 +1208,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseString(key, value, &instance->config.libPCI); else if(strcasecmp(key, "--lib-vulkan") == 0) optionParseString(key, value, &instance->config.libVulkan); + else if(strcasecmp(key, "--lib-freetype") == 0) + optionParseString(key, value, &instance->config.libfreetype); else if(strcasecmp(key, "--lib-wayland") == 0) optionParseString(key, value, &instance->config.libWayland); else if(strcasecmp(key, "--lib-xcb-randr") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index a8178453..d1439b84 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -151,6 +151,7 @@ typedef struct FFconfig FFstrbuf libOpenCL; FFstrbuf libplist; FFstrbuf libcJSON; + FFstrbuf libfreetype; bool cpuTemp; bool gpuTemp;