Files
fastfetch/src/modules/cursor.c
T

215 lines
5.6 KiB
C
Raw Normal View History

2021-06-20 21:04:55 +02:00
#include "fastfetch.h"
#define FF_CURSOR_MODULE_NAME "Cursor"
#define FF_CURSOR_NUM_FORMAT_ARGS 2
2021-06-26 16:48:15 +02:00
static void printCursor(FFinstance* instance, FFstrbuf* cursorTheme, const FFstrbuf* cursorSize)
2021-06-20 21:04:55 +02:00
{
ffPrintLogoAndKey(instance, FF_CURSOR_MODULE_NAME, 0, &instance->config.cursorKey);
2021-06-26 16:48:15 +02:00
ffStrbufRemoveIgnCaseEndS(cursorTheme, "cursors");
ffStrbufRemoveIgnCaseEndS(cursorTheme, "cursor");
ffStrbufTrimRight(cursorTheme, '_');
2021-06-26 17:08:15 +02:00
ffStrbufTrimRight(cursorTheme, '-');
2021-06-26 16:48:15 +02:00
if(cursorTheme->length == 0)
ffStrbufAppendS(cursorTheme, "default");
2021-06-20 21:04:55 +02:00
ffStrbufWriteTo(cursorTheme, stdout);
2021-06-26 11:39:42 +02:00
if(cursorSize != NULL && cursorSize->length > 0)
2021-06-20 21:04:55 +02:00
{
fputs(" (", stdout);
ffStrbufWriteTo(cursorSize, stdout);
2021-06-26 11:43:36 +02:00
fputs("px)", stdout);
2021-06-20 21:04:55 +02:00
}
putchar('\n');
}
static void printCursorGTK(FFinstance* instance)
{
const FFGTKResult* gtk = ffDetectGTK4(instance);
if(gtk->cursor.length == 0)
gtk = ffDetectGTK3(instance);
if(gtk->cursor.length == 0)
gtk = ffDetectGTK2(instance);
if(gtk->cursor.length == 0)
{
ffPrintError(instance, FF_CURSOR_MODULE_NAME, 0, &instance->config.cursorKey, &instance->config.cursorFormat, FF_CURSOR_NUM_FORMAT_ARGS, "Couldn't detect GTK Cursor");
return;
}
2021-06-26 16:48:15 +02:00
//gtk->cursor is const, so we don't want to modify it
FFstrbuf theme;
ffStrbufInitCopy(&theme, &gtk->cursor);
printCursor(instance, &theme, &gtk->cursorSize);
ffStrbufDestroy(&theme);
2021-06-20 21:04:55 +02:00
}
static void printCursorPlasma(FFinstance* instance)
{
FFstrbuf cursorTheme;
ffStrbufInit(&cursorTheme);
FFstrbuf cursorSize;
ffStrbufInit(&cursorSize);
if(ffParsePropFileConfigValues(instance, "kcminputrc", 2, (FFpropquery[]) {
{"cursorTheme =", &cursorTheme},
{"cursorSize =", &cursorSize}
})) {
if(cursorTheme.length == 0)
ffStrbufAppendS(&cursorTheme, "Breeze");
if(cursorSize.length == 0)
ffStrbufAppendS(&cursorSize, "24");
}
if(cursorTheme.length == 0)
{
ffPrintError(instance, FF_CURSOR_MODULE_NAME, 0, &instance->config.cursorKey, &instance->config.cursorFormat, FF_CURSOR_NUM_FORMAT_ARGS, "Couldn't find plasma cursor in kcminputrc");
return;
}
printCursor(instance, &cursorTheme, &cursorSize);
ffStrbufDestroy(&cursorTheme);
ffStrbufDestroy(&cursorSize);
}
static void printCursorXFCE(FFinstance* instance)
{
FFstrbuf cursorTheme;
ffStrbufInit(&cursorTheme);
ffStrbufAppendS(&cursorTheme, ffSettingsGetXFConf(instance, "xsettings", "/Gtk/CursorThemeName", FF_VARIANT_TYPE_STRING).strValue);
if(cursorTheme.length == 0)
{
ffPrintError(instance, FF_CURSOR_MODULE_NAME, 0, &instance->config.cursorKey, &instance->config.cursorFormat, FF_CURSOR_NUM_FORMAT_ARGS, "Couldn't find xfce cursor in xfconf (xsettings::/Gtk/CursorThemeName)");
return;
}
FFstrbuf cursorSize;
ffStrbufInit(&cursorSize);
int cursorSizeVal = ffSettingsGetXFConf(instance, "xsettings", "/Gtk/CursorThemeSize", FF_VARIANT_TYPE_INT).intValue;
if(cursorSizeVal > 0)
ffStrbufAppendF(&cursorSize, "%i", cursorSizeVal);
printCursor(instance, &cursorTheme, &cursorSize);
ffStrbufDestroy(&cursorTheme);
ffStrbufDestroy(&cursorSize);
}
2021-06-26 11:39:42 +02:00
static bool printCursorFromXResources(FFinstance* instance)
{
FFstrbuf theme;
ffStrbufInit(&theme);
FFstrbuf size;
ffStrbufInit(&size);
ffParsePropFileHomeValues(instance, ".Xresources", 2, (FFpropquery[]) {
{"Xcursor.theme :", &theme},
{"Xcursor.size :", &size}
});
if(theme.length == 0)
{
ffStrbufDestroy(&size);
ffStrbufDestroy(&theme);
return false;
}
printCursor(instance, &theme, &size);
ffStrbufDestroy(&size);
ffStrbufDestroy(&theme);
return true;
}
static bool printCursorFromXDG(FFinstance* instance, bool user)
{
FFstrbuf theme;
ffStrbufInit(&theme);
if(user)
ffParsePropFileHome(instance, ".icons/default/index.theme", "Inherits =", &theme);
else
ffParsePropFile("/usr/share/icons/default/index.theme", "Inherits =", &theme);
if(theme.length == 0)
{
ffStrbufDestroy(&theme);
return false;
}
printCursor(instance, &theme, NULL);
ffStrbufDestroy(&theme);
return true;
}
static bool printCursorFromEnv(FFinstance* instance)
{
const char* xcursor_theme = getenv("XCURSOR_THEME");
if(xcursor_theme == NULL || *xcursor_theme == '\0')
return false;
FFstrbuf theme;
ffStrbufInit(&theme);
ffStrbufAppendS(&theme, xcursor_theme);
FFstrbuf size;
ffStrbufInit(&size);
ffStrbufAppendS(&size, getenv("XCURSOR_SIZE"));
printCursor(instance, &theme, &size);
ffStrbufDestroy(&size);
ffStrbufDestroy(&theme);
return true;
}
2021-06-20 21:04:55 +02:00
void ffPrintCursor(FFinstance* instance)
{
const FFWMDEResult* wmde = ffDetectWMDE(instance);
if(ffStrbufIgnCaseCompS(&wmde->dePrettyName, "KDE Plasma") == 0)
2021-06-26 11:39:42 +02:00
{
2021-06-20 21:04:55 +02:00
printCursorPlasma(instance);
2021-06-26 11:39:42 +02:00
return;
}
if(ffStrbufStartsWithIgnCaseS(&wmde->dePrettyName, "XFCE"))
{
2021-06-20 21:04:55 +02:00
printCursorXFCE(instance);
2021-06-26 11:39:42 +02:00
return;
}
if(ffStrbufIgnCaseCompS(&wmde->dePrettyName, "Gnome") == 0 || ffStrbufIgnCaseCompS(&wmde->dePrettyName, "Cinnamon") == 0 || ffStrbufIgnCaseCompS(&wmde->dePrettyName, "Mate") == 0)
{
2021-06-20 21:04:55 +02:00
printCursorGTK(instance);
2021-06-26 11:39:42 +02:00
return;
}
2021-06-26 16:48:15 +02:00
if(printCursorFromEnv(instance))
return;
2021-06-26 11:39:42 +02:00
//User config
if(printCursorFromXDG(instance, true))
return;
if(printCursorFromXResources(instance))
return;
//System config
if(printCursorFromXDG(instance, false))
return;
printCursorGTK(instance);
2021-06-20 21:04:55 +02:00
}