TerminalFont: support Termux

This commit is contained in:
李通洲 2022-09-26 23:07:18 +08:00
parent 4632fe8cd9
commit 38a6d07c85
No known key found for this signature in database
GPG Key ID: 3570F9F0F4410388
7 changed files with 77 additions and 2 deletions

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -1,7 +1,74 @@
#include "fastfetch.h"
#include "terminalfont.h"
#include "detection/terminalshell.h"
#include "common/io.h"
#include <sys/stat.h>
#ifdef FF_HAVE_FREETYPE
#include "common/library.h"
#include <ft2build.h>
#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));
}

View File

@ -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)

View File

@ -151,6 +151,7 @@ typedef struct FFconfig
FFstrbuf libOpenCL;
FFstrbuf libplist;
FFstrbuf libcJSON;
FFstrbuf libfreetype;
bool cpuTemp;
bool gpuTemp;