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>
This commit is contained in:
Keith Packard 2013-07-10 22:42:55 -07:00 committed by Peter Hutterer
parent 3d87566310
commit 4360514d1c

View File

@ -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) {