summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-11-13 11:39:54 +1030
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-11-13 11:39:54 +1030
commit16dc064bf997dfa9226a574e5989d8cd1209a5b0 (patch)
tree2b35270711ae1ddff7957f90cb2ff4a1a6f2a42e
parent0e6331a2c8494cd24d75ab80443f9f071be47334 (diff)
Add XDeviceClassesChangedEvent parsing.
Some stuff from XListInputDevices moved into separate functions to be re-used in the event parsing.
-rw-r--r--src/XExtInt.c36
-rw-r--r--src/XListDev.c173
2 files changed, 131 insertions, 78 deletions
diff --git a/src/XExtInt.c b/src/XExtInt.c
index 64ae923..0e16baa 100644
--- a/src/XExtInt.c
+++ b/src/XExtInt.c
@@ -761,6 +761,40 @@ XInputWireToEvent(dpy, re, event)
*re = *save;
return ENQUEUE_EVENT;
}
+ case XI_DeviceClassesChangedNotify:
+ {
+ XDeviceClassesChangedEvent* dcc_event =
+ (XDeviceClassesChangedEvent*)save;
+ deviceClassesChangedEvent* dcc_wire =
+ (deviceClassesChangedEvent*)event;
+ int size;
+ XAnyClassPtr Any;
+ xAnyClassPtr any;
+
+ dcc_event->extension = dcc_wire->extension;
+ dcc_event->evtype = dcc_wire->evtype;
+ dcc_event->time = dcc_wire->time;
+ dcc_event->deviceid = dcc_wire->deviceid;
+ dcc_event->slaveid = dcc_wire->new_slave;
+ dcc_event->num_classes = dcc_wire->num_classes;
+
+ any = (xAnyClassPtr)&dcc_wire[1];
+ size = SizeClassInfo(&any, dcc_wire->num_classes);
+
+ dcc_event->inputclassinfo = Xmalloc(size);
+ if (!dcc_event)
+ {
+ printf("Allocation error.\n");
+ return DONT_ENQUEUE;
+ }
+
+ any = (xAnyClassPtr)&dcc_wire[1];
+ Any = (XAnyClassPtr)dcc_event->inputclassinfo;
+ ParseClassInfo(&any, &Any, dcc_wire->num_classes);
+
+ *re = *save;
+ return ENQUEUE_EVENT;
+ }
case XI_RawDeviceEvent:
{
XRawDeviceEvent* raw_event =
@@ -780,7 +814,7 @@ XInputWireToEvent(dpy, re, event)
int i;
CARD32* valptr;
raw_event->valuators =
- (char*)calloc((raw_event->num_valuators), sizeof(int));
+ calloc((raw_event->num_valuators), sizeof(int));
valptr = &raw_wire->valuator0;
for (i = 0; i < raw_event->num_valuators; i++,
valptr++)
diff --git a/src/XListDev.c b/src/XListDev.c
index 347e990..99cc033 100644
--- a/src/XListDev.c
+++ b/src/XListDev.c
@@ -63,6 +63,97 @@ SOFTWARE.
#include <X11/extensions/extutil.h>
#include "XIint.h"
+int
+SizeClassInfo(xAnyClassPtr *any, int num_classes)
+{
+ int size = 0;
+ int j;
+ for (j = 0; j < 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);
+ }
+
+ return size;
+}
+
+void
+ParseClassInfo(xAnyClassPtr *any, XAnyClassPtr *Any, int num_classes)
+{
+ int j, k;
+
+ for (j = 0; j < 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;
+ break;
+ }
+ case ButtonClass:
+ {
+ XButtonInfoPtr B = (XButtonInfoPtr) *Any;
+ xButtonInfoPtr b = (xButtonInfoPtr) *any;
+
+ B->class = ButtonClass;
+ B->length = sizeof(XButtonInfo);
+ B->num_buttons = b->num_buttons;
+ 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 * sizeof(XAxisInfo));
+ V->num_axes = v->num_axes;
+ V->motion_buffer = v->motion_buffer_size;
+ V->mode = v->mode;
+ A = (XAxisInfoPtr) ((char *)V + sizeof(XValuatorInfo));
+ V->axes = A;
+ a = (xAxisInfoPtr) ((char *)(*any) + sizeof(xValuatorInfo));
+ for (k = 0; k < (int)v->num_axes; k++, a++, A++) {
+ A->min_value = a->min_value;
+ A->max_value = a->max_value;
+ A->resolution = a->resolution;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ *any = (xAnyClassPtr) ((char *)(*any) + (*any)->length);
+ *Any = (XAnyClassPtr) ((char *)(*Any) + (*Any)->length);
+ }
+}
+
XDeviceInfo *
XListInputDevices(dpy, ndevices)
register Display *dpy;
@@ -77,8 +168,8 @@ XListInputDevices(dpy, ndevices)
xAnyClassPtr any, sav_any;
XAnyClassPtr Any;
char *nptr, *Nptr;
- register int i, j, k;
- register long rlen;
+ int i;
+ long rlen;
XExtDisplayInfo *info = XInput_find_display(dpy);
LockDisplay(dpy);
@@ -111,28 +202,7 @@ XListInputDevices(dpy, ndevices)
any = (xAnyClassPtr) ((char *)list + (*ndevices * sizeof(xDeviceInfo)));
sav_any = any;
for (i = 0; i < *ndevices; i++, list++) {
- for (j = 0; j < (int)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);
- }
+ size += SizeClassInfo(&any, (int)list->num_classes);
/* Thanks to Xlibs braindead abstraction of XListInputDevices we
* have to fake up a new class to indicate attachment, otherwise
* we need to break the ABI. Each device has such a class.
@@ -163,59 +233,8 @@ XListInputDevices(dpy, ndevices)
clist->use = list->use;
clist->num_classes = list->num_classes + 1; /*fake attach class */
clist->inputclassinfo = Any;
- for (j = 0; j < (int)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;
- break;
- }
- case ButtonClass:
- {
- XButtonInfoPtr B = (XButtonInfoPtr) Any;
- xButtonInfoPtr b = (xButtonInfoPtr) any;
-
- B->class = ButtonClass;
- B->length = sizeof(XButtonInfo);
- B->num_buttons = b->num_buttons;
- 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 * sizeof(XAxisInfo));
- V->num_axes = v->num_axes;
- V->motion_buffer = v->motion_buffer_size;
- V->mode = v->mode;
- A = (XAxisInfoPtr) ((char *)V + sizeof(XValuatorInfo));
- V->axes = A;
- a = (xAxisInfoPtr) ((char *)any + sizeof(xValuatorInfo));
- for (k = 0; k < (int)v->num_axes; k++, a++, A++) {
- A->min_value = a->min_value;
- A->max_value = a->max_value;
- A->resolution = a->resolution;
- }
- break;
- }
- default:
- break;
- }
- any = (xAnyClassPtr) ((char *)any + any->length);
- Any = (XAnyClassPtr) ((char *)Any + Any->length);
- }
+
+ ParseClassInfo(&any, &Any, (int)list->num_classes);
/* Insert fake AttachInfo class */
{