[PATCH v2 libXi multitouch 4/4] Implement support for XI 2.2
Chase Douglas
chase.douglas at canonical.com
Fri Oct 14 09:22:27 PDT 2011
On 10/13/2011 10:23 PM, Peter Hutterer wrote:
> From: Chase Douglas <chase.douglas at canonical.com>
>
> XI 2.1 has not been implemented yet, so this code defines version info
> for it too. These will be dropped when XI 2.1 support is merged.
>
> The code is based on what we have in the prototype libXi in Ubuntu. The
> main differences are:
>
> * No touch valuator classes
> * No TouchUpdateUnownedEvents
> * Addition of raw touch events
> * Touch grab and ungrab is handled in existing passive grab functions
> * XIAllowTouchEvents has been added as an extension of XIAllowEvents
> * XIAllowEvents has been extended when XI 2.2 is supported
>
> The last item causes a bit of an issue. The XIAllowEvents handling in
> released X.org servers check that the size of the request is exactly the
> size published in XI 2.0. Since we are extending the request, we must
> get the right request size from the Xlib buffer depending on what
> version of XI the server supports.
>
> None of this code has been tested because we don't have a server to test
> it with yet.
>
> Signed-off-by: Chase Douglas <chase.douglas at canonical.com>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> Changes to v1:
> - adjust to current protocol
> - rebase on current libXi master
> - re-use code in XIAllowTouchEvents and XIAllowEvents
>
> This patch requires http://patchwork.freedesktop.org/patch/7580/
> Untested for lack of a server supporting MT, and it doesn't include the man
> pages yet either.
[snip]
> diff --git a/src/XIAllowEvents.c b/src/XIAllowEvents.c
> index 1d388b3..e53cf25 100644
> --- a/src/XIAllowEvents.c
> +++ b/src/XIAllowEvents.c
> @@ -29,9 +29,12 @@
> #include <X11/extensions/extutil.h>
> #include "XIint.h"
>
> -Status
> -XIAllowEvents(Display *dpy, int deviceid, int event_mode, Time time)
> +static Status
> +_XIAllowEvents(Display *dpy, int deviceid, int event_mode, Time time,
> + unsigned int touch_id, Window grab_window)
> {
> + Bool have_XI22 = False;
It looks like have_XI22 is set backwards. Shouldn't it be True here, and
then ...
> + int req_len = sz_xXIAllowEventsReq; /* in bytes */
> xXIAllowEventsReq *req;
>
> XExtDisplayInfo *extinfo = XInput_find_display(dpy);
> @@ -40,14 +43,51 @@ XIAllowEvents(Display *dpy, int deviceid, int event_mode, Time time)
> if (_XiCheckExtInit(dpy, XInput_2_0, extinfo) == -1)
> return (NoSuchExtension);
>
> - GetReq(XIAllowEvents, req);
> + /* 2.2's XIAllowEvents is 8 bytes longer than 2.0 */
> + if (_XiCheckExtInit(dpy, XInput_2_2, extinfo) == -1) {
> + req_len -= 8;
> + have_XI22 = True;
set to False here?
> + }
> +
> + GetReqSized(XIAllowEvents, req_len/4, req);
> +
> req->reqType = extinfo->codes->major_opcode;
> req->ReqType = X_XIAllowEvents;
> req->deviceid = deviceid;
> req->mode = event_mode;
> req->time = time;
>
> + if (have_XI22) {
> + req->touch_id = touch_id;
> + req->grab_window = grab_window;
> + }
> +
> UnlockDisplay(dpy);
> SyncHandle();
> return Success;
> }
BTW, thanks for fixing this up. I was getting close to revisiting this
patch, but I still wasn't sure exactly how to do it correctly.
-- Chase
More information about the xorg-devel
mailing list