[PATCH evdev] Added Sensitivity option
Peter Hutterer
peter.hutterer at who-t.net
Thu Dec 31 19:46:29 PST 2009
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.
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
>
More information about the xorg-devel
mailing list