On Mon, Nov 24, 2014 at 03:53:36PM -0600, Derek Foreman wrote:
> Instead of using a hard coded mouse DPI value, we query it from udev.
> If it's not present or the property is obviously broken we fall back
> to default.

for the archives: the thing we're struggling with on high-DPI mice is that
our pointer acceleration becomes rather useless. the DPI setting is
something we can't get from the device though, so our goal is to build a
udev database of "all" devices and go from there. once that is in place, we
expect the MOUSE_DPI property to be set and use that to calibrate our
pointer acceleration.

> Signed-off-by: Derek Foreman <der...@osg.samsung.com>
> ---
>  src/evdev.c         | 18 ++++++++++++++++++
>  src/libinput-util.c | 41 +++++++++++++++++++++++++++++++++++++++++
>  src/libinput-util.h |  2 ++
>  3 files changed, 61 insertions(+)
> 
> diff --git a/src/evdev.c b/src/evdev.c
> index 36c6859..a2547c7 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -1218,8 +1218,11 @@ evdev_need_mtdev(struct evdev_device *device)
>  static void
>  evdev_tag_device(struct evdev_device *device)
>  {
> +     struct libinput *libinput = device->base.seat->libinput;
> +     const char *mouse_dpi;
>       struct udev *udev;
>       struct udev_device *udev_device = NULL;
> +     int dpi;
>  
>       udev = udev_new();
>       if (!udev)
> @@ -1229,6 +1232,21 @@ evdev_tag_device(struct evdev_device *device)
>       if (udev_device) {
>               if (device->dispatch->interface->tag_device)
>                       device->dispatch->interface->tag_device(device, 
> udev_device);
> +             mouse_dpi = udev_device_get_property_value(udev_device, 
> "MOUSE_DPI");
> +             if (mouse_dpi) {
> +                     dpi = udev_parse_mouse_dpi_property(mouse_dpi);
> +                     if (dpi)
> +                             device->dpi = dpi;
> +                     else {
> +                             log_error(libinput, "Mouse DPI property for"
> +                                                 "  '%s' is present but "
> +                                                 "invalid, using %d DPI "
> +                                                 "instead\n",
> +                                                 device->devname,
> +                                                 DEFAULT_MOUSE_DPI);
> +                             device->dpi = DEFAULT_MOUSE_DPI;
> +                     }
> +             }
>               udev_device_unref(udev_device);
>       }
>       udev_unref(udev);
> diff --git a/src/libinput-util.c b/src/libinput-util.c
> index 34d5549..5600424 100644
> --- a/src/libinput-util.c
> +++ b/src/libinput-util.c
> @@ -28,7 +28,9 @@
>  
>  #include "config.h"
>  
> +#include <ctype.h>
>  #include <stdarg.h>
> +#include <stdbool.h>
>  #include <stdio.h>
>  #include <stdlib.h>
>  
> @@ -113,3 +115,42 @@ ratelimit_test(struct ratelimit *r)
>  
>       return RATELIMIT_EXCEEDED;
>  }
> +
> +int
> +udev_parse_mouse_dpi_property(const char *prop)

I'd prefer this not be named udev_... if it's a general utility. just drop
udev_ would be enough.


> +{
> +     bool is_default = false;
> +     int rd, dpi;

this is nitpicking, but I think we can afford the extra character storage to
have 'nread' instead of the harder-to-interpret 'rd' :)

> +
> +     /* When parsing the mouse DPI property, if we find an error we
> +      * just return 0 since it's obviously invalid, the caller will
> +      * treat that as an error and use a reasonable default instead.
> +      * If the property contains multiple DPI settings but none flagged
> +      * as default, we return the last because we're lazy and that's
> +      * a silly way to set the property anyway.
> +      */

it'd be nice to add a comment here on how the property _should_ look like.

otherwise, looks good, thanks. I'll get the udev hwdb patches to the list
asap, just a heads up: I'm going to wait until those are merged before we
merge this just in case there are any last-minute changes.

Cheers,
   Peter

> +     while (*prop != 0) {
> +             if (*prop == ' ') {
> +                     prop++;
> +                     continue;
> +             }
> +             if (*prop == '*') {
> +                     prop++;
> +                     is_default = true;
> +                     if (!isdigit(prop[0]))
> +                             return 0;
> +             }
> +
> +             rd = 0;
> +             sscanf(prop, "%d@%*d%n", &dpi, &rd);
> +             if (!rd)
> +                     sscanf(prop, "%d%n", &dpi, &rd);
> +             if (!rd || dpi == 0 || prop[rd] == '@')
> +                     return 0;

check for negative dpi/frequency here pls

otherwise, looks good, thanks.

Cheers,
   Peter

> +
> +             if (is_default)
> +                     break;
> +             prop += rd;
> +     }
> +     return dpi;
> +}
> diff --git a/src/libinput-util.h b/src/libinput-util.h
> index 909c9db..62d7ac1 100644
> --- a/src/libinput-util.h
> +++ b/src/libinput-util.h
> @@ -296,4 +296,6 @@ struct ratelimit {
>  void ratelimit_init(struct ratelimit *r, uint64_t ival_ms, unsigned int 
> burst);
>  enum ratelimit_state ratelimit_test(struct ratelimit *r);
>  
> +int udev_parse_mouse_dpi_property(const char *prop);
> +
>  #endif /* LIBINPUT_UTIL_H */
> -- 
> 2.1.3
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to