- Fix version mismatch for XI 2.2+ clients (where a library supports > 2.2 but another version than the originally requested one).
69 lines
2.9 KiB
Diff
69 lines
2.9 KiB
Diff
From e6da18f67516dcee394cd0eff591a255b59fe544 Mon Sep 17 00:00:00 2001
|
|
From: Keith Packard <keithp@keithp.com>
|
|
Date: Wed, 10 Jul 2013 22:42:55 -0700
|
|
Subject: [PATCH 3/3] Xi: Allow clients to ask for 2.3 and then 2.2 without
|
|
failing
|
|
|
|
This allows different sub-systems within the same application to
|
|
request different Xi versions without either getting old behaviour
|
|
everywhere or simply failing with a BadValue.
|
|
|
|
Signed-off-by: Keith Packard <keithp@keithp.com>
|
|
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
|
(cherry picked from commit 4360514d1cc8e3132f93f56172d291074e8c770f)
|
|
---
|
|
Xi/xiqueryversion.c | 36 ++++++++++++++++++++++++++++++------
|
|
1 file changed, 30 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/Xi/xiqueryversion.c b/Xi/xiqueryversion.c
|
|
index b807a53..6c7b9c0 100644
|
|
--- a/Xi/xiqueryversion.c
|
|
+++ b/Xi/xiqueryversion.c
|
|
@@ -71,13 +71,37 @@ ProcXIQueryVersion(ClientPtr client)
|
|
pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
|
|
|
|
if (pXIClient->major_version) {
|
|
- if (version_compare(stuff->major_version, stuff->minor_version,
|
|
- pXIClient->major_version, pXIClient->minor_version) < 0) {
|
|
- client->errorValue = stuff->major_version;
|
|
- return BadValue;
|
|
+
|
|
+ /* Check to see if the client has only ever asked
|
|
+ * for version 2.2 or higher
|
|
+ */
|
|
+ if (version_compare(stuff->major_version, stuff->minor_version, 2, 2) >= 0 &&
|
|
+ version_compare(pXIClient->major_version, pXIClient->minor_version, 2, 2) >= 0)
|
|
+ {
|
|
+
|
|
+ /* As of version 2.2, Peter promises to never again break
|
|
+ * backward compatibility, so we'll return the requested
|
|
+ * version to the client but leave the server internal
|
|
+ * version set to the highest requested value
|
|
+ */
|
|
+ major = stuff->major_version;
|
|
+ minor = stuff->minor_version;
|
|
+ if (version_compare(stuff->major_version, stuff->minor_version,
|
|
+ pXIClient->major_version, pXIClient->minor_version) > 0)
|
|
+ {
|
|
+ pXIClient->major_version = stuff->major_version;
|
|
+ pXIClient->minor_version = stuff->minor_version;
|
|
+ }
|
|
+ } else {
|
|
+ if (version_compare(stuff->major_version, stuff->minor_version,
|
|
+ pXIClient->major_version, pXIClient->minor_version) < 0) {
|
|
+
|
|
+ client->errorValue = stuff->major_version;
|
|
+ return BadValue;
|
|
+ }
|
|
+ major = pXIClient->major_version;
|
|
+ minor = pXIClient->minor_version;
|
|
}
|
|
- major = pXIClient->major_version;
|
|
- minor = pXIClient->minor_version;
|
|
} else {
|
|
if (version_compare(XIVersion.major_version, XIVersion.minor_version,
|
|
stuff->major_version, stuff->minor_version) > 0) {
|
|
--
|
|
1.8.2.1
|
|
|