[PATCH xserver] Added processing of XI grabs with confine.
Peter Hutterer
peter.hutterer at who-t.net
Wed May 18 21:40:29 PDT 2011
On Wed, May 18, 2011 at 06:30:06PM +0200, Philipp Reh wrote:
> Version 2.1 of XI sends a confine_to parameter
> right after the mask. The server checks if the client
> has version 2.1 or later to see if it has to read the
> additional value.
> ---
> Xi/xigrabdev.c | 28 +++++++++++++++++++++++++++-
> include/protocol-versions.h | 2 +-
> 2 files changed, 28 insertions(+), 2 deletions(-)
>
> diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
> index 0adc878..48fb6cc 100644
> --- a/Xi/xigrabdev.c
> +++ b/Xi/xigrabdev.c
> @@ -42,10 +42,21 @@
> #include "exevents.h"
> #include "xigrabdev.h"
>
> +static Bool
> +ConfineSent(ClientPtr client)
s/ConfineSent/HasConfineTo/ (bikeshedding :)
> +{
> + XIClientPtr pXIClient;
> + pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
> +
> + return (pXIClient->major_version * 1000 + pXIClient->minor_version) >= 2001 ? TRUE : FALSE;
please use the new version_compare() for version checks. admittedly that
commit probably went in while you weren't looking, but we should make use of
it :)
> +}
> +
> int
> SProcXIGrabDevice(ClientPtr client)
> {
> char n;
> + int mask_len;
> + GrabMask mask;
>
> REQUEST(xXIGrabDeviceReq);
>
> @@ -54,6 +65,13 @@ SProcXIGrabDevice(ClientPtr client)
> swapl(&stuff->grab_window, n);
> swapl(&stuff->cursor, n);
> swapl(&stuff->time, n);
> +
> + if(ConfineSent(client) == TRUE)
> + {
> + mask_len = min(sizeof(mask.xi2mask[0]), stuff->mask_len * 4);
this looks weird. why the sizeof? shouldn't mask_len always be the correct
value?
Cheers,
Peter
> + swapl(&stuff[1] + mask_len, n);
> + }
> +
> swaps(&stuff->mask_len, n);
>
> return ProcXIGrabDevice(client);
> @@ -68,6 +86,7 @@ ProcXIGrabDevice(ClientPtr client)
> uint8_t status;
> GrabMask mask;
> int mask_len;
> + Window confine_to;
>
> REQUEST(xXIGrabDeviceReq);
> REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq);
> @@ -87,6 +106,13 @@ ProcXIGrabDevice(ClientPtr client)
> memset(mask.xi2mask, 0, sizeof(mask.xi2mask));
> memcpy(mask.xi2mask, (char*)&stuff[1], mask_len);
>
> + /* If the client has version 2_1 or higher, it will send the confine_to window
> + * at the end of the request (after the mask).*/
> + confine_to = None;
> +
> + if(ConfineSent(client) == TRUE)
> + memcpy((unsigned char *)&confine_to, (char*)&stuff[1] + mask_len, 4);
> +
> ret = GrabDevice(client, dev, stuff->grab_mode,
> stuff->paired_device_mode,
> stuff->grab_window,
> @@ -95,7 +121,7 @@ ProcXIGrabDevice(ClientPtr client)
> &mask,
> GRABTYPE_XI2,
> stuff->cursor,
> - None /* confineTo */,
> + confine_to,
> &status);
>
> if (ret != Success)
> diff --git a/include/protocol-versions.h b/include/protocol-versions.h
> index 8692ded..f53399a 100644
> --- a/include/protocol-versions.h
> +++ b/include/protocol-versions.h
> @@ -127,7 +127,7 @@
>
> /* X Input */
> #define SERVER_XI_MAJOR_VERSION 2
> -#define SERVER_XI_MINOR_VERSION 0
> +#define SERVER_XI_MINOR_VERSION 1
>
> /* XKB */
> #define SERVER_XKB_MAJOR_VERSION 1
> --
> 1.7.5.rc3
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list