[PATCH] dix: make input clipping respect subpixels (#24187)

Peter Hutterer peter.hutterer at who-t.net
Thu Oct 1 04:06:48 PDT 2009


On Thu, Oct 01, 2009 at 12:53:02PM +0200, Simon Thum wrote:
> Peter Hutterer wrote:
> > @@ -587,16 +587,41 @@ clipAxis(DeviceIntPtr pDev, int axisNum, int *val)
> >  
> >      /* If a value range is defined, clip. If not, do nothing */
> A nit: This is no longer true then.
> >      if (axis->max_value <= axis->min_value)
> > -        return;
> > +    {
> > +        /* Special case: for relative devices with no valid axis range, we
> > +         * still need to clip off the remainder to avoid negative root
> > +         * coordinates. We do NOT set val to 0, otherwise we can't cross
> > +         * screens anymore. */
> > +        if (*val <= axis->min_value && remainder && (*remainder < 0.0f))
> > +            *remainder = 0.0f;
> Errrm... that's a bug. You're killing the remainder based on an
> undefined axis range. That can't really be it?
> 
> Supposed the axis is screen (which we first checked it can't be, since
> screen axis would have a valid range) it would be sensible to me to add
> the analog line:
> 
> if (*val >= axis->max_value && remainder && (*remainder > 0.0f))
>     *remainder = 0.0f;
> 
> so we actually hold what's intended:
> "The clipping rules intend to avoid enlarging the
> valuator range by the remainder range, so assumptions
> one may have made stay valid."
> 
> Second, it should really be:
> 
> if (*val >= axis->max_value && remainder && (*remainder > 0.0f || *val >
> axis->min_value))
> 
> and vice versa, because if we're bigger/smaller (i.e. not just equal)
> the remainder always must be zeroed. That's basically why the patch is
> so complicated compared to what it does.
> 
> But I think the real solution must involve screen limits, which seems to
> happen somewhere else.

christ, what was I thinking. Thanks for the review.

/me goes and hides in the corner.
 
Cheers,
  Peter


More information about the xorg-devel mailing list