[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC] kbdif: add multi-touch support
On Wed, 4 Jan 2017, Oleksandr Andrushchenko wrote: > First of all, thank you for comments You are welcome :-) > On 01/04/2017 03:03 AM, Stefano Stabellini wrote: > > On Tue, 3 Jan 2017, Oleksandr Andrushchenko wrote: > > > From: Oleksandr Andrushchenko <Oleksandr_Andrushchenko@xxxxxxxx> > > > > > > Signed-off-by: Oleksandr Andrushchenko <Oleksandr_Andrushchenko@xxxxxxxx> > > > --- > > > xen/include/public/io/kbdif.h | 64 > > > +++++++++++++++++++++++++++++++++++++++++++ > > > 1 file changed, 64 insertions(+) > > > > > > diff --git a/xen/include/public/io/kbdif.h b/xen/include/public/io/kbdif.h > > > index 2d2aebd..ad94b53 100644 > > > --- a/xen/include/public/io/kbdif.h > > > +++ b/xen/include/public/io/kbdif.h > > > @@ -45,6 +45,19 @@ > > > */ > > > #define XENKBD_TYPE_POS 4 > > > +/* > > > + * Multi-touch event > > > + * Capable backend sets feature-multi-touch in xenstore. > > > + * Frontend requests feature by setting request-multi-touch in xenstore. > > > + * Frontend supports up to XENKBD_MT_NUM_DEV virtual multi-touch input > > > devices, > > > + * configured by the backend in xenstore under mt-%d folder, %d being > > > + * a sequential number of the virtual input device: > > > + * o num-contacts - number of simultaneous touches supported > > > + * o width - width of the touch area in pixels > > > + * o height - height of the touch area in pixels > > Please write down the max width and height supported by the protocol, > > keeping in mind that motion events below use int32_t for coordinates. > I will put "width(height) of the... in pixels, 32-bit signed integer" I don't think I understand what you wrote here. To clarify, I meant that the doc should say what is the theoretical maximum for width and height, for example INT32_MAX. > > Are there any benefits of this compared to just setting up multiple kbd > > connections, one per multi-touch device? The only benefit I can think of > > is saving few pages. > Well, not only saving a few pages, but somewhat > simplifying handling of the protocol on both back and > front ends. But, you are probably right as current > protocol is capable of holding > (XENKBD_IN_RING_SIZE - XENKBD_IN_RING_OFFS) / XENKBD_IN_EVENT_SIZE == > (2048 - 1024) / 40 = 25 incoming events which may not be > enough for multiple mt devices delivering hundreds of > events per second. > Will set-up dedicated rings per mt device then. I think you'll find it is going to be simpler and faster for little extra memory costs. > Will also remove > uint8_t dev_idx; /* index of the multi-touch device */ > as every device will have its own ring. Right > Will extend XenStore configuration for mt devices with: > o page-ref (?) > o page-gref > o event-channel > as it is done by the Linux xen-kbdfront driver. > > BTW, is there any reason we need "page-ref"? My understanding is > that the pair of page-gref + event-channel is enough to establish > and uniquely identify the connection. It's page-gref that is superfluous. I don't know why the Linux frontend writes it, in fact the QEMU backend doesn't even read it. > > > +/* Sent when a new touch is made: touch is assigned a unique contact > > > + * ID, sent with this and consequent events related to this touch. > > > + * Contact ID will be reused after XENKBD_MT_EV_UP event. > > Will be reused or can be reused? > I would probably say "may be reused" as it depends on how > and if new touches/contacts are made > > Please provide an example of a Contact > > ID lifecycle. > Do you want it to be described in the protocol or just here? > If the latter then, for example, as Wayland documentation > describes it [1]: > "Touch interactions can consist of one or more contacts. > For each contact, a series of events is generated, starting > with a down event, followed by zero or more motion events, > and ending with an up event. Events relating to the same > contact point can be identified by the ID of the sequence." > So, if there is contact/touch a free Contact ID is assigned to > this contact(sequence) and it is "released" when contact is > done, e.g. after up event. From this point contact ID may be > reused. This is very useful info for people not familiar with Wayland. Please write this in the doc, and link to the Wayland documentation. > I was basing the mt additions to the protocol on Wayland [1], > Linux [2] and Windows [3] multi-touch support, so those may > better explain the idea > > What is the max Contact ID? > > > /* contact ID, [0; num-contacts - 1] */ > num-contacts - number of simultaneous touches supported > > > + */ > > > +#define XENKBD_MT_EV_DOWN 0 > > > +/* Touch point has been released */ > > > +#define XENKBD_MT_EV_UP 1 > > > +/* Touch point has changed its coordinate(s) */ > > > +#define XENKBD_MT_EV_MOTION 2 > > > +/* Input synchronization event: shows end of a set of events > > > + * which logically belong together. > > > + */ > > > +#define XENKBD_MT_EV_SYN 3 > > > +/* Touch point has changed its shape. Shape is approximated by an ellipse > > > + * through the major and minor axis lengths: major is the longer diameter > > > + * of the ellipse and minor is the shorter one. Center of the ellipse is > > > + * reported via XENKBD_MT_EV_DOWN/XENKBD_MT_EV_MOTION events. > > > + */ > > > +#define XENKBD_MT_EV_SHAPE 4 > > > +/* Touch point's shape has changed its orientation: calculated as a > > > clockwise > > > + * angle between the major axis of the ellipse and positive Y axis in > > > degrees, > > > + * [-180; +180]. > > > + */ > > > +#define XENKBD_MT_EV_ORIENT 5 > > > + > > > +struct xenkbd_mtouch { > > > + uint8_t type; /* XENKBD_TYPE_MTOUCH */ > > > + uint8_t dev_idx; /* index of the multi-touch device */ > > > + uint8_t event_type; /* XENKBD_MT_EV_??? */ > > > + uint8_t reserved; /* reserved for the future use */ > > > + int32_t contact_id; /* contact ID, [0; num-contacts - 1] */ > > > + union { > > > + /* XENKBD_MT_EV_DOWN/XENKBD_MT_EV_MOTION */ > > > + struct { > > > + int32_t abs_x; /* absolute X position, pixels */ > > > + int32_t abs_y; /* absolute Y position, pixels */ > > > + } pos; > > > + /* XENKBD_MT_EV_SHAPE */ > > > + struct { > > > + uint32_t major; /* length of the major axis, pixels */ > > > + uint32_t minor; /* length of the minor axis, pixels */ > > > + } shape; > > > + /* XENKBD_MT_EV_ORIENT */ > > > + uint16_t orientation; /* clockwise angle of the major axis */ > > > + } u; > > > +}; > > Need a binary representation. > > > Could you please elaborate more on this, this is not > clear to me. Sure, sorry. I meant something like: 0 1 2 3 4 +----+----+----+----+ |type|dev_|even|res | +----+----+----+----+ I know it is cumbersome, and I might not be a fun of it myself, but it is required for new Xen protocol changes. I wrote all of the binary representations manually but if you find a tool to do it, please let me know :-) > > > #define XENKBD_IN_EVENT_SIZE 40 > > > union xenkbd_in_event > > > @@ -76,6 +139,7 @@ union xenkbd_in_event > > > struct xenkbd_motion motion; > > > struct xenkbd_key key; > > > struct xenkbd_position pos; > > > + struct xenkbd_mtouch mtouch; > > > char pad[XENKBD_IN_EVENT_SIZE]; > > > }; > > > > > > -- > > > 2.7.4 > > Related question: what if I also extend existing > xenkbd_motion/key/position by adding uint32(8?)_t dev_idx > at the bottom of the structures, e.g. > > struct xenkbd_motion { > uint8_t type; /* XENKBD_TYPE_MOTION */ > int32_t rel_x; /* relative X motion */ > int32_t rel_y; /* relative Y motion */ > int32_t rel_z; /* relative Z motion (wheel) */ > uint32_t dev_idx; or uint8_t dev_idx; > }; > > This way: > 1. Existing fronts/backs will not be affected > 2. New fronts/backs may use this field to serve > multiple keyboards and/or pointer devices via single ring > > Should I make this change as a dedicated patch or do you think > it can be in the same one for mt? I thought we decided to use one ring per device? If so, why would you want to introduce dev_idx in xenkbd_motion? Also, where would the list of available devices be described? The current xenstore info assumes one ring per device. In any case, it should be separate from the mt discussion. > Thank you, > Oleksandr > [1] > https://cgit.freedesktop.org/wayland/wayland/tree/protocol/wayland.xml#n2196 > [2] https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt > [3] > https://msdn.microsoft.com/en-us/library/jj151564(v=vs.85).aspx#optional_hid_usages > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |