summaryrefslogtreecommitdiff
path: root/xc/lib
diff options
context:
space:
mode:
authorgms <empty>1989-10-12 17:04:07 +0000
committergms <empty>1989-10-12 17:04:07 +0000
commit21f2eae9ef20f688b6ea6ed7cac6ee2f83f9a9c8 (patch)
tree587af7ca94eb2b241e2180398c7c4de09c0e4f52 /xc/lib
parentbe77d32ca1e72fd16ac9fd6aea1717f05e6c0101 (diff)
original version from George
Diffstat (limited to 'xc/lib')
-rw-r--r--xc/lib/Xi/XListDev.c202
1 files changed, 202 insertions, 0 deletions
diff --git a/xc/lib/Xi/XListDev.c b/xc/lib/Xi/XListDev.c
new file mode 100644
index 000000000..52a879980
--- /dev/null
+++ b/xc/lib/Xi/XListDev.c
@@ -0,0 +1,202 @@
+/* $XConsortium: XListDev.c,v 1.5 89/10/12 17:04:07 gms Exp $ */
+
+/************************************************************
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, California, and the
+Massachusetts Institute of Technology, Cambridge, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+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 names of Hewlett-Packard or MIT not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+HEWLETT-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.
+
+********************************************************/
+
+/***********************************************************************
+ *
+ * XListInputDevices - Request the server to return a list of
+ * available input devices.
+ *
+ */
+
+#define NEED_REPLIES
+#define NEED_EVENTS
+#include "Xproto.h"
+#include "Xlibint.h"
+#include "XIproto.h"
+#include "XI.h"
+#include "XInput.h"
+
+extern int IReqCode;
+
+XDeviceInfo
+*XListInputDevices(dpy, ndevices)
+ register Display *dpy;
+ int *ndevices;
+ {
+ int size;
+ xListInputDevicesReq *req;
+ xListInputDevicesReply rep;
+ xDeviceInfo *list, *slist;
+ XDeviceInfo *sclist;
+ XDeviceInfo *clist = NULL;
+ xAnyClassPtr any, sav_any;
+ XAnyClassPtr Any;
+ char *nptr, *Nptr;
+ register int i,j,k,namelen;
+ register long rlen;
+
+ LockDisplay (dpy);
+ if (CheckExtInit(dpy, XInput_Initial_Release) == -1)
+ return ((XDeviceInfo *) NoSuchExtension);
+
+ GetReq(ListInputDevices,req);
+ req->reqType = IReqCode;
+ req->ReqType = X_ListInputDevices;
+
+ (void) _XReply (dpy, (xReply *) &rep, 0, xFalse);
+
+ if (*ndevices = rep.ndevices) /* at least 1 input device */
+ {
+ size = *ndevices * sizeof (XDeviceInfo);
+ rlen = rep.length << 2; /* multiply length by 4 */
+ list = (xDeviceInfo *) Xmalloc (rlen);
+ slist = list;
+ _XRead (dpy, list, rlen);
+
+ any = (xAnyClassPtr) ((char *) list +
+ (*ndevices * sizeof(xDeviceInfo)));
+ sav_any = any;
+ for (i=0; i<*ndevices; i++, list++)
+ {
+ for (j=0; j<list->num_classes; j++)
+ {
+ switch (any->class)
+ {
+ case KeyClass:
+ size += sizeof (XKeyInfo);
+ break;
+ case ButtonClass:
+ size += sizeof (XButtonInfo);
+ break;
+ case ValuatorClass:
+ {
+ xValuatorInfoPtr v;
+ v = (xValuatorInfoPtr) any;
+ size += sizeof (XValuatorInfo) +
+ (v->num_axes * sizeof (XAxisInfo));
+ break;
+ }
+ default:
+ break;
+ }
+ any = (xAnyClassPtr) ((char *) any + any->length);
+ }
+ }
+
+ for (i=0, nptr = (char *) any; i<*ndevices; i++)
+ {
+ size += *nptr +1;
+ nptr += (*nptr + 1);
+ }
+
+ clist = (XDeviceInfoPtr) Xmalloc (size);
+ sclist = clist;
+ Any = (XAnyClassPtr) ((char *) clist +
+ (*ndevices * sizeof (XDeviceInfo)));
+ list = slist;
+ any = sav_any;
+ for (i=0; i<*ndevices; i++, list++, clist++)
+ {
+ clist->type = list->type;
+ clist->id = list->id;
+ clist->use = list->use;
+ clist->num_classes = list->num_classes;
+ clist->inputclassinfo = Any;
+ for (j=0; j<list->num_classes; j++)
+ {
+ switch (any->class)
+ {
+ case KeyClass:
+ {
+ XKeyInfoPtr K = (XKeyInfoPtr) Any;
+ xKeyInfoPtr k = (xKeyInfoPtr) any;
+ K->class = KeyClass;
+ K->length = sizeof (XKeyInfo);
+ K->min_keycode = k->min_keycode;
+ K->max_keycode = k->max_keycode;
+ K->num_keys = k->num_keys;
+ Any = (XAnyClassPtr) ((char *) Any + Any->length);
+ break;
+ }
+ case ButtonClass:
+ {
+ XButtonInfoPtr B = (XButtonInfoPtr) Any;
+ xButtonInfoPtr b = (xButtonInfoPtr) any;
+ B->class = ButtonClass;
+ B->length = sizeof (XButtonInfo);
+ B->num_buttons = b->num_buttons;
+ Any = (XAnyClassPtr) ((char *) Any + Any->length);
+ break;
+ }
+ case ValuatorClass:
+ {
+ XValuatorInfoPtr V = (XValuatorInfoPtr) Any;
+ xValuatorInfoPtr v = (xValuatorInfoPtr) any;
+ XAxisInfoPtr A;
+ xAxisInfoPtr a;
+
+ V->class = ValuatorClass;
+ V->length = sizeof (XValuatorInfo);
+ V->num_axes = v->num_axes;
+ V->motion_buffer = v->motion_buffer_size;
+ A = (XAxisInfoPtr) ((char *) Any + Any->length);
+ a = (xAxisInfoPtr) ((char *) any +
+ sizeof (xValuatorInfo));
+ for (k=0; k<v->num_axes; k++,a++,A++)
+ {
+ A->min_value = a->min_value;
+ A->max_value = a->max_value;
+ A->resolution = a->resolution;
+ }
+ Any = (XAnyClassPtr) ((char *) Any + Any->length +
+ (V->num_axes * sizeof (XAxisInfo)));
+ break;
+ }
+ default:
+ break;
+ }
+ any = (xAnyClassPtr) ((char *) any + any->length);
+ }
+ }
+
+ clist = sclist;
+ nptr = (char *) any;
+ Nptr = (char *) Any;
+ for (i=0; i<*ndevices; i++,clist++)
+ {
+ clist->name = (char *) Nptr;
+ bcopy ( nptr+1, Nptr, *nptr);
+ Nptr += (*nptr);
+ *Nptr++ = '\0';
+ nptr += (*nptr + 1);
+ }
+ }
+
+ XFree (slist);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return (sclist);
+ }