On Thu, Jun 25, 2015 at 08:06:29AM -0700, [email protected] wrote:
> From: Bill Spitzak <[email protected]>
> 
> (changes from previous version: rounds the guess and changes 0 to 1,
> removed unused variables)
> 
> Instead a default resolution is set if the device does not claim one.
> The selected value is a guess that the trackpad is 67 mm tall and
> that the device units are square.
> 
> This estimate was arrived at by equating the results calculated when
> fake_resolution is on or off and computing the ratio of units to
> resolution and choosing the most popular value (yres = height / 66.666).
> 
> Also fixes an apparent bug in computing motion_dist.scale_coeff, I
> believe the fake value was the reciprocal of the intended value.
> 
> Unfortunately this patch has not been tested as I lack the ability to do so.
> It is unclear to me if the absinfo_x/y->maximum/minimum fields have been
> filled in before evdev_fix_abs_resolution is called, this patch
> assumes that.
> ---
>  src/evdev-mt-touchpad-buttons.c | 59 
> +++++++++--------------------------------
>  src/evdev-mt-touchpad.c         | 32 +++++-----------------
>  src/evdev.c                     | 16 ++++++++---
>  3 files changed, 31 insertions(+), 76 deletions(-)
> 

[...]

> diff --git a/src/evdev.c b/src/evdev.c
> index cfcdc34..0bd19a4 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -1748,16 +1748,20 @@ evdev_configure_mt_device(struct evdev_device *device)
>       int num_slots;
>       int active_slot;
>       int slot;
> +     int guessed_resolution;
>  
>       if (!libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_X) ||
>           !libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_Y))
>                return 0;
>  
> +     guessed_resolution =
> +         (device->abs.absinfo_y->maximum - device->abs.absinfo_y->minimum + 
> 1 + 33) / 67;
> +     if (guessed_resolution < 1) guessed_resolution = 1;
>       if (evdev_fix_abs_resolution(device,
>                                    ABS_MT_POSITION_X,
>                                    ABS_MT_POSITION_Y,
> -                                  EVDEV_FAKE_RESOLUTION,
> -                                  EVDEV_FAKE_RESOLUTION))
> +                                  guessed_resolution,
> +                                  guessed_resolution))
>               device->abs.fake_resolution = 1;
>  
>       device->abs.absinfo_x = libevdev_get_abs_info(evdev, ABS_MT_POSITION_X);


sigh. I understand that you may not have a device to trigger certain
conditions but that's exactly why we have a test suite. you didn't even run
that, otherwise you'd have noticed this segfaults immediately on every
touchpad - you're using absinfo 5 lines before it is assigned.

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

Reply via email to