From 33be85c4bcf1b65a1b05efc35f481dac1838e00b Mon Sep 17 00:00:00 2001 From: Linus Dierheimer Date: Thu, 11 Mar 2021 17:21:18 +0100 Subject: [PATCH] terminal font --- CMakeLists.txt | 1 + src/common.c | 16 +++++++++ src/fastfetch.c | 4 ++- src/fastfetch.h | 13 ++++++++ src/flashfetch.c | 1 + src/modules/font.c | 22 +++---------- src/modules/terminal.c | 56 ++++++++++++++++++++++++------- src/modules/terminalfont.c | 67 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 149 insertions(+), 31 deletions(-) create mode 100644 src/modules/terminalfont.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f953968d..28ae425e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ set(SRCS src/modules/icons.c src/modules/font.c src/modules/terminal.c + src/modules/terminalfont.c src/modules/cpu.c src/modules/gpu.c src/modules/memory.c diff --git a/src/common.c b/src/common.c index f5c6c787a..c6185e4f4 100644 --- a/src/common.c +++ b/src/common.c @@ -12,6 +12,8 @@ void ffInitState(FFstate* state) state->passwd = getpwuid(getuid()); uname(&state->utsname); sysinfo(&state->sysinfo); + state->terminal.value = NULL; + state->terminal.error = NULL; } void ffDefaultConfig(FFconfig* config) @@ -131,6 +133,20 @@ void ffPrintGtkPretty(const char* gtk2, const char* gtk3, const char* gtk4) } } +void ffParseFont(char* font, char* buffer) +{ + char name[64]; + char size[32]; + int scanned = sscanf(font, "%[^,], %[^,]", name, size); + + if(scanned == 0) + strcpy(buffer, font); + else if(scanned == 1) + strcpy(buffer, name); + else + sprintf(buffer, "%s (%spt)", name, size); +} + void ffPrintError(FFinstance* instance, const char* key, const char* message) { if(!instance->config.showErrors) diff --git a/src/fastfetch.c b/src/fastfetch.c index 6ae5d40f2..bfa986c3e 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -8,7 +8,7 @@ #include #include -#define FASTFETCH_DEFAULT_STRUCTURE "Title:Seperator:OS:Host:Kernel:Uptime:Packages:Shell:Resolution:DE:WM:Theme:Icons:Font:Terminal:CPU:GPU:Memory:Disk:Battery:Locale:Break:Colors" +#define FASTFETCH_DEFAULT_STRUCTURE "Title:Seperator:OS:Host:Kernel:Uptime:Packages:Shell:Resolution:DE:WM:Theme:Icons:Font:Terminal:TerminalFont:CPU:GPU:Memory:Disk:Battery:Locale:Break:Colors" #define FASTFETCH_DEFAULT_CONFIG \ "## Fastfetch configuration\n" \ @@ -204,6 +204,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char ffPrintFont(instance); else if(strcasecmp(line, "terminal") == 0) ffPrintTerminal(instance); + else if(strcasecmp(line, "terminalfont") == 0) + ffPrintTerminalFont(instance); else if(strcasecmp(line, "cpu") == 0) ffPrintCPU(instance); else if(strcasecmp(line, "gpu") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index a8177b523..96076e1f8 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -66,12 +66,20 @@ typedef struct FFconfig } FFconfig; +typedef struct FFvalue +{ + char* value; + char* error; +} FFvalue; + typedef struct FFstate { uint8_t current_row; struct passwd* passwd; struct utsname utsname; struct sysinfo sysinfo; + + FFvalue terminal; } FFstate; typedef struct FFinstance @@ -88,6 +96,7 @@ void ffPrintLogoAndKey(FFinstance* instance, const char* key); void ffGetFileContent(const char* fileName, char* buffer, uint32_t bufferSize); void ffParsePropFile(const char* file, const char* regex, char* buffer); void ffParsePropFileHome(FFinstance* instance, const char* relativeFile, const char* regex, char* buffer); +void ffParseFont(char* font, char* buffer); void ffPrintGtkPretty(const char* gtk2, const char* gtk3, const char* gtk4); void ffPrintError(FFinstance* instance, const char* key, const char* message); void ffTrimTrailingWhitespace(char* buffer); @@ -105,6 +114,9 @@ void ffPrintLogos(bool color); #endif //Module functions + +void ffPopulateTerminal(FFinstance* instance); + void ffPrintCustom(FFinstance* instance, const char* key, const char* value); void ffPrintBreak(FFinstance* instance); void ffPrintTitle(FFinstance* instance); @@ -122,6 +134,7 @@ void ffPrintTheme(FFinstance* instance); void ffPrintIcons(FFinstance* instance); void ffPrintFont(FFinstance* instance); void ffPrintTerminal(FFinstance* instance); +void ffPrintTerminalFont(FFinstance* instance); void ffPrintCPU(FFinstance* instance); void ffPrintGPU(FFinstance* instance); void ffPrintMemory(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 35a061bc1..caca93a45 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -28,6 +28,7 @@ int main(int argc, char** argv) ffPrintIcons(&instance); ffPrintFont(&instance); ffPrintTerminal(&instance); + ffPrintTerminalFont(&instance); ffPrintCPU(&instance); ffPrintGPU(&instance); ffPrintMemory(&instance); diff --git a/src/modules/font.c b/src/modules/font.c index 02297f153..2665c755a 100644 --- a/src/modules/font.c +++ b/src/modules/font.c @@ -1,19 +1,5 @@ #include "fastfetch.h" -static void parseFont(char* font, char* buffer) -{ - char name[64]; - char size[32]; - int scanned = sscanf(font, "%[^,], %[^,]", name, size); - - if(scanned == 0) - strcpy(buffer, font); - else if(scanned == 1) - strcpy(buffer, name); - else - sprintf(buffer, "%s (%spt)", name, size); -} - void ffPrintFont(FFinstance* instance) { char plasma[256]; @@ -26,7 +12,7 @@ void ffPrintFont(FFinstance* instance) if(gtk2[0] == '\0') gtk2Pretty[0] = '\0'; else - parseFont(gtk2, gtk2Pretty); + ffParseFont(gtk2, gtk2Pretty); char gtk3[256]; ffParsePropFileHome(instance, ".config/gtk-3.0/settings.ini", "gtk-font-name=%[^\n]", gtk3); @@ -35,7 +21,7 @@ void ffPrintFont(FFinstance* instance) if(gtk3[0] == '\0') gtk3Pretty[0] = '\0'; else - parseFont(gtk3, gtk3Pretty); + ffParseFont(gtk3, gtk3Pretty); char gtk4[256]; ffParsePropFileHome(instance, ".config/gtk-4.0/settings.ini", "gtk-font-name=%[^\n]", gtk4); @@ -44,7 +30,7 @@ void ffPrintFont(FFinstance* instance) if(gtk4Pretty[0] == '\0') gtk4Pretty[0] = '\0'; else - parseFont(gtk4, gtk4Pretty); + ffParseFont(gtk4, gtk4Pretty); ffPrintLogoAndKey(instance, "Font"); @@ -55,7 +41,7 @@ void ffPrintFont(FFinstance* instance) else { char plasmaPretty[256]; - parseFont(plasma, plasmaPretty); + ffParseFont(plasma, plasmaPretty); printf("%s [Plasma], ", plasmaPretty); } diff --git a/src/modules/terminal.c b/src/modules/terminal.c index 4c9261659..00443120f 100644 --- a/src/modules/terminal.c +++ b/src/modules/terminal.c @@ -1,6 +1,6 @@ #include "fastfetch.h" -static void printTerminalName(FFinstance* instance, const char* pid) +static void getTerminalName(FFinstance* instance, const char* pid, char* terminal, char* error) { char file[256]; sprintf(file, "/proc/%s/stat", pid); @@ -8,9 +8,7 @@ static void printTerminalName(FFinstance* instance, const char* pid) FILE* stat = fopen(file, "r"); if(stat == NULL) { - char error[300]; sprintf(error, "fopen(\"%s\", \"r\") == NULL", file); - ffPrintError(instance, "Terminal", error); return; } @@ -18,7 +16,7 @@ static void printTerminalName(FFinstance* instance, const char* pid) char ppid[256]; if(fscanf(stat, "%*s (%[^)])%*s%s", name, ppid) != 2) { - ffPrintError(instance, "Terminal", "fscanf(stat, \"%*s (%[^)])%*s%s\", name, ppid) != 2"); + strcpy(error, "fscanf(stat, \"%*s (%[^)])%*s%s\", name, ppid) != 2"); return; } @@ -35,28 +33,62 @@ static void printTerminalName(FFinstance* instance, const char* pid) strcasecmp(name, "doas") == 0 || strcasecmp(name, "strace") == 0 ) { - printTerminalName(instance, ppid); + getTerminalName(instance, ppid, terminal, error); return; } - - ffPrintLogoAndKey(instance, "Terminal"); if( strcasecmp(name, "systemd") == 0 || strcasecmp(name, "init") == 0 || + strcasecmp(name, "login") == 0 || + strcasecmp(name, "0") == 0 || strcasecmp(ppid, "0") == 0 ) { - puts("TTY"); + strcpy(terminal, "TTY"); } else { - puts(name); + strcpy(terminal, name); } } +void ffPopulateTerminal(FFinstance* instance) +{ + if(instance->state.terminal.value != NULL || instance->state.terminal.error != NULL) + return; + + static char terminal[256]; + static char error[256]; + + terminal[0] = '\0'; + error[0] = '\0'; + + char ppid[256]; + sprintf(ppid, "%i", getppid()); + getTerminalName(instance, ppid, terminal, error); + + if(terminal[0] != '\0') + instance->state.terminal.value = terminal; + + if(error[0] != '\0') + instance->state.terminal.error = error; +} + void ffPrintTerminal(FFinstance* instance) { - char ppid[256]; - sprintf(ppid, "%i", getppid()); - printTerminalName(instance, ppid); + ffPopulateTerminal(instance); + + if(instance->state.terminal.value != NULL) + { + ffPrintLogoAndKey(instance, "Terminal"); + puts(instance->state.terminal.value); + } + else if(instance->state.terminal.error != NULL) + { + ffPrintError(instance, "Terminal", instance->state.terminal.error); + } + else + { + ffPrintError(instance, "Terminal", "ffPopulateTerminal failed"); + } } diff --git a/src/modules/terminalfont.c b/src/modules/terminalfont.c new file mode 100644 index 000000000..37c6c81a4 --- /dev/null +++ b/src/modules/terminalfont.c @@ -0,0 +1,67 @@ +#include "fastfetch.h" + +static void printKonsole(FFinstance* instance) +{ + char profile[128]; + ffParsePropFileHome(instance, ".config/konsolerc", "DefaultProfile=%[^\n]", profile); + if(profile[0] == '\0') + { + ffPrintError(instance, "Terminal Font", "Couldn't find \"DefaultProfile=%[^\n]\" in \".config/konsolerc\""); + return; + } + + char profilePath[256]; + sprintf(profilePath, ".local/share/konsole/%s", profile); + + char font[128]; + ffParsePropFileHome(instance, profilePath, "Font=%[^\n]", font); + if(font[0] == '\0') + { + char error[256]; + sprintf(error, "Terminal Font", "Couldn't find \"Font=%[^\n]\" in \"%s\"", profilePath); + ffPrintError(instance, "Terminal Font", error); + } + + char fontPretty[128]; + ffParseFont(font, fontPretty); + + ffPrintLogoAndKey(instance, "Terminal Font"); + puts(fontPretty); +} + +static void printTTY(FFinstance* instance) +{ + char font[128]; + ffParsePropFile("/etc/vconsole.conf", "Font=%[^\n]", font); + if(font[0] == '\0') + strcpy(font, "hardware-supplied VGA font"); + + ffPrintLogoAndKey(instance, "Terminal Font"); + puts(font); +} + +void ffPrintTerminalFont(FFinstance* instance) +{ + ffPopulateTerminal(instance); + + if(instance->state.terminal.error != NULL) + { + ffPrintError(instance, "Terminal Font", "Terminal Font needs successfull terminal detection"); + } + else if(instance->state.terminal.value == NULL) + { + ffPrintError(instance, "Terminal Font", "ffPopulateTerminal failed"); + } + + if(strcasecmp(instance->state.terminal.value, "konsole") == 0) + printKonsole(instance); + else if(strcasecmp(instance->state.terminal.value, "TTY") == 0) + printTTY(instance); + else + { + char error[256]; + sprintf(error, "Unknown terminal: %s", instance->state.terminal.value); + ffPrintError(instance, "Terminal Font", error); + } + +} \ No newline at end of file