@@ -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+
486539bool
487540#ifdef __ANDROID__
488541ffDetectTerminalFontPlatformLinux
@@ -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