From e6da18f67516dcee394cd0eff591a255b59fe544 Mon Sep 17 00:00:00 2001 From: Keith Packard 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 Signed-off-by: Peter Hutterer (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