master ohmu/fastfetch-openbsd / src / detection / terminalfont / terminalfont_android.c
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}