Hi Chase,
I'm replying to this summary now just to get some of the higher-level
issues clarified. I haven't looked at the code yet.
On 2/07/10 08:36 , Chase Douglas wrote:
Last week I posted some patches for xf86-input-evdev to enable
multitouch through array-indexed valuators. However, I wasn't quite
satisfied with the results. First, depending on how many touch
properties your device presents there may be only enough room in the
valuators for five or six simultaneous touches. There are products
readily available that support more than this amount. Second, it still
sent touches as valuators of a device tied to a pointer. This seems ok
for a device like the Magic Mouse, but for most multitouch devices we
need to separate touches from X pointers due to the X pointer
architecture. One other small issue was that we have a nice new
optimized slotted events protocol from the kernel that doesn't send data
for touches and properties that haven't changed. However, in the evdev
patches we essentially undid all of that and passed all the properties
for every touch in every event.
To remedy the pointer architecture issues I turned to the concept of
direct input devices (DIDs). Peter Hutterer brought up the idea of DIDs
in an email here:
http://lists.x.org/archives/xorg-devel/2010-June/009757.html
I have implemented this DIDs approach by creating a new internal event
type: ET_DirectMotion. These events are mostly just like ET_Motion
events, except they cannot be turned into core or XI1 events.
I heuristically determine if a device is a DID by checking whether it
has valuators for ABS_MT_POSITION_X or ABS_MT_POSITION_Y, but none of
ABS_X, ABS_Y, REL_X, or REL_Y. This check is performed at valuator class
device initialization. Any motion events that a DID posts are sent as
ET_DirectMotion events. The ET_DirectMotion events are transformed into
normal motion events before they are sent to an XI2 client, so XI2
clients will see touches as normal pointer motion events. Further, a DID
starts off as a floating device, unattached to any master pointer
device. Any attempt to attach it to a master will fail.
This is a good start. Eventually, we should have DIDs exposed as a new
device class on the protocol though. Likewise, I don't think ET_DM
should not be converted to normal XIDeviceEvents but rather to their own
type that can be expanded in the future to accommodate for additional
features (e.g. the touch area).
To remedy the protocol issues I looked at the bitmask valuator event
support of XI2. XI2 events send axis values alongside a bitmask
describing what values are valid for the event. However, the current X
input module API provides only for valuator ranges for events. I
extended the API by adding xf86Post*EventsM() and Get*EventsM()
functions. These functions take a "uint8_t *mask" argument instead of
the "int first_valuator" argument. The mask always starts at the 0th
valuator, and num_valuators is used to provide the position of the last
valid valuator for the event.
It'd be interesting to see how much work it is to have this API
_replace_ the current API. Gives us more exposure and better testing.
Note that I have some more API changes planned (not coded) that simplify
the init process, they should all go in in one go.
Another change that goes with that is the ability to easily split up
devices into multiple X devices. This would make it easier to handle
devices that have both MT events and normal events - they would simply
end up being two devices, one normal one, one DID.
Henrik, Rafi - do you think this would work for the MT devices we've
seen so far?
I updated the xf86-input-evdev module to use the new bitmask APIs and to
send each touch as its own event. I also added a small patch to xinput
for the test-xi2 command so it prints out the valuator index along with
all the valuator values (otherwise you have no clue what values
correspond to what properties).
Thanks, this patch is already applied.
All of these changes are available in my git repos on
http://kernel.ubuntu.com/git. I will be sending pull requests for
xserver, xf86-input-evdev, and a patch for xinput so people can find and
comment on the code. Also, I have uploaded versions of these packages to
the Ubuntu Maverick xorg-edgers/multitouch PPA if anyone wants to test
them out:
Thanks, I'll try to look at the code asap.
Cheers,
Peter
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel