summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Dunaev <adunaev@igalia.com>2021-02-17 15:44:00 +0700
committerSimon Ser <contact@emersion.fr>2021-04-27 11:16:17 +0000
commit0aebb5b94d6c9ba5e5b1440cb57060d9063e202d (patch)
treec8dddf6e568a377880357a82503cbf44c320a470
parent88f1605a826ca0c2ff02be6f4cf9ecabf68e8341 (diff)
cursor: add one more directory to XCURSORPATH
The user may install cursor themes manually, and the desktop environment may provide a special directory for storing them. For instance, GTK puts those themes into ~/.local/share/icons, and many Linux distributions suggest using that directory for user-specific themes. However, users of libwayland-cursor cannot load these themes using the API provided by the library because the latter does not look into that directory. This patch adds ~/.local/share/icons to the search path, so user-specific themes can be loaded through the API provided by libwayland-cursor. Signed-off-by: Alexander Dunaev <adunaev@igalia.com> Reviewed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Reviewed-by: Simon Ser <contact@emersion.fr>
-rw-r--r--cursor/xcursor.c50
1 files changed, 42 insertions, 8 deletions
diff --git a/cursor/xcursor.c b/cursor/xcursor.c
index 1f1360f..3b35f1c 100644
--- a/cursor/xcursor.c
+++ b/cursor/xcursor.c
@@ -621,16 +621,43 @@ XcursorFileLoadImages (FILE *file, int size)
#define XCURSORPATH "~/.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)
+ env_var = getenv ("XCURSOR_PATH");
+ if (env_var)
{
- path = getenv ("XCURSOR_PATH");
- if (!path)
- path = XCURSORPATH;
+ 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 CURSORDIR ":" XCURSORPATH);
+ }
}
return path;
}
@@ -803,6 +830,7 @@ XcursorScanTheme (const char *theme, const char *name)
const char *path;
char *inherits = NULL;
const char *i;
+ char *xcursor_path;
if (!theme || !name)
return NULL;
@@ -810,7 +838,8 @@ XcursorScanTheme (const char *theme, const char *name)
/*
* Scan this theme
*/
- for (path = XcursorLibraryPath ();
+ xcursor_path = XcursorLibraryPath ();
+ for (path = xcursor_path;
path && f == NULL;
path = _XcursorNextPath (path))
{
@@ -842,6 +871,7 @@ XcursorScanTheme (const char *theme, const char *name)
f = XcursorScanTheme (i, name);
if (inherits != NULL)
free (inherits);
+ free (xcursor_path);
return f;
}
@@ -940,11 +970,13 @@ xcursor_load_theme(const char *theme, int size,
char *full, *dir;
char *inherits = NULL;
const char *path, *i;
+ char *xcursor_path;
if (!theme)
theme = "default";
- for (path = XcursorLibraryPath();
+ xcursor_path = XcursorLibraryPath();
+ for (path = xcursor_path;
path;
path = _XcursorNextPath(path)) {
dir = _XcursorBuildThemeDir(path, theme);
@@ -975,4 +1007,6 @@ xcursor_load_theme(const char *theme, int size,
if (inherits)
free(inherits);
+
+ free (xcursor_path);
}