Skip to content

Commit defc118

Browse files
committed
feat(terminalfont): add kmscon font detection
Read kmscon's config file (found via --configdir in /proc/<pid>/cmdline, falling back to /etc/kmscon/kmscon.conf) to extract font-name and font-size. Fixes #2393
1 parent 4594734 commit defc118

1 file changed

Lines changed: 55 additions & 0 deletions

File tree

src/detection/terminalfont/terminalfont_linux.c

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,59 @@ static void detectHaikuTerminal(FFTerminalFontResult* terminalFont) {
483483
}
484484
#endif
485485

486+
static void detectKmscon(FFTerminalFontResult* terminalFont, const FFTerminalResult* terminal) {
487+
FF_STRBUF_AUTO_DESTROY cmdline = ffStrbufCreate();
488+
FF_STRBUF_AUTO_DESTROY cmdlinePath = ffStrbufCreateF("/proc/%u/cmdline", terminal->pid);
489+
if (!ffAppendFileBuffer(cmdlinePath.chars, &cmdline)) {
490+
ffStrbufAppendF(&terminalFont->error, "Failed to open %s", cmdlinePath.chars);
491+
return;
492+
}
493+
494+
// Search for --configdir in NUL-separated cmdline (safe: memmem/memchr, no strlen)
495+
FF_STRBUF_AUTO_DESTROY configdir = ffStrbufCreate();
496+
const char* p = memmem(cmdline.chars, cmdline.length, "\0--configdir\0", sizeof("\0--configdir\0") - 1);
497+
if (p) {
498+
const char* val = p + sizeof("\0--configdir\0") - 1;
499+
const char* end = cmdline.chars + cmdline.length;
500+
if (val < end) {
501+
const char* valEnd = memchr(val, '\0', (size_t)(end - val));
502+
if (valEnd && valEnd > val)
503+
ffStrbufSetNS(&configdir, (uint32_t)(valEnd - val), val);
504+
}
505+
}
506+
507+
// Build config file path — only accept absolute paths
508+
FF_STRBUF_AUTO_DESTROY configPath = ffStrbufCreate();
509+
if (configdir.length > 0 && configdir.chars[0] == '/') {
510+
ffStrbufAppendS(&configPath, configdir.chars);
511+
ffStrbufAppendS(&configPath, "/kmscon.conf");
512+
} else {
513+
ffStrbufAppendS(&configPath, FASTFETCH_TARGET_DIR_ETC "/kmscon/kmscon.conf");
514+
}
515+
516+
FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate();
517+
FF_STRBUF_AUTO_DESTROY fontSize = ffStrbufCreate();
518+
519+
if (!ffParsePropFileValues(configPath.chars, 2, (FFpropquery[]) {
520+
{ "font-name=", &fontName },
521+
{ "font-size=", &fontSize },
522+
})) {
523+
ffStrbufAppendF(&terminalFont->error, "Couldn't read kmscon config: %s", configPath.chars);
524+
return;
525+
}
526+
527+
if (fontName.length == 0) {
528+
ffStrbufAppendF(&terminalFont->error, "Couldn't find font-name in %s", configPath.chars);
529+
return;
530+
}
531+
532+
if (fontSize.length == 0) {
533+
ffStrbufSetStatic(&fontSize, "16");
534+
}
535+
536+
ffFontInitValues(&terminalFont->font, fontName.chars, fontSize.chars);
537+
}
538+
486539
bool
487540
#ifdef __ANDROID__
488541
ffDetectTerminalFontPlatformLinux
@@ -538,6 +591,8 @@ ffDetectTerminalFontPlatform
538591
detectFromConfigFile("termite/config", "font =", terminalFont);
539592
} else if (ffStrbufIgnCaseEqualS(&terminal->processName, "rxvt") || ffStrbufIgnCaseEqualS(&terminal->processName, "urxvt") || ffStrbufIgnCaseEqualS(&terminal->processName, "urxvtd")) {
540593
detectUrxvt(terminalFont);
594+
} else if (ffStrbufIgnCaseEqualS(&terminal->processName, "kmscon")) {
595+
detectKmscon(terminalFont, terminal);
541596
} else {
542597
return false;
543598
}

0 commit comments

Comments
 (0)