On Fri, Jan 20, 2012 at 05:51:33AM +0100, Chase Douglas wrote: > On 01/20/2012 05:28 AM, Peter Hutterer wrote: > > On Wed, Jan 18, 2012 at 07:09:20PM -0800, Chase Douglas wrote: > >> An indirect touch device, such as a multitouch touchpad, has relative X > >> and Y axes internally. These axes are in screen coordinates. However, > >> the cooresponding axes for touch events are in absolute device > >> coordinates. > >> > >> Signed-off-by: Chase Douglas <[email protected]> > >> --- > >> dix/getevents.c | 12 +++++++++--- > >> 1 files changed, 9 insertions(+), 3 deletions(-) > >> > >> diff --git a/dix/getevents.c b/dix/getevents.c > >> index 1547059..3e37910 100644 > >> --- a/dix/getevents.c > >> +++ b/dix/getevents.c > >> @@ -222,17 +222,23 @@ set_valuators(DeviceIntPtr dev, DeviceEvent* event, > >> ValuatorMask *mask) > >> int i; > >> > >> /* Set the data to the previous value for unset absolute axes. The > >> values > >> - * may be used when sent as part of an XI 1.x valuator event. */ > >> + * may be used when sent as part of an XI 1.x valuator event. > >> + * > >> + * All touch event valuators are absolute, even if the corresponding > >> pointer > >> + * valuator is relative. This is the case for indirect touch devices > >> for the > >> + * X and Y axes. */ > >> for (i = 0; i < valuator_mask_size(mask); i++) > >> { > >> if (valuator_mask_isset(mask, i)) > >> { > >> SetBit(event->valuators.mask, i); > >> - if (valuator_get_mode(dev, i) == Absolute) > >> + if (IsTouchEvent((InternalEvent *)event) || > >> + valuator_get_mode(dev, i) == Absolute) > >> SetBit(event->valuators.mode, i); > >> event->valuators.data[i] = valuator_mask_get_double(mask, i); > >> } > >> - else if (valuator_get_mode(dev, i) == Absolute) > >> + else if (IsTouchEvent((InternalEvent *)event) || > >> + valuator_get_mode(dev, i) == Absolute) > >> event->valuators.data[i] = dev->valuator->axisVal[i]; > >> } > >> } > >> -- > >> 1.7.8.3 > > > > can we reshape this to pass in what the mode is for the valuators > > instead of guessing based on the event type? > > The purpose is to force absolute for all valuators if it's a touch > event. We can add a parameter "Bool force_absolute", but that doesn't > feel any less hackish to me. It also hides the details through a level > of indirection, making us put a comment at the call into set_valuators > instead of inside set_valuators. I understand what you see as being a > bit obtuse in this implementation, but I'm not sure the alternative is > better.
the current input API requires us to submit all valuators in one mode anyway . xf86PostMotionEvent takes only a single Relative/Absolute argument, so we can carry that through. For touch events, we know that the values are always absolute, so we can assume mode = Absolute in GetTouchEvents() and pass that to set_valuators, no? Cheers, Peter _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
