summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/X11/extensions/XInput2.h44
-rw-r--r--src/XIQueryDevice.c13
2 files changed, 34 insertions, 23 deletions
diff --git a/include/X11/extensions/XInput2.h b/include/X11/extensions/XInput2.h
index 7fd81c5..43abdb3 100644
--- a/include/X11/extensions/XInput2.h
+++ b/include/X11/extensions/XInput2.h
@@ -70,6 +70,27 @@ typedef union {
typedef struct
{
+ int base;
+ int latched;
+ int locked;
+} XIModifierState;
+
+typedef XIModifierState XIGroupState;
+
+typedef struct {
+ int mask_len;
+ unsigned char *mask;
+} XIButtonState;
+
+typedef struct {
+ int mask_len;
+ unsigned char *mask;
+ double *values;
+} XIValuatorState;
+
+
+typedef struct
+{
int deviceid;
int mask_len;
unsigned char* mask;
@@ -86,7 +107,8 @@ typedef struct
int type;
int sourceid;
int num_buttons;
- Atom *buttons;
+ Atom *names;
+ XIButtonState state;
} XIButtonClassInfo;
typedef struct
@@ -186,26 +208,6 @@ typedef struct {
XIAnyClassInfo **classes; /* same as in XIDeviceInfo */
} XIDeviceChangedEvent;
-typedef struct
-{
- int base;
- int latched;
- int locked;
-} XIModifierState;
-
-typedef XIModifierState XIGroupState;
-
-typedef struct {
- int mask_len;
- unsigned char *mask;
-} XIButtonState;
-
-typedef struct {
- int mask_len;
- unsigned char *mask;
- double *values;
-} XIValuatorState;
-
typedef struct {
int type; /* GenericEvent */
unsigned long serial; /* # of last request processed by server */
diff --git a/src/XIQueryDevice.c b/src/XIQueryDevice.c
index d8de8a6..d8df2d1 100644
--- a/src/XIQueryDevice.c
+++ b/src/XIQueryDevice.c
@@ -57,6 +57,7 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
case XIButtonClass:
l = sizeof(XIButtonClassInfo);
l += ((xXIButtonInfo*)any_wire)->num_buttons * sizeof(Atom);
+ l += ((((((xXIButtonInfo*)any_wire)->num_buttons + 7)/8) + 3)/4) * 4;
break;
case XIKeyClass:
l = sizeof(XIKeyClassInfo);
@@ -93,17 +94,25 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
{
XIButtonClassInfo *cls_lib;
xXIButtonInfo *cls_wire;
+ uint32_t *atoms;
+ int j;
cls_lib = (XIButtonClassInfo*)any_lib;
cls_wire = (xXIButtonInfo*)any_wire;
cls_lib->num_buttons = cls_wire->num_buttons;
- cls_lib->buttons = (Atom*)&cls_lib[1];
- memcpy(cls_lib->buttons, &cls_wire[1],
+ cls_lib->state.mask_len = ((((cls_wire->num_buttons + 7)/8) + 3)/4) * 4;
+ cls_lib->state.mask = (unsigned char*)&cls_lib[1];
+ memcpy(cls_lib->state.mask, &cls_wire[1],
+ cls_lib->state.mask_len);
+
+ cls_lib->names = (Atom*)((char*)&cls_lib[1] + cls_lib->state.mask_len);
+ memcpy(cls_lib->names, &cls_wire[1],
cls_lib->num_buttons);
ptr_lib += sizeof(XIButtonClassInfo);
ptr_lib += cls_lib->num_buttons * sizeof(Atom);
+ ptr_lib += cls_lib->state.mask_len;
break;
}
case XIKeyClass: