1/* 2 * Copyright © 2024 Thomas E. Dickey 3 * Copyright © 2002 Keith Packard 4 * 5 * Permission to use, copy, modify, distribute, and sell this software and its 6 * documentation for any purpose is hereby granted without fee, provided that 7 * the above copyright notice appear in all copies and that both that 8 * copyright notice and this permission notice appear in supporting 9 * documentation, and that the name of Keith Packard not be used in 10 * advertising or publicity pertaining to distribution of the software without 11 * specific, written prior permission. Keith Packard makes no 12 * representations about the suitability of this software for any purpose. It 13 * is provided "as is" without express or implied warranty. 14 * 15 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 17 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 18 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 19 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 20 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 21 * PERFORMANCE OF THIS SOFTWARE. 22 */ 23 24#ifndef _XCURSORINT_H_ 25#define _XCURSORINT_H_ 26 27#ifdef HAVE_CONFIG_H 28#include "config.h" 29#endif 30 31#include <X11/Xlib.h> 32#include <X11/cursorfont.h> 33#include <X11/extensions/Xrender.h> 34 35#ifdef HAVE_XFIXES 36#include <X11/extensions/Xfixes.h> 37#endif 38 39#include "Xcursor.h" 40 41#include <fcntl.h> 42#ifdef O_CLOEXEC 43#define FOPEN_CLOEXEC "e" 44#else 45#define FOPEN_CLOEXEC "" 46#endif 47 48typedef struct _XcursorFontInfo { 49 struct _XcursorFontInfo *next; 50 Font font; 51 XcursorBool is_cursor_font; 52} XcursorFontInfo; 53 54/* 55 * Track a few recently created bitmaps to see 56 * if they get used to create cursors. This 57 * is done by hooking into Xlib and watching 58 * for XCreatePixmap, XPutImage, XCreatePixmapCursor 59 * with appropriate arguments. When this happens 60 * Xcursor computes a hash value for the source image 61 * and tries to load a library cursor of that name. 62 */ 63 64/* large bitmaps are unlikely to be cursors */ 65#define MAX_BITMAP_CURSOR_SIZE 64 66/* don't need to remember very many; in fact, 2 is likely sufficient */ 67#define NUM_BITMAPS 8 68 69typedef struct _XcursorBitmapInfo { 70 Pixmap bitmap; 71 unsigned long sequence; 72 unsigned int width, height; 73 Bool has_image; 74 unsigned char hash[XCURSOR_BITMAP_HASH_SIZE]; 75} XcursorBitmapInfo; 76 77typedef enum _XcursorDither { 78 XcursorDitherThreshold, 79 XcursorDitherMedian, 80 XcursorDitherOrdered, 81 XcursorDitherDiffuse 82} XcursorDither; 83 84typedef struct _XcursorDisplayInfo { 85 struct _XcursorDisplayInfo *next; 86 Display *display; 87 XExtCodes *codes; 88 XcursorBool has_render_cursor; 89 XcursorBool has_anim_cursor; 90 XcursorBool resized_cursors; 91 XcursorBool theme_core; 92 int size; 93 XcursorFontInfo *fonts; 94 char *theme; 95 char *theme_from_config; 96 XcursorDither dither; 97 XcursorBitmapInfo bitmaps[NUM_BITMAPS]; 98} XcursorDisplayInfo; 99 100XcursorDisplayInfo * 101_XcursorGetDisplayInfo (Display *dpy); 102 103Cursor 104_XcursorCreateGlyphCursor(Display *dpy, 105 Font source_font, 106 Font mask_font, 107 unsigned int source_char, 108 unsigned int mask_char, 109 XColor _Xconst *foreground, 110 XColor _Xconst *background); 111 112Cursor 113_XcursorCreateFontCursor (Display *dpy, unsigned int shape); 114 115/* provide for XCURSOR_RESIZED */ 116XcursorImage * 117_XcursorFileLoadImage (FILE *file, int size, XcursorBool resize); 118 119XcursorImages * 120_XcursorXcFileLoadImages (XcursorFile *file, int size, XcursorBool resize); 121 122XcursorImages * 123_XcursorFileLoadImages (FILE *file, int size, XcursorBool resize); 124 125XcursorImages * 126_XcursorFilenameLoadImages (const char *file, int size, XcursorBool resize); 127 128XcursorImages * 129_XcursorShapeLoadImages (Display *dpy, unsigned int shape); 130 131#ifdef DEBUG_XCURSOR 132void _XcursorTrace(const char *fmt, ...) __attribute__((format(printf,1,2))); 133void *_XcursorReturnAddr(void *addr); 134int _XcursorReturnCode(int code); 135unsigned long _XcursorReturnLong(unsigned long code); 136unsigned _XcursorReturnUint(unsigned code); 137void _XcursorReturnVoid(void); 138#define T_CALLED(func) "called: { " #func 139#define T_OPTION(opts) "option: : " #opts 140#define T_RETURN(form) "return: } %" #form "\n" 141#define enterFunc(params) _XcursorTrace params 142#define traceOpts(params) _XcursorTrace params 143#define returnAddr(addr) return _XcursorReturnAddr(addr) 144#define returnCode(code) return _XcursorReturnCode(code) 145#define returnLong(code) return _XcursorReturnLong(code) 146#define returnUint(code) return _XcursorReturnUint(code) 147#define returnVoid() do { _XcursorReturnVoid(); return; } while (0) 148#else 149#define enterFunc(params) /* nothing */ 150#define traceOpts(params) /* nothing */ 151#define returnAddr(addr) return (addr) 152#define returnCode(code) return (code) 153#define returnLong(code) return (code) 154#define returnUint(code) return (code) 155#define returnVoid() return 156#endif 157 158#define NonNull(p) ((p) != NULL ? (p) : "<null>") 159 160#endif /* _XCURSORINT_H_ */ 161