[RFC PATCH inputproto] Add XIGetSupportedVersion request

Peter Hutterer peter.hutterer at who-t.net
Wed Jan 23 17:38:55 PST 2013


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



More information about the xorg-devel mailing list