[PATCH evdev] Added Sensitivity option

Simon Thum simon.thum at gmx.de
Fri Jan 1 03:30:44 PST 2010


Peter Hutterer wrote:
> On Thu, Dec 31, 2009 at 05:31:42PM +0100, Yann Kaiser wrote:
>> Evdev now multiplies movement on each axis with a new Sensitivity option
>> (property "Evdev Sensitivity"). It keeps the fractional part of the computed
>> movement for next event, in order to prevent slow movements from being
>> discarded in high mouse dpi/low sensitivity combinations.
> 
> wouldn't this be better solved by increasing constant deceleration for this
> device? This sensitivity option duplicates functionality that we already
> have in the server.
Worse, it introduces an independent motion buffer we can't see from the
server. I'd rather have transforms and their buffers in one place.

This makes some sense from a noise cancellation perspective though. If
that's the intent, I would include some hysteresis and give it a shot.

Another consideration, maybe 'constant deceleration' simply isn't
descriptive enough? I'm not a native speaker, so I'm pretty much lost on
this one.

> 
> Cheers,
>   Peter
>> Signed-off-by: Yann Kaiser <epsy46 at free.fr>
>> ---
>>  include/evdev-properties.h |    4 ++++
>>  man/evdev.man              |    7 +++++++
>>  src/evdev.c                |   26 ++++++++++++++++++++++++++
>>  src/evdev.h                |    2 ++
>>  4 files changed, 39 insertions(+), 0 deletions(-)
>>
>> diff --git a/include/evdev-properties.h b/include/evdev-properties.h
>> index 7df2876..e1593fe 100644
>> --- a/include/evdev-properties.h
>> +++ b/include/evdev-properties.h
>> @@ -62,6 +62,10 @@
>>  /* CARD32, 4 values [minx, maxx, miny, maxy], or no values for unset */
>>  #define EVDEV_PROP_CALIBRATION "Evdev Axis Calibration"
>>  
>> +/* Constant pointer speed multiplier */
>> +/* FLOAT */
>> +#define EVDEV_PROP_SENS "Evdev Sensitivity"
>> +
>>  /* Swap x and y axis. */
>>  /* BOOL */
>>  #define EVDEV_PROP_SWAP_AXES "Evdev Axes Swap"
>> diff --git a/man/evdev.man b/man/evdev.man
>> index 4771167..bfa5fd4 100644
>> --- a/man/evdev.man
>> +++ b/man/evdev.man
>> @@ -159,6 +159,10 @@ originally reported by the kernel (e.g. touchscreens). The scaling to the
>>  custom coordinate system is done in-driver and the X server is unaware of
>>  the transformation. Property: "Evdev Axis Calibration".
>>  .TP 7
>> +.BI "Option \*qSensitivity\*q \*q" Double \*q
>> +Constant multiplier to the mouse movement. Default: 1.0. Property: "Evdev
>> +Sensitivity".
>> +.TP 7
>>  .BI "Option \*qSwapAxes\*q \*q" Bool \*q
>>  Swap x/y axes. Default: off. Property: "Evdev Axes Swap".
>>  .TP 7
>> @@ -205,6 +209,9 @@ value.
>>  .BI "Evdev Middle Button Timeout"
>>  1 16-bit positive value.
>>  .TP 7
>> +.BI "Evdev Sensitivity"
>> +1 16-bit positive value.
>> +.TP 7
>>  .BI "Evdev Wheel Emulation"
>>  1 boolean value (8 bit, 0 or 1).
>>  .TP 7
>> diff --git a/src/evdev.c b/src/evdev.c
>> index 7e65c69..cbd4fdb 100644
>> --- a/src/evdev.c
>> +++ b/src/evdev.c
>> @@ -129,6 +129,7 @@ static Atom prop_calibration = 0;
>>  static Atom prop_swap = 0;
>>  static Atom prop_axis_label = 0;
>>  static Atom prop_btn_label = 0;
>> +static Atom prop_sens = 0;
>>  #endif
>>  
>>  /* All devices the evdev driver has allocated and knows about.
>> @@ -359,6 +360,7 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
>>      }
>>  
>>      if (pEvdev->rel) {
>> +        float delta_real;
>>          int first = REL_CNT, last = 0;
>>          int i;
>>  
>> @@ -375,6 +377,11 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
>>          for (i = 0; i < REL_CNT; i++)
>>          {
>>              int map = pEvdev->axis_map[i];
>> +
>> +            delta_real = pEvdev->delta[i] * pEvdev->sens + pEvdev->delta_rest[i];
>> +            pEvdev->delta[i] = floor(delta_real);
>> +            pEvdev->delta_rest[i] = delta_real - pEvdev->delta[i];
>> +
>>              if (map != -1)
>>              {
>>                  v[map] = pEvdev->delta[i];
>> @@ -1396,6 +1403,7 @@ EvdevInitRelClass(DeviceIntPtr device, EvdevPtr pEvdev)
>>      if (EvdevAddRelClass(device) == Success) {
>>  
>>          xf86Msg(X_INFO,"%s: initialized for relative axes.\n", device->name);
>> +        xf86Msg(X_CONFIG,"%s: using a sensitivity of: %lf.\n", device->name, pEvdev->sens);
>>  
>>          if (has_abs_axes) {
>>  
>> @@ -2022,6 +2030,7 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
>>      pEvdev->invert_x = xf86SetBoolOption(pInfo->options, "InvertX", FALSE);
>>      pEvdev->invert_y = xf86SetBoolOption(pInfo->options, "InvertY", FALSE);
>>      pEvdev->swap_axes = xf86SetBoolOption(pInfo->options, "SwapAxes", FALSE);
>> +    pEvdev->sens = xf86SetRealOption(pInfo->options, "Sensitivity", 1.0);
>>  
>>      str = xf86CheckStrOption(pInfo->options, "Calibration", NULL);
>>      if (str) {
>> @@ -2455,6 +2464,16 @@ EvdevInitProperty(DeviceIntPtr dev)
>>  
>>          XISetDevicePropertyDeletable(dev, prop_swap, FALSE);
>>  
>> +        prop_sens = MakeAtom(EVDEV_PROP_SENS,
>> +                strlen(EVDEV_PROP_SENS), TRUE);
>> +
>> +        rc = XIChangeDeviceProperty(dev, prop_sens, XIGetKnownProperty(XATOM_FLOAT), 32,
>> +                PropModeReplace, 1, &pEvdev->sens, FALSE);
>> +        if (rc != Success)
>> +            return;
>> +
>> +        XISetDevicePropertyDeletable(dev, prop_sens, FALSE);
>> +
>>  #ifdef HAVE_LABELS
>>          /* Axis labelling */
>>          if ((pEvdev->num_vals > 0) && (prop_axis_label = XIGetKnownProperty(AXIS_LABEL_PROP)))
>> @@ -2514,6 +2533,13 @@ EvdevSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
>>  
>>          if (!checkonly)
>>              pEvdev->swap_axes = *((BOOL*)val->data);
>> +    } else if (atom == prop_sens)
>> +    {
>> +        if(val->format != 32 || val->type != XIGetKnownProperty(XATOM_FLOAT) || val->size != 1)
>> +            return BadMatch;
>> +
>> +        if (!checkonly)
>> +            pEvdev->sens = *((float*)val->data);
>>      } else if (atom == prop_axis_label || atom == prop_btn_label)
>>          return BadAccess; /* Axis/Button labels can't be changed */
>>  
>> diff --git a/src/evdev.h b/src/evdev.h
>> index 95d00db..dd9574a 100644
>> --- a/src/evdev.h
>> +++ b/src/evdev.h
>> @@ -114,8 +114,10 @@ typedef struct {
>>      BOOL swap_axes;
>>      BOOL invert_x;
>>      BOOL invert_y;
>> +    float sens;
>>  
>>      int delta[REL_CNT];
>> +    float delta_rest[REL_CNT];   /* non-integer complement to delta */
>>      unsigned int abs, rel;
>>  
>>      /* XKB stuff has to be per-device rather than per-driver */
>> -- 
>> 1.6.5.7
>>
>  
> _______________________________________________
> xorg-devel mailing list
> xorg-devel at lists.x.org
> http://lists.x.org/mailman/listinfo/xorg-devel
> 



More information about the xorg-devel mailing list