Hi, attached is a patch that implements driver_get_axis_info() for the linux-input driver. If we can reach consensus that this is a good thing to do, then I'd like to push this change to the git repository.
Sven
>From 970ebffa842e598257945e922a544406a80431dd Mon Sep 17 00:00:00 2001 From: Sven Neumann <s.neum...@raumfeld.com> Date: Thu, 7 May 2009 11:34:52 +0200 Subject: [PATCH] input: Implement driver_get_axis_info() in the linux-input driver --- inputdrivers/linux_input/linux_input.c | 47 +++++++++++++++++++++++++++++++- 1 files changed, 46 insertions(+), 1 deletions(-) diff --git a/inputdrivers/linux_input/linux_input.c b/inputdrivers/linux_input/linux_input.c index 1e9d761..7415cfb 100644 --- a/inputdrivers/linux_input/linux_input.c +++ b/inputdrivers/linux_input/linux_input.c @@ -85,6 +85,7 @@ typedef unsigned long kernel_ulong_t; #include <sys/kd.h> #include <stdlib.h> +#define DFB_INPUTDRIVER_HAS_AXIS_INFO #include <directfb.h> #include <directfb_keyboard.h> @@ -1217,7 +1218,7 @@ driver_open_device( CoreInputDevice *device, ret = ioctl( fd, EVIOCGRAB, 1 ); /* 2.4 kernels don't have EVIOCGRAB so ignore EINVAL */ if (ret && errno != EINVAL) { - D_PERROR( "Direc tFB/linux_input: could not grab device" ); + D_PERROR( "DirectFB/linux_input: could not grab device" ); close( fd ); return DFB_INIT; } @@ -1278,6 +1279,50 @@ driver_open_device( CoreInputDevice *device, return DFB_OK; } +/* + * Obtain information about an axis (only absolute axis so far). + */ +static DFBResult +driver_get_axis_info( CoreInputDevice *device, + void *driver_data, + DFBInputDeviceAxisIdentifier axis, + DFBInputDeviceAxisInfo *ret_info ) +{ + LinuxInputData *data = (LinuxInputData*) driver_data; + + if (data->touchpad) { + /* for the touchpad, events are normalized to 0..511 */ + switch (axis) { + case DIAI_X: + case DIAI_Y: + ret_info->flags |= DIAIF_ABS_MIN | DIAIF_ABS_MAX; + ret_info->abs_min = 0; + ret_info->abs_max = (1 << 9) - 1; + break; + default: + break; + } + } else { + if (axis <= ABS_PRESSURE && axis < DIAI_LAST) { + unsigned long absbit[NBITS(ABS_CNT)]; + + /* check if we have an absolute axes */ + ioctl( data->fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit ); + + if (test_bit (axis, absbit)) { + struct input_absinfo absinfo; + + ioctl( data->fd, EVIOCGABS(axis), &absinfo ); + + ret_info->flags |= DIAIF_ABS_MIN | DIAIF_ABS_MAX; + ret_info->abs_min = absinfo.minimum; + ret_info->abs_max = absinfo.maximum; + } + } + } + + return DFB_OK; +} /* * Fetch one entry from the kernel keymap. -- 1.5.6.3
_______________________________________________ directfb-dev mailing list directfb-dev@directfb.org http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev