summaryrefslogtreecommitdiff
path: root/src/evdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/evdev.c')
-rw-r--r--src/evdev.c52
1 files changed, 41 insertions, 11 deletions
diff --git a/src/evdev.c b/src/evdev.c
index ed92ff0..7dc8eb4 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -1000,6 +1000,7 @@ EvdevAddAbsClass(DeviceIntPtr device)
InputInfoPtr pInfo;
EvdevPtr pEvdev;
int num_axes, axis, i = 0;
+ Atom *atoms;
pInfo = device->public.devicePrivate;
pEvdev = pInfo->private;
@@ -1013,8 +1014,14 @@ EvdevAddAbsClass(DeviceIntPtr device)
pEvdev->num_vals = num_axes;
memset(pEvdev->vals, 0, num_axes * sizeof(int));
memset(pEvdev->old_vals, -1, num_axes * sizeof(int));
+ atoms = xalloc(pEvdev->num_vals * sizeof(Atom));
+
+ EvdevInitAxesLabels(pEvdev, pEvdev->num_vals, atoms);
if (!InitValuatorClassDeviceStruct(device, num_axes,
+#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
+ atoms,
+#endif
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 3
GetMotionHistory,
#endif
@@ -1026,7 +1033,7 @@ EvdevAddAbsClass(DeviceIntPtr device)
if (!TestBit(axis, pEvdev->abs_bitmask))
continue;
pEvdev->axis_map[axis] = i;
- xf86InitValuatorAxisStruct(device, i,
+ xf86InitValuatorAxisStruct(device, i, atoms[axis],
pEvdev->absinfo[axis].minimum,
pEvdev->absinfo[axis].maximum,
10000, 0, 10000);
@@ -1035,6 +1042,8 @@ EvdevAddAbsClass(DeviceIntPtr device)
i++;
}
+ xfree(atoms);
+
if (!InitPtrFeedbackClassDeviceStruct(device, EvdevPtrCtrlProc))
return !Success;
@@ -1063,6 +1072,7 @@ EvdevAddRelClass(DeviceIntPtr device)
InputInfoPtr pInfo;
EvdevPtr pEvdev;
int num_axes, axis, i = 0;
+ Atom *atoms;
pInfo = device->public.devicePrivate;
pEvdev = pInfo->private;
@@ -1085,8 +1095,26 @@ EvdevAddRelClass(DeviceIntPtr device)
pEvdev->num_vals = num_axes;
memset(pEvdev->vals, 0, num_axes * sizeof(int));
+ atoms = xalloc(pEvdev->num_vals * sizeof(Atom));
+
+ for (axis = REL_X; axis <= REL_MAX; axis++)
+ {
+ pEvdev->axis_map[axis] = -1;
+ /* We don't post wheel events, so ignore them here too */
+ if (axis == REL_WHEEL || axis == REL_HWHEEL || axis == REL_DIAL)
+ continue;
+ if (!TestBit(axis, pEvdev->rel_bitmask))
+ continue;
+ pEvdev->axis_map[axis] = i;
+ i++;
+ }
+
+ EvdevInitAxesLabels(pEvdev, pEvdev->num_vals, atoms);
if (!InitValuatorClassDeviceStruct(device, num_axes,
+#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
+ atoms,
+#endif
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 3
GetMotionHistory,
#endif
@@ -1095,19 +1123,16 @@ EvdevAddRelClass(DeviceIntPtr device)
for (axis = REL_X; axis <= REL_MAX; axis++)
{
+ int axnum = pEvdev->axis_map[axis];
- pEvdev->axis_map[axis] = -1;
- /* We don't post wheel events, so ignore them here too */
- if (axis == REL_WHEEL || axis == REL_HWHEEL || axis == REL_DIAL)
+ if (axnum == -1)
continue;
- if (!TestBit(axis, pEvdev->rel_bitmask))
- continue;
- pEvdev->axis_map[axis] = i;
- xf86InitValuatorAxisStruct(device, i, -1, -1, 1, 0, 1);
- xf86InitValuatorDefaults(device, i);
- i++;
+ xf86InitValuatorAxisStruct(device, axnum, atoms[axnum], -1, -1, 1, 0, 1);
+ xf86InitValuatorDefaults(device, axnum);
}
+ xfree(atoms);
+
if (!InitPtrFeedbackClassDeviceStruct(device, EvdevPtrCtrlProc))
return !Success;
@@ -1121,13 +1146,18 @@ EvdevAddButtonClass(DeviceIntPtr device)
{
InputInfoPtr pInfo;
EvdevPtr pEvdev;
+ Atom *labels;
pInfo = device->public.devicePrivate;
pEvdev = pInfo->private;
- if (!InitButtonClassDeviceStruct(device, pEvdev->num_buttons, pEvdev->btnmap))
+ labels = xalloc(pEvdev->num_buttons * sizeof(Atom));
+ EvdevInitButtonLabels(pEvdev, pEvdev->num_buttons, labels);
+
+ if (!InitButtonClassDeviceStruct(device, pEvdev->num_buttons, labels, pEvdev->btnmap))
return !Success;
+ xfree(labels);
return Success;
}