Skip to content

Commit 6a69cbd

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 6a69cbd

1 file changed

Lines changed: 57 additions & 0 deletions

File tree

src/detection/terminalfont/terminalfont_linux.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,61 @@ 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
495+
const char* configdir = NULL;
496+
const char* p = cmdline.chars;
497+
const char* end = cmdline.chars + cmdline.length;
498+
while (p < end) {
499+
if (ffStrEquals(p, "--configdir")) {
500+
p += strlen("--configdir") + 1; // skip NUL
501+
if (p < end) {
502+
configdir = p;
503+
}
504+
break;
505+
}
506+
p += strlen(p) + 1; // skip to next NUL-terminated token
507+
}
508+
509+
// Build config file path
510+
FF_STRBUF_AUTO_DESTROY configPath = ffStrbufCreate();
511+
if (configdir && ffStrSet(configdir)) {
512+
ffStrbufAppendS(&configPath, configdir);
513+
ffStrbufAppendS(&configPath, "/kmscon.conf");
514+
} else {
515+
ffStrbufAppendS(&configPath, FASTFETCH_TARGET_DIR_ETC "/kmscon/kmscon.conf");
516+
}
517+
518+
FF_STRBUF_AUTO_DESTROY fontName = ffStrbufCreate();
519+
FF_STRBUF_AUTO_DESTROY fontSize = ffStrbufCreate();
520+
521+
if (!ffParsePropFileValues(configPath.chars, 2, (FFpropquery[]) {
522+
{ "font-name=", &fontName },
523+
{ "font-size=", &fontSize },
524+
})) {
525+
ffStrbufAppendF(&terminalFont->error, "Couldn't read kmscon config: %s", configPath.chars);
526+
return;
527+
}
528+
529+
if (fontName.length == 0) {
530+
ffStrbufAppendF(&terminalFont->error, "Couldn't find font-name in %s", configPath.chars);
531+
return;
532+
}
533+
534+
if (fontSize.length == 0) {
535+
ffStrbufSetStatic(&fontSize, "16");
536+
}
537+
538+
ffFontInitValues(&terminalFont->font, fontName.chars, fontSize.chars);
539+
}
540+
486541
bool
487542
#ifdef __ANDROID__
488543
ffDetectTerminalFontPlatformLinux
@@ -538,6 +593,8 @@ ffDetectTerminalFontPlatform
538593
detectFromConfigFile("termite/config", "font =", terminalFont);
539594
} else if (ffStrbufIgnCaseEqualS(&terminal->processName, "rxvt") || ffStrbufIgnCaseEqualS(&terminal->processName, "urxvt") || ffStrbufIgnCaseEqualS(&terminal->processName, "urxvtd")) {
540595
detectUrxvt(terminalFont);
596+
} else if (ffStrbufIgnCaseEqualS(&terminal->processName, "kmscon")) {
597+
detectKmscon(terminalFont, terminal);
541598
} else {
542599
return false;
543600
}

0 commit comments

Comments
 (0)