[RFC PATCH inputproto] Add XIGetSupportedVersion request

Jasper St. Pierre jstpierre at mecheye.net
Wed Jan 23 19:22:44 PST 2013


This sounds like a good idea to me.


On Wed, Jan 23, 2013 at 8:38 PM, Peter Hutterer <peter.hutterer at who-t.net>wrote:

> XIQueryVersion sends the client-supported version to the server. The server
> then uses that version to adjust the behaviour of XI2 for this client.
> Current examples include:
> * XIQueryPointer will not set the button mask for touch events if the
> client
>   is XI 2.2-aware
> * RawEvents are sent to XI 2.1 clients if a grab is active
> * XIAllowEvents will accept different values from XI 2.2 clients
>
> This behaviour is an issue for libraries supporting XI2. A library that
> calls XIQueryVersion before the client will lock in behaviour that the
> client may not request. A library that calls XIQueryVersion after the
> client
> may trigger BadValue errors if the libraries requested version differs from
> the client's requested version.
>
> This request adds a side-effect free version of XIQueryVersion. It returns
> the server version and the already-requested client version (if any). A
> library may use this request to query the server for the XI2 version
> withouth locking in any behaviour for the client.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> I was tempted to call this XIQueryServerVersion but IMO that is too close
> to
> XIQueryVersion.
>
> Returning the client version is to determine what the client actually
> expects in behavior. Not 100% sure if needed, but if it is needed this
> opens
> another question: do we need a XIQueryVersionCalled event? If the library
> calls XIGetSupportedVersion before the client calls XIQueryVersion, it
> won't have the information. Unless it keeps calling it until it gets a
> number back, which doesn't seem useful either.
>
>  XI2proto.h         | 30 +++++++++++++++++++++++++++++-
>  specs/XI2proto.txt | 34 ++++++++++++++++++++++++++++++++++
>  2 files changed, 63 insertions(+), 1 deletion(-)
>
> diff --git a/XI2proto.h b/XI2proto.h
> index 4cdaa0d..e99c9d6 100644
> --- a/XI2proto.h
> +++ b/XI2proto.h
> @@ -94,9 +94,10 @@
>  #define X_XIGetProperty                 59
>  #define X_XIGetSelectedEvents           60
>  #define X_XIBarrierReleasePointer       61
> +#define X_XIGetSupportedVersion         62
>
>  /** Number of XI requests */
> -#define XI2REQUESTS (X_XIBarrierReleasePointer - X_XIQueryPointer + 1)
> +#define XI2REQUESTS (X_XIGetSupportedVersion - X_XIQueryPointer + 1)
>  /** Number of XI2 events */
>  #define XI2EVENTS   (XI_LASTEVENT + 1)
>
> @@ -833,6 +834,33 @@ typedef struct {
>  } xXIBarrierReleasePointerReq;
>  #define sz_xXIBarrierReleasePointerReq       8
>
> +/**
> + * Retrieve the server-supported X Input extension version.
> + */
> +
> +typedef struct {
> +    uint8_t     reqType;                /**< Input extension major code */
> +    uint8_t     ReqType;                /**< Always
> ::X_XIGetSupportedVersion */
> +    uint16_t    length;                 /**< Length in 4 byte units */
> +} xXIGetSupportedVersionReq;
> +#define sz_xXIGetSupportedVersionReq         4
> +
> +typedef struct {
> +    uint8_t     repType;                /**< ::X_Reply */
> +    uint8_t     RepType;                /**< Always
> ::X_XIGetSupportedVersion */
> +    uint16_t    sequenceNumber;
> +    uint32_t    length;
> +    uint16_t    server_major_version;
> +    uint16_t    server_minor_version;
> +    uint16_t    client_major_version;
> +    uint16_t    client_minor_version;
> +    uint32_t    pad1
> +    uint32_t    pad3;
> +    uint32_t    pad4;
> +    uint32_t    pad5;
> +} xXIGetSupportedVersionReply;
> +#define sz_xXIGetSupportedVersionReply             32
> +
>
>  /*************************************************************************************
>   *
>             *
>   *                                      EVENTS
>             *
> diff --git a/specs/XI2proto.txt b/specs/XI2proto.txt
> index d30fcca..b5d9afd 100644
> --- a/specs/XI2proto.txt
> +++ b/specs/XI2proto.txt
> @@ -62,6 +62,7 @@ Changes in version 2.3
>  ----------------------
>
>  - Pointer barrier events added
> +- XIGetSupportedVersion request added
>
>  //                            ❧❧❧❧❧❧❧❧❧❧❧
>
> @@ -2035,6 +2036,39 @@ assigned and the client must re-issue the
> XIBarrierReleasePointer request.
>  If the device is not a master pointer device, a BadDevice error results.
>  If the barrier does not name a valid barrier, a BadValue error results.
>
> +XIGetSupportedVersion
> +^^^^^^^^^^^^^^
> +    ┌───
> +        XIGetSupportedVersion
> +        ▶
> +        server_major_version:          CARD16
> +        server_minor_version:          CARD16
> +        client_major_version:          CARD16
> +        client_minor_version:          CARD16
> +    └───
> +
> +This request queries the server for its supported XI2 version, and the
> +version this client has already registered for. It is side-effect free.
> +
> +    server_major_version
> +        Major XI2 version supported by the server.
> +    server_minor_version
> +        Minor XI2 version supported by the server.
> +    client_major_version
> +        Major XI2 version this client has registered for.
> +    client_minor_version
> +        Minor XI2 version this client has registered for.
> +
> +XIGetSupportedVersion returns the current supported server major/minor
> +version. It does not register this client for XI2 support and clients must
> +call XIQueryVersion with the version they support before issuing other XI2
> +requests.
> +
> +XIGetSupportedVersion returns the major/minor version requested by this
> +client in a previous XIQueryVersion request.  If the client has not
> +previously called XIQueryVersion, client_major_version and
> +client_minor_version is 0.
> +
>
>  [[events]]
>  Events
> --
> 1.8.1
>
>


-- 
  Jasper
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-devel/attachments/20130123/c0e1af8a/attachment-0001.html>


More information about the xorg-devel mailing list