Files
fastfetch/src/detection/cursor/cursor_linux.c
T

92 lines
3.3 KiB
C
Raw Normal View History

2022-11-23 12:10:45 +08:00
#include "cursor.h"
#include "common/properties.h"
#include "common/parsing.h"
#include "common/settings.h"
2023-02-14 17:46:21 +08:00
#include "detection/gtk_qt/gtk_qt.h"
2022-11-23 12:10:45 +08:00
#include "detection/displayserver/displayserver.h"
2023-02-01 15:56:25 +01:00
#include "util/stringUtils.h"
2022-11-23 12:10:45 +08:00
#include <stdlib.h>
2023-01-17 17:49:41 +01:00
static bool detectCursorGTK(const FFinstance* instance, FFCursorResult* result)
2022-11-23 12:10:45 +08:00
{
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)
2023-01-17 17:49:41 +01:00
return false;
2022-11-23 12:10:45 +08:00
ffStrbufAppend(&result->theme, &gtk->cursor);
ffStrbufAppend(&result->size, &gtk->cursorSize);
2023-01-17 17:49:41 +01:00
return true;
2022-11-23 12:10:45 +08:00
}
static void detectCursorFromConfigFile(const FFinstance* instance, const char* relativeFilePath, const char* themeStart, const char* themeDefault, const char* sizeStart, const char* sizeDefault, FFCursorResult* result)
{
if(ffParsePropFileConfigValues(instance, relativeFilePath, 2, (FFpropquery[]) {
{themeStart, &result->theme},
{sizeStart, &result->size}
})) {
if(result->theme.length == 0)
ffStrbufAppendS(&result->theme, themeDefault);
if(result->size.length == 0)
ffStrbufAppendS(&result->size, sizeDefault);
}
if(result->theme.length == 0)
ffStrbufAppendF(&result->error, "Couldn't find cursor in %s", relativeFilePath);
}
static bool detectCursorFromXResources(const FFinstance* instance, FFCursorResult* result)
{
ffParsePropFileHomeValues(instance, ".Xresources", 2, (FFpropquery[]) {
{"Xcursor.theme :", &result->theme},
{"Xcursor.size :", &result->size}
});
return result->theme.length > 0;
}
static bool detectCursorFromEnv(const FFinstance* instance, FFCursorResult* result)
{
FF_UNUSED(instance);
const char* xcursor_theme = getenv("XCURSOR_THEME");
if(!ffStrSet(xcursor_theme))
return false;
ffStrbufAppendS(&result->theme, xcursor_theme);
ffStrbufAppendS(&result->size, getenv("XCURSOR_SIZE"));
return true;
}
void ffDetectCursor(const FFinstance* instance, FFCursorResult* result)
{
const FFDisplayServerResult* wmde = ffConnectDisplayServer(instance);
if(ffStrbufCompS(&wmde->wmPrettyName, FF_WM_PRETTY_WSLG) == 0)
2022-11-23 12:10:45 +08:00
ffStrbufAppendS(&result->error, "WSLg uses native windows cursor");
else if(ffStrbufIgnCaseCompS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY) == 0)
2022-11-23 12:10:45 +08:00
ffStrbufAppendS(&result->error, "Cursor isn't supported in TTY");
else if(ffStrbufIgnCaseCompS(&wmde->dePrettyName, FF_DE_PRETTY_PLASMA) == 0)
2023-01-17 17:49:41 +01:00
detectCursorFromConfigFile(instance, "kcminputrc", "cursorTheme =", "Breeze", "cursorSize =", "24", result);
else if(ffStrbufStartsWithIgnCaseS(&wmde->dePrettyName, FF_DE_PRETTY_LXQT))
2023-01-17 17:49:41 +01:00
detectCursorFromConfigFile(instance, "lxqt/session.conf", "cursor_theme =", "Adwaita", "cursor_size =", "24", result);
else if(
!detectCursorGTK(instance, result) &&
!detectCursorFromEnv(instance, result) &&
!ffParsePropFileHome(instance, ".icons/default/index.theme", "Inherits =", &result->theme) &&
!detectCursorFromXResources(instance, result) &&
!ffParsePropFileData(instance, "icons/default/index.theme", "Inherits =", &result->theme)
) ffStrbufAppendS(&result->error, "Couldn't find cursor");
2022-11-23 12:10:45 +08:00
}