Files
fastfetch/src/common/init.c
T

348 lines
10 KiB
C
Raw Normal View History

2021-04-09 14:07:05 +02:00
#include "fastfetch.h"
#include "common/caching.h"
2021-04-09 14:07:05 +02:00
2022-06-18 14:25:31 +02:00
#include <stdlib.h>
2021-04-09 14:07:05 +02:00
#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);
ffStrbufEnsureEndsWithC(buffer, '/');
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/");
2021-05-07 14:55:43 +02:00
FF_ENSURE_ONLY_ONCE_IN_LIST(userConfigHome)
FFstrbuf* userHome = ffListAdd(&state->configDirs);
ffStrbufInitA(userHome, 64);
ffStrbufAppendS(userHome, state->passwd->pw_dir);
ffStrbufEnsureEndsWithC(userHome, '/');
2021-05-07 14:55:43 +02:00
FF_ENSURE_ONLY_ONCE_IN_LIST(userHome)
2022-06-19 18:21:41 +02:00
FFstrbuf xdgConfigDirs;
ffStrbufInitA(&xdgConfigDirs, 64);
ffStrbufAppendS(&xdgConfigDirs, getenv("XDG_CONFIG_DIRS"));
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);
ffStrbufEnsureEndsWithC(buffer, '/');
2021-10-22 18:42:14 +02:00
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, FASTFETCH_TARGET_DIR_ROOT"/etc/xdg/");
2021-05-07 14:55:43 +02:00
FF_ENSURE_ONLY_ONCE_IN_LIST(systemConfigHome)
FFstrbuf* systemConfig = ffListAdd(&state->configDirs);
ffStrbufInitA(systemConfig, 64);
ffStrbufAppendS(systemConfig, FASTFETCH_TARGET_DIR_ROOT"/etc/");
2021-05-07 14:55:43 +02:00
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/");
}
else
ffStrbufEnsureEndsWithC(&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)
{
2022-04-06 14:02:05 +02:00
state->logoWidth = 0;
2022-04-02 14:35:43 +02:00
state->logoHeight = 0;
state->keysHeight = 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
}
2022-06-17 18:15:36 +02:00
static void initModuleArg(FFModuleArgs* args)
{
ffStrbufInitA(&args->key, 0);
ffStrbufInitA(&args->outputFormat, 0);
ffStrbufInitA(&args->errorFormat, 0);
}
2021-06-13 14:23:35 +02:00
static void defaultConfig(FFinstance* instance)
2021-04-09 14:07:05 +02:00
{
2022-07-10 18:28:17 +02:00
ffStrbufInit(&instance->config.logo.source);
instance->config.logo.type = FF_LOGO_TYPE_AUTO;
2022-04-02 14:35:43 +02:00
for(uint8_t i = 0; i < (uint8_t) FASTFETCH_LOGO_MAX_COLORS; ++i)
2022-07-10 18:28:17 +02:00
ffStrbufInit(&instance->config.logo.colors[i]);
instance->config.logo.width = 0;
instance->config.logo.height = 0; //preserve aspect ratio
instance->config.logo.paddingLeft = 0;
instance->config.logo.paddingRight = 4;
instance->config.logo.printRemaining = true;
2022-01-12 01:02:14 +01:00
2022-04-02 14:35:43 +02:00
ffStrbufInit(&instance->config.mainColor);
2022-01-12 01:02:14 +01:00
ffStrbufInit(&instance->config.separator);
ffStrbufAppendS(&instance->config.separator, ": ");
2021-06-13 14:23:35 +02:00
instance->config.showErrors = false;
instance->config.recache = false;
instance->config.cacheSave = true;
instance->config.allowSlowOperations = false;
2021-06-17 13:49:25 +02:00
instance->config.disableLinewrap = true;
instance->config.hideCursor = true;
2022-06-02 23:06:49 +02:00
instance->config.escapeBedrock = true;
2022-06-04 15:21:34 +02:00
instance->config.glType = FF_GL_TYPE_AUTO;
2022-06-06 14:02:21 +02:00
instance->config.pipe = false;
2021-06-13 14:23:35 +02:00
2022-06-17 18:15:36 +02:00
initModuleArg(&instance->config.os);
initModuleArg(&instance->config.host);
initModuleArg(&instance->config.kernel);
initModuleArg(&instance->config.uptime);
initModuleArg(&instance->config.processes);
initModuleArg(&instance->config.packages);
initModuleArg(&instance->config.shell);
initModuleArg(&instance->config.resolution);
initModuleArg(&instance->config.de);
initModuleArg(&instance->config.wm);
initModuleArg(&instance->config.wmTheme);
initModuleArg(&instance->config.theme);
initModuleArg(&instance->config.icons);
initModuleArg(&instance->config.font);
initModuleArg(&instance->config.cursor);
initModuleArg(&instance->config.terminal);
initModuleArg(&instance->config.terminalFont);
initModuleArg(&instance->config.cpu);
initModuleArg(&instance->config.cpuUsage);
initModuleArg(&instance->config.gpu);
initModuleArg(&instance->config.memory);
initModuleArg(&instance->config.disk);
initModuleArg(&instance->config.battery);
initModuleArg(&instance->config.locale);
initModuleArg(&instance->config.localIP);
initModuleArg(&instance->config.publicIP);
initModuleArg(&instance->config.player);
initModuleArg(&instance->config.song);
initModuleArg(&instance->config.dateTime);
initModuleArg(&instance->config.date);
initModuleArg(&instance->config.time);
initModuleArg(&instance->config.vulkan);
initModuleArg(&instance->config.openGL);
initModuleArg(&instance->config.openCL);
2021-11-16 12:54:49 +01:00
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);
2022-02-13 23:51:13 +01:00
ffStrbufInitA(&instance->config.libDBus, 0);
2021-11-16 12:54:49 +01:00
ffStrbufInitA(&instance->config.libXFConf, 0);
2022-05-23 19:30:02 +02:00
ffStrbufInitA(&instance->config.libSQLite3, 0);
2022-05-24 13:36:33 +02:00
ffStrbufInitA(&instance->config.librpm, 0);
2022-04-06 14:02:05 +02:00
ffStrbufInitA(&instance->config.libImageMagick, 0);
2022-04-14 15:11:14 +02:00
ffStrbufInitA(&instance->config.libZ, 0);
2022-04-28 19:15:46 +02:00
ffStrbufInitA(&instance->config.libChafa, 0);
2022-06-04 15:21:34 +02:00
ffStrbufInitA(&instance->config.libEGL, 0);
ffStrbufInitA(&instance->config.libGLX, 0);
2022-06-04 19:30:26 +02:00
ffStrbufInitA(&instance->config.libOSMesa, 0);
2022-06-05 00:18:40 +02:00
ffStrbufInitA(&instance->config.libOpenCL, 0);
2021-11-16 12:54:49 +01:00
2022-07-22 19:36:00 +02:00
instance->config.titleFQDN = false;
2021-11-16 12:54:49 +01:00
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;
2022-01-10 20:20:18 +01:00
2022-01-12 19:16:49 +01:00
instance->config.publicIpTimeout = 0;
2022-01-18 18:56:37 +01:00
ffStrbufInitA(&instance->config.osFile, 0);
2022-02-13 23:51:13 +01:00
ffStrbufInitA(&instance->config.playerName, 0);
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-09 14:07:05 +02:00
}
2022-06-06 14:02:21 +02:00
static volatile bool ffDisableLinewrap = true;
static volatile bool ffHideCursor = true;
static void resetConsole()
2021-10-23 15:48:24 +02:00
{
2022-06-06 14:02:21 +02:00
if(ffDisableLinewrap)
2021-10-23 15:48:24 +02:00
fputs("\033[?7h", stdout);
2022-06-06 14:02:21 +02:00
if(ffHideCursor)
2021-10-23 15:48:24 +02:00
fputs("\033[?25h", stdout);
}
static void exitSignalHandler(int signal)
{
FF_UNUSED(signal);
2022-06-06 14:02:21 +02:00
resetConsole();
2021-10-23 15:48:24 +02:00
exit(0);
}
2021-06-17 13:49:25 +02:00
void ffStart(FFinstance* instance)
{
2022-06-06 14:02:21 +02:00
ffDisableLinewrap = instance->config.disableLinewrap && !instance->config.pipe;
ffHideCursor = instance->config.hideCursor && !instance->config.pipe;
2021-10-23 15:48:24 +02:00
struct sigaction action = {};
action.sa_handler = exitSignalHandler;
sigaction(SIGINT, &action, NULL);
sigaction(SIGTERM, &action, NULL);
sigaction(SIGQUIT, &action, NULL);
2022-04-11 18:54:56 +02:00
//We do the cache validation here, so we can skip it if --recache is given
2022-06-06 14:02:21 +02:00
if(!instance->config.recache)
ffCacheValidate(instance);
2022-04-11 18:54:56 +02:00
2022-04-02 14:35:43 +02:00
//reset everything to default before we start printing
2022-06-06 14:02:21 +02:00
if(!instance->config.pipe)
fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout);
2022-04-02 14:35:43 +02:00
2022-06-06 14:02:21 +02:00
if(ffHideCursor)
2021-06-17 13:49:25 +02:00
fputs("\033[?25l", stdout);
2022-06-06 14:02:21 +02:00
if(ffDisableLinewrap)
2021-06-17 13:49:25 +02:00
fputs("\033[?7l", stdout);
2022-04-02 14:35:43 +02:00
2022-06-08 10:59:33 +02:00
ffLogoPrint(instance);
2021-06-17 13:49:25 +02:00
}
2021-04-09 14:07:05 +02:00
void ffFinish(FFinstance* instance)
{
2022-07-10 18:28:17 +02:00
if(instance->config.logo.printRemaining)
2022-06-08 10:59:33 +02:00
ffLogoPrintRemaining(instance);
2022-06-06 14:02:21 +02:00
resetConsole();
2021-04-09 14:07:05 +02:00
}
2022-02-13 23:51:13 +01:00
2022-04-02 14:35:43 +02:00
//Must be in a file compiled with the libfastfetch target, because the FF_HAVE* macros are not defined for the executable targets
2022-02-13 23:51:13 +01:00
void ffListFeatures()
{
fputs(
#ifdef FF_HAVE_LIBPCI
"libpci\n"
#endif
#ifdef FF_HAVE_VULKAN
"vulkan\n"
#endif
#ifdef FF_HAVE_WAYLAND
"wayland\n"
#endif
#ifdef FF_HAVE_XCB_RANDR
"xcb-randr\n"
#endif
#ifdef FF_HAVE_XCB
"xcb\n"
#endif
#ifdef FF_HAVE_XRANDR
"xrandr\n"
#endif
#ifdef FF_HAVE_X11
"x11\n"
#endif
#ifdef FF_HAVE_GIO
"gio\n"
#endif
#ifdef FF_HAVE_DCONF
"dconf\n"
#endif
#ifdef FF_HAVE_DBUS
"dbus\n"
#endif
#ifdef FF_HAVE_IMAGEMAGICK7
"imagemagick7\n"
#endif
#ifdef FF_HAVE_IMAGEMAGICK6
"imagemagick6\n"
2022-04-06 14:54:39 +02:00
#endif
2022-04-29 14:11:22 +02:00
#ifdef FF_HAVE_CHAFA
"chafa\n"
#endif
2022-04-14 15:11:14 +02:00
#ifdef FF_HAVE_ZLIB
"zlib\n"
#endif
2022-02-13 23:51:13 +01:00
#ifdef FF_HAVE_XFCONF
"xfconf\n"
#endif
2022-05-23 19:30:02 +02:00
#ifdef FF_HAVE_SQLITE3
"sqlite3\n"
2022-02-13 23:51:13 +01:00
#endif
2022-05-24 13:36:33 +02:00
#ifdef FF_HAVE_RPM
"rpm\n"
#endif
2022-06-04 15:21:34 +02:00
#ifdef FF_HAVE_EGL
"egl\n"
#endif
#ifdef FF_HAVE_GLX
"glx\n"
#endif
2022-06-04 19:30:26 +02:00
#ifdef FF_HAVE_OSMESA
"osmesa\n"
#endif
2022-06-05 00:18:40 +02:00
#ifdef FF_HAVE_OPENCL
"opencl\n"
#endif
2022-02-13 23:51:13 +01:00
""
, stdout);
}