On Tue, 18 Sep 2012 16:44:57 +0100
Rob Bradford <[email protected]> wrote:

> From: Rob Bradford <[email protected]>
> 
> This quirk is designed for hardware that has the X and Y axes swapped for
> absolute events.
> ---
>  src/evdev.c | 68 
> ++++++++++++++++++++++++++++++++++++++++++++-----------------
>  src/evdev.h |  6 ++++++
>  2 files changed, 55 insertions(+), 19 deletions(-)
> 
> diff --git a/src/evdev.c b/src/evdev.c
> index 8848736..3f9d635 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -129,21 +129,41 @@ evdev_process_absolute_motion(struct evdev_device 
> *device,
>       const int screen_width = device->output->current->width;
>       const int screen_height = device->output->current->height;
>  
> -     switch (e->code) {
> -     case ABS_X:
> -             device->abs.x =
> -                     (e->value - device->abs.min_x) * screen_width /
> -                     (device->abs.max_x - device->abs.min_x) +
> -                     device->output->x;
> -             device->pending_events |= EVDEV_ABSOLUTE_MOTION;
> -             break;
> -     case ABS_Y:
> -             device->abs.y =
> -                     (e->value - device->abs.min_y) * screen_height /
> -                     (device->abs.max_y - device->abs.min_y) +
> -                     device->output->y;
> -             device->pending_events |= EVDEV_ABSOLUTE_MOTION;
> -             break;
> +     if (device->quirks & EVDEV_QUIRK_SWAP_AXES) {
> +             switch (e->code) {
> +             case ABS_X:
> +                     device->abs.y =
> +                             (e->value - device->abs.min_y) * screen_height /
> +                             (device->abs.max_y - device->abs.min_y) +
> +                             device->output->y;
> +                     device->pending_events |= EVDEV_ABSOLUTE_MOTION;
> +                     break;
> +             case ABS_Y:
> +                     device->abs.x =
> +                             (e->value - device->abs.min_x) * screen_width /
> +                             (device->abs.max_x - device->abs.min_x) +
> +                             device->output->x;
> +                     device->pending_events |= EVDEV_ABSOLUTE_MOTION;
> +                     break;
> +             }
> +
> +     } else {
> +             switch (e->code) {
> +             case ABS_X:
> +                     device->abs.x =
> +                             (e->value - device->abs.min_x) * screen_width /
> +                             (device->abs.max_x - device->abs.min_x) +
> +                             device->output->x;
> +                     device->pending_events |= EVDEV_ABSOLUTE_MOTION;
> +                     break;
> +             case ABS_Y:
> +                     device->abs.y =
> +                             (e->value - device->abs.min_y) * screen_height /
> +                             (device->abs.max_y - device->abs.min_y) +
> +                             device->output->y;
> +                     device->pending_events |= EVDEV_ABSOLUTE_MOTION;
> +                     break;
> +             }
>       }
>  }
>  
> @@ -395,12 +415,22 @@ evdev_configure_device(struct evdev_device *device)
>               if (TEST_BIT(abs_bits, ABS_MT_SLOT)) {
>                       ioctl(device->fd, EVIOCGABS(ABS_MT_POSITION_X),
>                             &absinfo);
> -                     device->abs.min_x = absinfo.minimum;
> -                     device->abs.max_x = absinfo.maximum;
> +                     if (device->quirks & EVDEV_QUIRK_SWAP_AXES) {
> +                             device->abs.min_y = absinfo.minimum;
> +                             device->abs.max_y = absinfo.maximum;
> +                     } else {
> +                             device->abs.min_x = absinfo.minimum;
> +                             device->abs.max_x = absinfo.maximum;
> +                     }
>                       ioctl(device->fd, EVIOCGABS(ABS_MT_POSITION_Y),
>                             &absinfo);
> -                     device->abs.min_y = absinfo.minimum;
> -                     device->abs.max_y = absinfo.maximum;
> +                     if (device->quirks & EVDEV_QUIRK_SWAP_AXES) {
> +                             device->abs.min_x = absinfo.minimum;
> +                             device->abs.max_x = absinfo.maximum;
> +                     } else {
> +                             device->abs.min_y = absinfo.minimum;
> +                             device->abs.max_y = absinfo.maximum;
> +                     }
>                       device->is_mt = 1;
>                       device->mt.slot = 0;
>                       device->caps |= EVDEV_TOUCH;

Hi Rob,

this seems to have quite much of code duplication. Would it not be any
easier to do the swap only at notify_*() calling time instead?
Or do you really need to limit it to these very specific evdev events?


Thanks,
pq
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to