ohmu
·
2026-10-15
1#include "fastfetch.h"
2#include "terminalfont.h"
3#include "detection/terminalshell/terminalshell.h"
4#include "common/io.h"
5#include "common/properties.h"
6
7#ifdef FF_HAVE_FREETYPE
8 #include "common/library.h"
9 #include <ft2build.h>
10 #include FT_FREETYPE_H
11#endif
12
13#define FF_TERMUX_FONT_PATH FASTFETCH_TARGET_DIR_HOME "/.termux/font.ttf"
14#define FF_TERMUX_PREF_PATH "/data/data/com.termux/shared_prefs/com.termux_preferences.xml"
15
16const char* detectTermux(FFTerminalFontResult* terminalFont) {
17 FF_STRBUF_AUTO_DESTROY fontSize = ffStrbufCreate();
18 // SharedPreferences XML: <string name="fontsize">14</string>, in px
19 ffParsePropFile(FF_TERMUX_PREF_PATH, "<string name=\"fontsize\">", &fontSize);
20 if (fontSize.length > 0) {
21 ffStrbufAppendS(&fontSize, "px");
22 }
23
24 if (!ffPathExists(FF_TERMUX_FONT_PATH, FF_PATHTYPE_FILE)) {
25 ffFontInitValues(&terminalFont->font, "monospace", fontSize.length ? fontSize.chars : nullptr);
26 return nullptr;
27 }
28
29#ifdef FF_HAVE_FREETYPE
30
31 FF_LIBRARY_LOAD_MESSAGE(freetype, "libfreetype" FF_LIBRARY_EXTENSION, 2)
32 FF_LIBRARY_LOAD_SYMBOL_MESSAGE(freetype, FT_Init_FreeType);
33 FF_LIBRARY_LOAD_SYMBOL_MESSAGE(freetype, FT_New_Face);
34 FF_LIBRARY_LOAD_SYMBOL_MESSAGE(freetype, FT_Done_Face);
35 FF_LIBRARY_LOAD_SYMBOL_MESSAGE(freetype, FT_Done_FreeType);
36
37 FT_Library library = nullptr;
38 FT_Face face = nullptr;
39 const char* error = nullptr;
40
41 if (ffFT_Init_FreeType(&library)) {
42 error = "FT_Init_FreeType() failed";
43 goto exit;
44 }
45
46 if (ffFT_New_Face(library, FF_TERMUX_FONT_PATH, 0, &face)) {
47 error = "FT_NEW_Face(" FF_TERMUX_FONT_PATH ") failed";
48 goto exit;
49 }
50
51 ffFontInitValues(&terminalFont->font, face->family_name, fontSize.length ? fontSize.chars : nullptr);
52
53exit:
54 if (face) {
55 ffFT_Done_Face(face);
56 }
57 if (library) {
58 ffFT_Done_FreeType(library);
59 }
60
61 return error;
62
63#else
64
65 ffFontInitValues(&terminalFont->font, "monospace", fontSize.length ? fontSize.chars : nullptr);
66 return "Fastfetch was built without freetype2 support";
67
68#endif
69}
70
71bool ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont) {
72 if (ffStrbufEqualS(&terminal->processName, "com.termux")) {
73 ffStrbufSetS(&terminalFont->error, detectTermux(terminalFont));
74 } else {
75 bool ffDetectTerminalFontPlatformLinux(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont);
76 return ffDetectTerminalFontPlatformLinux(terminal, terminalFont);
77 }
78
79 return true;
80}