aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/Xcursor/library.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/lib/Xcursor/library.c')
-rw-r--r--nx-X11/lib/Xcursor/library.c495
1 files changed, 0 insertions, 495 deletions
diff --git a/nx-X11/lib/Xcursor/library.c b/nx-X11/lib/Xcursor/library.c
deleted file mode 100644
index 6774f802f..000000000
--- a/nx-X11/lib/Xcursor/library.c
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- * $Id: library.c,v 1.6 2005/12/08 17:54:40 kem Exp $
- *
- * Copyright © 2002 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "xcursorint.h"
-#include <stdlib.h>
-#include <string.h>
-
-#ifndef ICONDIR
-#define ICONDIR "/usr/X11R6/lib/X11/icons"
-#endif
-
-#ifndef XCURSORPATH
-#define XCURSORPATH "~/.icons:/usr/share/icons:/usr/share/pixmaps:"ICONDIR
-#endif
-
-const char *
-XcursorLibraryPath (void)
-{
- static const char *path;
-
- if (!path)
- {
- path = getenv ("XCURSOR_PATH");
- if (!path)
- path = XCURSORPATH;
- }
- return path;
-}
-
-static void
-_XcursorAddPathElt (char *path, const char *elt, int len)
-{
- int pathlen = strlen (path);
-
- /* append / if the path doesn't currently have one */
- if (path[0] == '\0' || path[pathlen - 1] != '/')
- {
- strcat (path, "/");
- pathlen++;
- }
- if (len == -1)
- len = strlen (elt);
- /* strip leading slashes */
- while (len && elt[0] == '/')
- {
- elt++;
- len--;
- }
- strncpy (path + pathlen, elt, len);
- path[pathlen + len] = '\0';
-}
-
-static char *
-_XcursorBuildThemeDir (const char *dir, const char *theme)
-{
- const char *colon;
- const char *tcolon;
- char *full;
- char *home;
- int dirlen;
- int homelen;
- int themelen;
- int len;
-
- if (!dir || !theme)
- return NULL;
-
- colon = strchr (dir, ':');
- if (!colon)
- colon = dir + strlen (dir);
-
- dirlen = colon - dir;
-
- tcolon = strchr (theme, ':');
- if (!tcolon)
- tcolon = theme + strlen (theme);
-
- themelen = tcolon - theme;
-
- home = 0;
- homelen = 0;
- if (*dir == '~')
- {
- home = getenv ("HOME");
- if (!home)
- return 0;
- homelen = strlen (home);
- dir++;
- dirlen--;
- }
-
- /*
- * add space for any needed directory separators, one per component,
- * and one for the trailing null
- */
- len = 1 + homelen + 1 + dirlen + 1 + themelen + 1;
-
- full = malloc (len);
- if (!full)
- return 0;
- full[0] = '\0';
-
- if (home)
- _XcursorAddPathElt (full, home, -1);
- _XcursorAddPathElt (full, dir, dirlen);
- _XcursorAddPathElt (full, theme, themelen);
- return full;
-}
-
-static char *
-_XcursorBuildFullname (const char *dir, const char *subdir, const char *file)
-{
- char *full;
-
- if (!dir || !subdir || !file)
- return NULL;
-
- full = malloc (strlen (dir) + 1 + strlen (subdir) + 1 + strlen (file) + 1);
- if (!full)
- return 0;
- full[0] = '\0';
- _XcursorAddPathElt (full, dir, -1);
- _XcursorAddPathElt (full, subdir, -1);
- _XcursorAddPathElt (full, file, -1);
- return full;
-}
-
-static const char *
-_XcursorNextPath (const char *path)
-{
- char *colon = strchr (path, ':');
-
- if (!colon)
- return 0;
- return colon + 1;
-}
-
-#define XcursorWhite(c) ((c) == ' ' || (c) == '\t' || (c) == '\n')
-#define XcursorSep(c) ((c) == ';' || (c) == ',')
-
-static char *
-_XcursorThemeInherits (const char *full)
-{
- char line[8192];
- char *result = 0;
- FILE *f;
-
- if (!full)
- return NULL;
-
- f = fopen (full, "r");
- if (f)
- {
- while (fgets (line, sizeof (line), f))
- {
- if (!strncmp (line, "Inherits", 8))
- {
- char *l = line + 8;
- char *r;
- while (*l == ' ') l++;
- if (*l != '=') continue;
- l++;
- while (*l == ' ') l++;
- result = malloc (strlen (l));
- if (result)
- {
- r = result;
- while (*l)
- {
- while (XcursorSep(*l) || XcursorWhite (*l)) l++;
- if (!*l)
- break;
- if (r != result)
- *r++ = ':';
- while (*l && !XcursorWhite(*l) &&
- !XcursorSep(*l))
- *r++ = *l++;
- }
- *r++ = '\0';
- }
- break;
- }
- }
- fclose (f);
- }
- return result;
-}
-
-#define XCURSOR_SCAN_CORE ((FILE *) 1)
-
-static FILE *
-XcursorScanTheme (const char *theme, const char *name)
-{
- FILE *f = 0;
- char *full;
- char *dir;
- const char *path;
- char *inherits = 0;
- const char *i;
-
- if (!theme || !name)
- return NULL;
-
- /*
- * XCURSOR_CORE_THEME is a magic name; cursors from the core set
- * are never found in any directory. Instead, a magic value is
- * returned which truncates any search so that overlying functions
- * can switch to equivalent core cursors
- */
- if (!strcmp (theme, XCURSOR_CORE_THEME) && XcursorLibraryShape (name) >= 0)
- return XCURSOR_SCAN_CORE;
- /*
- * Scan this theme
- */
- for (path = XcursorLibraryPath ();
- path && f == 0;
- path = _XcursorNextPath (path))
- {
- dir = _XcursorBuildThemeDir (path, theme);
- if (dir)
- {
- full = _XcursorBuildFullname (dir, "cursors", name);
- if (full)
- {
- f = fopen (full, "r");
- free (full);
- }
- if (!f && !inherits)
- {
- full = _XcursorBuildFullname (dir, "", "index.theme");
- if (full)
- {
- inherits = _XcursorThemeInherits (full);
- free (full);
- }
- }
- free (dir);
- }
- }
- /*
- * Recurse to scan inherited themes
- */
- for (i = inherits; i && f == 0; i = _XcursorNextPath (i))
- f = XcursorScanTheme (i, name);
- if (inherits)
- free (inherits);
- return f;
-}
-
-XcursorImage *
-XcursorLibraryLoadImage (const char *file, const char *theme, int size)
-{
- FILE *f = 0;
- XcursorImage *image = 0;
-
- if (!file)
- return NULL;
-
- if (theme)
- f = XcursorScanTheme (theme, file);
- if (!f)
- f = XcursorScanTheme ("default", file);
- if (f == XCURSOR_SCAN_CORE)
- return 0;
- if (f)
- {
- image = XcursorFileLoadImage (f, size);
- fclose (f);
- }
- return image;
-}
-
-XcursorImages *
-XcursorLibraryLoadImages (const char *file, const char *theme, int size)
-{
- FILE *f = 0;
- XcursorImages *images = 0;
-
- if (!file)
- return NULL;
-
- if (theme)
- f = XcursorScanTheme (theme, file);
- if (!f)
- f = XcursorScanTheme ("default", file);
- if (f == XCURSOR_SCAN_CORE)
- return 0;
- if (f)
- {
- images = XcursorFileLoadImages (f, size);
- if (images)
- XcursorImagesSetName (images, file);
- fclose (f);
- }
- return images;
-}
-
-Cursor
-XcursorLibraryLoadCursor (Display *dpy, const char *file)
-{
- int size = XcursorGetDefaultSize (dpy);
- char *theme = XcursorGetTheme (dpy);
- XcursorImages *images = XcursorLibraryLoadImages (file, theme, size);
- Cursor cursor;
-
- if (!file)
- return 0;
-
- if (!images)
- {
- int id = XcursorLibraryShape (file);
-
- if (id >= 0)
- return _XcursorCreateFontCursor (dpy, id);
- else
- return 0;
- }
- cursor = XcursorImagesLoadCursor (dpy, images);
- XcursorImagesDestroy (images);
-#if defined HAVE_XFIXES && XFIXES_MAJOR >= 2
- XFixesSetCursorName (dpy, cursor, file);
-#endif
- return cursor;
-}
-
-XcursorCursors *
-XcursorLibraryLoadCursors (Display *dpy, const char *file)
-{
- int size = XcursorGetDefaultSize (dpy);
- char *theme = XcursorGetTheme (dpy);
- XcursorImages *images = XcursorLibraryLoadImages (file, theme, size);
- XcursorCursors *cursors;
-
- if (!file)
- return NULL;
-
- if (!images)
- {
- int id = XcursorLibraryShape (file);
-
- if (id >= 0)
- {
- cursors = XcursorCursorsCreate (dpy, 1);
- if (cursors)
- {
- cursors->cursors[0] = _XcursorCreateFontCursor (dpy, id);
- if (cursors->cursors[0] == None)
- {
- XcursorCursorsDestroy (cursors);
- cursors = 0;
- }
- else
- cursors->ncursor = 1;
- }
- }
- else
- cursors = 0;
- }
- else
- {
- cursors = XcursorImagesLoadCursors (dpy, images);
- XcursorImagesDestroy (images);
- }
- return cursors;
-}
-
-const static char *_XcursorStandardNames[] = {
- /* 0 */
- "X_cursor", "arrow", "based_arrow_down", "based_arrow_up",
- "boat", "bogosity", "bottom_left_corner", "bottom_right_corner",
- "bottom_side", "bottom_tee", "box_spiral", "center_ptr",
- "circle", "clock", "coffee_mug", "cross",
-
- /* 32 */
- "cross_reverse", "crosshair", "diamond_cross", "dot",
- "dotbox", "double_arrow", "draft_large", "draft_small",
- "draped_box", "exchange", "fleur", "gobbler",
- "gumby", "hand1", "hand2", "heart",
-
- /* 64 */
- "icon", "iron_cross", "left_ptr", "left_side",
- "left_tee", "leftbutton", "ll_angle", "lr_angle",
- "man", "middlebutton", "mouse", "pencil",
- "pirate", "plus", "question_arrow", "right_ptr",
-
- /* 96 */
- "right_side", "right_tee", "rightbutton", "rtl_logo",
- "sailboat", "sb_down_arrow", "sb_h_double_arrow", "sb_left_arrow",
- "sb_right_arrow", "sb_up_arrow", "sb_v_double_arrow", "shuttle",
- "sizing", "spider", "spraycan", "star",
-
- /* 128 */
- "target", "tcross", "top_left_arrow", "top_left_corner",
- "top_right_corner", "top_side", "top_tee", "trek",
- "ul_angle", "umbrella", "ur_angle", "watch",
- "xterm",
-};
-
-#define NUM_STANDARD_NAMES (sizeof _XcursorStandardNames / sizeof _XcursorStandardNames[0])
-
-XcursorImage *
-XcursorShapeLoadImage (unsigned int shape, const char *theme, int size)
-{
- unsigned int id = shape >> 1;
-
- if (id < NUM_STANDARD_NAMES)
- return XcursorLibraryLoadImage (_XcursorStandardNames[id],
- theme, size);
- else
- return 0;
-}
-
-XcursorImages *
-XcursorShapeLoadImages (unsigned int shape, const char *theme, int size)
-{
- unsigned int id = shape >> 1;
-
- if (id < NUM_STANDARD_NAMES)
- return XcursorLibraryLoadImages (_XcursorStandardNames[id],
- theme, size);
- else
- return 0;
-}
-
-Cursor
-XcursorShapeLoadCursor (Display *dpy, unsigned int shape)
-{
- unsigned int id = shape >> 1;
-
- if (id < NUM_STANDARD_NAMES)
- return XcursorLibraryLoadCursor (dpy, _XcursorStandardNames[id]);
- else
- return 0;
-}
-
-XcursorCursors *
-XcursorShapeLoadCursors (Display *dpy, unsigned int shape)
-{
- unsigned int id = shape >> 1;
-
- if (id < NUM_STANDARD_NAMES)
- return XcursorLibraryLoadCursors (dpy, _XcursorStandardNames[id]);
- else
- return 0;
-}
-
-int
-XcursorLibraryShape (const char *library)
-{
- int low, high;
- int mid;
- int c;
-
- low = 0;
- high = NUM_STANDARD_NAMES - 1;
- while (low < high - 1)
- {
- mid = (low + high) >> 1;
- c = strcmp (library, _XcursorStandardNames[mid]);
- if (c == 0)
- return (mid << 1);
- if (c > 0)
- low = mid;
- else
- high = mid;
- }
- while (low <= high)
- {
- if (!strcmp (library, _XcursorStandardNames[low]))
- return (low << 1);
- low++;
- }
- return -1;
-}