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