Daniel Kurtz <[email protected]> wrote:

> However, my understanding is that edge motion occurs when a drag or move
> hits an edge, but the finger stays in contact with the pad.  Thus, there
> should always still be hardware events during an edge motion.

Yeah, once the properties EdgeMotion{MinZ,MaxZ,UseAlways} are set accordingly.

> This timer, instead, should only fire after the finger is raised immediately
> after a valid motion packet (a hardware sample that generated a delta
> resulting in pointer motion).  Actually, since there is no way of
> distinguishing between timer-events and hardware-events (since timerFunc 
> copies
> previous priv->hwState), what this means is, once fired, this timer will
> keep firing forever.
> 
> However, at least on the trackpads that I have tested, this doesn't happen
> for a very different reason.  When the finger is lifted from the pad, the
> touchpad/kernel-driver doesn't immediately stop sending packets.  Instead,
> it sends about 1 second worth of dummy "x=0,y=0,z=0..." packets at regular
> intervals.

>From section 2.3 of the Synpatics TouchPad Interfacing Guide:

  "In Absolute mode, the TouchPad reports packets continuously at the specified
   packet rate, either 40 or 80 packets per second, whenever the finger is on or
   near the pad.  (Specifically, the TouchPad begins sending packets when Z is 8
   or more.) The TouchPad also begins sending packets whenever any button is
   pressed or released. Once the TouchPad begins transmitting, it continues to
   send packets for one second after Z falls below 8 and the buttons stop
   changing. The TouchPad does this partly to allow host software to use the
   packet stream as a time base for gesture decoding, and also to minimize the
   impact if the system occasionally drops a packet."

So, this seems to be the intended behavior for Synaptics touchpads produced at
the time that document was printed, which dates back to 2001. What rests to be
assured is whether more recent hardware operates under the same assumption, or
if the evdev input handler within the Linux kernel somehow mangles this fact.

> These packets are recognized as "!insidearea", which resets
> priv->count_packet_finger and therefore doesn't schedule the edge_motion
> timer, effectively cancelling it.
> 
> The only time this timer actual fires, then, is in this case that I am
> trying to fix - when it fires in between touchpad hardware samples because
> the touchpad generates samples slower than 13 ms apart.

Who dares to disagree that Synaptics code in X is a mess, raise your hands!

What? Nobody? :)
_______________________________________________
[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