summaryrefslogtreecommitdiff
path: root/src/Cursor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Cursor.c')
-rw-r--r--src/Cursor.c217
1 files changed, 217 insertions, 0 deletions
diff --git a/src/Cursor.c b/src/Cursor.c
new file mode 100644
index 0000000..c3d1123
--- /dev/null
+++ b/src/Cursor.c
@@ -0,0 +1,217 @@
+/*
+ * $XFree86: xc/lib/Xfixes/Cursor.c,v 1.1 2002/11/30 06:21:44 keithp Exp $
+ *
+ * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+ *
+ * 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 "Xfixesint.h"
+
+void
+XFixesSelectCursorInput (Display *dpy,
+ Window win,
+ unsigned long eventMask)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesSelectCursorInputReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+
+ LockDisplay (dpy);
+ GetReq (XFixesSelectCursorInput, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesSelectCursorInput;
+ req->window = win;
+ req->eventMask = eventMask;
+ UnlockDisplay (dpy);
+ SyncHandle ();
+}
+
+XFixesCursorImage *
+XFixesGetCursorImage (Display *dpy)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesGetCursorImageAndNameReq *req;
+ xXFixesGetCursorImageAndNameReply rep;
+ int npixels;
+ int nbytes_name;
+ int nbytes, nread, rlength;
+ XFixesCursorImage *image;
+ char *name;
+
+ XFixesCheckExtension (dpy, info, 0);
+ LockDisplay (dpy);
+ GetReq (XFixesGetCursorImageAndName, req);
+ req->reqType = info->codes->major_opcode;
+ if (info->major_version >= 2)
+ req->xfixesReqType = X_XFixesGetCursorImageAndName;
+ else
+ req->xfixesReqType = X_XFixesGetCursorImage;
+ if (!_XReply (dpy, (xReply *) &rep, 0, xFalse))
+ {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return 0;
+ }
+ if (info->major_version < 2)
+ {
+ rep.cursorName = None;
+ rep.nbytes = 0;
+ }
+ npixels = rep.width * rep.height;
+ nbytes_name = rep.nbytes;
+ /* reply data length */
+ nbytes = (long) rep.length << 2;
+ /* bytes of actual data in the reply */
+ nread = (npixels << 2) + nbytes_name;
+ /* size of data returned to application */
+ rlength = (sizeof (XFixesCursorImage) +
+ npixels * sizeof (unsigned long) +
+ nbytes_name + 1);
+
+ image = (XFixesCursorImage *) Xmalloc (rlength);
+ if (!image)
+ {
+ _XEatData (dpy, nbytes);
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return 0;
+ }
+ image->x = rep.x;
+ image->y = rep.y;
+ image->width = rep.width;
+ image->height = rep.height;
+ image->xhot = rep.xhot;
+ image->yhot = rep.yhot;
+ image->cursor_serial = rep.cursorSerial;
+ image->pixels = (unsigned long *) (image + 1);
+ image->atom = rep.cursorName;
+ name = (char *) (image->pixels + npixels);
+ image->name = name;
+ _XRead32 (dpy, image->pixels, npixels << 2);
+ _XRead (dpy, name, nbytes_name);
+ name[nbytes_name] = '\0'; /* null-terminate */
+ /* skip any padding */
+ if(nbytes > nread)
+ {
+ _XEatData (dpy, (unsigned long) (nbytes - nread));
+ }
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return image;
+}
+
+void
+XFixesSetCursorName (Display *dpy, Cursor cursor, const char *name)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesSetCursorNameReq *req;
+ int nbytes = strlen (name);
+
+ XFixesSimpleCheckExtension (dpy, info);
+ if (info->major_version < 2)
+ return;
+ LockDisplay (dpy);
+ GetReq (XFixesSetCursorName, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesSetCursorName;
+ req->cursor = cursor;
+ req->nbytes = nbytes;
+ req->length += (nbytes + 3) >> 2;
+ Data (dpy, name, nbytes);
+ UnlockDisplay (dpy);
+ SyncHandle ();
+}
+
+const char *
+XFixesGetCursorName (Display *dpy, Cursor cursor, Atom *atom)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesGetCursorNameReq *req;
+ xXFixesGetCursorNameReply rep;
+ char *name;
+
+ XFixesCheckExtension (dpy, info, 0);
+ if (info->major_version < 2)
+ return 0;
+ LockDisplay (dpy);
+ GetReq (XFixesGetCursorName, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesGetCursorName;
+ req->cursor = cursor;
+ if (!_XReply (dpy, (xReply *) &rep, 0, xFalse))
+ {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return 0;
+ }
+ *atom = rep.atom;
+ if ((name = (char *) Xmalloc(rep.nbytes+1))) {
+ _XReadPad(dpy, name, (long)rep.nbytes);
+ name[rep.nbytes] = '\0';
+ } else {
+ _XEatData(dpy, (unsigned long) (rep.nbytes + 3) & ~3);
+ name = (char *) NULL;
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return(name);
+}
+
+void
+XFixesChangeCursor (Display *dpy, Cursor source, Cursor destination)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesChangeCursorReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ if (info->major_version < 2)
+ return;
+ LockDisplay (dpy);
+ GetReq (XFixesChangeCursor, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesChangeCursor;
+ req->source = source;
+ req->destination = destination;
+ UnlockDisplay(dpy);
+ SyncHandle();
+}
+
+void
+XFixesChangeCursorByName (Display *dpy, Cursor source, const char *name)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesChangeCursorByNameReq *req;
+ int nbytes = strlen (name);
+
+ XFixesSimpleCheckExtension (dpy, info);
+ if (info->major_version < 2)
+ return;
+ LockDisplay (dpy);
+ GetReq (XFixesChangeCursorByName, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesChangeCursorByName;
+ req->source = source;
+ req->nbytes = nbytes;
+ req->length += (nbytes + 3) >> 2;
+ Data (dpy, name, nbytes);
+ UnlockDisplay(dpy);
+ SyncHandle();
+}