diff options
author | Alexander Dunaev <adunaev@igalia.com> | 2021-02-17 15:44:00 +0700 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-04-27 11:16:17 +0000 |
commit | 0aebb5b94d6c9ba5e5b1440cb57060d9063e202d (patch) | |
tree | c8dddf6e568a377880357a82503cbf44c320a470 | |
parent | 88f1605a826ca0c2ff02be6f4cf9ecabf68e8341 (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.c | 50 |
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); } |