[PATCH] Xi: Allow clients to ask for 2.3 and then 2.2 without failing

Peter Hutterer peter.hutterer at who-t.net
Wed Jul 17 18:17:42 PDT 2013


On Wed, Jul 10, 2013 at 10:42:55PM -0700, Keith Packard wrote:
> 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.
> 

thanks. yes, this patch is needed because the current situation is untenable
for too many clients and we clearly can't rely on the client knowning what
version it actually supports. sad, but true.
it means some error checking flies out the window, but really, not much we
can do apparently.

However, before we can shove this patch in, we (== you :) need to also
update the libXi man page.

Cheers,
   Peter

> ---
>  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.3.1
> 


More information about the xorg-devel mailing list