On 01/17/2012 06:05 AM, Peter Hutterer wrote:
> If a device has both relative and absolute axes, we'd initialise the
> relative axes but label them with the absolute labels.
> 
> Signed-off-by: Peter Hutterer <[email protected]>
> ---
>  src/evdev.c |   25 ++++++++++++++++++-------
>  1 files changed, 18 insertions(+), 7 deletions(-)
> 
> diff --git a/src/evdev.c b/src/evdev.c
> index effac40..1cdba41 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -120,7 +120,7 @@ static BOOL EvdevGrabDevice(InputInfoPtr pInfo, int grab, 
> int ungrab);
>  static void EvdevSetCalibration(InputInfoPtr pInfo, int num_calibration, int 
> calibration[4]);
>  static int EvdevOpenDevice(InputInfoPtr pInfo);
>  
> -static void EvdevInitAxesLabels(EvdevPtr pEvdev, int natoms, Atom *atoms);
> +static void EvdevInitAxesLabels(EvdevPtr pEvdev, int mode, int natoms, Atom 
> *atoms);
>  static void EvdevInitButtonLabels(EvdevPtr pEvdev, int natoms, Atom *atoms);
>  static void EvdevInitProperty(DeviceIntPtr dev);
>  static int EvdevSetProperty(DeviceIntPtr dev, Atom atom,
> @@ -1297,7 +1297,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device)
>              i++;
>      }
>  
> -    EvdevInitAxesLabels(pEvdev, pEvdev->num_vals + num_mt_axes, atoms);
> +    EvdevInitAxesLabels(pEvdev, Absolute, pEvdev->num_vals + num_mt_axes, 
> atoms);
>  
>      if (!InitValuatorClassDeviceStruct(device, num_axes + num_mt_axes, atoms,
>                                         GetMotionHistorySize(), Absolute)) {
> @@ -1496,7 +1496,7 @@ EvdevAddRelValuatorClass(DeviceIntPtr device)
>          i++;
>      }
>  
> -    EvdevInitAxesLabels(pEvdev, pEvdev->num_vals, atoms);
> +    EvdevInitAxesLabels(pEvdev, Relative, pEvdev->num_vals, atoms);
>  
>      if (!InitValuatorClassDeviceStruct(device, num_axes, atoms,
>                                         GetMotionHistorySize(), Relative)) {
> @@ -2637,18 +2637,18 @@ static char* btn_labels[][16] = {
>      }
>  };
>  
> -static void EvdevInitAxesLabels(EvdevPtr pEvdev, int natoms, Atom *atoms)
> +static void EvdevInitAxesLabels(EvdevPtr pEvdev, int mode, int natoms, Atom 
> *atoms)
>  {
>      Atom atom;
>      int axis;
>      char **labels;
>      int labels_len = 0;
>  
> -    if (pEvdev->flags & EVDEV_ABSOLUTE_EVENTS)
> +    if (mode == Absolute)
>      {
>          labels     = abs_labels;
>          labels_len = ArrayLength(abs_labels);
> -    } else if ((pEvdev->flags & EVDEV_RELATIVE_EVENTS))
> +    } else if (mode == Relative)
>      {
>          labels     = rel_labels;
>          labels_len = ArrayLength(rel_labels);
> @@ -2810,8 +2810,19 @@ EvdevInitProperty(DeviceIntPtr dev)
>          /* Axis labelling */
>          if ((pEvdev->num_vals > 0) && (prop_axis_label = 
> XIGetKnownProperty(AXIS_LABEL_PROP)))
>          {
> +            int mode;
>              Atom atoms[pEvdev->num_vals];
> -            EvdevInitAxesLabels(pEvdev, pEvdev->num_vals, atoms);
> +
> +            if (pEvdev->flags & EVDEV_ABSOLUTE_EVENTS)
> +                mode = Absolute;
> +            else if (pEvdev->flags & EVDEV_RELATIVE_EVENTS)
> +                mode = Relative;
> +            else {
> +                xf86IDrvMsg(pInfo, X_ERROR, "BUG: mode is neither absolute 
> nor relative\n");
> +                mode = Absolute;
> +            }
> +
> +            EvdevInitAxesLabels(pEvdev, mode, pEvdev->num_vals, atoms);
>              XIChangeDeviceProperty(dev, prop_axis_label, XA_ATOM, 32,
>                                     PropModeReplace, pEvdev->num_vals, atoms, 
> FALSE);
>              XISetDevicePropertyDeletable(dev, prop_axis_label, FALSE);

How does this fix mixed mode devices? We're still only initializing the
array for either relative or absolute, but not both.

-- Chase
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to