From e8ebae7ee9bd429f91401a196498b8f8b0d66d49 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Thu, 8 Aug 2024 15:04:27 +0800 Subject: [PATCH] TerminalFont (Linux): improve performance of st terminal font detection --- .../terminalfont/terminalfont_linux.c | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/src/detection/terminalfont/terminalfont_linux.c b/src/detection/terminalfont/terminalfont_linux.c index 634160bcf..0f0576958 100644 --- a/src/detection/terminalfont/terminalfont_linux.c +++ b/src/detection/terminalfont/terminalfont_linux.c @@ -8,6 +8,7 @@ #include "detection/displayserver/displayserver.h" #include "util/mallocHelper.h" #include "util/stringUtils.h" +#include "util/linux/elf.h" static const char* getSystemMonospaceFont(void) { @@ -286,6 +287,13 @@ static void detectXterm(FFTerminalFontResult* terminalFont) ffFontInitValues(&terminalFont->font, fontName.chars, fontSize.chars); } +static bool elfExtractStringsCallBack(const char* str, uint32_t len, void* userData) +{ + if (!ffStrContains(str, "size=")) return true; + ffStrbufSetNS((FFstrbuf*) userData, len, str); + return false; +} + static void detectSt(FFTerminalFontResult* terminalFont, const FFTerminalResult* terminal) { FF_STRBUF_AUTO_DESTROY size = ffStrbufCreateF("/proc/%u/cmdline", terminal->pid); @@ -306,30 +314,13 @@ static void detectSt(FFTerminalFontResult* terminalFont, const FFTerminalResult* else { ffStrbufClear(&font); - if (ffProcessAppendStdOut(&font, (char* const[]) { - "strings", - terminal->exePath.chars, - NULL, - }) != NULL || font.length == 0) - { - ffStrbufAppendS(&terminalFont->error, "Failed to run `strings st`"); - return; - } - // Search font config string in st binary - uint32_t middleIndex = ffStrbufFirstIndexS(&font, "size="); - if (middleIndex == font.length) + ffElfExtractStrings(terminal->exePath.chars, elfExtractStringsCallBack, &font); + if (font.length == 0) { ffStrbufAppendS(&terminalFont->error, "No font config found in st binary"); return; } - - uint32_t startIndex = ffStrbufPreviousIndexC(&font, middleIndex, '\n'); - if (startIndex == font.length) startIndex = 0; - uint32_t endIndex = ffStrbufNextIndexC(&font, middleIndex, '\n'); - - ffStrbufSubstrBefore(&font, endIndex); - ffStrbufSubstrAfter(&font, startIndex); } // JetBrainsMono Nerd Font Mono:pixelsize=12:antialias=true:autohint=true