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>
This commit is contained in:
Alexander Dunaev 2021-02-17 15:44:00 +07:00 committed by Simon Ser
parent 88f1605a82
commit 0aebb5b94d

View file

@ -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 #define XCURSORPATH "~/.icons:/usr/share/icons:/usr/share/pixmaps:~/.cursors:/usr/share/cursors/xorg-x11:"ICONDIR
#endif #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) 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"); path = strdup (env_var);
if (!path) }
path = XCURSORPATH; 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; return path;
} }
@ -803,6 +830,7 @@ XcursorScanTheme (const char *theme, const char *name)
const char *path; const char *path;
char *inherits = NULL; char *inherits = NULL;
const char *i; const char *i;
char *xcursor_path;
if (!theme || !name) if (!theme || !name)
return NULL; return NULL;
@ -810,7 +838,8 @@ XcursorScanTheme (const char *theme, const char *name)
/* /*
* Scan this theme * Scan this theme
*/ */
for (path = XcursorLibraryPath (); xcursor_path = XcursorLibraryPath ();
for (path = xcursor_path;
path && f == NULL; path && f == NULL;
path = _XcursorNextPath (path)) path = _XcursorNextPath (path))
{ {
@ -842,6 +871,7 @@ XcursorScanTheme (const char *theme, const char *name)
f = XcursorScanTheme (i, name); f = XcursorScanTheme (i, name);
if (inherits != NULL) if (inherits != NULL)
free (inherits); free (inherits);
free (xcursor_path);
return f; return f;
} }
@ -940,11 +970,13 @@ xcursor_load_theme(const char *theme, int size,
char *full, *dir; char *full, *dir;
char *inherits = NULL; char *inherits = NULL;
const char *path, *i; const char *path, *i;
char *xcursor_path;
if (!theme) if (!theme)
theme = "default"; theme = "default";
for (path = XcursorLibraryPath(); xcursor_path = XcursorLibraryPath();
for (path = xcursor_path;
path; path;
path = _XcursorNextPath(path)) { path = _XcursorNextPath(path)) {
dir = _XcursorBuildThemeDir(path, theme); dir = _XcursorBuildThemeDir(path, theme);
@ -975,4 +1007,6 @@ xcursor_load_theme(const char *theme, int size,
if (inherits) if (inherits)
free(inherits); free(inherits);
free (xcursor_path);
} }