mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2026-04-04 07:15:53 -04:00
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:
parent
88f1605a82
commit
0aebb5b94d
1 changed files with 42 additions and 8 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue