From 2f67509b53b27dd7f51ca2aadd19605aee613a61 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 16 Jan 2013 08:38:52 +1000 Subject: Split rel and abs axis mapping into two separate arrays This will enable a device to have relative scrolling axes in addition to absolute axes (required by the QEMU tablet). Signed-off-by: Peter Hutterer --- src/emuWheel.c | 2 +- src/evdev.c | 66 +++++++++++++++++++++++----------------------------------- src/evdev.h | 3 ++- 3 files changed, 29 insertions(+), 42 deletions(-) diff --git a/src/emuWheel.c b/src/emuWheel.c index db989c5..5774930 100644 --- a/src/emuWheel.c +++ b/src/emuWheel.c @@ -117,7 +117,7 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv) /* We don't want to intercept real mouse wheel events */ if(pEv->type == EV_ABS) { - int axis = pEvdev->axis_map[pEv->code]; + int axis = pEvdev->abs_axis_map[pEv->code]; oldValue = valuator_mask_get(pEvdev->vals, axis); valuator_mask_set(pEvdev->vals, axis, value); value -= oldValue; /* make value into a differential measurement */ diff --git a/src/evdev.c b/src/evdev.c index a9b1fd2..9741821 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -123,7 +123,7 @@ static int EvdevOpenDevice(InputInfoPtr pInfo); static void EvdevCloseDevice(InputInfoPtr pInfo); static void EvdevInitAxesLabels(EvdevPtr pEvdev, int mode, int natoms, Atom *atoms); -static void EvdevInitOneAxisLabel(EvdevPtr pEvdev, int axis, +static void EvdevInitOneAxisLabel(EvdevPtr pEvdev, int mapped_axis, const char **labels, int label_idx, Atom *atoms); static void EvdevInitButtonLabels(EvdevPtr pEvdev, int natoms, Atom *atoms); static void EvdevInitProperty(DeviceIntPtr dev); @@ -479,7 +479,7 @@ EvdevProcessValuators(InputInfoPtr pInfo) for (i = 0; i < REL_CNT; i++) { - int map = pEvdev->axis_map[i]; + int map = pEvdev->rel_axis_map[i]; if (pEvdev->delta[i] && map != -1) valuator_mask_set(pEvdev->vals, map, pEvdev->delta[i]); } @@ -701,7 +701,7 @@ EvdevProcessRelativeMotionEvent(InputInfoPtr pInfo, struct input_event *ev) pEvdev->rel_queued = 1; pEvdev->delta[ev->code] += value; - map = pEvdev->axis_map[ev->code]; + map = pEvdev->rel_axis_map[ev->code]; valuator_mask_set(pEvdev->vals, map, value); break; } @@ -787,7 +787,7 @@ EvdevProcessTouchEvent(InputInfoPtr pInfo, struct input_event *ev) } else pEvdev->slot_state = SLOTSTATE_CLOSE; } else { - map = pEvdev->axis_map[ev->code]; + map = pEvdev->abs_axis_map[ev->code]; valuator_mask_set(pEvdev->mt_mask, map, ev->value); if (slot_index >= 0) valuator_mask_set(pEvdev->last_mt_vals[slot_index], map, @@ -827,7 +827,7 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev) EvdevProcessTouchEvent(pInfo, ev); pEvdev->abs_queued = 1; } else if (!pEvdev->mt_mask) { - map = pEvdev->axis_map[ev->code]; + map = pEvdev->abs_axis_map[ev->code]; valuator_mask_set(pEvdev->vals, map, value); pEvdev->abs_queued = 1; } @@ -1330,7 +1330,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device) int j; #endif int mapping; - pEvdev->axis_map[axis] = -1; + pEvdev->abs_axis_map[axis] = -1; if (!EvdevBitIsSet(pEvdev->abs_bitmask, axis) || is_blacklisted_axis(axis)) continue; @@ -1347,7 +1347,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device) mapping = mt_axis_mappings[j].mapping; } #endif - pEvdev->axis_map[axis] = mapping; + pEvdev->abs_axis_map[axis] = mapping; if (mapping == i) i++; } @@ -1380,11 +1380,11 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device) for (i = 0; i < num_slots(pEvdev); i++) { for (axis = ABS_MT_TOUCH_MAJOR; axis < ABS_MAX; axis++) { - if (pEvdev->axis_map[axis] >= 0) { + if (pEvdev->abs_axis_map[axis] >= 0) { /* XXX: read initial values from mtdev when it adds support * for doing so. */ valuator_mask_set(pEvdev->last_mt_vals[i], - pEvdev->axis_map[axis], 0); + pEvdev->abs_axis_map[axis], 0); } } } @@ -1392,7 +1392,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device) #endif for (axis = ABS_X; axis < ABS_MT_SLOT; axis++) { - int axnum = pEvdev->axis_map[axis]; + int axnum = pEvdev->abs_axis_map[axis]; int resolution = 0; if (axnum == -1) @@ -1414,7 +1414,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device) #ifdef MULTITOUCH for (axis = ABS_MT_TOUCH_MAJOR; axis <= ABS_MAX; axis++) { - int axnum = pEvdev->axis_map[axis]; + int axnum = pEvdev->abs_axis_map[axis]; int resolution = 0; int j; BOOL skip = FALSE; @@ -1544,7 +1544,7 @@ EvdevAddRelValuatorClass(DeviceIntPtr device) for (axis = REL_X; i < MAX_VALUATORS && axis <= REL_MAX; axis++) { - pEvdev->axis_map[axis] = -1; + pEvdev->rel_axis_map[axis] = -1; #ifndef HAVE_SMOOTH_SCROLLING /* We don't post wheel events, so ignore them here too */ if (axis == REL_WHEEL || axis == REL_HWHEEL || axis == REL_DIAL) @@ -1552,7 +1552,7 @@ EvdevAddRelValuatorClass(DeviceIntPtr device) #endif if (!EvdevBitIsSet(pEvdev->rel_bitmask, axis)) continue; - pEvdev->axis_map[axis] = i; + pEvdev->rel_axis_map[axis] = i; i++; } @@ -1572,7 +1572,7 @@ EvdevAddRelValuatorClass(DeviceIntPtr device) for (axis = REL_X; axis <= REL_MAX; axis++) { - int axnum = pEvdev->axis_map[axis]; + int axnum = pEvdev->rel_axis_map[axis]; if (axnum == -1) continue; @@ -1739,17 +1739,12 @@ EvdevInitTouchDevice(DeviceIntPtr device, EvdevPtr pEvdev) static int EvdevInit(DeviceIntPtr device) { - int i; InputInfoPtr pInfo; EvdevPtr pEvdev; pInfo = device->public.devicePrivate; pEvdev = pInfo->private; - /* clear all axis_map entries */ - for(i = 0; i < max(ABS_CNT,REL_CNT); i++) - pEvdev->axis_map[i]=-1; - if (pEvdev->flags & EVDEV_KEYBOARD_EVENTS) EvdevAddKeyClass(device); if (pEvdev->flags & EVDEV_BUTTON_EVENTS) @@ -2480,8 +2475,10 @@ EvdevAlloc(void) pEvdev->cur_slot = -1; #endif - for (i = 0; i < ArrayLength(pEvdev->axis_map); i++) - pEvdev->axis_map[i] = -1; + for (i = 0; i < ArrayLength(pEvdev->rel_axis_map); i++) + pEvdev->rel_axis_map[i] = -1; + for (i = 0; i < ArrayLength(pEvdev->abs_axis_map); i++) + pEvdev->abs_axis_map[i] = -1; return pEvdev; } @@ -2626,43 +2623,32 @@ EvdevUtilButtonEventToButtonNumber(EvdevPtr pEvdev, int code) } } -static void EvdevInitOneAxisLabel(EvdevPtr pEvdev, int axis, +static void EvdevInitOneAxisLabel(EvdevPtr pEvdev, int mapped_axis, const char **labels, int label_idx, Atom *atoms) { Atom atom; - if (pEvdev->axis_map[axis] == -1) + if (mapped_axis == -1) return; atom = XIGetKnownProperty(labels[label_idx]); if (!atom) /* Should not happen */ return; - atoms[pEvdev->axis_map[axis]] = atom; + atoms[mapped_axis] = atom; } static void EvdevInitAxesLabels(EvdevPtr pEvdev, int mode, int natoms, Atom *atoms) { int axis; - const char **labels; - int labels_len = 0; - - if (mode == Absolute) - { - labels = abs_labels; - labels_len = ArrayLength(abs_labels); - } else if (mode == Relative) - { - labels = rel_labels; - labels_len = ArrayLength(rel_labels); - } else - return; memset(atoms, 0, natoms * sizeof(Atom)); - /* Now fill the ones we know */ - for (axis = 0; axis < labels_len; axis++) - EvdevInitOneAxisLabel(pEvdev, axis, labels, axis, atoms); + for (axis = 0; axis < ArrayLength(rel_labels); axis++) + EvdevInitOneAxisLabel(pEvdev, pEvdev->rel_axis_map[axis], rel_labels, axis, atoms); + + for (axis = 0; axis < ArrayLength(abs_labels); axis++) + EvdevInitOneAxisLabel(pEvdev, pEvdev->abs_axis_map[axis], abs_labels, axis, atoms); } static void EvdevInitButtonLabels(EvdevPtr pEvdev, int natoms, Atom *atoms) diff --git a/src/evdev.h b/src/evdev.h index 51b7fa0..63c3bfa 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -158,7 +158,8 @@ typedef struct { int num_vals; /* number of valuators */ int num_mt_vals; /* number of multitouch valuators */ - int axis_map[max(ABS_CNT, REL_CNT)]; /* Map evdev to index */ + int abs_axis_map[ABS_CNT]; /* Map evdev ABS_* to index */ + int rel_axis_map[REL_CNT]; /* Map evdev REL_* to index */ ValuatorMask *vals; /* new values coming in */ ValuatorMask *old_vals; /* old values for calculating relative motion */ ValuatorMask *prox; /* last values set while not in proximity */ -- cgit v1.2.3