summaryrefslogtreecommitdiff
path: root/src/evdev.c
diff options
context:
space:
mode:
authorMatt Helsley <matt.helsley@gmail.com>2009-01-11 18:36:59 -0800
committerPeter Hutterer <peter.hutterer@who-t.net>2009-01-12 13:17:40 +1000
commit4dfd86b2201b2b19761a1abb3c580cecf0060224 (patch)
tree17caf2b7a3a716aa58dcda6a66157507aa6c5345 /src/evdev.c
parentd3fd42d8644310abcae23bbf534f8c445296bcb7 (diff)
Fix FOO_MAX off-by-one
In linux/input.h each section's (e.g. ABS) FOO_MAX is the maximum FOO value. Recent kernels define FOO_CNT as the maximum number of FOO there will ever be. Hence using FOO_MAX to size the bit vectors representing the capabilities of an evdev device is off by one. Define FOO_CNT values for use with Linux kernels which lack them. Use FOO_CNT whenever we need to know the number of bits needed -- usually to calculate the number of longs needed. When iterating over the values FOO_MAX still seems appropriate however the loop test should include FOO_MAX rather than skip it. Signed-off-by: Matt Helsley <matt.helsley@gmail.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'src/evdev.c')
-rw-r--r--src/evdev.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/evdev.c b/src/evdev.c
index 38f9c08..b1e5c9a 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -236,14 +236,14 @@ static void
PostKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value)
{
int code = ev->code + MIN_KEYCODE;
- static char warned[KEY_MAX];
+ static char warned[KEY_CNT];
/* Filter all repeated events from device.
We'll do softrepeat in the server */
if (value == 2)
return;
- if (code > 255 && ev->code < KEY_MAX) {
+ if (code > 255 && ev->code <= KEY_MAX) {
if (!warned[ev->code])
xf86Msg(X_WARNING, "%s: unable to handle keycode %d\n",
pInfo->name, ev->code);
@@ -1223,12 +1223,12 @@ EvdevCacheCompare(InputInfoPtr pInfo, BOOL compare)
int i;
char name[1024] = {0};
- long bitmask[NLONGS(EV_MAX)] = {0};
- long key_bitmask[NLONGS(KEY_MAX)] = {0};
- long rel_bitmask[NLONGS(REL_MAX)] = {0};
- long abs_bitmask[NLONGS(ABS_MAX)] = {0};
- long led_bitmask[NLONGS(LED_MAX)] = {0};
- struct input_absinfo absinfo[ABS_MAX];
+ long bitmask[NLONGS(EV_CNT)] = {0};
+ long key_bitmask[NLONGS(KEY_CNT)] = {0};
+ long rel_bitmask[NLONGS(REL_CNT)] = {0};
+ long abs_bitmask[NLONGS(ABS_CNT)] = {0};
+ long led_bitmask[NLONGS(LED_CNT)] = {0};
+ struct input_absinfo absinfo[ABS_CNT];
if (ioctl(pInfo->fd,
EVIOCGNAME(sizeof(name) - 1), name) < 0) {
@@ -1287,7 +1287,7 @@ EvdevCacheCompare(InputInfoPtr pInfo, BOOL compare)
memset(absinfo, 0, sizeof(absinfo));
- for (i = 0; i < ABS_MAX; i++)
+ for (i = ABS_X; i <= ABS_MAX; i++)
{
if (TestBit(i, abs_bitmask))
{
@@ -1323,9 +1323,9 @@ error:
static int
EvdevProbe(InputInfoPtr pInfo)
{
- long key_bitmask[NLONGS(KEY_MAX)] = {0};
- long rel_bitmask[NLONGS(REL_MAX)] = {0};
- long abs_bitmask[NLONGS(ABS_MAX)] = {0};
+ long key_bitmask[NLONGS(KEY_CNT)] = {0};
+ long rel_bitmask[NLONGS(REL_CNT)] = {0};
+ long abs_bitmask[NLONGS(ABS_CNT)] = {0};
int i, has_axes, has_keys, num_buttons, has_scroll;
int kernel24 = 0;
EvdevPtr pEvdev = pInfo->private;