diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-11-13 11:39:54 +1030 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-11-13 11:39:54 +1030 |
commit | 16dc064bf997dfa9226a574e5989d8cd1209a5b0 (patch) | |
tree | 2b35270711ae1ddff7957f90cb2ff4a1a6f2a42e | |
parent | 0e6331a2c8494cd24d75ab80443f9f071be47334 (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.c | 36 | ||||
-rw-r--r-- | src/XListDev.c | 173 |
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 */ { |