mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-10-30 09:11:15 +01:00
project structure refactoring
This commit is contained in:
@@ -0,0 +1,299 @@
|
||||
#include "fastfetch.h"
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <pthread.h>
|
||||
#include <dconf/client/dconf-client.h>
|
||||
|
||||
static inline bool allPropertiesSet(FFstrbuf* themeNamePtr, FFstrbuf* iconsNamePtr, FFstrbuf* fontNamePtr)
|
||||
{
|
||||
return
|
||||
themeNamePtr->length > 0 &&
|
||||
iconsNamePtr->length > 0 &&
|
||||
fontNamePtr->length > 0;
|
||||
}
|
||||
|
||||
static void parseGTKDConfSettings(FFinstance* instance, FFstrbuf* themeNamePtr, FFstrbuf* iconsNamePtr, FFstrbuf* fontNamePtr)
|
||||
{
|
||||
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
static const gchar* themeName;
|
||||
static const gchar* iconsName;
|
||||
static const gchar* fontName;
|
||||
|
||||
static bool init = false;
|
||||
|
||||
pthread_mutex_lock(&mutex);
|
||||
|
||||
if(init)
|
||||
{
|
||||
ffStrbufAppendS(themeNamePtr, themeName);
|
||||
ffStrbufAppendS(iconsNamePtr, iconsName);
|
||||
ffStrbufAppendS(fontNamePtr, fontName);
|
||||
pthread_mutex_unlock(&mutex);
|
||||
return;
|
||||
}
|
||||
init = true;
|
||||
|
||||
void* dconf;
|
||||
if(instance->config.libDConf.length == 0)
|
||||
dconf = dlopen("libdconf.so", RTLD_LAZY);
|
||||
else
|
||||
dconf = dlopen(instance->config.libDConf.chars, RTLD_LAZY);
|
||||
|
||||
if(dconf == NULL)
|
||||
return;
|
||||
|
||||
DConfClient*(*ffdconf_client_new)(void) = dlsym(dconf, "dconf_client_new");
|
||||
if(ffdconf_client_new == NULL)
|
||||
{
|
||||
dlclose(dconf);
|
||||
return;
|
||||
}
|
||||
|
||||
const gchar*(*ffg_variant_get_string)(GVariant*, gsize*) = dlsym(dconf, "g_variant_get_string");
|
||||
if(ffg_variant_get_string == NULL)
|
||||
{
|
||||
dlclose(dconf);
|
||||
return;
|
||||
}
|
||||
|
||||
GVariant*(*ffdconf_client_read)(DConfClient*, const gchar*) = dlsym(dconf, "dconf_client_read");
|
||||
if(ffdconf_client_read == NULL)
|
||||
{
|
||||
dlclose(dconf);
|
||||
return;
|
||||
}
|
||||
|
||||
DConfClient* dconfClient = ffdconf_client_new();
|
||||
if(dconfClient == NULL)
|
||||
{
|
||||
dlclose(dconf);
|
||||
return;
|
||||
}
|
||||
|
||||
GVariant* themeNameVariant = ffdconf_client_read(dconfClient, "/org/gnome/desktop/interface/gtk-theme");
|
||||
if(themeNameVariant != NULL)
|
||||
themeName = ffg_variant_get_string(themeNameVariant, NULL);
|
||||
|
||||
GVariant* fontNameVariant = ffdconf_client_read(dconfClient, "/org/gnome/desktop/interface/font-name");
|
||||
if(fontNameVariant != NULL)
|
||||
fontName = ffg_variant_get_string(fontNameVariant, NULL);
|
||||
|
||||
GVariant* iconsNameVariant = ffdconf_client_read(dconfClient, "/org/gnome/desktop/interface/icon-theme");
|
||||
if(iconsNameVariant != NULL)
|
||||
iconsName = ffg_variant_get_string(iconsNameVariant, NULL);
|
||||
|
||||
dlclose(dconf);
|
||||
|
||||
ffStrbufAppendS(themeNamePtr, themeName);
|
||||
ffStrbufAppendS(iconsNamePtr, iconsName);
|
||||
ffStrbufAppendS(fontNamePtr, fontName);
|
||||
|
||||
pthread_mutex_unlock(&mutex);
|
||||
}
|
||||
|
||||
static void parseGTKConfigFile(FFstrbuf* fileName, FFstrbuf* themeNamePtr, FFstrbuf* iconsNamePtr, FFstrbuf* fontNamePtr)
|
||||
{
|
||||
FILE* file = fopen(fileName->chars, "r");
|
||||
if(file == NULL)
|
||||
return;
|
||||
|
||||
char* line = NULL;
|
||||
size_t len = 0;
|
||||
|
||||
while(getline(&line, &len, file) != -1)
|
||||
{
|
||||
if(themeNamePtr->length == 0)
|
||||
{
|
||||
sscanf(line, "gtk-theme-name=%[^\n]", themeNamePtr->chars);
|
||||
sscanf(line, "gtk-theme-name=\"%[^\"]+", themeNamePtr->chars);
|
||||
}
|
||||
|
||||
if(iconsNamePtr->length == 0)
|
||||
{
|
||||
sscanf(line, "gtk-icon-theme-name=%[^\n]", iconsNamePtr->chars);
|
||||
sscanf(line, "gtk-icon-theme-name=\"%[^\"]+", iconsNamePtr->chars);
|
||||
}
|
||||
|
||||
if(fontNamePtr->length == 0)
|
||||
{
|
||||
sscanf(line, "gtk-font-name=%[^\n]", fontNamePtr->chars);
|
||||
sscanf(line, "gtk-font-name=\"%[^\"]+", fontNamePtr->chars);
|
||||
}
|
||||
}
|
||||
|
||||
if(line != NULL)
|
||||
free(line);
|
||||
|
||||
fclose(file);
|
||||
|
||||
ffStrbufRecalculateLength(themeNamePtr);
|
||||
ffStrbufRecalculateLength(iconsNamePtr);
|
||||
ffStrbufRecalculateLength(fontNamePtr);
|
||||
}
|
||||
|
||||
static void calculateGTKFromConfigDir(const char* configDir, const char* version, FFstrbuf* themeNamePtr, FFstrbuf* iconsNamePtr, FFstrbuf* fontNamePtr)
|
||||
{
|
||||
// <configdir>/gtk-<version>.0/settings.ini
|
||||
FFstrbuf file1;
|
||||
ffStrbufInitA(&file1, 64);
|
||||
ffStrbufAppendS(&file1, configDir);
|
||||
ffStrbufAppendS(&file1, "gtk-");
|
||||
ffStrbufAppendS(&file1, version);
|
||||
ffStrbufAppendS(&file1, ".0/settings.ini");
|
||||
parseGTKConfigFile(&file1, themeNamePtr, iconsNamePtr, fontNamePtr);
|
||||
ffStrbufDestroy(&file1);
|
||||
if(allPropertiesSet(themeNamePtr, iconsNamePtr, fontNamePtr))
|
||||
return;
|
||||
|
||||
// <configdir>/gtk-<version>.0/gtkrc
|
||||
FFstrbuf file2;
|
||||
ffStrbufInitA(&file2, 64);
|
||||
ffStrbufAppendS(&file2, configDir);
|
||||
ffStrbufAppendS(&file2, "gtk-");
|
||||
ffStrbufAppendS(&file2, version);
|
||||
ffStrbufAppendS(&file2, ".0/gtkrc");
|
||||
parseGTKConfigFile(&file2, themeNamePtr, iconsNamePtr, fontNamePtr);
|
||||
ffStrbufDestroy(&file2);
|
||||
if(allPropertiesSet(themeNamePtr, iconsNamePtr, fontNamePtr))
|
||||
return;
|
||||
|
||||
// <configdir>/gtkrc-<version>.0
|
||||
FFstrbuf file3;
|
||||
ffStrbufInitA(&file3, 64);
|
||||
ffStrbufAppendS(&file3, configDir);
|
||||
ffStrbufAppendS(&file3, "gtkrc-");
|
||||
ffStrbufAppendS(&file3, version);
|
||||
ffStrbufAppendS(&file3, ".0");
|
||||
parseGTKConfigFile(&file3, themeNamePtr, iconsNamePtr, fontNamePtr);
|
||||
ffStrbufDestroy(&file3);
|
||||
if(allPropertiesSet(themeNamePtr, iconsNamePtr, fontNamePtr))
|
||||
return;
|
||||
|
||||
// <configdir>/.gtkrc-<version>.0
|
||||
FFstrbuf file4;
|
||||
ffStrbufInitA(&file4, 64);
|
||||
ffStrbufAppendS(&file4, configDir);
|
||||
ffStrbufAppendS(&file4, ".gtkrc-");
|
||||
ffStrbufAppendS(&file4, version);
|
||||
ffStrbufAppendS(&file4, ".0");
|
||||
parseGTKConfigFile(&file4, themeNamePtr, iconsNamePtr, fontNamePtr);
|
||||
ffStrbufDestroy(&file4);
|
||||
}
|
||||
|
||||
static void calculateGTK(FFinstance* instance, const char* version, FFstrbuf* themeNamePtr, FFstrbuf* iconsNamePtr, FFstrbuf* fontNamePtr)
|
||||
{
|
||||
static FFstrbuf configDir;
|
||||
static bool configDirInit = false;
|
||||
|
||||
if(!configDirInit)
|
||||
{
|
||||
ffStrbufInitA(&configDir, 64);
|
||||
ffStrbufAppendS(&configDir, instance->state.passwd->pw_dir);
|
||||
ffStrbufAppendS(&configDir, "/.config/");
|
||||
configDirInit = true;
|
||||
}
|
||||
|
||||
static FFstrbuf xdgConfigDir;
|
||||
static bool xdgConfigDirInit = false;
|
||||
|
||||
if(!xdgConfigDirInit)
|
||||
{
|
||||
ffStrbufInitA(&xdgConfigDir, 64);
|
||||
ffStrbufAppendS(&xdgConfigDir, getenv("XDG_CONFIG_HOME"));
|
||||
if(xdgConfigDir.length > 0 && xdgConfigDir.chars[xdgConfigDir.length - 1] != '/')
|
||||
ffStrbufAppendC(&xdgConfigDir, '/');
|
||||
xdgConfigDirInit = true;
|
||||
}
|
||||
|
||||
static bool xdgIsDifferent;
|
||||
static bool xdgIsDifferentInit = false;
|
||||
|
||||
if(!xdgIsDifferentInit)
|
||||
{
|
||||
xdgIsDifferent = ffStrbufComp(&configDir, &xdgConfigDir) != 0;
|
||||
xdgConfigDirInit = true;
|
||||
}
|
||||
|
||||
if(xdgIsDifferent)
|
||||
{
|
||||
calculateGTKFromConfigDir(xdgConfigDir.chars, version, themeNamePtr, iconsNamePtr, fontNamePtr);
|
||||
if(allPropertiesSet(themeNamePtr, iconsNamePtr, fontNamePtr))
|
||||
return;
|
||||
}
|
||||
|
||||
calculateGTKFromConfigDir(configDir.chars, version, themeNamePtr, iconsNamePtr, fontNamePtr);
|
||||
if(allPropertiesSet(themeNamePtr, iconsNamePtr, fontNamePtr))
|
||||
return;
|
||||
|
||||
// <homedir>/gtkrc-<version>.0
|
||||
FFstrbuf homeConfig1;
|
||||
ffStrbufInitA(&homeConfig1, 64);
|
||||
ffStrbufAppendS(&homeConfig1, instance->state.passwd->pw_dir);
|
||||
ffStrbufAppendS(&homeConfig1, "/gtkrc-");
|
||||
ffStrbufAppendS(&homeConfig1, version);
|
||||
ffStrbufAppendS(&homeConfig1, ".0");
|
||||
parseGTKConfigFile(&homeConfig1, themeNamePtr, iconsNamePtr, fontNamePtr);
|
||||
ffStrbufDestroy(&homeConfig1);
|
||||
if(allPropertiesSet(themeNamePtr, iconsNamePtr, fontNamePtr))
|
||||
return;
|
||||
|
||||
// <homedir>/.gtkrc-<version>.0
|
||||
FFstrbuf homeConfig2;
|
||||
ffStrbufInitA(&homeConfig2, 64);
|
||||
ffStrbufAppendS(&homeConfig2, instance->state.passwd->pw_dir);
|
||||
ffStrbufAppendS(&homeConfig2, "/.gtkrc-");
|
||||
ffStrbufAppendS(&homeConfig2, version);
|
||||
ffStrbufAppendS(&homeConfig2, ".0");
|
||||
parseGTKConfigFile(&homeConfig2, themeNamePtr, iconsNamePtr, fontNamePtr);
|
||||
ffStrbufDestroy(&homeConfig2);
|
||||
if(allPropertiesSet(themeNamePtr, iconsNamePtr, fontNamePtr))
|
||||
return;
|
||||
|
||||
parseGTKDConfSettings(instance, themeNamePtr, iconsNamePtr, fontNamePtr);
|
||||
if(allPropertiesSet(themeNamePtr, iconsNamePtr, fontNamePtr))
|
||||
return;
|
||||
|
||||
calculateGTKFromConfigDir("/etc/", version, themeNamePtr, iconsNamePtr, fontNamePtr);
|
||||
}
|
||||
|
||||
#define FF_CALCULATE_GTK_IMPL(version) \
|
||||
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; \
|
||||
static FFstrbuf themeName; \
|
||||
static FFstrbuf iconsName; \
|
||||
static FFstrbuf fontName; \
|
||||
static bool init = false; \
|
||||
if(themeNamePtr != NULL) \
|
||||
*themeNamePtr = &themeName; \
|
||||
if(iconsNamePtr != NULL) \
|
||||
*iconsNamePtr = &iconsName; \
|
||||
if(fontNamePtr != NULL) \
|
||||
*fontNamePtr = &fontName; \
|
||||
pthread_mutex_lock(&mutex); \
|
||||
if(init){ \
|
||||
pthread_mutex_unlock(&mutex);\
|
||||
return; \
|
||||
} \
|
||||
init = true; \
|
||||
ffStrbufInit(&themeName); \
|
||||
ffStrbufInit(&iconsName); \
|
||||
ffStrbufInit(&fontName); \
|
||||
calculateGTK(instance, #version, &themeName, &iconsName, &fontName); \
|
||||
pthread_mutex_unlock(&mutex);
|
||||
|
||||
void ffCalculateGTK2(FFinstance* instance, FFstrbuf** themeNamePtr, FFstrbuf** iconsNamePtr, FFstrbuf** fontNamePtr)
|
||||
{
|
||||
FF_CALCULATE_GTK_IMPL(2)
|
||||
}
|
||||
|
||||
void ffCalculateGTK3(FFinstance* instance, FFstrbuf** themeNamePtr, FFstrbuf** iconsNamePtr, FFstrbuf** fontNamePtr)
|
||||
{
|
||||
FF_CALCULATE_GTK_IMPL(3)
|
||||
}
|
||||
|
||||
void ffCalculateGTK4(FFinstance* instance, FFstrbuf** themeNamePtr, FFstrbuf** iconsNamePtr, FFstrbuf** fontNamePtr)
|
||||
{
|
||||
FF_CALCULATE_GTK_IMPL(4)
|
||||
}
|
||||
|
||||
#undef FF_CALCULATE_GTK_IMPL
|
||||
@@ -0,0 +1,80 @@
|
||||
#include "fastfetch.h"
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
void ffCalculatePlasma(FFinstance* instance, FFstrbuf** themeNamePtr, FFstrbuf** iconsNamePtr, FFstrbuf** fontNamePtr)
|
||||
{
|
||||
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
static FFstrbuf themeName;
|
||||
static FFstrbuf iconsName;
|
||||
static FFstrbuf fontName;
|
||||
static bool init = false;
|
||||
|
||||
if(themeNamePtr != NULL)
|
||||
*themeNamePtr = &themeName;
|
||||
|
||||
if(iconsNamePtr != NULL)
|
||||
*iconsNamePtr = &iconsName;
|
||||
|
||||
if(fontNamePtr != NULL)
|
||||
*fontNamePtr = &fontName;
|
||||
|
||||
pthread_mutex_lock(&mutex);
|
||||
|
||||
if(init)
|
||||
{
|
||||
pthread_mutex_unlock(&mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
init = true;
|
||||
|
||||
ffStrbufInit(&themeName);
|
||||
ffStrbufInit(&iconsName);
|
||||
ffStrbufInit(&fontName);
|
||||
|
||||
FF_STRBUF_CREATE(kdeglobalsFile);
|
||||
ffStrbufAppendS(&kdeglobalsFile, instance->state.passwd->pw_dir);
|
||||
ffStrbufAppendS(&kdeglobalsFile, "/.config/kdeglobals");
|
||||
|
||||
FILE* kdeglobals = fopen(kdeglobalsFile.chars, "r");
|
||||
if(kdeglobals == NULL)
|
||||
{
|
||||
ffStrbufDestroy(&kdeglobalsFile);
|
||||
pthread_mutex_unlock(&mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
char* line = NULL;
|
||||
size_t len = 0;
|
||||
|
||||
while(getline(&line, &len, kdeglobals) != -1)
|
||||
{
|
||||
sscanf(line, "widgetStyle=%[^\n]", themeName.chars);
|
||||
sscanf(line, "widgetStyle=\"%[^\"]+", themeName.chars);
|
||||
|
||||
sscanf(line, "Theme=%[^\n]", iconsName.chars);
|
||||
sscanf(line, "Theme=\"%[^\"]+", iconsName.chars);
|
||||
|
||||
sscanf(line, "font=%[^\n]", fontName.chars);
|
||||
sscanf(line, "font=\"%[^\"]+", fontName.chars);
|
||||
}
|
||||
|
||||
ffStrbufRecalculateLength(&themeName);
|
||||
ffStrbufRecalculateLength(&iconsName);
|
||||
ffStrbufRecalculateLength(&fontName);
|
||||
|
||||
if(line != NULL)
|
||||
free(line);
|
||||
|
||||
fclose(kdeglobals);
|
||||
ffStrbufDestroy(&kdeglobalsFile);
|
||||
|
||||
//When using Noto Sans 10, the default font in KDE Plasma, the font entry is deleted from the config file instead of set.
|
||||
//So the pure existence of the file sets this font value if not set other in the file itself.
|
||||
if(fontName.length == 0)
|
||||
ffStrbufAppendS(&fontName, "Noto Sans, 10");
|
||||
|
||||
pthread_mutex_unlock(&mutex);
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
#include "fastfetch.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
|
||||
static void getTerminalName(FFinstance* instance, const char* pid, FFstrbuf* exeName, FFstrbuf* processName, FFstrbuf* error)
|
||||
{
|
||||
char statFile[234];
|
||||
sprintf(statFile, "/proc/%s/stat", pid);
|
||||
|
||||
FILE* stat = fopen(statFile, "r");
|
||||
if(stat == NULL)
|
||||
{
|
||||
ffStrbufSetF(error, "fopen(\"%s\", \"r\") == NULL", statFile);
|
||||
return;
|
||||
}
|
||||
|
||||
char name[256];
|
||||
char ppid[256];
|
||||
if(fscanf(stat, "%*s (%[^)])%*s%s", name, ppid) != 2)
|
||||
{
|
||||
ffStrbufSetS(error, "fscanf(stat, \"%*s (%[^)])%*s%s\", name, ppid) != 2");
|
||||
return;
|
||||
}
|
||||
|
||||
fclose(stat);
|
||||
|
||||
if (
|
||||
strcasecmp(name, "bash") == 0 ||
|
||||
strcasecmp(name, "sh") == 0 ||
|
||||
strcasecmp(name, "zsh") == 0 ||
|
||||
strcasecmp(name, "ksh") == 0 ||
|
||||
strcasecmp(name, "fish") == 0 ||
|
||||
strcasecmp(name, "sudo") == 0 ||
|
||||
strcasecmp(name, "su") == 0 ||
|
||||
strcasecmp(name, "doas") == 0 ||
|
||||
strcasecmp(name, "strace") == 0 )
|
||||
{
|
||||
getTerminalName(instance, ppid, exeName, processName, error);
|
||||
return;
|
||||
}
|
||||
|
||||
char cmdlineFile[234];
|
||||
sprintf(cmdlineFile, "/proc/%s/cmdline", pid);
|
||||
|
||||
ffGetFileContent(cmdlineFile, exeName);
|
||||
ffStrbufSubstrBeforeFirstC(exeName, '\0');
|
||||
ffStrbufSubstrAfterLastC(exeName, '/');
|
||||
|
||||
ffStrbufSetS(processName, name);
|
||||
}
|
||||
|
||||
void ffCalculateTerminal(FFinstance* instance, FFstrbuf** exeNamePtr, FFstrbuf** processNamePtr, FFstrbuf** errorPtr)
|
||||
{
|
||||
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
static FFstrbuf exeName;
|
||||
static FFstrbuf processName;
|
||||
static FFstrbuf error;
|
||||
static bool init = false;
|
||||
|
||||
if(exeNamePtr != NULL)
|
||||
*exeNamePtr = &exeName;
|
||||
|
||||
if(processNamePtr != NULL)
|
||||
*processNamePtr = &processName;
|
||||
|
||||
if(errorPtr != NULL)
|
||||
*errorPtr = &error;
|
||||
|
||||
pthread_mutex_lock(&mutex);
|
||||
|
||||
if(init)
|
||||
{
|
||||
pthread_mutex_unlock(&mutex);
|
||||
return;
|
||||
}
|
||||
init = true;
|
||||
|
||||
ffStrbufInit(&exeName);
|
||||
ffStrbufInit(&processName);
|
||||
ffStrbufInit(&error);
|
||||
|
||||
char ppid[256];
|
||||
sprintf(ppid, "%i", getppid());
|
||||
|
||||
getTerminalName(instance, ppid, &exeName, &processName, &error);
|
||||
|
||||
pthread_mutex_unlock(&mutex);
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
#include "fastfetch.h"
|
||||
|
||||
#include <dirent.h>
|
||||
#include <pthread.h>
|
||||
|
||||
void ffCalculateWM(FFinstance* instance, FFstrbuf** prettyNamePtr, FFstrbuf** processNamePtr, FFstrbuf** errorPtr)
|
||||
{
|
||||
UNUSED(instance);
|
||||
|
||||
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
static FFstrbuf prettyName;
|
||||
static FFstrbuf processName;
|
||||
static FFstrbuf error;
|
||||
static bool init = false;
|
||||
|
||||
if(prettyNamePtr != NULL)
|
||||
*prettyNamePtr = &prettyName;
|
||||
|
||||
if(processNamePtr != NULL)
|
||||
*processNamePtr = &processName;
|
||||
|
||||
if(errorPtr != NULL)
|
||||
*errorPtr = &error;
|
||||
|
||||
pthread_mutex_lock(&mutex);
|
||||
|
||||
if(init)
|
||||
{
|
||||
pthread_mutex_unlock(&mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
init = true;
|
||||
|
||||
ffStrbufInit(&prettyName);
|
||||
ffStrbufInit(&processName);
|
||||
ffStrbufInit(&error);
|
||||
|
||||
DIR* proc = opendir("/proc/");
|
||||
if(proc == NULL)
|
||||
{
|
||||
ffStrbufSetS(&error, "opendir(\"/proc/\") == NULL");
|
||||
pthread_mutex_unlock(&mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
struct dirent* dirent;
|
||||
|
||||
while((dirent = readdir(proc)) != NULL)
|
||||
{
|
||||
if(dirent->d_type != DT_DIR)
|
||||
continue;
|
||||
|
||||
char path[20];
|
||||
sprintf(path, "/proc/%.8s/comm", dirent->d_name);
|
||||
|
||||
ffGetFileContent(path, &processName);
|
||||
|
||||
if(ffStrbufIgnCaseCompS(&processName, "kwin_wayland") == 0 || ffStrbufIgnCaseCompS(&processName, "kwin_x11") == 0)
|
||||
ffStrbufSetS(&prettyName, "KWin");
|
||||
|
||||
if(prettyName.length > 0)
|
||||
break;
|
||||
}
|
||||
|
||||
closedir(proc);
|
||||
|
||||
if(prettyName.length == 0)
|
||||
ffStrbufSetS(&error, "No process name matches the name of known display managers");
|
||||
|
||||
pthread_mutex_unlock(&mutex);
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
#include "fastfetch.h"
|
||||
|
||||
void ffParseFormatStringV(FFstrbuf* buffer, FFstrbuf* formatstr, uint32_t numArgs, va_list argp)
|
||||
{
|
||||
FFformatarg arguments[numArgs];
|
||||
for(uint32_t i = 0; i < numArgs; i++)
|
||||
arguments[i] = (FFformatarg) va_arg(argp, FFformatarg);
|
||||
|
||||
uint32_t argCounter = 1; //First arg is 1 in fomat string
|
||||
|
||||
for(uint32_t i = 0; i < formatstr->length; ++i)
|
||||
{
|
||||
if(formatstr->chars[i] != '{')
|
||||
{
|
||||
ffStrbufAppendC(buffer, formatstr->chars[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(i == formatstr->length - 1)
|
||||
{
|
||||
ffStrbufAppendC(buffer, '{');
|
||||
continue; //This will always stop the loop
|
||||
}
|
||||
|
||||
++i;
|
||||
|
||||
if(formatstr->chars[i] == '{')
|
||||
{
|
||||
ffStrbufAppendC(buffer, '{');
|
||||
continue;
|
||||
}
|
||||
|
||||
uint32_t argIndex;
|
||||
|
||||
if(formatstr->chars[i] == '}')
|
||||
{
|
||||
if(argCounter > numArgs)
|
||||
{
|
||||
ffStrbufAppendS(buffer, "{}");
|
||||
continue;
|
||||
}
|
||||
|
||||
argIndex = argCounter++;
|
||||
}
|
||||
else
|
||||
{
|
||||
FFstrbuf argnumstr;
|
||||
ffStrbufInit(&argnumstr);
|
||||
|
||||
while(formatstr->chars[i] != '}' && i < formatstr->length)
|
||||
ffStrbufAppendC(&argnumstr, formatstr->chars[i++]);
|
||||
|
||||
if(
|
||||
argnumstr.length == 0 ||
|
||||
ffStrbufGetC(&argnumstr, 0) == '-' ||
|
||||
sscanf(argnumstr.chars, "%u", &argIndex) != 1 ||
|
||||
argIndex > numArgs
|
||||
) {
|
||||
ffStrbufAppendC(buffer, '{');
|
||||
ffStrbufAppend(buffer, &argnumstr);
|
||||
if(formatstr->chars[i] == '}') // We dont have a closing { when ending because whole format string is over
|
||||
ffStrbufAppendC(buffer, '}');
|
||||
ffStrbufDestroy(&argnumstr);
|
||||
continue;
|
||||
}
|
||||
|
||||
ffStrbufDestroy(&argnumstr);
|
||||
}
|
||||
|
||||
if(argIndex == 0)
|
||||
argIndex = 1;
|
||||
|
||||
FFformatarg arg = arguments[argIndex - 1];
|
||||
|
||||
if(arg.type == FF_FORMAT_ARG_TYPE_INT)
|
||||
ffStrbufAppendF(buffer, "%i", *(int*)arg.value);
|
||||
else if(arg.type == FF_FORMAT_ARG_TYPE_UINT)
|
||||
ffStrbufAppendF(buffer, "%u", *(uint32_t*)arg.value);
|
||||
else if(arg.type == FF_FORMAT_ARG_TYPE_UINT8)
|
||||
ffStrbufAppendF(buffer, "%u", *(uint8_t*)arg.value);
|
||||
else if(arg.type == FF_FORMAT_ARG_TYPE_STRING)
|
||||
ffStrbufAppendF(buffer, "%s", (const char*)arg.value);
|
||||
else if(arg.type == FF_FORMAT_ARG_TYPE_STRBUF)
|
||||
ffStrbufAppend(buffer, (FFstrbuf*)arg.value);
|
||||
else if(arg.type == FF_FORMAT_ARG_TYPE_DOUBLE)
|
||||
ffStrbufAppendF(buffer, "%g", *(double*)arg.value);
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Error: format string \"%s\" argument is not implemented\n", formatstr->chars);
|
||||
ffStrbufDestroy(buffer);
|
||||
exit(806);
|
||||
}
|
||||
}
|
||||
|
||||
ffStrbufTrimRight(buffer, ' ');
|
||||
}
|
||||
|
||||
void ffParseFormatString(FFstrbuf* buffer, FFstrbuf* formatstr, uint32_t numArgs, ...)
|
||||
{
|
||||
va_list argp;
|
||||
va_start(argp, numArgs);
|
||||
ffParseFormatStringV(buffer, formatstr, numArgs, argp);
|
||||
va_end(argp);
|
||||
}
|
||||
|
||||
void ffPrintFormatString(FFinstance* instance, FFstrbuf* customKey, const char* defKey, FFstrbuf* formatstr, uint32_t numArgs, ...)
|
||||
{
|
||||
FFstrbuf buffer;
|
||||
ffStrbufInitA(&buffer, 256);
|
||||
|
||||
va_list argp;
|
||||
va_start(argp, numArgs);
|
||||
|
||||
ffParseFormatStringV(&buffer, formatstr, numArgs, argp);
|
||||
|
||||
va_end(argp);
|
||||
|
||||
if(buffer.length > 0)
|
||||
{
|
||||
ffPrintLogoAndKey(instance, customKey, defKey);
|
||||
ffStrbufPutTo(&buffer, stdout);
|
||||
}
|
||||
|
||||
ffStrbufDestroy(&buffer);
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
#include "fastfetch.h"
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
static void initState(FFstate* state)
|
||||
{
|
||||
state->current_row = 0;
|
||||
state->passwd = getpwuid(getuid());
|
||||
uname(&state->utsname);
|
||||
sysinfo(&state->sysinfo);
|
||||
}
|
||||
|
||||
static void defaultConfig(FFconfig* config)
|
||||
{
|
||||
ffStrbufInit(&config->color);
|
||||
config->logo_spacing = 4;
|
||||
ffStrbufInitS(&config->seperator, ": ");
|
||||
config->offsetx = 0;
|
||||
config->titleLength = 20; // This is overwritten by ffPrintTitle
|
||||
config->colorLogo = true;
|
||||
config->showErrors = false;
|
||||
config->recache = false;
|
||||
config->cacheSave = true;
|
||||
config->printRemainingLogo = true;
|
||||
|
||||
//Since most of these properties are unlikely to be used at once, give them minimal heap space (the \0 character)
|
||||
ffStrbufInitA(&config->osFormat, 1);
|
||||
ffStrbufInitA(&config->osKey, 1);
|
||||
ffStrbufInitA(&config->hostFormat, 1);
|
||||
ffStrbufInitA(&config->hostKey, 1);
|
||||
ffStrbufInitA(&config->kernelFormat, 1);
|
||||
ffStrbufInitA(&config->kernelKey, 1);
|
||||
ffStrbufInitA(&config->uptimeFormat, 1);
|
||||
ffStrbufInitA(&config->uptimeKey, 1);
|
||||
ffStrbufInitA(&config->packagesFormat, 1);
|
||||
ffStrbufInitA(&config->packagesKey, 1);
|
||||
ffStrbufInitA(&config->shellFormat, 1);
|
||||
ffStrbufInitA(&config->shellKey, 1);
|
||||
ffStrbufInitA(&config->resolutionFormat, 1);
|
||||
ffStrbufInitA(&config->resolutionKey, 1);
|
||||
ffStrbufInitA(&config->deFormat, 1);
|
||||
ffStrbufInitA(&config->deKey, 1);
|
||||
ffStrbufInitA(&config->wmFormat, 1);
|
||||
ffStrbufInitA(&config->wmKey, 1);
|
||||
ffStrbufInitA(&config->wmThemeFormat, 1);
|
||||
ffStrbufInitA(&config->wmThemeKey, 1);
|
||||
ffStrbufInitA(&config->themeFormat, 1);
|
||||
ffStrbufInitA(&config->themeKey, 1);
|
||||
ffStrbufInitA(&config->iconsFormat, 1);
|
||||
ffStrbufInitA(&config->iconsKey, 1);
|
||||
ffStrbufInitA(&config->fontFormat, 1);
|
||||
ffStrbufInitA(&config->fontKey, 1);
|
||||
ffStrbufInitA(&config->terminalFormat, 1);
|
||||
ffStrbufInitA(&config->terminalKey, 1);
|
||||
ffStrbufInitA(&config->termFontFormat, 1);
|
||||
ffStrbufInitA(&config->termFontKey, 1);
|
||||
ffStrbufInitA(&config->cpuFormat, 1);
|
||||
ffStrbufInitA(&config->cpuKey, 1);
|
||||
ffStrbufInitA(&config->gpuFormat, 1);
|
||||
ffStrbufInitA(&config->gpuKey, 1);
|
||||
ffStrbufInitA(&config->memoryFormat, 1);
|
||||
ffStrbufInitA(&config->memoryKey, 1);
|
||||
ffStrbufInitA(&config->diskFormat, 1);
|
||||
ffStrbufInitA(&config->diskKey, 1);
|
||||
ffStrbufInitA(&config->batteryFormat, 1);
|
||||
ffStrbufInitA(&config->batteryKey, 1);
|
||||
ffStrbufInitA(&config->localeFormat, 1);
|
||||
ffStrbufInitA(&config->localeKey, 1);
|
||||
|
||||
ffStrbufInitA(&config->libPCI, 1);
|
||||
ffStrbufInitA(&config->libX11, 1);
|
||||
ffStrbufInitA(&config->libXrandr, 1);
|
||||
ffStrbufInitA(&config->libDConf, 1);
|
||||
|
||||
ffStrbufInitA(&config->diskFolders, 1);
|
||||
}
|
||||
|
||||
void ffInitInstance(FFinstance* instance)
|
||||
{
|
||||
initState(&instance->state);
|
||||
defaultConfig(&instance->config);
|
||||
}
|
||||
|
||||
static void ffCleanup(FFinstance* instance)
|
||||
{
|
||||
UNUSED(instance);
|
||||
// Place for cleaning up
|
||||
// I dont destroy the global strbufs, because the OS is typically faster doing it after the program terminates
|
||||
// This eliminates one function call per strbuf + setting things like length to 0
|
||||
}
|
||||
|
||||
void ffFinish(FFinstance* instance)
|
||||
{
|
||||
if(instance->config.printRemainingLogo)
|
||||
ffPrintRemainingLogo(instance);
|
||||
|
||||
ffCleanup(instance);
|
||||
}
|
||||
+185
@@ -0,0 +1,185 @@
|
||||
#include "fastfetch.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
void ffPrintKey(FFinstance* instance, FFstrbuf* customKey, const char* defKey)
|
||||
{
|
||||
fputs(FASTFETCH_TEXT_MODIFIER_BOLT, stdout);
|
||||
ffStrbufWriteTo(&instance->config.color, stdout);
|
||||
if(customKey == NULL || customKey->length == 0)
|
||||
fputs(defKey, stdout);
|
||||
else
|
||||
ffStrbufWriteTo(customKey, stdout);
|
||||
fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout);
|
||||
ffStrbufWriteTo(&instance->config.seperator, stdout);
|
||||
}
|
||||
|
||||
void ffPrintLogoAndKey(FFinstance* instance, FFstrbuf* customKey, const char* defKey)
|
||||
{
|
||||
ffPrintLogoLine(instance);
|
||||
ffPrintKey(instance, customKey, defKey);
|
||||
}
|
||||
|
||||
void ffPrintError(FFinstance* instance, FFstrbuf* customKey, const char* defKey, const char* message, ...)
|
||||
{
|
||||
if(!instance->config.showErrors)
|
||||
return;
|
||||
|
||||
ffPrintLogoAndKey(instance, customKey, defKey);
|
||||
|
||||
va_list arguments;
|
||||
va_start(arguments, message);
|
||||
|
||||
printf(FASTFETCH_TEXT_MODIFIER_ERROR);
|
||||
vprintf(message, arguments);
|
||||
puts(FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
|
||||
va_end(arguments);
|
||||
}
|
||||
|
||||
void ffParsePropFile(const char* fileName, const char* regex, char* buffer)
|
||||
{
|
||||
buffer[0] = '\0'; //If an error occures, this is the indicator
|
||||
|
||||
char* line = NULL;
|
||||
size_t len = 0;
|
||||
|
||||
FILE* file = fopen(fileName, "r");
|
||||
if(file == NULL)
|
||||
return; // handle errors in higher functions
|
||||
|
||||
while (getline(&line, &len, file) != -1)
|
||||
{
|
||||
if (sscanf(line, regex, buffer) > 0)
|
||||
break;
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
if(line != NULL)
|
||||
free(line);
|
||||
}
|
||||
|
||||
void ffParsePropFileHome(FFinstance* instance, const char* relativeFile, const char* regex, char* buffer)
|
||||
{
|
||||
FFstrbuf absolutePath;
|
||||
ffStrbufInitA(&absolutePath, 64);
|
||||
ffStrbufAppendS(&absolutePath, instance->state.passwd->pw_dir);
|
||||
ffStrbufAppendC(&absolutePath, '/');
|
||||
ffStrbufAppendS(&absolutePath, relativeFile);
|
||||
|
||||
ffParsePropFile(absolutePath.chars, regex, buffer);
|
||||
|
||||
ffStrbufDestroy(&absolutePath);
|
||||
}
|
||||
|
||||
void ffAppendFileContent(const char* fileName, FFstrbuf* buffer)
|
||||
{
|
||||
int fd = open(fileName, O_RDONLY);
|
||||
if(fd == -1)
|
||||
return;
|
||||
|
||||
ssize_t readed;
|
||||
while((readed = read(fd, buffer->chars + buffer->length, buffer->allocated - buffer->length)) == (buffer->allocated - buffer->length))
|
||||
{
|
||||
buffer->length += (uint32_t) readed;
|
||||
ffStrbufEnsureCapacity(buffer, buffer->allocated * 2);
|
||||
}
|
||||
|
||||
if(readed >= 0)
|
||||
buffer->length += (uint32_t) readed;
|
||||
|
||||
ffStrbufTrimRight(buffer, '\n');
|
||||
ffStrbufTrimRight(buffer, ' ');
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
void ffGetFileContent(const char* fileName, FFstrbuf* buffer)
|
||||
{
|
||||
ffStrbufClear(buffer);
|
||||
ffAppendFileContent(fileName, buffer);
|
||||
}
|
||||
|
||||
static const FFstrbuf* getCacheDir(FFinstance* instance)
|
||||
{
|
||||
static FFstrbuf cacheDir;
|
||||
static bool init = false;
|
||||
if(init)
|
||||
return &cacheDir;
|
||||
|
||||
ffStrbufInitAS(&cacheDir, 64, getenv("XDG_CACHE_HOME"));
|
||||
|
||||
if(cacheDir.length == 0)
|
||||
{
|
||||
ffStrbufSetS(&cacheDir, instance->state.passwd->pw_dir);
|
||||
ffStrbufAppendS(&cacheDir, "/.cache/");
|
||||
}
|
||||
|
||||
mkdir(cacheDir.chars, S_IRWXU | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH); //I hope everybody has a cache folder but whow knews
|
||||
|
||||
ffStrbufAppendS(&cacheDir, "fastfetch/");
|
||||
mkdir(cacheDir.chars, S_IRWXU | S_IRGRP | S_IROTH);
|
||||
|
||||
init = true;
|
||||
return &cacheDir;
|
||||
}
|
||||
|
||||
bool ffPrintCachedValue(FFinstance* instance, FFstrbuf* customKey, const char* defKey)
|
||||
{
|
||||
if(instance->config.recache)
|
||||
return false;
|
||||
|
||||
FFstrbuf cacheFile;
|
||||
ffStrbufInitA(&cacheFile, 128);
|
||||
ffStrbufAppend(&cacheFile, getCacheDir(instance));
|
||||
ffStrbufAppendS(&cacheFile, defKey);
|
||||
|
||||
FFstrbuf value;
|
||||
ffStrbufInitA(&value, 128);
|
||||
ffGetFileContent(cacheFile.chars, &value);
|
||||
|
||||
ffStrbufDestroy(&cacheFile);
|
||||
|
||||
if(value.length == 0)
|
||||
{
|
||||
ffStrbufDestroy(&value);
|
||||
return false;
|
||||
}
|
||||
|
||||
ffPrintLogoAndKey(instance, customKey, defKey);
|
||||
ffStrbufPutTo(&value, stdout);
|
||||
ffStrbufDestroy(&value);
|
||||
return true;
|
||||
}
|
||||
|
||||
void ffPrintAndSaveCachedValue(FFinstance* instance, FFstrbuf* customKey, const char* defKey, FFstrbuf* value)
|
||||
{
|
||||
if(value->length == 0)
|
||||
return;
|
||||
|
||||
ffPrintLogoAndKey(instance, customKey, defKey);
|
||||
ffStrbufPutTo(value, stdout);
|
||||
|
||||
if(!instance->config.cacheSave)
|
||||
return;
|
||||
|
||||
FFstrbuf cacheFile;
|
||||
ffStrbufInit(&cacheFile);
|
||||
ffStrbufAppend(&cacheFile, getCacheDir(instance));
|
||||
ffStrbufAppendS(&cacheFile, defKey);
|
||||
|
||||
int fd = open(cacheFile.chars, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
|
||||
if(fd == -1)
|
||||
return;
|
||||
|
||||
bool failed = write(fd, value->chars, value->length) != value->length;
|
||||
|
||||
close(fd);
|
||||
|
||||
if(failed)
|
||||
unlink(cacheFile.chars);
|
||||
|
||||
ffStrbufDestroy(&cacheFile);
|
||||
}
|
||||
@@ -0,0 +1,289 @@
|
||||
#include "fastfetch.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
static void loadUnknownLogo(FFlogo* logo)
|
||||
{
|
||||
logo->width = 23;
|
||||
logo->height = 18;
|
||||
strcpy(logo->name, "unknown");
|
||||
strcpy(logo->color, "");
|
||||
strcpy(logo->chars[0], FASTFETCH_TEXT_MODIFIER_BOLT" ________ "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[1], FASTFETCH_TEXT_MODIFIER_BOLT" _jgN########Ngg_ "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[2], FASTFETCH_TEXT_MODIFIER_BOLT" _N##N@@\"\" \"\"9NN##Np_ "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[3], FASTFETCH_TEXT_MODIFIER_BOLT"d###P N####p"FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[4], FASTFETCH_TEXT_MODIFIER_BOLT"\"^^\" T####"FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[5], FASTFETCH_TEXT_MODIFIER_BOLT" d###P"FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[6], FASTFETCH_TEXT_MODIFIER_BOLT" _g###@F "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[7], FASTFETCH_TEXT_MODIFIER_BOLT" _gN##@P "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[8], FASTFETCH_TEXT_MODIFIER_BOLT" gN###F\" "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[9], FASTFETCH_TEXT_MODIFIER_BOLT" d###F "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[10], FASTFETCH_TEXT_MODIFIER_BOLT" 0###F "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[11], FASTFETCH_TEXT_MODIFIER_BOLT" 0###F "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[12], FASTFETCH_TEXT_MODIFIER_BOLT" 0###F "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[13], FASTFETCH_TEXT_MODIFIER_BOLT" \"NN@' "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[14], FASTFETCH_TEXT_MODIFIER_BOLT" "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[15], FASTFETCH_TEXT_MODIFIER_BOLT" ___ "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[16], FASTFETCH_TEXT_MODIFIER_BOLT" q###r "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
strcpy(logo->chars[17], FASTFETCH_TEXT_MODIFIER_BOLT" \"\" "FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
}
|
||||
|
||||
static void loadNoneLogo(FFlogo* logo)
|
||||
{
|
||||
logo->width = 0;
|
||||
logo->height = 0;
|
||||
strcpy(logo->name, "none");
|
||||
strcpy(logo->color, "");
|
||||
}
|
||||
|
||||
static void loadArchLogo(FFlogo* logo, bool doColor)
|
||||
{
|
||||
logo->width = 37;
|
||||
logo->height = 20;
|
||||
strcpy(logo->name, "arch");
|
||||
|
||||
const char* color = doColor ? "\033[36m" : "";
|
||||
strcpy(logo->color, "\033[36m");
|
||||
|
||||
sprintf(logo->chars[0], FASTFETCH_TEXT_MODIFIER_BOLT"%s -` "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[1], FASTFETCH_TEXT_MODIFIER_BOLT"%s -` "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[2], FASTFETCH_TEXT_MODIFIER_BOLT"%s .o+` "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[3], FASTFETCH_TEXT_MODIFIER_BOLT"%s `ooo/ "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[4], FASTFETCH_TEXT_MODIFIER_BOLT"%s `+oooo: "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[5], FASTFETCH_TEXT_MODIFIER_BOLT"%s `+oooooo: "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[6], FASTFETCH_TEXT_MODIFIER_BOLT"%s -+oooooo+: "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[7], FASTFETCH_TEXT_MODIFIER_BOLT"%s `/:-:++oooo+: "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[8], FASTFETCH_TEXT_MODIFIER_BOLT"%s `/++++/+++++++: "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[9], FASTFETCH_TEXT_MODIFIER_BOLT"%s `/++++++++++++++: "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[10], FASTFETCH_TEXT_MODIFIER_BOLT"%s `/+++ooooooooooooo/` "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[11], FASTFETCH_TEXT_MODIFIER_BOLT"%s ./ooosssso++osssssso+` "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[12], FASTFETCH_TEXT_MODIFIER_BOLT"%s .oossssso-````/ossssss+` "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[13], FASTFETCH_TEXT_MODIFIER_BOLT"%s -osssssso. :ssssssso. "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[14], FASTFETCH_TEXT_MODIFIER_BOLT"%s :osssssss/ osssso+++. "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[15], FASTFETCH_TEXT_MODIFIER_BOLT"%s /ossssssss/ +ssssooo/- "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[16], FASTFETCH_TEXT_MODIFIER_BOLT"%s `/ossssso+/:- -:/+osssso+- "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[17], FASTFETCH_TEXT_MODIFIER_BOLT"%s `+sso+:-` `.-/+oso: "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[18], FASTFETCH_TEXT_MODIFIER_BOLT"%s`++:. `-/+/"FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[19], FASTFETCH_TEXT_MODIFIER_BOLT"%s.` `/"FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
}
|
||||
|
||||
static void loadArtixLogo(FFlogo* logo, bool doColor)
|
||||
{
|
||||
logo->width = 38;
|
||||
logo->height = 20;
|
||||
strcpy(logo->name, "artix");
|
||||
|
||||
const char* color = doColor ? "\033[36m" : "";
|
||||
strcpy(logo->color, "\033[36m");
|
||||
|
||||
sprintf(logo->chars[0], FASTFETCH_TEXT_MODIFIER_BOLT"%s ' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[1], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'o' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[2], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'ooo' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[3], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'ooxoo' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[4], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'ooxxxoo' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[5], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'oookkxxoo' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[6], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'oiioxkkxxoo' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[7], FASTFETCH_TEXT_MODIFIER_BOLT"%s ':;:iiiioxxxoo' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[8], FASTFETCH_TEXT_MODIFIER_BOLT"%s `'.;::ioxxoo'' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[9], FASTFETCH_TEXT_MODIFIER_BOLT"%s '-. `':;jiooo' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[10], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'oooio-.. `'i:io' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[11], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'ooooxxxxoio:,. `'-;' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[12], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'ooooxxxxxkkxoooIi:-. `' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[13], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'ooooxxxxxkkkkxoiiiiiji' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[14], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'ooooxxxxxkxxoiiii:'` .i' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[15], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'ooooxxxxxoi:::'` .;ioxo' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[16], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'ooooxooi::'` .:iiixkxxo' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[17], FASTFETCH_TEXT_MODIFIER_BOLT"%s 'ooooi:'` `'';ioxxo' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[18], FASTFETCH_TEXT_MODIFIER_BOLT"%s'i:'` '':io' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[19], FASTFETCH_TEXT_MODIFIER_BOLT"%s'` `'"FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
}
|
||||
|
||||
static void loadUbuntuLogo(FFlogo *logo, bool doColor)
|
||||
{
|
||||
logo->width = 40;
|
||||
logo->height = 20;
|
||||
strcpy(logo->name, "ubuntu");
|
||||
|
||||
/* color = red; color2 = white */
|
||||
const char* color = doColor ? "\033[91m" : "";
|
||||
const char* color2 = doColor ? "\033[97m" : "";
|
||||
strcpy(logo->color, "\033[91m");
|
||||
|
||||
sprintf(logo->chars[0], FASTFETCH_TEXT_MODIFIER_BOLT"%s .-/+oossssoo+/-. "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[1], FASTFETCH_TEXT_MODIFIER_BOLT"%s `:+ssssssssssssssssss+:` "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[2], FASTFETCH_TEXT_MODIFIER_BOLT"%s -+ssssssssssssssssssyyssss+- "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[3], FASTFETCH_TEXT_MODIFIER_BOLT"%s .ossssssssssssssssssd%sMMMNy%ssssso. "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[4], FASTFETCH_TEXT_MODIFIER_BOLT"%s /sssssssssss%shdmmNNmmyNMMMMh%sssssss/ "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[5], FASTFETCH_TEXT_MODIFIER_BOLT"%s +sssssssss%shmydMMMMMMMNddddy%sssssssss+ "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[6], FASTFETCH_TEXT_MODIFIER_BOLT"%s /ssssssss%shNMMMyhhyyyyhmNMMMNh%sssssssss/ "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[7], FASTFETCH_TEXT_MODIFIER_BOLT"%s.ssssssss%sdMMMNh%sssssssssss%shNMMMd%sssssssss."FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color, color2, color);
|
||||
sprintf(logo->chars[8], FASTFETCH_TEXT_MODIFIER_BOLT"%s+ssss%shhhyNMMNy%sssssssssssss%syNMMMy%ssssssss+"FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color, color2, color);
|
||||
sprintf(logo->chars[9], FASTFETCH_TEXT_MODIFIER_BOLT"%soss%syNMMMNyMMh%sssssssssssssss%shmmmh%sssssssso"FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color, color2, color);
|
||||
sprintf(logo->chars[10], FASTFETCH_TEXT_MODIFIER_BOLT"%soss%syNMMMNyMMh%sssssssssssssss%shmmmh%sssssssso"FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color, color2, color);
|
||||
sprintf(logo->chars[11], FASTFETCH_TEXT_MODIFIER_BOLT"%s+ssss%shhhyNMMNy%sssssssssssss%syNMMMy%ssssssss+"FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color, color2, color);
|
||||
sprintf(logo->chars[12], FASTFETCH_TEXT_MODIFIER_BOLT"%s.ssssssss%sdMMMNh%sssssssssss%shNMMMd%sssssssss."FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color, color2, color);
|
||||
sprintf(logo->chars[13], FASTFETCH_TEXT_MODIFIER_BOLT"%s /ssssssss%shNMMMyhhyyyyhdNMMMNh%sssssssss/ "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[14], FASTFETCH_TEXT_MODIFIER_BOLT"%s +sssssssss%sdmydMMMMMMMMddddy%sssssssss+ "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[15], FASTFETCH_TEXT_MODIFIER_BOLT"%s /sssssssssss%shdmNNNNmyNMMMMh%sssssss/ "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[16], FASTFETCH_TEXT_MODIFIER_BOLT"%s .ossssssssssssssssss%sdMMMNy%ssssso. "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[17], FASTFETCH_TEXT_MODIFIER_BOLT"%s -+sssssssssssssssss%syyy%sssss+- "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[18], FASTFETCH_TEXT_MODIFIER_BOLT"%s `:+ssssssssssssssssss+:` "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[19], FASTFETCH_TEXT_MODIFIER_BOLT"%s .-/+oossssoo+/-. "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
}
|
||||
|
||||
static void loadDebianLogo(FFlogo *logo, bool doColor)
|
||||
{
|
||||
logo->width = 27;
|
||||
logo->height = 17;
|
||||
strcpy(logo->name, "debian");
|
||||
|
||||
/* color = red; color2 = white */
|
||||
const char* color = doColor ? "\033[91m" : "";
|
||||
const char* color2 = doColor ? "\033[97m" : "";
|
||||
strcpy(logo->color, "\033[91m");
|
||||
|
||||
sprintf(logo->chars[0], FASTFETCH_TEXT_MODIFIER_BOLT"%s _,met$$$$$gg. "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[1], FASTFETCH_TEXT_MODIFIER_BOLT"%s ,g$$$$$$$$$$$$$$$P. "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[2], FASTFETCH_TEXT_MODIFIER_BOLT"%s ,g$$P\" \"\"\"Y$$.\". "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[3], FASTFETCH_TEXT_MODIFIER_BOLT"%s ,$$P' `$$$. "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[4], FASTFETCH_TEXT_MODIFIER_BOLT"%s',$$P ,ggs. `$$b:"FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[5], FASTFETCH_TEXT_MODIFIER_BOLT"%s`d$$' ,$P\"' %s.%s $$$ "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[6], FASTFETCH_TEXT_MODIFIER_BOLT"%s $$P d$' %s,%s $$P "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[7], FASTFETCH_TEXT_MODIFIER_BOLT"%s $$: $$. %s-%s ,d$$' "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[8], FASTFETCH_TEXT_MODIFIER_BOLT"%s $$; Y$b._ _,d$P' "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[9], FASTFETCH_TEXT_MODIFIER_BOLT"%s Y$$. %s`.%s`\"Y$$$$P\"' "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[10], FASTFETCH_TEXT_MODIFIER_BOLT"%s `$$b %s\"-.__%s "FASTFETCH_TEXT_MODIFIER_RESET, color, color2, color);
|
||||
sprintf(logo->chars[11], FASTFETCH_TEXT_MODIFIER_BOLT"%s `Y$$ "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[12], FASTFETCH_TEXT_MODIFIER_BOLT"%s `Y$$. "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[13], FASTFETCH_TEXT_MODIFIER_BOLT"%s `$$b. "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[14], FASTFETCH_TEXT_MODIFIER_BOLT"%s `Y$$b. "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[15], FASTFETCH_TEXT_MODIFIER_BOLT"%s `\"Y$b._ "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
sprintf(logo->chars[16], FASTFETCH_TEXT_MODIFIER_BOLT"%s `\"\"\" "FASTFETCH_TEXT_MODIFIER_RESET, color);
|
||||
}
|
||||
|
||||
void ffLoadLogoSet(FFconfig* config, const char* logo)
|
||||
{
|
||||
if(strcasecmp(logo, "none") == 0)
|
||||
{
|
||||
loadNoneLogo(&config->logo);
|
||||
config->logo_spacing = 0; //This is wanted in most cases, so just set it
|
||||
}
|
||||
else if(strcasecmp(logo, "arch") == 0)
|
||||
{
|
||||
loadArchLogo(&config->logo, config->colorLogo);
|
||||
}
|
||||
else if(strcasecmp(logo, "artix") == 0)
|
||||
{
|
||||
loadArtixLogo(&config->logo, config->colorLogo);
|
||||
}
|
||||
else if(strcasecmp(logo, "ubuntu") == 0)
|
||||
{
|
||||
loadUbuntuLogo(&config->logo, config->colorLogo);
|
||||
}
|
||||
else if(strcasecmp(logo, "debian") == 0)
|
||||
{
|
||||
loadDebianLogo(&config->logo, config->colorLogo);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(config->showErrors)
|
||||
printf(FASTFETCH_TEXT_MODIFIER_ERROR"Error: unknown logo: %s"FASTFETCH_TEXT_MODIFIER_RESET"\n", logo);
|
||||
loadUnknownLogo(&config->logo);
|
||||
}
|
||||
}
|
||||
|
||||
void ffLoadLogo(FFconfig* config)
|
||||
{
|
||||
char id[256];
|
||||
ffParsePropFile("/etc/os-release", "ID=%[^\n]", id);
|
||||
if(id[0] == '\0')
|
||||
{
|
||||
if(config->showErrors)
|
||||
puts(FASTFETCH_TEXT_MODIFIER_ERROR"Error: \"ID=%[^\\n]\" not found in \"/etc/os-release\""FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
loadUnknownLogo(&config->logo);
|
||||
}
|
||||
else
|
||||
{
|
||||
ffLoadLogoSet(config, id);
|
||||
}
|
||||
}
|
||||
|
||||
void ffPrintLogoLine(FFinstance* instance)
|
||||
{
|
||||
for(int16_t i = 0; i < instance->config.offsetx; i++)
|
||||
putchar(' ');
|
||||
|
||||
int16_t cut = instance->config.offsetx >= 0 ? 0 :
|
||||
(instance->config.logo.width > instance->config.offsetx * -1 ? instance->config.offsetx * -1 : instance->config.logo.width);
|
||||
|
||||
if(instance->state.current_row < instance->config.logo.height)
|
||||
{
|
||||
printf("%s", instance->config.logo.chars[instance->state.current_row] + cut);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(uint8_t i = 0; i < instance->config.logo.width - cut; i++)
|
||||
putchar(' ');
|
||||
}
|
||||
|
||||
for(uint16_t i = 0; i < instance->config.logo_spacing; i++)
|
||||
putchar(' ');
|
||||
|
||||
++instance->state.current_row;
|
||||
}
|
||||
|
||||
void ffPrintRemainingLogo(FFinstance* instance)
|
||||
{
|
||||
while(instance->state.current_row < instance->config.logo.height)
|
||||
{
|
||||
ffPrintLogoLine(instance);
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef FASTFETCH_BUILD_FLASHFETCH
|
||||
|
||||
static FFlogo* getLogos(uint8_t* size, bool color)
|
||||
{
|
||||
#define FASTFETCH_LOGO_AMOUNT 6
|
||||
|
||||
*size = FASTFETCH_LOGO_AMOUNT;
|
||||
static FFlogo logos[FASTFETCH_LOGO_AMOUNT];
|
||||
|
||||
#undef FASTFETCH_LOGO_AMOUNT
|
||||
|
||||
loadNoneLogo(&logos[0]);
|
||||
loadUnknownLogo(&logos[1]);
|
||||
loadArchLogo(&logos[2], color);
|
||||
loadArtixLogo(&logos[3], color);
|
||||
loadUbuntuLogo(&logos[4], color);
|
||||
loadDebianLogo(&logos[5], color);
|
||||
|
||||
return logos;
|
||||
}
|
||||
|
||||
void ffListLogos()
|
||||
{
|
||||
uint8_t size;
|
||||
FFlogo* logos = getLogos(&size, false);
|
||||
|
||||
for(uint8_t i = 0; i < size; i++)
|
||||
puts(logos[i].name);
|
||||
}
|
||||
|
||||
void ffPrintLogos(bool doColor)
|
||||
{
|
||||
uint8_t size;
|
||||
FFlogo* logos = getLogos(&size, doColor);
|
||||
|
||||
for(uint8_t i = 0; i < size; i++)
|
||||
{
|
||||
printf(FASTFETCH_TEXT_MODIFIER_BOLT"%s%s"FASTFETCH_TEXT_MODIFIER_RESET":\n", doColor ? logos[i].color : "", logos[i].name);
|
||||
for(uint8_t k = 0; k < logos[i].height; k++)
|
||||
puts(logos[i].chars[k]);
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
#include "fastfetch.h"
|
||||
|
||||
void ffGetGtkPretty(FFstrbuf* buffer, FFstrbuf* gtk2, FFstrbuf* gtk3, FFstrbuf* gtk4)
|
||||
{
|
||||
if(gtk2->length > 0 && gtk3->length > 0 && gtk4->length > 0)
|
||||
{
|
||||
if((ffStrbufIgnCaseComp(gtk2, gtk3) == 0) && (ffStrbufIgnCaseComp(gtk2, gtk4) == 0))
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk4);
|
||||
ffStrbufAppendS(buffer, " [GTK2/3/4]");
|
||||
}
|
||||
else if(ffStrbufIgnCaseComp(gtk2, gtk3) == 0)
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk3);
|
||||
ffStrbufAppendS(buffer, " [GTK2/3], ");
|
||||
ffStrbufAppend(buffer, gtk4);
|
||||
ffStrbufAppendS(buffer, " [GTK4]");
|
||||
}
|
||||
else if(ffStrbufIgnCaseComp(gtk3, gtk4) == 0)
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk2);
|
||||
ffStrbufAppendS(buffer, " [GTK2], ");
|
||||
ffStrbufAppend(buffer, gtk4);
|
||||
ffStrbufAppendS(buffer, " [GTK3/4]");
|
||||
}
|
||||
else
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk2);
|
||||
ffStrbufAppendS(buffer, " [GTK2], ");
|
||||
ffStrbufAppend(buffer, gtk3);
|
||||
ffStrbufAppendS(buffer, " [GTK3], ");
|
||||
ffStrbufAppend(buffer, gtk4);
|
||||
ffStrbufAppendS(buffer, " [GTK4]");
|
||||
}
|
||||
}
|
||||
else if(gtk2->length > 0 && gtk3->length > 0)
|
||||
{
|
||||
if(ffStrbufIgnCaseComp(gtk2, gtk3) == 0)
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk3);
|
||||
ffStrbufAppendS(buffer, " [GTK2/3]");
|
||||
}
|
||||
else
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk2);
|
||||
ffStrbufAppendS(buffer, " [GTK2], ");
|
||||
ffStrbufAppend(buffer, gtk3);
|
||||
ffStrbufAppendS(buffer, " [GTK3]");
|
||||
}
|
||||
}
|
||||
else if(gtk3->length > 0 && gtk4->length > 0)
|
||||
{
|
||||
if(ffStrbufIgnCaseComp(gtk3, gtk4) == 0)
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk4);
|
||||
ffStrbufAppendS(buffer, " [GTK3/4]");
|
||||
}
|
||||
else
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk3);
|
||||
ffStrbufAppendS(buffer, " [GTK3], ");
|
||||
ffStrbufAppend(buffer, gtk4);
|
||||
ffStrbufAppendS(buffer, " [GTK4]");
|
||||
}
|
||||
}
|
||||
else if(gtk2->length > 0)
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk2);
|
||||
ffStrbufAppendS(buffer, " [GTK2]");
|
||||
}
|
||||
else if(gtk3->length > 0)
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk3);
|
||||
ffStrbufAppendS(buffer, " [GTK3]");
|
||||
}
|
||||
else if(gtk4->length > 0)
|
||||
{
|
||||
ffStrbufAppend(buffer, gtk4);
|
||||
ffStrbufAppendS(buffer, " [GTK4]");
|
||||
}
|
||||
}
|
||||
|
||||
void ffGetFont(const char* font, FFstrbuf* name, double* size)
|
||||
{
|
||||
ffStrbufEnsureCapacity(name, 32);
|
||||
|
||||
int scanned = sscanf(font, "%[^,], %lf", name->chars, size);
|
||||
|
||||
ffStrbufRecalculateLength(name);
|
||||
|
||||
if(scanned < 2)
|
||||
*size = 0.0;
|
||||
|
||||
if(scanned == 0)
|
||||
ffStrbufSetS(name, font);
|
||||
}
|
||||
|
||||
void ffGetFontPretty(FFstrbuf* buffer, const FFstrbuf* name, double size)
|
||||
{
|
||||
ffStrbufAppend(buffer, name);
|
||||
|
||||
if(size > 0)
|
||||
{
|
||||
ffStrbufAppendS(buffer, " (");
|
||||
ffStrbufAppendF(buffer, "%g", size);
|
||||
ffStrbufAppendS(buffer, "pt)");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
#include "fastfetch.h"
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
static inline void* calculatePlasmaThreadMain(void* instance)
|
||||
{
|
||||
ffCalculatePlasma((FFinstance*)instance, NULL, NULL, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void* calculateGTK2ThreadMain(void* instance)
|
||||
{
|
||||
ffCalculateGTK2((FFinstance*)instance, NULL, NULL, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void* calculateGTK3ThreadMain(void* instance)
|
||||
{
|
||||
ffCalculateGTK3((FFinstance*)instance, NULL, NULL, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void* calculateGTK4ThreadMain(void* instance)
|
||||
{
|
||||
ffCalculateGTK4((FFinstance*)instance, NULL, NULL, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void* calculateWMThreadMain(void* instance)
|
||||
{
|
||||
ffCalculateWM((FFinstance*)instance, NULL, NULL, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void* calculateTerminalThreadMain(void* instance)
|
||||
{
|
||||
ffCalculateTerminal((FFinstance*)instance, NULL, NULL, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void* startThreadsThreadMain(void* instance)
|
||||
{
|
||||
pthread_t wmThread;
|
||||
pthread_create(&wmThread, NULL, calculateWMThreadMain, instance);
|
||||
pthread_detach(wmThread);
|
||||
|
||||
pthread_t gtk2Thread;
|
||||
pthread_create(>k2Thread, NULL, calculateGTK2ThreadMain, instance);
|
||||
pthread_detach(gtk2Thread);
|
||||
|
||||
pthread_t gtk3Thread;
|
||||
pthread_create(>k3Thread, NULL, calculateGTK3ThreadMain, instance);
|
||||
pthread_detach(gtk3Thread);
|
||||
|
||||
pthread_t gtk4Thread;
|
||||
pthread_create(>k4Thread, NULL, calculateGTK4ThreadMain, instance);
|
||||
pthread_detach(gtk4Thread);
|
||||
|
||||
pthread_t terminalThread;
|
||||
pthread_create(&terminalThread, NULL, calculateTerminalThreadMain, instance);
|
||||
pthread_detach(terminalThread);
|
||||
|
||||
pthread_t plasmaThread;
|
||||
pthread_create(&plasmaThread, NULL, calculatePlasmaThreadMain, instance);
|
||||
pthread_detach(plasmaThread);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void ffStartCalculationThreads(FFinstance* instance)
|
||||
{
|
||||
pthread_t startThreadsThread;
|
||||
pthread_create(&startThreadsThread, NULL, startThreadsThreadMain, instance);
|
||||
pthread_detach(startThreadsThread);
|
||||
}
|
||||
Reference in New Issue
Block a user