aboutsummaryrefslogtreecommitdiff
path: root/xcursor/xcursor.c
diff options
context:
space:
mode:
authorMoon Sungjoon <sumoon@seoulsaram.org>2022-03-06 00:33:28 +0900
committerSimon Ser <contact@emersion.fr>2022-03-08 15:41:42 +0000
commit2dd121235ea4c3f37c83ef19bb87aa11448fb40d (patch)
tree72426c6b81baf483e838fb55b653bc3cf98ca45b /xcursor/xcursor.c
parentf330759ba43ba55696c8e378fedfa2d1448ae12f (diff)
xcursor: support XDG Base Directory Specification
This patch adds ~/.local/share/icons to the search path, so user-specific themes can be loaded through the API provided by libwayland-cursor. Use this PR as reference: https://gitlab.freedesktop.org/wayland/wayland/-/merge_requests/112
Diffstat (limited to 'xcursor/xcursor.c')
-rw-r--r--xcursor/xcursor.c51
1 files changed, 38 insertions, 13 deletions
diff --git a/xcursor/xcursor.c b/xcursor/xcursor.c
index 293d6e9d..b0c424f4 100644
--- a/xcursor/xcursor.c
+++ b/xcursor/xcursor.c
@@ -622,18 +622,43 @@ XcursorFileLoadImages (FILE *file, int size)
#define XCURSORPATH "~/.local/share/icons:~/.icons:/usr/share/icons:/usr/share/pixmaps:~/.cursors:/usr/share/cursors/xorg-x11:"ICONDIR
#endif
-static const char *
+#define XDG_DATA_HOME_FALLBACK "~/.local/share"
+#define CURSORDIR "/icons"
+
+/** Get search path for cursor themes
+ *
+ * This function builds the list of directories to look for cursor
+ * themes in. The format is PATH-like: directories are separated by
+ * colons.
+ *
+ * The memory block returned by this function is allocated on the heap
+ * and must be freed by the caller.
+ */
+static char *
XcursorLibraryPath (void)
{
- static const char *path;
+ const char *env_var;
+ char *path = NULL;
+ int pathlen = 0;
- if (!path)
- {
- path = getenv ("XCURSOR_PATH");
- if (!path)
- path = XCURSORPATH;
- }
- return path;
+ env_var = getenv("XCURSOR_PATH");
+ if (env_var) {
+ path = strdup(env_var);
+ }
+ else {
+ env_var = getenv("XDG_DATA_HOME");
+ if (env_var) {
+ pathlen = strlen(env_var) +
+ strlen(CURSORDIR ":" XCURSORPATH) + 1;
+ path = malloc(pathlen);
+ snprintf(path, pathlen, "%s%s", env_var,
+ CURSORDIR ":" XCURSORPATH);
+ }
+ else {
+ path = strdup(XDG_DATA_HOME_FALLBACK ":" XCURSORPATH);
+ }
+ }
+ return path;
}
static void
@@ -866,14 +891,13 @@ xcursor_load_theme(const char *theme, int size,
{
char *full, *dir;
char *inherits = NULL;
+ char *xcursor_path = NULL;
const char *path, *i;
if (!theme)
theme = "default";
-
- for (path = XcursorLibraryPath();
- path;
- path = _XcursorNextPath(path)) {
+ xcursor_path = XcursorLibraryPath();
+ for (path = xcursor_path; path; path = _XcursorNextPath(path)) {
dir = _XcursorBuildThemeDir(path, theme);
if (!dir)
continue;
@@ -902,4 +926,5 @@ xcursor_load_theme(const char *theme, int size,
if (inherits)
free(inherits);
+ free(xcursor_path);
}