+ dev = calloc(1, sizeof(*dev));
+ if (dev == NULL)
+ goto skip;
+
+ /* check for abs too */
+ if (support & (1 << EV_ABS)) {
+ struct input_absinfo ainfo;
+ int dist;
+ ret = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits);
+ if (ret == -1)
+ goto no_abs;
+ if (absbits[0] & (1 << ABS_X)) {
+ ret = ioctl(fd, EVIOCGABS(ABS_X), &ainfo);
+ if (ret == -1)
+ goto no_abs;
+ dist = ainfo.maximum - ainfo.minimum;
+ dev->abs_lzone = ainfo.minimum + dist / 4;
+ dev->abs_rzone = ainfo.maximum - dist / 4;
+ }
+ if (absbits[0] & (1 << ABS_Y)) {
+ ret = ioctl(fd, EVIOCGABS(ABS_Y), &ainfo);
+ if (ret == -1)
+ goto no_abs;
+ dist = ainfo.maximum - ainfo.minimum;
+ dev->abs_tzone = ainfo.minimum + dist / 4;
+ dev->abs_bzone = ainfo.maximum - dist / 4;
+ }
+ }
+
+no_abs:
+ dev->fd = fd;