XFree86 Version Numbering Schemes : Finding the XFree86 X Server Version From a Client
Previous: Version Numbering Scheme for XFree86 3.3.x.
Next: XFree86 Version Numbering Schemes

6. Finding the XFree86 X Server Version From a Client

The XFree86 X servers report a VendorRelease value that matches the XFree86 version number. There have been some cases of releases where this value wasn't set correctly. The rules for interpreting this value as well as the known exceptions are outlined here.

For 3.3.x versions, the VendorRelease value is Mmnp. That is, version M.m.n.p has VendorRelease set to M * 1000 + m * 100 + n * 10 + p. Exceptions to this are: The value wasn't incremented for the 3.3.3.1 release, and for the 3.3.4 and 3.3.5 releases the value was incorrectly set to Mmn (M * 100 + m * 10 + n). This was corrected for the 3.3.6 release.

For versions 3.9.15 to 4.0.x, the VendorRelease value is Mmnn. That is, version M.m.n has VendorRelease set to M * 1000 + m * 100 + n. There have been no exceptions to this rule.

For post-4.0.2 development and release versions using the new numbering scheme, the VendorRelease value is MMmmPPsss. That is, version M.m.P.s has VendorRelease set to M * 10000000 + m * 100000 + P * 1000 + s. Note: 4.0.3 and any other 4.0.x releases will continue with the Mmnn scheme.

The following is a code fragment taken from xdpyinfo.c that shows how the VendorRelease information can be interpreted.


    if (strstr(ServerVendor(dpy), "XFree86")) {
        int vendrel = VendorRelease(dpy);

        printf("XFree86 version: ");
        if (vendrel < 336) {
            /*
             * vendrel was set incorrectly for 3.3.4 and 3.3.5, so handle
             * those cases here.
             */
            printf("%d.%d.%d", vendrel / 100,
                              (vendrel / 10) % 10,
                               vendrel       % 10);
        } else if (vendrel < 3900) {
            /* 3.3.x versions, other than the exceptions handled above */
            printf("%d.%d", vendrel / 1000,
                           (vendrel /  100) % 10);
            if (((vendrel / 10) % 10) || (vendrel % 10)) {
                printf(".%d", (vendrel / 10) % 10);
                if (vendrel % 10) {
                    printf(".%d", vendrel % 10);
                }
            }
        } else if (vendrel < 40000000) {
            /* 4.0.x versions */
            printf("%d.%d", vendrel / 1000,
                           (vendrel /   10) % 10);
            if (vendrel % 10) {
                printf(".%d", vendrel % 10);
            }
        } else {
            /* post-4.0.x */
            printf("%d.%d.%d", vendrel / 10000000,
                              (vendrel /   100000) % 100,
                              (vendrel /     1000) % 100);
            if (vendrel % 1000) {
                printf(".%d", vendrel % 1000);
            }
        }
    }


XFree86 Version Numbering Schemes : Finding the XFree86 X Server Version From a Client
Previous: Version Numbering Scheme for XFree86 3.3.x.
Next: XFree86 Version Numbering Schemes