2021-04-09 14:07:05 +02:00
|
|
|
#include "fastfetch.h"
|
|
|
|
|
|
|
|
|
|
#include <unistd.h>
|
2021-05-08 12:14:55 +02:00
|
|
|
#include <sys/stat.h>
|
2021-10-23 15:48:24 +02:00
|
|
|
#include <signal.h>
|
2021-04-09 14:07:05 +02:00
|
|
|
|
2021-05-07 14:55:43 +02:00
|
|
|
static bool strbufEqualsAdapter(const void* first, const void* second)
|
|
|
|
|
{
|
|
|
|
|
return ffStrbufComp(second, first) == 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void initConfigDirs(FFstate* state)
|
|
|
|
|
{
|
|
|
|
|
ffListInit(&state->configDirs, sizeof(FFstrbuf));
|
|
|
|
|
|
|
|
|
|
const char* xdgConfigHome = getenv("XDG_CONFIG_HOME");
|
|
|
|
|
if(xdgConfigHome != NULL)
|
|
|
|
|
{
|
|
|
|
|
FFstrbuf* buffer = (FFstrbuf*) ffListAdd(&state->configDirs);
|
|
|
|
|
ffStrbufInitA(buffer, 64);
|
|
|
|
|
ffStrbufAppendS(buffer, xdgConfigHome);
|
|
|
|
|
ffStrbufTrimRight(buffer, '/');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FFstrbuf xdgConfigDirs;
|
2021-06-26 15:34:01 +02:00
|
|
|
ffStrbufInitA(&xdgConfigDirs, 64);
|
|
|
|
|
ffStrbufAppendS(&xdgConfigDirs, getenv("XDG_CONFIG_DIRS"));
|
|
|
|
|
|
2021-05-07 14:55:43 +02:00
|
|
|
#define FF_ENSURE_ONLY_ONCE_IN_LIST(element) \
|
|
|
|
|
if(ffListFirstIndexComp(&state->configDirs, element, strbufEqualsAdapter) < state->configDirs.length - 1) \
|
|
|
|
|
--state->configDirs.length;
|
|
|
|
|
|
|
|
|
|
FFstrbuf* userConfigHome = ffListAdd(&state->configDirs);
|
|
|
|
|
ffStrbufInitA(userConfigHome, 64);
|
|
|
|
|
ffStrbufAppendS(userConfigHome, state->passwd->pw_dir);
|
|
|
|
|
ffStrbufAppendS(userConfigHome, "/.config");
|
|
|
|
|
FF_ENSURE_ONLY_ONCE_IN_LIST(userConfigHome)
|
|
|
|
|
|
|
|
|
|
FFstrbuf* userHome = ffListAdd(&state->configDirs);
|
|
|
|
|
ffStrbufInitA(userHome, 64);
|
|
|
|
|
ffStrbufAppendS(userHome, state->passwd->pw_dir);
|
|
|
|
|
FF_ENSURE_ONLY_ONCE_IN_LIST(userHome)
|
|
|
|
|
|
2021-10-22 18:42:14 +02:00
|
|
|
uint32_t startIndex = 0;
|
|
|
|
|
while (startIndex < xdgConfigDirs.length)
|
|
|
|
|
{
|
|
|
|
|
uint32_t colonIndex = ffStrbufNextIndexC(&xdgConfigDirs, startIndex, ':');
|
|
|
|
|
xdgConfigDirs.chars[colonIndex] = '\0';
|
|
|
|
|
|
|
|
|
|
FFstrbuf* buffer = (FFstrbuf*) ffListAdd(&state->configDirs);
|
|
|
|
|
ffStrbufInitA(buffer, 64);
|
|
|
|
|
ffStrbufAppendS(buffer, xdgConfigDirs.chars + startIndex);
|
|
|
|
|
ffStrbufTrimRight(buffer, '/');
|
|
|
|
|
FF_ENSURE_ONLY_ONCE_IN_LIST(buffer);
|
|
|
|
|
|
|
|
|
|
startIndex = colonIndex + 1;
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-07 14:55:43 +02:00
|
|
|
FFstrbuf* systemConfigHome = ffListAdd(&state->configDirs);
|
|
|
|
|
ffStrbufInitA(systemConfigHome, 64);
|
|
|
|
|
ffStrbufAppendS(systemConfigHome, "/etc/xdg");
|
|
|
|
|
FF_ENSURE_ONLY_ONCE_IN_LIST(systemConfigHome)
|
|
|
|
|
|
|
|
|
|
FFstrbuf* systemConfig = ffListAdd(&state->configDirs);
|
|
|
|
|
ffStrbufInitA(systemConfig, 64);
|
|
|
|
|
ffStrbufAppendS(systemConfig, "/etc");
|
|
|
|
|
FF_ENSURE_ONLY_ONCE_IN_LIST(systemConfig)
|
|
|
|
|
|
|
|
|
|
#undef FF_ENSURE_ONLY_ONCE_IN_LIST
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-08 12:14:55 +02:00
|
|
|
static void initCacheDir(FFstate* state)
|
|
|
|
|
{
|
|
|
|
|
ffStrbufInitA(&state->cacheDir, 64);
|
|
|
|
|
|
|
|
|
|
ffStrbufAppendS(&state->cacheDir, getenv("XDG_CACHE_HOME"));
|
|
|
|
|
|
|
|
|
|
if(state->cacheDir.length == 0)
|
|
|
|
|
{
|
|
|
|
|
ffStrbufAppendS(&state->cacheDir, state->passwd->pw_dir);
|
|
|
|
|
ffStrbufAppendS(&state->cacheDir, "/.cache/");
|
|
|
|
|
}
|
2022-01-01 17:28:41 +01:00
|
|
|
else if(!ffStrbufEndsWithC(&state->cacheDir, '/'))
|
2021-05-08 16:56:37 +02:00
|
|
|
ffStrbufAppendC(&state->cacheDir, '/');
|
2021-05-08 12:14:55 +02:00
|
|
|
|
2021-05-08 17:13:26 +02:00
|
|
|
mkdir(state->cacheDir.chars, S_IRWXU | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH); //I hope everybody has a cache folder, but who knows
|
2021-05-08 12:14:55 +02:00
|
|
|
|
|
|
|
|
ffStrbufAppendS(&state->cacheDir, "fastfetch/");
|
|
|
|
|
mkdir(state->cacheDir.chars, S_IRWXU | S_IRGRP | S_IROTH);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-09 14:07:05 +02:00
|
|
|
static void initState(FFstate* state)
|
|
|
|
|
{
|
2021-06-13 14:23:35 +02:00
|
|
|
state->logoWidth = 0;
|
2021-04-09 14:07:05 +02:00
|
|
|
state->passwd = getpwuid(getuid());
|
|
|
|
|
uname(&state->utsname);
|
|
|
|
|
sysinfo(&state->sysinfo);
|
2021-05-07 14:55:43 +02:00
|
|
|
|
|
|
|
|
initConfigDirs(state);
|
2021-05-08 12:14:55 +02:00
|
|
|
initCacheDir(state);
|
2021-04-09 14:07:05 +02:00
|
|
|
}
|
|
|
|
|
|
2021-06-13 14:23:35 +02:00
|
|
|
static void defaultConfig(FFinstance* instance)
|
2021-04-09 14:07:05 +02:00
|
|
|
{
|
2021-06-13 14:23:35 +02:00
|
|
|
ffStrbufInit(&instance->config.color);
|
|
|
|
|
instance->config.logoKeySpacing = 4;
|
|
|
|
|
ffStrbufInitS(&instance->config.separator, ": ");
|
|
|
|
|
instance->config.offsetx = 0;
|
|
|
|
|
instance->config.colorLogo = true;
|
|
|
|
|
instance->config.showErrors = false;
|
|
|
|
|
instance->config.recache = false;
|
|
|
|
|
instance->config.cacheSave = true;
|
|
|
|
|
instance->config.printRemainingLogo = true;
|
|
|
|
|
instance->config.allowSlowOperations = false;
|
2021-06-17 13:49:25 +02:00
|
|
|
instance->config.disableLinewrap = true;
|
|
|
|
|
instance->config.hideCursor = true;
|
2021-12-19 22:39:22 +01:00
|
|
|
instance->config.userLogoIsRaw = false;
|
|
|
|
|
|
|
|
|
|
for(uint8_t i = 0; i < (uint8_t) FASTFETCH_LOGO_MAX_COLORS; ++i)
|
|
|
|
|
ffStrbufInit(&instance->config.logoColors[i]);
|
2021-06-13 14:23:35 +02:00
|
|
|
|
2021-11-09 15:14:25 +01:00
|
|
|
ffLoadLogo(instance);
|
2021-04-09 14:07:05 +02:00
|
|
|
|
2021-11-16 12:54:49 +01:00
|
|
|
ffStrbufInitA(&instance->config.osFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.osKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.hostFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.hostKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.kernelFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.kernelKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.uptimeFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.uptimeKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.processesFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.processesKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.packagesFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.packagesKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.shellFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.shellKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.resolutionFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.resolutionKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.deFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.deKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.wmFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.wmKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.wmThemeFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.wmThemeKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.themeFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.themeKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.iconsFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.iconsKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.fontFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.fontKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.cursorKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.cursorFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.terminalFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.terminalKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.termFontFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.termFontKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.cpuFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.cpuKey, 0);
|
2021-11-24 16:16:25 +08:00
|
|
|
ffStrbufInitA(&instance->config.cpuUsageFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.cpuUsageKey, 0);
|
2021-11-16 12:54:49 +01:00
|
|
|
ffStrbufInitA(&instance->config.gpuFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.gpuKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.memoryFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.memoryKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.diskFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.diskKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.batteryFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.batteryKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.localeFormat, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.localeKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.localIpKey, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.localIpFormat, 0);
|
|
|
|
|
|
|
|
|
|
ffStrbufInitA(&instance->config.libPCI, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.libVulkan, 0);
|
2022-01-05 14:40:57 +01:00
|
|
|
ffStrbufInitA(&instance->config.libWayland, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.libXcbRandr, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.libXcb, 0);
|
2021-11-16 12:54:49 +01:00
|
|
|
ffStrbufInitA(&instance->config.libXrandr, 0);
|
2022-01-05 14:40:57 +01:00
|
|
|
ffStrbufInitA(&instance->config.libX11, 0);
|
2021-11-16 12:54:49 +01:00
|
|
|
ffStrbufInitA(&instance->config.libGIO, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.libDConf, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.libXFConf, 0);
|
|
|
|
|
ffStrbufInitA(&instance->config.librpm, 0);
|
|
|
|
|
|
|
|
|
|
ffStrbufInitA(&instance->config.diskFolders, 0);
|
|
|
|
|
|
|
|
|
|
ffStrbufInitA(&instance->config.batteryDir, 0);
|
2021-10-17 12:42:15 +08:00
|
|
|
|
2021-11-18 18:25:24 +01:00
|
|
|
ffStrbufInitA(&instance->config.separatorString, 0);
|
|
|
|
|
|
2021-10-17 12:42:15 +08:00
|
|
|
instance->config.localIpShowIpV4 = true;
|
|
|
|
|
instance->config.localIpShowIpV6 = false;
|
|
|
|
|
instance->config.localIpShowLoop = false;
|
2021-04-09 14:07:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ffInitInstance(FFinstance* instance)
|
|
|
|
|
{
|
|
|
|
|
initState(&instance->state);
|
2021-06-13 14:23:35 +02:00
|
|
|
defaultConfig(instance);
|
2021-04-15 18:59:26 +02:00
|
|
|
ffCacheValidate(instance);
|
2021-04-09 14:07:05 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-23 15:48:24 +02:00
|
|
|
static void resetConsole(bool disableLinewrap, bool hideCursor)
|
|
|
|
|
{
|
|
|
|
|
if(disableLinewrap)
|
|
|
|
|
fputs("\033[?7h", stdout);
|
|
|
|
|
|
|
|
|
|
if(hideCursor)
|
|
|
|
|
fputs("\033[?25h", stdout);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static volatile bool ffDisableLinewrap = true;
|
|
|
|
|
static volatile bool ffHideCursor = true;
|
|
|
|
|
|
|
|
|
|
static void exitSignalHandler(int signal)
|
|
|
|
|
{
|
|
|
|
|
FF_UNUSED(signal);
|
|
|
|
|
resetConsole(ffDisableLinewrap, ffHideCursor);
|
|
|
|
|
exit(0);
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-17 13:49:25 +02:00
|
|
|
void ffStart(FFinstance* instance)
|
|
|
|
|
{
|
2021-10-23 15:48:24 +02:00
|
|
|
ffDisableLinewrap = instance->config.disableLinewrap;
|
|
|
|
|
ffHideCursor = instance->config.hideCursor;
|
|
|
|
|
|
|
|
|
|
struct sigaction action = {};
|
|
|
|
|
action.sa_handler = exitSignalHandler;
|
|
|
|
|
|
|
|
|
|
sigaction(SIGINT, &action, NULL);
|
|
|
|
|
sigaction(SIGTERM, &action, NULL);
|
|
|
|
|
sigaction(SIGQUIT, &action, NULL);
|
|
|
|
|
|
2021-06-17 13:49:25 +02:00
|
|
|
if(instance->config.hideCursor)
|
|
|
|
|
fputs("\033[?25l", stdout);
|
|
|
|
|
|
|
|
|
|
if(instance->config.disableLinewrap)
|
|
|
|
|
fputs("\033[?7l", stdout);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-09 14:07:05 +02:00
|
|
|
void ffFinish(FFinstance* instance)
|
|
|
|
|
{
|
|
|
|
|
if(instance->config.printRemainingLogo)
|
|
|
|
|
ffPrintRemainingLogo(instance);
|
|
|
|
|
|
2021-10-23 15:48:24 +02:00
|
|
|
resetConsole(instance->config.disableLinewrap, instance->config.hideCursor);
|
2021-04-09 14:07:05 +02:00
|
|
|
}
|