Upstream-Status: Backport

backported from https://crrev.com/c/1066670

Signed-off-by: Maksim Sisov <msisov@igalia.com>
---
From ea363a792e156f99676dad5036beb99e6b0d100d Mon Sep 17 00:00:00 2001
From: Tom Anderson <thomasanderson@chromium.org>
Date: Wed, 1 Jul 2020 19:49:33 +0000
Subject: [PATCH 1/2] Add xcbproto to third_party

Bug:
https://bugs.chromium.org/p/chromium/issues/detail?id=1066670

Design doc:
https://docs.google.com/document/d/190l8eBJrtb-8TyJZLzdRiQEH-gW1XvBVH0gWy0zHiNM/edit?usp=sharing

Chrome Eng approval:
https://groups.google.com/a/google.com/g/chrome-eng-review/c/TY2zqz7uICI/m/MwHdJv4HAQAJ

BUG=1066670

Change-Id: I4fdb7c2169a2b116cb57dec4e436aa832112dd3b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2267923
Commit-Queue: Thomas Anderson <thomasanderson@chromium.org>
Reviewed-by: Nico Weber <thakis@chromium.org>
Reviewed-by: Nick Yamane <nickdiego@igalia.com>
Reviewed-by: Alex Gough <ajgo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#784536}
---
 third_party/xcbproto/LICENSE                 |    1 +
 third_party/xcbproto/OWNERS                  |    2 +
 third_party/xcbproto/README.chromium         |   14 +
 third_party/xcbproto/VERSION                 |    1 +
 third_party/xcbproto/src/.gitignore          |   31 +
 third_party/xcbproto/src/COPYING             |   30 +
 third_party/xcbproto/src/HACKING             |   20 +
 third_party/xcbproto/src/INSTALL             |  229 +
 third_party/xcbproto/src/Makefile.am         |    6 +
 third_party/xcbproto/src/NEWS                |  314 +
 third_party/xcbproto/src/README.md           |   49 +
 third_party/xcbproto/src/TODO                |   45 +
 third_party/xcbproto/src/autogen.sh          |   14 +
 third_party/xcbproto/src/configure.ac        |   22 +
 third_party/xcbproto/src/doc/xml-xcb.txt     |  425 ++
 third_party/xcbproto/src/src/.gitattributes  |    1 +
 third_party/xcbproto/src/src/Makefile.am     |   38 +
 third_party/xcbproto/src/src/bigreq.xml      |   38 +
 third_party/xcbproto/src/src/composite.xml   |   98 +
 third_party/xcbproto/src/src/damage.xml      |   87 +
 third_party/xcbproto/src/src/dpms.xml        |   87 +
 third_party/xcbproto/src/src/dri2.xml        |  282 +
 third_party/xcbproto/src/src/dri3.xml        |  166 +
 third_party/xcbproto/src/src/ge.xml          |   42 +
 third_party/xcbproto/src/src/glx.xml         | 1639 +++++
 third_party/xcbproto/src/src/present.xml     |  211 +
 third_party/xcbproto/src/src/randr.xml       |  954 +++
 third_party/xcbproto/src/src/record.xml      |  178 +
 third_party/xcbproto/src/src/render.xml      |  693 +++
 third_party/xcbproto/src/src/res.xml         |  164 +
 third_party/xcbproto/src/src/screensaver.xml |  186 +
 third_party/xcbproto/src/src/shape.xml       |  155 +
 third_party/xcbproto/src/src/shm.xml         |  135 +
 third_party/xcbproto/src/src/sync.xml        |  280 +
 third_party/xcbproto/src/src/xc_misc.xml     |   38 +
 third_party/xcbproto/src/src/xcb.xsd         |  416 ++
 third_party/xcbproto/src/src/xevie.xml       |   85 +
 third_party/xcbproto/src/src/xf86dri.xml     |  172 +
 third_party/xcbproto/src/src/xf86vidmode.xml |  478 ++
 third_party/xcbproto/src/src/xfixes.xml      |  362 ++
 third_party/xcbproto/src/src/xinerama.xml    |   99 +
 third_party/xcbproto/src/src/xinput.xml      | 2651 +++++++++
 third_party/xcbproto/src/src/xkb.xml         | 2589 ++++++++
 third_party/xcbproto/src/src/xprint.xml      |  329 +
 third_party/xcbproto/src/src/xproto.xml      | 5620 ++++++++++++++++++
 third_party/xcbproto/src/src/xselinux.xml    |  278 +
 third_party/xcbproto/src/src/xtest.xml       |  105 +
 third_party/xcbproto/src/src/xv.xml          |  445 ++
 third_party/xcbproto/src/src/xvmc.xml        |  146 +
 third_party/xcbproto/src/xcb-proto.pc.in     |   11 +
 third_party/xcbproto/src/xcbgen/Makefile.am  |    3 +
 third_party/xcbproto/src/xcbgen/__init__.py  |    1 +
 third_party/xcbproto/src/xcbgen/align.py     |  182 +
 third_party/xcbproto/src/xcbgen/error.py     |    5 +
 third_party/xcbproto/src/xcbgen/expr.py      |  176 +
 third_party/xcbproto/src/xcbgen/matcher.py   |  127 +
 third_party/xcbproto/src/xcbgen/state.py     |  219 +
 third_party/xcbproto/src/xcbgen/xtypes.py    | 1397 +++++
 third_party/xcbproto/update.sh               |   37 +
 59 files changed, 22608 insertions(+)
 create mode 120000 third_party/xcbproto/LICENSE
 create mode 100644 third_party/xcbproto/OWNERS
 create mode 100644 third_party/xcbproto/README.chromium
 create mode 100644 third_party/xcbproto/VERSION
 create mode 100644 third_party/xcbproto/src/.gitignore
 create mode 100644 third_party/xcbproto/src/COPYING
 create mode 100644 third_party/xcbproto/src/HACKING
 create mode 100644 third_party/xcbproto/src/INSTALL
 create mode 100644 third_party/xcbproto/src/Makefile.am
 create mode 100644 third_party/xcbproto/src/NEWS
 create mode 100644 third_party/xcbproto/src/README.md
 create mode 100644 third_party/xcbproto/src/TODO
 create mode 100755 third_party/xcbproto/src/autogen.sh
 create mode 100644 third_party/xcbproto/src/configure.ac
 create mode 100644 third_party/xcbproto/src/doc/xml-xcb.txt
 create mode 100644 third_party/xcbproto/src/src/.gitattributes
 create mode 100644 third_party/xcbproto/src/src/Makefile.am
 create mode 100644 third_party/xcbproto/src/src/bigreq.xml
 create mode 100644 third_party/xcbproto/src/src/composite.xml
 create mode 100644 third_party/xcbproto/src/src/damage.xml
 create mode 100644 third_party/xcbproto/src/src/dpms.xml
 create mode 100644 third_party/xcbproto/src/src/dri2.xml
 create mode 100644 third_party/xcbproto/src/src/dri3.xml
 create mode 100644 third_party/xcbproto/src/src/ge.xml
 create mode 100644 third_party/xcbproto/src/src/glx.xml
 create mode 100644 third_party/xcbproto/src/src/present.xml
 create mode 100644 third_party/xcbproto/src/src/randr.xml
 create mode 100644 third_party/xcbproto/src/src/record.xml
 create mode 100644 third_party/xcbproto/src/src/render.xml
 create mode 100644 third_party/xcbproto/src/src/res.xml
 create mode 100644 third_party/xcbproto/src/src/screensaver.xml
 create mode 100644 third_party/xcbproto/src/src/shape.xml
 create mode 100644 third_party/xcbproto/src/src/shm.xml
 create mode 100644 third_party/xcbproto/src/src/sync.xml
 create mode 100644 third_party/xcbproto/src/src/xc_misc.xml
 create mode 100644 third_party/xcbproto/src/src/xcb.xsd
 create mode 100644 third_party/xcbproto/src/src/xevie.xml
 create mode 100644 third_party/xcbproto/src/src/xf86dri.xml
 create mode 100644 third_party/xcbproto/src/src/xf86vidmode.xml
 create mode 100644 third_party/xcbproto/src/src/xfixes.xml
 create mode 100644 third_party/xcbproto/src/src/xinerama.xml
 create mode 100644 third_party/xcbproto/src/src/xinput.xml
 create mode 100644 third_party/xcbproto/src/src/xkb.xml
 create mode 100644 third_party/xcbproto/src/src/xprint.xml
 create mode 100644 third_party/xcbproto/src/src/xproto.xml
 create mode 100644 third_party/xcbproto/src/src/xselinux.xml
 create mode 100644 third_party/xcbproto/src/src/xtest.xml
 create mode 100644 third_party/xcbproto/src/src/xv.xml
 create mode 100644 third_party/xcbproto/src/src/xvmc.xml
 create mode 100644 third_party/xcbproto/src/xcb-proto.pc.in
 create mode 100644 third_party/xcbproto/src/xcbgen/Makefile.am
 create mode 100644 third_party/xcbproto/src/xcbgen/__init__.py
 create mode 100644 third_party/xcbproto/src/xcbgen/align.py
 create mode 100644 third_party/xcbproto/src/xcbgen/error.py
 create mode 100644 third_party/xcbproto/src/xcbgen/expr.py
 create mode 100644 third_party/xcbproto/src/xcbgen/matcher.py
 create mode 100644 third_party/xcbproto/src/xcbgen/state.py
 create mode 100644 third_party/xcbproto/src/xcbgen/xtypes.py
 create mode 100755 third_party/xcbproto/update.sh

diff --git a/third_party/xcbproto/LICENSE b/third_party/xcbproto/LICENSE
new file mode 120000
index 000000000000..a6d16ce5ca81
--- /dev/null
+++ b/third_party/xcbproto/LICENSE
@@ -0,0 +1 @@
+src/COPYING
\ No newline at end of file
diff --git a/third_party/xcbproto/OWNERS b/third_party/xcbproto/OWNERS
new file mode 100644
index 000000000000..81bea6f80860
--- /dev/null
+++ b/third_party/xcbproto/OWNERS
@@ -0,0 +1,2 @@
+nickdiego@igalia.com
+thomasanderson@chromium.org
diff --git a/third_party/xcbproto/README.chromium b/third_party/xcbproto/README.chromium
new file mode 100644
index 000000000000..f862d6d63fa9
--- /dev/null
+++ b/third_party/xcbproto/README.chromium
@@ -0,0 +1,14 @@
+Name: xcbproto
+Short Name: xcbproto
+URL: https://gitlab.freedesktop.org/xorg/proto/xcbproto
+Version: 7d58eed95f796fc764741d7549ee2214bbbcc64c
+CPEPrefix: unknown
+Security Critical: no
+License: MIT
+License File: NOT_SHIPPED
+
+Description:
+XML-XCB protocol descriptions
+
+Updating:
+Run third_party/xcbproto/update.sh
diff --git a/third_party/xcbproto/VERSION b/third_party/xcbproto/VERSION
new file mode 100644
index 000000000000..a8e3ee2dac55
--- /dev/null
+++ b/third_party/xcbproto/VERSION
@@ -0,0 +1 @@
+7d58eed95f796fc764741d7549ee2214bbbcc64c
diff --git a/third_party/xcbproto/src/.gitignore b/third_party/xcbproto/src/.gitignore
new file mode 100644
index 000000000000..91876c66a76a
--- /dev/null
+++ b/third_party/xcbproto/src/.gitignore
@@ -0,0 +1,31 @@
+aclocal.m4
+autom4te.cache
+compile
+depcomp
+install-sh
+libtool
+ltmain.sh
+missing
+mkinstalldirs
+py-compile
+config.guess
+config.h
+config.h.in
+config.log
+config.status
+config.sub
+configure
+configure.lineno
+.deps
+.dirstamp
+.libs
+*.lo
+*.loT
+*.la
+Makefile
+Makefile.in
+stamp-h1
+*.o
+*.pc
+*.tar.bz2
+*.tar.gz
diff --git a/third_party/xcbproto/src/COPYING b/third_party/xcbproto/src/COPYING
new file mode 100644
index 000000000000..54bfbe5b0207
--- /dev/null
+++ b/third_party/xcbproto/src/COPYING
@@ -0,0 +1,30 @@
+Copyright (C) 2001-2006 Bart Massey, Jamey Sharp, and Josh Triplett.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute,
+sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall
+be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors
+or their institutions shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this
+Software without prior written authorization from the
+authors.
diff --git a/third_party/xcbproto/src/HACKING b/third_party/xcbproto/src/HACKING
new file mode 100644
index 000000000000..e954a766a2f3
--- /dev/null
+++ b/third_party/xcbproto/src/HACKING
@@ -0,0 +1,20 @@
+Make patches more descriptive
+=============================
+
+By default hunk headers of a patch will look like this:
+
+    @@ -1227,6 +1227,8 @@ authorization from the authors.
+
+Which is not very usefull as it doesn't give a hint where the change
+happened (except for the line number). To make those hunk headers more
+descriptive, i.e.:
+
+    @@ -1227,6 +1227,8 @@ <struct name="HierarchyChange">
+
+Add these 2 lines to your .git/config file:
+
+    [diff "xcb"]
+        xfuncname = "(<\\b(xcb|enum|event|request|struct|union)\\b.*>)"
+
+For more background on this magic have a look at src/.gitattributes and
+the man page gitattributes(5) chapter "Defining a custom hunk-header".
diff --git a/third_party/xcbproto/src/INSTALL b/third_party/xcbproto/src/INSTALL
new file mode 100644
index 000000000000..54caf7c190f2
--- /dev/null
+++ b/third_party/xcbproto/src/INSTALL
@@ -0,0 +1,229 @@
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
+Foundation, Inc.
+
+   This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory.  After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/third_party/xcbproto/src/Makefile.am b/third_party/xcbproto/src/Makefile.am
new file mode 100644
index 000000000000..0312e7ad8aee
--- /dev/null
+++ b/third_party/xcbproto/src/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = src xcbgen
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = xcb-proto.pc
+
+EXTRA_DIST=doc xcb-proto.pc.in autogen.sh README.md
diff --git a/third_party/xcbproto/src/NEWS b/third_party/xcbproto/src/NEWS
new file mode 100644
index 000000000000..9bab62be70ae
--- /dev/null
+++ b/third_party/xcbproto/src/NEWS
@@ -0,0 +1,314 @@
+Release 1.14 (2020-02-22)
+=========================
+* Fix size computation of imported lists
+* Allow access to the original type in the XML
+* Add sysroot prefix to pkgconfig file (Fixes #9)
+ 
+Release 1.13 (2018-02-28)
+=========================
+* dri3: Add multi-plane/modifier protocol for v1.2
+* present: Add suboptimal-copy protocol for v1.2
+* randr: Add output-lease protocol for v1.6
+* Add support for variable-sized lists of FDs
+* xge: Add safe generic-event sending support
+* Fix initial connection handshaking
+* Updated XML DTD
+* Python 3.x cleanups and compatibility
+
+Release 1.12 (2016-05-18)
+=========================
+* xinput: Various padding-related additions and fixes
+* xinput: Various type fixes
+* xinput: Various mask fixes
+* xinput: Various additions of enums
+* Define new "altmask" attribute
+* Define new switch-case construct
+* xinput: Convert various construct from bitcase to case
+* xinput: Add full support for various requests
+* Define new sumof with nested expressions
+* present: Specify length of RedirectNotify.notifies
+* Define new listelement-ref construct
+* xinput: Support list axisvalues in events
+* Define new paramref construct
+* xfixes: Fix GetCursorImageAndName cursor image support
+* Replace valueparam with other construct in various extensions
+* Remove support for the valueparam construct
+* xprint: Fix some list definitions
+* randr: Add RandR 1.5 requests and data types
+* shm: Mark PutImage.send_event field as boolean
+* glx: Add IsEnabled request
+* Make padding explicit in various places
+* Fix typos in some documentation examples
+* Add an automatic alignment checker
+* Optionally enforce serilization of pads for ABI compatibility
+
+Release 1.11 (2014-08-01)
+=========================
+* Add support for <pad align="n" />
+* xkb: Fix padding bug in GetMap
+* xcbgen: Track directly included modules
+* xprint: Fix PrintGetAttributes reply
+* xkb: Fix use of nKTLevels
+* xv: Fix padding in struct AdaptorInfo
+* xproto: Fix EnterNotify documentation
+* Update the protocol schema
+* xinput: Add missing pad in DeviceResolutionCtl
+* xinput: Add missing pad in XIChangeHierarchy
+* xinput: Add missing modLatches as comment in LatchLockState
+
+Release 1.10 (2013-12-22)
+=========================
+* xkb: comment out portions that libxcb doesn't handle properly
+* Present: Remove reference to nonexistent enum
+* sync: Add missing namespace for the INT64 struct
+* sync: VALUETYPE and TESTTYPE are enum
+* xinput: Add XI2 event enum. for event selection
+* Rename ge events to GeGeneric events to avoid clash with libxcb
+
+Release 1.9 (2013-11-07)
+========================
+* Add Present protocol specification
+* Add DRI3
+* Add MIT-SHM AttachFd and CreateSegment requests
+* Add support for file descriptor request fields
+* Define X generic event structure
+* Add CARD64/INT64 protocol types
+* XKB: Rewrite AXOption
+* XKB: Fix values of AXFBOpt enum
+* xkb: Fix struct ExtensionDeviceNotify
+* xkb: Pad structs CommonDoodad and SALockDeviceBtn
+* randr: Fix GetProviderProperty reply
+* Enforce a bit or value in enum items
+* xkb: Add missing LedClass and BellClass enum values
+* xkb: Add missing 'supported' field to GetNamedIndicator reply
+* xkb: Unify Overlay1Behavior and Overlay2Behavior
+* xkb: Change DfltBtnAbsolute to the value used by the server
+* xkb: Fix key type map entry field order
+* xkb: Work around alignment problems in GetNames and GetMap replies
+* xinput: Use BARRIER from xfixes
+* xinput: Unlock uninterpreted lists
+* xinput: Add XI v2.3
+* xinput: Add XI v2.2
+* xinput: Add XI v2.1
+* xinput: Add XI v2.0
+* xinput: Add XI v1.5
+* xinput: Cleanup implementation of XI up to v1.4
+* Add support for X Generic Extension events
+* sync: Change value list param of CreateAlarm and ChangeAlarm into switch
+* res: Add ClientIdMask enum
+* res: Fix and rename list in ClientIdValue
+* randr: Add provider object support (RandR v1.4)
+* xtest: Version bump 2.1..2.2
+* glx: Version bump 1.3..1.4
+* composite: Version bump 0.3..0.4
+* xfixes: Rename enum DirectionMask to BarrierDirec.
+* XKB: Correct enum to mask
+* screensaver: Use enum and mask attributes
+* screensaver: Remove wrong fields from Notify event
+* Prototype for XRes v1.2
+* XKB: Fix calculation in GetIndicatorMap
+* XKB: Fix GetKbdByName
+* Allow multiple <enumref> in a <bitcase>
+* XKB: Change CARD8 to char where ASCII is expected
+* XKB: Fix VirtualMods
+* XKB: Fix SymInterpret
+* XKB: Fix CountedString16 padding
+* xkb: Revert half of d42d791 XKB: Fix broken events
+* xfixes: Update to version 5
+* autogen.sh: Implement GNOME Build API
+
+Release 1.8 (2012-10-05)
+========================
+* dri2: Update to DRI2 1.4
+* XKB: Fix broken events
+* xproto: add doc tags, xcbgen: handle doc tags
+
+Release 1.7.1 (2012-03-23)
+==========================
+* Add ge and xf86vidmode protocol descriptions
+* Remove now unnecessary files as everything is implemented in xcbgen
+* Rename the ExprType "parent" attribute to "parents"
+
+Release 1.7 (2012-01-11)
+========================
+* Add missing padding bytes to ChangeKeyboardMapping request
+* Corrected type of FakeInput rootX & rootY fields
+* Changed Exception message in case of unknown/unhandled XML tags
+* xcbgen: perform lenfield lookup within all anchestors
+* Add support for new expr tags popcount, enumref, sumof
+* Changed handling of anchestor types
+* Assign switch name to bitcases
+* Support name attribute for bitcases and set BitcaseType.has_name accordingly
+* Use absolute imports in xcbgen for Python 3 compatibilit
+* dri2: Update to version 1.3 (v2)
+* glx: Replace some 'reserved' fields with explicit padding
+* glx: Use glx:CONTEXT for share_list parameter of CreateNewContext
+* glx: Use FBCONFIG type for fbconfig parameter of CreateNewContext and CreatePixmap
+* glx: Add protocol for GLX_ARB_create_context and GLX_ARB_create_context_profile
+* Add support for fence sync objects
+* xf86dri: fix GetDrawableInfo reply
+* xproto: fix TranslateCoordinates reply
+* xcbgen: Add unop support
+* xf86vidmode: Fix padding expressions
+* dri2: Add proper padding before driver_name
+* Add libdir/exec_prefix to xcb-xproto.pc
+* Revive support for hex literals in protocol
+* Add description of new protocol elements
+* Add XKEYBOARD protocol description
+* Fix ChangeHosts address string
+* Fix SetFontPath path string encoding
+* Fix some fields name
+* Fix XKB GetState missing lookupMods field
+* Add RENDER 0.11 definitions
+
+Release 1.6 (2009-12-02)
+========================
+* Add DRI2 protocol, based off of dri2proto.h and the server code. (v2)
+* xf86dri.xml seems to have been wrong forever. Fixes bug #16894.
+* shape: add missing padding bytes to GetRectangles
+* Add XML description for the Generic Event extension.
+* Add XML description for the XFree86VidMode extension.
+* Fix typo in xf86vidmode.xml
+* Fix length calculation for xfixes/FetchRegion reply
+* Add pre-defined atoms to Atom enum
+
+Release 1.5 (2009-05-09)
+========================
+* Add support for mod mask Any
+* Add and use altenum (non-exhaustive enum)
+* Tweak some XInput specs
+* Fix milter spelling
+* Correct the length calculation for the value field of GetPropertyReply
+* xtest: rename window field to root
+* randr: add version 1.3 requests
+* shm: fix ShmCompletion event
+
+Release 1.4 (2009-02-16)
+========================
+* Add explicit padding in various protocol description.
+* Associate fields with the enum which describes their allowed values.
+
+Release 1.3 (2008-12-10)
+========================
+Explicit padding was added in various protocol description.
+
+Protcol fixes:
+* RandR
+* X proto
+* Change CARD8 to char when specs requires STRING8
+
+Release 1.2 (2008-07-17)
+========================
+New extensions:
+* XInput 1.4
+* SELinux 1.0
+
+Various fixes in protocol description:
+* X proto
+* X-Resource
+* XVMC
+* GLX
+
+New Python parser language-independent parts.
+
+Release 1.1 (2007-11-04)
+========================
+
+Incompatible change to the XML schema: rather than special-casing the
+treatment of protocol extension names, use the new extension-multiword
+attribute.  Normally, XCB prefixes C extension functions with
+xcb_extname_.  However, some of the existing extensions used multi-word
+names, such as xcb_big_requests_ or xcb_xc_misc_. Those extensions now
+use this attribute to match their existing defined API.  This allows the
+XCB code generator to avoid special-casing those extension names.
+
+Protocol updates:
+* Update DAMAGE to 1.1
+* Update RandR to version 1.2
+
+Bug fixes:
+* fix XSync Initialize call
+* Update autogen.sh to one that does objdir != srcdir.
+
+
+Release 1.0 (2006-11-23)
+========================
+
+The "Thanksgiving" release: We feel thankful to have it released.
+
+* Fix Bug #8990: randr type fixes
+* Fixed screen parameter type in several GLX requests to use CARD32 instead
+  of the SCREEN structure.
+* Corrected valueparam arguments to attribute lists in several requests and
+  a reply.
+* Estethic change for attribute parameter name
+* Remove support for the <localfield> tag: nothing needs it.
+* Fix Bug #8973: In UngrabKey, the 'key' field should have type KEYCODE, not
+  the more general CARD8.
+
+
+Release 1.0 RC3 (2006-11-02)
+============================
+
+* Add support for the Xinerama extension, version 1.1
+* Protocol descriptions now document the major and minor version numbers
+  of the extension version they support, through major-version and
+  minor-version attributes on the xcb tag.  XML Schema updated
+  accordingly.
+* Minor source reorganization: Now that the extensions do not get
+  installed to an extensions/ subdirectory, move them out of the
+  extensions/ subdirectory in the source as well.
+* Various protocol description fixes:
+    * Add REPEAT enumeration to Render extension to fix bug #8535
+    * Fix core xproto GrabMode enumeration (reported by Yang JianJun)
+    * Fix core xproto cap style enumeration (bug #8857).
+
+
+Release 1.0 RC2 (2006-10-07)
+============================
+
+* Add <import>xproto</import> explicitly to extensions that use xproto;
+  this goes along with the change in the code generator for libxcb 1.0 RC2 to
+  stop implicitly importing xproto.
+* Change "union" to "xidunion" for XID unions like DRAWABLE and FONTABLE,
+  so that the code generator can more easily declare these XID unions as
+  integer typedefs rather than unions.
+* Replace structures attempting to provide C type safety with CARD32 typedefs
+* render.xml no longer describes the CompositeGlyphs* requests as taking lists
+  of complicated unions of structures of lists: it says instead that they take
+  a LISTofBYTE. The caller is responsible for constructing an appropriate
+  sequence of glyph elements. Previously, the requests could not actually be
+  used because XCB did not correctly compute the length of the provided data.
+
+
+Release 1.0 RC1 (2006-09-25)
+============================
+
+The Great XCB Renaming
+----------------------
+
+* Rename shape_op and shape_kind to drop the "shape_" prefix, since
+  otherwise these types end up as xcb_shape_shape_{op,kind}_t.
+* Remove leading underscores from enums in the GLX protocol description,
+  previously needed to ensure a word separator, but now redundant.
+* The XML-XCB protocol descriptions have moved to /usr/share/xcb, with
+  extension descriptions no longer relegated to an extensions/ subdirectory.
+
+GIT Repository split
+--------------------
+
+Previously, several XCB-related projects all existed under the umbrella
+of a single monolithic GIT repository with per-project subdirectories.
+We have split this repository into individual per-project repositories.
+
+Josh Triplett and Jamey Sharp wrote a tool called git-split to
+accomplish this repository split. git-split reconstructs the history of
+a sub-project previously stored in a subdirectory of a larger
+repository. It constructs new commit objects based on the existing tree
+objects for the subtree in each commit, and discards commits which do
+not affect the history of the sub-project, as well as merges made
+unnecessary due to these discarded commits.
+
+We would like to acknowledge the work of the gobby team in creating a
+collaborative editor which greatly aided the development of git-split
+(as well as these release notes).
diff --git a/third_party/xcbproto/src/README.md b/third_party/xcbproto/src/README.md
new file mode 100644
index 000000000000..5ee075cf1ba6
--- /dev/null
+++ b/third_party/xcbproto/src/README.md
@@ -0,0 +1,49 @@
+About xcb-proto
+===============
+
+xcb-proto provides the XML-XCB protocol descriptions that libxcb uses to
+generate the majority of its code and API. We provide them separately
+from libxcb to allow reuse by other projects, such as additional
+language bindings, protocol dissectors, or documentation generators.
+
+This separation between the XCB transport layer and the
+automatically-generated protocol layer also makes it far easier to write
+new extensions. With the Xlib infrastructure, client-side support for
+new extensions requires significant duplication of effort. With XCB and
+the XML-XCB protocol descriptions, client-side support for a new
+extension requires only an XML description of the extension, and not a
+single line of code.
+
+Python libraries: xcb-proto also contains language-independent Python
+libraries that are used to parse an XML description and create objects
+used by Python code generators in individual language bindings.  These
+libraries are installed into $(prefix)/lib/pythonX.X/site-packages.  If
+this location is not on your system's Python path, scripts that import
+them will fail with import errors.  In this case you must add the
+install location to your Python path by creating a file with a `.pth'
+extension in a directory that _is_ on the Python path, and put the
+path to the install location in that file.  For example, on my system
+there is a file named 'local.pth' in /usr/lib/python2.5/site-packages,
+which contains '/usr/local/lib/python2.5/site-packages'.  Note that
+this is only necessary on machines where XCB is being built.
+
+Please report any issues you find to the freedesktop.org bug tracker at:
+
+  https://gitlab.freedesktop.org/xorg/proto/xcbproto/issues
+
+Discussion about XCB occurs on the XCB mailing list:
+
+  https://lists.freedesktop.org/mailman/listinfo/xcb
+
+You can obtain the latest development versions of xcb-proto using GIT from
+the xcbproto code repository at:
+
+  https://gitlab.freedesktop.org/xorg/proto/xcbproto
+
+  For anonymous checkouts, use:
+
+    git clone https://gitlab.freedesktop.org/xorg/proto/xcbproto.git
+
+  For developers, use:
+
+    git clone git@gitlab.freedesktop.org:xorg/proto/xcbproto.git
diff --git a/third_party/xcbproto/src/TODO b/third_party/xcbproto/src/TODO
new file mode 100644
index 000000000000..add693c48f40
--- /dev/null
+++ b/third_party/xcbproto/src/TODO
@@ -0,0 +1,45 @@
+Last Updated: 2006-04-27
+
+Extension Status:
+
+X - Present, tested, works.
+U - Present, untested.
+I - Incomplete.
+
+X BIG-REQUESTS
+X COMPOSITE
+X DAMAGE
+  DOUBLE-BUFFER
+X DPMS
+  Extended-Visual-Information
+X GLX
+  LBX
+X MIT-SCREEN-SAVER
+X MIT-SHM
+  MIT-SUNDRY-NONSTANDARD
+  Multi-Buffering
+X RANDR
+X RECORD
+X RENDER
+  SECURITY
+  SGI-GLX
+X SHAPE
+X SYNC
+  TOG-CUP
+X X-Resource
+  XC-APPGROUP
+X XC-MISC
+X XEVIE
+X XFIXES
+  XFree86-Bigfont
+  XFree86-DGA
+X XFree86-DRI
+  XFree86-Misc
+  XFree86-VidModeExtension
+  XINERAMA
+  XInputExtension
+  XKEYBOARD
+I XpExtension (XPRINT)
+X XTEST
+X XVideo
+U XVideo-MotionCompensation
diff --git a/third_party/xcbproto/src/autogen.sh b/third_party/xcbproto/src/autogen.sh
new file mode 100755
index 000000000000..fc34bd55c443
--- /dev/null
+++ b/third_party/xcbproto/src/autogen.sh
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+ORIGDIR=`pwd`
+cd $srcdir
+
+autoreconf -v --install || exit 1
+cd $ORIGDIR || exit $?
+
+if test -z "$NOCONFIGURE"; then
+    $srcdir/configure "$@"
+fi
diff --git a/third_party/xcbproto/src/configure.ac b/third_party/xcbproto/src/configure.ac
new file mode 100644
index 000000000000..14a7c2d08873
--- /dev/null
+++ b/third_party/xcbproto/src/configure.ac
@@ -0,0 +1,22 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.57)
+AC_INIT([XCB Proto],
+        1.14,
+        [xcb@lists.freedesktop.org])
+AC_CONFIG_SRCDIR([xcb-proto.pc.in])
+AM_INIT_AUTOMAKE([foreign dist-xz])
+
+AC_PATH_PROG(XMLLINT, xmllint, no)
+AM_CONDITIONAL(HAVE_XMLLINT, test "x$XMLLINT" != "xno")
+if test "$XMLLINT" = "no"; then
+   AC_MSG_WARN([xmllint not found; unable to validate against schema.])
+fi
+
+AM_PATH_PYTHON([2.5])
+
+xcbincludedir='${datadir}/xcb'
+AC_SUBST(xcbincludedir)
+
+AC_OUTPUT([Makefile src/Makefile xcbgen/Makefile xcb-proto.pc])
diff --git a/third_party/xcbproto/src/doc/xml-xcb.txt b/third_party/xcbproto/src/doc/xml-xcb.txt
new file mode 100644
index 000000000000..f5b9aed13ad7
--- /dev/null
+++ b/third_party/xcbproto/src/doc/xml-xcb.txt
@@ -0,0 +1,425 @@
+                                  xcb/proto
+
+Description
+===========
+
+xcb/proto is a set of XML files describing the  X Window System protocol
+It is designed for use with libxcb, the X C binding
+<http://xcb.freedesktop.org/>.  xcb/proto consists of:
+
+xcb.xsd      An XML Schema defining the data format for describing the X
+             protocol.
+
+*.py         Code generator helpers that read the protocol descriptions
+             into python structures. See libxcb for example usage.
+
+*.xml        XML descriptions of the core X protocol and many extensions.
+
+
+Generating C bindings
+=====================
+
+See libxcb <http://cgit.freedesktop.org/xcb/libxcb/>.
+
+
+Protocol Description Format
+===========================
+
+Root element
+------------
+
+<xcb header="string" extension-name="string" extension-xname="string">
+  top-level elements
+</xcb>
+
+  This is the root element of a protocol description.  The attributes are all
+  various forms of the extension name.  header is the basename of the XML
+  protocol description file, which will be used as the basename for generated
+  bindings as well.  extension-name is the name of the extension in InterCaps,
+  which will be used in the names of functions.  extension-xname is the name
+  of the extension as passed to QueryExtension.
+
+  As an example, the XML-XCB description for the GO-FASTER extension would use
+  the root element <xcb header="gofaster" extension-name="GoFaster"
+  extension-xname="GO-FASTER">; as a result, C bindings will be put in
+  gofaster.h and gofaster.c, extension functions will be named
+  XCBGoFasterFunctionName, and the extension initialization will call
+  QueryExtension with the name "GO-FASTER".
+
+  This element can contain any number of the elements listed in the section
+  "Top-Level Elements" below.
+
+
+Top-Level Elements
+------------------
+
+<import>header_name</import>
+
+  The import element allows the protocol description to reference types
+  declared in another extension.  The content is be the basename of the
+  extension XML file, which is also the header attribute of the extension's
+  root node.  Note that types from xproto are automatically available, without
+  explicitly importing them.
+
+<struct name="identifier">structure contents</struct>
+
+  This element represents a data structure.  The name attribute gives the name
+  of the structure.  The content represents the fields of the structure, and
+  consists of one or more of the field, pad, and list elements described in
+  the section "Structure Contents" below.
+
+<union name="identifier">structure contents</union>
+
+  This element represents a union of data types, which can hold one value of
+  any of those types.  The name attribute gives the name of the union.  The
+  content represents the fields of the union, and consists of one or more of
+  the field and pad elements described in the section "Structure Contents
+  below".
+
+<eventstruct name="identifier">event-type-selector list</struct>
+
+  This element represents a data structure that is the wire-representation of
+  an event. The event can be any type that's selected by the
+  event-type-selector list.
+
+<xidtype name="identifier" />
+
+  This element represents an identifier for a particular type of resource.
+  The name attribute gives the name of the new type.
+
+<enum name="identifier">
+  <item name="identifier">[optional expression]</item>
+  ...
+</enum>
+
+  The enum element represents an enumeration type, which can take on any of
+  the values given by the contained item elements.  The name attribute on the
+  enum gives the name of the enumerated type.
+
+  The item element represents one possible value of an enumerated type.  The
+  name attribute on the item gives the name of that value, and the optional
+  content is an expression giving the numeric value.  If the expression is
+  omitted, the value will be one more than that of the previous item, or 0 for
+  the first item.
+
+<typedef oldname="identifier" newname="identifier" />
+
+  The typedef element declares the type given by the newname attribute to be
+  an alias for the type given by the oldname attribute.
+
+<request name="identifier" opcode="integer" [combine-adjacent="true"]>
+  structure contents
+  [<reply>structure contents</reply>]
+</request>
+
+  The request element represents an X protocol request.  The name attribute
+  gives the name of the request, and the opcode attribute gives the numeric
+  request code.  The content of the request element represents the fields in
+  the request, and consists of one or more of any of the elements listed in
+  the "Structure Contents" section below.  Note that for requests in the core
+  protocol, the first field in the request goes into the one-byte gap between
+  the major opcode and the length; if the request does not have any data in
+  that gap, put a one byte pad as the first element.  Extension requests
+  always have this gap filled with the minor opcode.
+
+  The optional reply element is present if the request has a reply.  The
+  content of the reply element represents the fields in the reply, and
+  consists of zero or more of the field, pad, and list elements listed in the
+  "Structure Contents" section below.  Note that the first field in the reply
+  always goes into the one-byte gap between the response type and the sequence
+  number; if the reply does not have any data in that gap, put a one byte pad
+  as the first element.
+
+  If the optional combine-adjacent attribute is true, multiple adjacent
+  requests of the same type may be combined into a single request without
+  affecting the semantics of the requests.
+
+<event name="identifier" number="integer"
+       [[no-sequence-number="true"] | [xge="true"]]>
+  structure contents
+</event>
+
+  This element represents an X protocol event.  The name attribute gives the
+  name of the event, and the number attribute gives the event number.  The
+  content of the event element represents the fields in the event, and
+  consists of zero or more of the field, pad, and list elements listed in the
+  "Structure Contents" section below.
+
+  If the optional no-sequence-number attribute is true, the event does not
+  include a sequence number.  This is a special-case for the KeymapNotify
+  event in the core protocol, and should not be used in any other event.
+
+  If the optional xge attribute is true, the event is an X Generic Event and
+  will be treated as such.
+
+  The no-sequence-number and xge attribute can not be combined.
+
+<error name="identifier" number="integer">
+  structure contents
+</error>
+
+  This element represents an X protocol error.  The name attribute gives the
+  name of the error, and the number attribute gives the error number.  The
+  content of the error element represents the fields in the error, and
+  consists of zero or more of the field, pad, and list elements listed in the
+  "Structure Contents" section below.
+
+<eventcopy name="identifier" number="identifier" ref="identifier" />
+
+  This element creates an alias for the event named in the ref attribute, with
+  the new name given in the name attribute, and the new event number given in
+  the number attribute.
+
+<errorcopy name="identifier" number="identifier" ref="identifier" />
+
+  This element creates an alias for the error named in the ref attribute, with
+  the new name given in the name attribute, and the new error number given in
+  the number attribute.
+
+
+Structure Contents
+------------------
+
+Note: "type" attributes below refer to types defined by previous elements,
+either in the current extension, xproto, or one of the imported extensions.
+The type name must refer to only one possible type; if more than one type
+matches, an error occurs.  To avoid this, the type may be explicitly prefixed
+with a namespace, which should be the value of the header attribute on the
+protocol description containing the desired type.  The namespace and type are
+separated by a single colon.  For example, to refer to the PIXMAP type defined
+in glx rather than the one defined in xproto, use type="glx:PIXMAP" rather
+than type="PIXMAP".
+
+Note: Most of the below may optionally contain an enum, altenum, mask or altmask
+attribute, which follows the above rules for "type". "enum" is an exhaustive
+enum; the value is restricted to one of the constants named in the enum.
+"altenum" may be one of the values contained in the enum, but it need not be.
+"mask" refers to an exhaustive enum to be used as a bitmask.
+"altmask" may be a mask from the referred enum, but it need not be.
+
+<pad bytes="integer" serialize="bool" />
+
+  This element declares some padding in a data structure.  The bytes
+  attribute declares the number of bytes of padding.
+
+  If serialize="true", then the pad will be serialized/deserialized.
+  This is only needed for ABI compatibility with legacy.
+  Newly added pads should not be defined with serialize="true".
+
+  The serialize attribute may be omitted.
+  Default is serialize="false".
+
+<field type="identifier" name="identifier" />
+
+  This element represents a field in a data structure.  The type attribute
+  declares the data type of the field, and the name attribute gives the name
+  of the field.
+
+<fd name="identifier" />
+
+  This element represents a file descriptor field passed with the request.  The
+  name attribute gives the name of the field.
+
+  While ordinary fields are encoded as part of the request, file descriptor
+  fields are generally passed via an out-of-band mechanism.
+
+<list type="identifier" name="identifier">expression</list>
+
+  This element represents an array or list of fields in a data structure.  The
+  type attribute declares the data type of the field, and the name attribute
+  gives the name of the field.  The content is an expression giving the length
+  of the list in terms of other fields in the structure.  See the section
+  "Expressions" for details on the expression representation.
+
+<exprfield type="identifier" name="identifier">expression</exprfield>
+
+  This element represents a field in a request that is calculated rather than
+  supplied by the caller.  The type attribute declares the data type of the
+  field, and the name attribute gives the name of the field.  The content is
+  the expression giving the value of the field.  See the section "Expressions"
+  for details on the expression representation.
+
+<valueparam value-mask-type="identifier" value-mask-name="identifier"
+            value-list-name="identifier" />
+
+  This element represents a BITMASK/LISTofVALUE parameter pair: a bitmask
+  defining the set of values included, and a list containing these values.
+  value-mask-type gives the type of the bitmask; this must be CARD16 or
+  CARD32.  value-mask-name gives the field name of the bitmask, and
+  value-list-name gives the field name of the list of values. Please use
+  <switch> instead for new protocol definitions.
+
+<switch name="identifier"> switch expression
+    <bitcase [name="identifier"]> bitcase expression(s), fields </bitcase>
+    <case [name="identifier"]> case expression(s), fields </case>
+</switch>
+
+  This element represents conditional inclusion of fields. It can be viewed
+  as sequence of multiple ifs:
+
+  <bitcase>:
+    if ( switch expression & bitcase expression ) is non-zero,
+    bitcase fields are included in structure.
+
+  <case>:
+    if ( switch expression == case expression ) is true,
+    then case fields are included in structure.
+
+  It can be used only as the last field of a structure.
+
+  When a bitcase or case includes multiple <enumref> clauses, the contents
+  of the bitcase or case are only present once regardless of the number of
+  bitcase or case expressions that match.
+
+  <enumref> inside <bitcase> can only refer to an enum's <bit> members.
+  <enumref> inside <case> can only refer to an enum's <value> members.
+
+  A switch may contain multiple <bitcase> or <case> elements.
+  Usually it will only contain <bitcase> elements
+  or only contain <case> elements.
+  That is, mixing of <case> and <bitcase> usually doesn't make any sense.
+
+  The same value may appear in multiple <case> or <bitcase> elements.
+
+  New protocol definitions should prefer to use this instead of <valueparam>
+  and instead of <union>.
+
+
+Expressions
+-----------
+
+  Expressions consist of a tree of <op> elements with leaves consisting of
+  <fieldref> or <value> elements.
+
+<op op="operator">expression expression</op>
+
+  The op element represents an operator, with the op attribute specifying
+  which operator.  The supported operations are +, -, *, /, &amp;, and
+  &lt;&lt;, and their semantics are identical to the corresponding operators
+  in C.  The two operand expressions may be other expression elements.
+
+<fieldref>identifier</fieldref>
+
+  The fieldref element represents a reference to the value of another field in
+  the structure containing this expression.  The identifier is the value of
+  the "name" attribute on the referenced field.
+
+<paramref type="type">identifier</paramref>
+
+  A paramref is similar to a fieldref, but it refers to the value of
+  a field in the context which refers to the struct which contains the paramref.
+
+  So, it refers to a field outside of the structure where it is defined.
+  This has the following consequences:
+  * The generator cannot deduce its type.
+    So, it is mandatory to specify its type.
+  * The identifier-name must not be used as a field in the structure
+    which contaons the paramref.
+
+  For an example, see struct "DeviceTimeCoord" and request/reply
+  "GetDeviceMotionEvents" in xinput.xml, where paramref "num_axes"
+  in struct DeviceTimeCoord refers to field "num_axes" in
+  the DeviceTimeCoord reply.
+
+<value>integer</value>
+
+  The value element represents a literal integer value in an expression.  The
+  integer may be expressed in decimal or hexadecimal.
+
+<bit>integer</bit>
+
+  The bit element represents a literal bitmask value in an expression.
+  The integer must be in the range 0..31, expanding to (1<<n) in C.
+
+<enumref ref="identifier">enum item identifier</enumref>
+
+  This element represents a reference to item of enum.
+
+<unop op="operator">expression</unop>
+
+  This element represents a unary operator, with the op attribute specifying
+  which operator. The only supported operation so far is ~, and its semantic
+  is identical to the corresponding operator in C.
+
+<sumof ref="identifier" />
+
+  This element represents a sumation of the elements of the referenced list.
+
+<sumof ref="identifier" >expression</sumof>
+
+  The expression is evaluated for each element of the referenced list,
+  in the context of this element.
+  This sumof element then represents a sumation of the results of these
+  evaluations.
+
+  expression will usually be a fieldref which references a field of
+  a list-element or an expression containing a fieldref,
+  such as popcount of a fieldref.
+
+<popcount>expression</popcount>
+
+  This element represents the number of bits set in the expression.
+
+<listelement-ref/>
+
+  This element represents the current list-element when used inside
+  a list-iteration expression such as <sumof>.
+
+
+Event-Type-Selector List
+------------------------
+
+  The event-type-selector list selects a set of eventtypes.
+  It consists of any number of the following elements:
+
+  <allowed extension="identifier" xge="boolean"
+           opcode-min="integer" opcode-max="integer" />
+
+  The extension attribute selects events from the given extension.
+
+  If the xge attribute is true, the event is an X Generic Event and
+  will be treated as such.
+
+  opcode-min and opcode-max describe the minimum and maximum opcode
+  respectively. The opcode is the same number as the number-attribute
+  of an event definition. I.e. this is the offset from the event-base
+  to the actual number used on the wire.
+
+  In the current implementation, only xge="false" is supported.
+
+
+Documentation
+-------------
+
+  Documentation for each request, reply or event is stored in the appropriate
+  element using a <doc> element. The <doc> element can contain the following
+  elements:
+
+<brief>brief description</brief>
+
+  A short description of the request, reply or event. For example "makes a
+  window visible" for MapWindow. This will end up in the manpage NAME section
+  and in the doxygen @brief description.
+
+<description><![CDATA[longer description]]></description>
+
+  The full description. Use `` to highlight words, such as "Draws
+  `points_len`-1 lines between each pair of points…"
+
+<example><![CDATA[example code]]</description>
+
+  Example C code illustrating the usage of the particular request, reply or
+  event.
+
+<field name="name">field description</field>
+
+  The full description for the specified field. Depending on the context, this
+  is either a request parameter or a reply/event datastructure field.
+
+<error type="type">error description</field>
+
+  The full description for an error which can occur due to this request.
+
+<see type="request" name="name" />
+
+  A reference to another relevant program, function, request or event.
diff --git a/third_party/xcbproto/src/src/.gitattributes b/third_party/xcbproto/src/src/.gitattributes
new file mode 100644
index 000000000000..8d345b069b6b
--- /dev/null
+++ b/third_party/xcbproto/src/src/.gitattributes
@@ -0,0 +1 @@
+*.xml diff=xcb
diff --git a/third_party/xcbproto/src/src/Makefile.am b/third_party/xcbproto/src/src/Makefile.am
new file mode 100644
index 000000000000..d81d818a6200
--- /dev/null
+++ b/third_party/xcbproto/src/src/Makefile.am
@@ -0,0 +1,38 @@
+xcbinclude_HEADERS = \
+	xcb.xsd \
+	xproto.xml \
+	bigreq.xml \
+	composite.xml \
+	damage.xml \
+	dpms.xml \
+	dri2.xml \
+	dri3.xml \
+	ge.xml \
+	glx.xml \
+	present.xml \
+	randr.xml \
+	record.xml \
+	render.xml \
+	res.xml \
+	screensaver.xml \
+	shape.xml \
+	shm.xml \
+	sync.xml \
+	xc_misc.xml \
+	xevie.xml \
+	xf86dri.xml \
+	xf86vidmode.xml \
+	xfixes.xml \
+	xinerama.xml \
+	xinput.xml \
+	xkb.xml \
+	xprint.xml \
+	xselinux.xml \
+	xtest.xml \
+	xv.xml \
+	xvmc.xml
+
+if HAVE_XMLLINT
+check-local:
+	$(XMLLINT) --noout --schema $(srcdir)/xcb.xsd $(srcdir)/*.xml
+endif
diff --git a/third_party/xcbproto/src/src/bigreq.xml b/third_party/xcbproto/src/src/bigreq.xml
new file mode 100644
index 000000000000..3cca2f77fcf5
--- /dev/null
+++ b/third_party/xcbproto/src/src/bigreq.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2001-2004 Bart Massey, Jamey Sharp, and Josh Triplett.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<xcb header="bigreq" extension-xname="BIG-REQUESTS"
+    extension-name="BigRequests" extension-multiword="true"
+    major-version="0" minor-version="0">
+
+  <request name="Enable" opcode="0">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="maximum_request_length" />
+    </reply>
+  </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/composite.xml b/third_party/xcbproto/src/src/composite.xml
new file mode 100644
index 000000000000..86de14629b17
--- /dev/null
+++ b/third_party/xcbproto/src/src/composite.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2004 Josh Triplett.  All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<!-- This file describes version 0.3 of COMPOSITE. -->
+<xcb header="composite" extension-xname="Composite" extension-name="Composite"
+    major-version="0" minor-version="4">
+
+  <import>xproto</import>
+  <import>xfixes</import>
+
+  <enum name="Redirect">
+    <item name="Automatic"> <value>0</value> </item>
+    <item name="Manual">    <value>1</value> </item>
+  </enum>
+
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD32" name="client_major_version" />
+    <field type="CARD32" name="client_minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="major_version" />
+      <field type="CARD32" name="minor_version" />
+      <pad bytes="16" />
+    </reply>
+  </request>
+
+  <request name="RedirectWindow" opcode="1">
+    <field type="WINDOW" name="window" />
+    <field type="CARD8" name="update" enum="Redirect" />
+    <pad bytes="3" />
+  </request>
+
+  <request name="RedirectSubwindows" opcode="2">
+    <field type="WINDOW" name="window" />
+    <field type="CARD8" name="update" enum="Redirect" />
+    <pad bytes="3" />
+  </request>
+
+  <request name="UnredirectWindow" opcode="3">
+    <field type="WINDOW" name="window" />
+    <field type="CARD8" name="update" enum="Redirect" />
+    <pad bytes="3" />
+  </request>
+
+  <request name="UnredirectSubwindows" opcode="4">
+    <field type="WINDOW" name="window" />
+    <field type="CARD8" name="update" enum="Redirect" />
+    <pad bytes="3" />
+  </request>
+
+  <request name="CreateRegionFromBorderClip" opcode="5">
+    <field type="REGION" name="region" />
+    <field type="WINDOW" name="window" />
+  </request>
+
+  <request name="NameWindowPixmap" opcode="6">
+    <field type="WINDOW" name="window" />
+    <field type="PIXMAP" name="pixmap" />
+  </request>
+  
+  <!-- new in version 0.3 -->
+  
+  <request name="GetOverlayWindow" opcode="7">
+    <field type="WINDOW" name="window" />
+    <reply>
+      <pad bytes="1" />
+      <field type="WINDOW" name="overlay_win" />
+      <pad bytes="20" />
+    </reply>
+  </request>
+
+  <request name="ReleaseOverlayWindow" opcode="8">
+    <field type="WINDOW" name="window" />
+  </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/damage.xml b/third_party/xcbproto/src/src/damage.xml
new file mode 100644
index 000000000000..c04721d1e34d
--- /dev/null
+++ b/third_party/xcbproto/src/src/damage.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2004 Josh Triplett
+Copyright (C) 2007 Jeremy Kolb
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<!-- This file describes version 1.1 of DAMAGE. -->
+<xcb header="damage" extension-xname="DAMAGE" extension-name="Damage"
+    major-version="1" minor-version="1">
+  <import>xproto</import>
+  <import>xfixes</import>
+
+  <xidtype name="DAMAGE" />
+
+  <enum name="ReportLevel">
+    <item name="RawRectangles">   <value>0</value> </item>
+    <item name="DeltaRectangles"> <value>1</value> </item>
+    <item name="BoundingBox">     <value>2</value> </item>
+    <item name="NonEmpty">        <value>3</value> </item>
+  </enum>
+
+  <error name="BadDamage" number="0" />
+
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD32" name="client_major_version" />
+    <field type="CARD32" name="client_minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="major_version" />
+      <field type="CARD32" name="minor_version" />
+      <pad bytes="16" />
+    </reply>
+  </request>
+
+  <request name="Create" opcode="1">
+    <field type="DAMAGE"   name="damage" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD8"    name="level" enum="ReportLevel" />
+    <pad bytes="3" />
+  </request>
+
+  <request name="Destroy" opcode="2">
+    <field type="DAMAGE" name="damage" />
+  </request>
+
+  <request name="Subtract" opcode="3">
+    <field type="DAMAGE" name="damage" />
+    <field type="REGION" name="repair" altenum="Region" />
+    <field type="REGION" name="parts" altenum="Region" />
+  </request>
+
+  <request name="Add" opcode="4">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="REGION" name="region" />
+  </request>
+
+  <event name="Notify" number="0">
+    <field type="CARD8"     name="level" enum="ReportLevel" />
+    <field type="DRAWABLE"  name="drawable" />
+    <field type="DAMAGE"    name="damage" />
+    <field type="TIMESTAMP" name="timestamp" />
+    <field type="RECTANGLE" name="area" />
+    <field type="RECTANGLE" name="geometry" />
+  </event>
+</xcb>
diff --git a/third_party/xcbproto/src/src/dpms.xml b/third_party/xcbproto/src/src/dpms.xml
new file mode 100644
index 000000000000..55812845fb3f
--- /dev/null
+++ b/third_party/xcbproto/src/src/dpms.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2001-2004 Bart Massey, Jamey Sharp, and Josh Triplett.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<xcb header="dpms" extension-xname="DPMS" extension-name="DPMS"
+    major-version="0" minor-version="0">
+  <request name="GetVersion" opcode="0">
+    <field type="CARD16" name="client_major_version" />
+    <field type="CARD16" name="client_minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="server_major_version" />
+      <field type="CARD16" name="server_minor_version" />
+    </reply>
+  </request>
+
+  <request name="Capable" opcode="1">
+    <reply>
+      <pad bytes="1" />
+      <field type="BOOL" name="capable" />
+      <pad bytes="23" />
+    </reply>
+  </request>
+
+  <request name="GetTimeouts" opcode="2">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="standby_timeout" />
+      <field type="CARD16" name="suspend_timeout" />
+      <field type="CARD16" name="off_timeout" />
+      <pad bytes="18" />
+    </reply>
+  </request>
+
+  <request name="SetTimeouts" opcode="3">
+    <field type="CARD16" name="standby_timeout" />
+    <field type="CARD16" name="suspend_timeout" />
+    <field type="CARD16" name="off_timeout" />
+  </request>
+
+  <request name="Enable" opcode="4" />
+
+  <request name="Disable" opcode="5" />
+
+  <enum name="DPMSMode">
+    <item name="On">      <value>0</value> </item>
+    <item name="Standby"> <value>1</value> </item>
+    <item name="Suspend"> <value>2</value> </item>
+    <item name="Off">     <value>3</value> </item>
+  </enum>
+
+  <request name="ForceLevel" opcode="6">
+    <field type="CARD16" name="power_level" enum="DPMSMode" />
+  </request>
+
+  <request name="Info" opcode="7">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="power_level" enum="DPMSMode" />
+      <field type="BOOL" name="state" />
+      <pad bytes="21" />
+    </reply>
+  </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/dri2.xml b/third_party/xcbproto/src/src/dri2.xml
new file mode 100644
index 000000000000..3b4c12e9b97e
--- /dev/null
+++ b/third_party/xcbproto/src/src/dri2.xml
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2005 Jeremy Kolb.
+Copyright © 2009 Intel Corporation
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<xcb header="dri2" extension-xname="DRI2" extension-name="DRI2"
+  major-version="1" minor-version="4">
+  <import>xproto</import>
+
+  <enum name="Attachment">
+    <item name="BufferFrontLeft">      <value>0</value> </item>
+    <item name="BufferBackLeft">       <value>1</value> </item>
+    <item name="BufferFrontRight">     <value>2</value> </item>
+    <item name="BufferBackRight">      <value>3</value> </item>
+    <item name="BufferDepth">          <value>4</value> </item>
+    <item name="BufferStencil">        <value>5</value> </item>
+    <item name="BufferAccum">          <value>6</value> </item>
+    <item name="BufferFakeFrontLeft">  <value>7</value> </item>
+    <item name="BufferFakeFrontRight"> <value>8</value> </item>
+    <item name="BufferDepthStencil">   <value>9</value> </item>
+    <item name="BufferHiz">            <value>10</value> </item>
+  </enum>
+
+  <enum name="DriverType">
+    <item name="DRI">   <value>0</value> </item>
+    <item name="VDPAU"> <value>1</value> </item>
+  </enum>
+
+  <enum name="EventType">
+    <item name="ExchangeComplete"><value>1</value></item>
+    <item name="BlitComplete">    <value>2</value></item>
+    <item name="FlipComplete">    <value>3</value></item>
+  </enum>
+
+  <!-- Types -->
+
+  <struct name="DRI2Buffer">
+    <field type="CARD32" name="attachment" enum="Attachment" />
+    <field type="CARD32" name="name" />
+    <field type="CARD32" name="pitch" />
+    <field type="CARD32" name="cpp" />
+    <field type="CARD32" name="flags" />
+  </struct>
+
+  <struct name="AttachFormat">
+    <field type="CARD32" name="attachment" enum="Attachment" />
+    <field type="CARD32" name="format" />
+  </struct>
+
+  <!-- Requests -->
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD32" name="major_version" />
+    <field type="CARD32" name="minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="major_version" />
+      <field type="CARD32" name="minor_version" />
+    </reply>
+  </request>
+
+  <request name="Connect" opcode="1">
+    <field type="WINDOW" name="window" />
+    <field type="CARD32" name="driver_type" enum="DriverType" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="driver_name_length" />
+      <field type="CARD32" name="device_name_length" />
+      <pad bytes="16" />
+      <list type="char" name="driver_name">
+        <fieldref>driver_name_length</fieldref>
+      </list>
+      <list type="void" name="alignment_pad">
+	  <op op="-">
+	      <op op="&amp;">
+		  <op op="+">
+		      <fieldref>driver_name_length</fieldref>
+		      <value>3</value>
+		  </op>
+		  <unop op="~">
+		      <value>3</value>
+		  </unop>
+	      </op>
+	      <fieldref>driver_name_length</fieldref>
+	  </op>
+      </list>
+      <list type="char" name="device_name">
+        <fieldref>device_name_length</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="Authenticate" opcode="2">
+    <field type="WINDOW" name="window" />
+    <field type="CARD32" name="magic" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="authenticated" />
+    </reply>
+  </request>
+
+  <request name="CreateDrawable" opcode="3">
+    <field type="DRAWABLE" name="drawable" />
+  </request>
+
+  <request name="DestroyDrawable" opcode="4">
+    <field type="DRAWABLE" name="drawable" />
+  </request>
+
+  <request name="GetBuffers" opcode="5">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="count" />
+    <list type="CARD32" name="attachments">
+    <!-- The length field should be linked but we can't correct it without breaking API -->
+    <!-- <fieldref>count</fieldref> -->
+    </list>
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="width" />
+      <field type="CARD32" name="height" />
+      <field type="CARD32" name="count" />
+      <pad bytes="12" />
+      <list type="DRI2Buffer" name="buffers">
+        <fieldref>count</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="CopyRegion" opcode="6">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="region" />
+    <field type="CARD32" name="dest" />
+    <field type="CARD32" name="src" />
+    <reply>
+      <pad bytes="1" />
+    </reply>
+  </request>
+
+  <request name="GetBuffersWithFormat" opcode="7">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="count" />
+    <list type="AttachFormat" name="attachments">
+    <!-- The length field should be linked but we can't correct it without breaking API -->
+    <!-- <fieldref>count</fieldref> -->
+    </list>
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="width" />
+      <field type="CARD32" name="height" />
+      <field type="CARD32" name="count" />
+      <pad bytes="12" />
+      <list type="DRI2Buffer" name="buffers">
+        <fieldref>count</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <!-- Version 1.2 -->
+
+  <request name="SwapBuffers" opcode="8">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="target_msc_hi" />
+    <field type="CARD32" name="target_msc_lo" />
+    <field type="CARD32" name="divisor_hi" />
+    <field type="CARD32" name="divisor_lo" />
+    <field type="CARD32" name="remainder_hi" />
+    <field type="CARD32" name="remainder_lo" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="swap_hi" />
+      <field type="CARD32" name="swap_lo" />
+    </reply>
+  </request>
+
+  <request name="GetMSC" opcode="9">
+    <field type="DRAWABLE" name="drawable" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="ust_hi" />
+      <field type="CARD32" name="ust_lo" />
+      <field type="CARD32" name="msc_hi" />
+      <field type="CARD32" name="msc_lo" />
+      <field type="CARD32" name="sbc_hi" />
+      <field type="CARD32" name="sbc_lo" />
+    </reply>
+  </request>
+
+  <request name="WaitMSC" opcode="10">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="target_msc_hi" />
+    <field type="CARD32" name="target_msc_lo" />
+    <field type="CARD32" name="divisor_hi" />
+    <field type="CARD32" name="divisor_lo" />
+    <field type="CARD32" name="remainder_hi" />
+    <field type="CARD32" name="remainder_lo" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="ust_hi" />
+      <field type="CARD32" name="ust_lo" />
+      <field type="CARD32" name="msc_hi" />
+      <field type="CARD32" name="msc_lo" />
+      <field type="CARD32" name="sbc_hi" />
+      <field type="CARD32" name="sbc_lo" />
+    </reply>
+  </request>
+
+  <request name="WaitSBC" opcode="11">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="target_sbc_hi" />
+    <field type="CARD32" name="target_sbc_lo" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="ust_hi" />
+      <field type="CARD32" name="ust_lo" />
+      <field type="CARD32" name="msc_hi" />
+      <field type="CARD32" name="msc_lo" />
+      <field type="CARD32" name="sbc_hi" />
+      <field type="CARD32" name="sbc_lo" />
+    </reply>
+  </request>
+
+  <request name="SwapInterval" opcode="12">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="interval" />
+  </request>
+
+  <!-- Version 1.4 -->
+
+  <request name="GetParam" opcode="13">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="param" />
+    <reply>
+      <field type="BOOL" name="is_param_recognized" />
+      <field type="CARD32" name="value_hi" />
+      <field type="CARD32" name="value_lo" />
+    </reply>
+  </request>
+
+  <!-- Events -->
+
+  <event name="BufferSwapComplete" number="0">
+    <pad bytes="1" />
+    <field type="CARD16" name="event_type" enum="EventType" />
+    <pad bytes="2" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="ust_hi" />
+    <field type="CARD32" name="ust_lo" />
+    <field type="CARD32" name="msc_hi" />
+    <field type="CARD32" name="msc_lo" />
+    <field type="CARD32" name="sbc" />
+  </event>
+
+  <!-- Version 1.3 -->
+
+  <event name="InvalidateBuffers" number="1">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+  </event>
+</xcb>
diff --git a/third_party/xcbproto/src/src/dri3.xml b/third_party/xcbproto/src/src/dri3.xml
new file mode 100644
index 000000000000..895d12a53aa0
--- /dev/null
+++ b/third_party/xcbproto/src/src/dri3.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Copyright © 2013 Keith Packard
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and
+that the name of the copyright holders not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.  The copyright holders make no representations
+about the suitability of this software for any purpose.  It is provided "as
+is" without express or implied warranty.
+
+THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+-->
+
+<xcb header="dri3" extension-xname="DRI3" extension-name="DRI3"
+  major-version="1" minor-version="2">
+  <import>xproto</import>
+
+  <!-- Types -->
+
+  <!-- Requests -->
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD32" name="major_version" />
+    <field type="CARD32" name="minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="major_version" />
+      <field type="CARD32" name="minor_version" />
+    </reply>
+  </request>
+
+  <request name="Open" opcode="1">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="provider" />
+    <reply>
+      <field type="CARD8" name="nfd"/>
+      <fd name="device_fd" />
+      <pad bytes="24" />
+    </reply>
+  </request>
+
+  <request name="PixmapFromBuffer" opcode="2">
+    <field type="PIXMAP" name="pixmap" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="size" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD16" name="stride" />
+    <field type="CARD8" name="depth" />
+    <field type="CARD8" name="bpp" />
+    <fd name="pixmap_fd" />
+  </request>
+
+  <request name="BufferFromPixmap" opcode="3">
+    <field type="PIXMAP" name="pixmap" />
+    <reply>
+      <field type="CARD8" name="nfd"/>
+      <field type="CARD32" name="size" />
+      <field type="CARD16" name="width" />
+      <field type="CARD16" name="height" />
+      <field type="CARD16" name="stride" />
+      <field type="CARD8" name="depth" />
+      <field type="CARD8" name="bpp" />
+      <fd name="pixmap_fd" />
+      <pad bytes="12"/>
+    </reply>
+  </request>
+
+  <request name="FenceFromFD" opcode="4">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="fence"/>
+    <field type="BOOL" name="initially_triggered"/>
+    <pad bytes="3"/>
+    <fd name="fence_fd"/>
+  </request>
+
+  <request name="FDFromFence" opcode="5">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="fence"/>
+    <reply>
+      <field type="CARD8" name="nfd"/>
+      <fd name="fence_fd" />
+      <pad bytes="24"/>
+    </reply>
+  </request>
+
+  <!-- v1.2 -->
+  <request name="GetSupportedModifiers" opcode="6">
+    <field type="CARD32" name="window" />
+    <field type="CARD8" name="depth"/>
+    <field type="CARD8" name="bpp"/>
+    <pad bytes="2"/>
+    <reply>
+      <required_start_align align="8" />
+      <pad bytes="1" />
+      <field type="CARD32" name="num_window_modifiers" />
+      <field type="CARD32" name="num_screen_modifiers" />
+      <pad bytes="16" />
+      <list type="CARD64" name="window_modifiers">
+        <fieldref>num_window_modifiers</fieldref>
+      </list>
+      <list type="CARD64" name="screen_modifiers">
+        <fieldref>num_screen_modifiers</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="PixmapFromBuffers" opcode="7">
+    <required_start_align align="8" />
+    <field type="PIXMAP" name="pixmap" />
+    <field type="WINDOW" name="window" />
+    <field type="CARD8" name="num_buffers" />
+    <pad bytes="3" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD32" name="stride0" />
+    <field type="CARD32" name="offset0" />
+    <field type="CARD32" name="stride1" />
+    <field type="CARD32" name="offset1" />
+    <field type="CARD32" name="stride2" />
+    <field type="CARD32" name="offset2" />
+    <field type="CARD32" name="stride3" />
+    <field type="CARD32" name="offset3" />
+    <field type="CARD8" name="depth" />
+    <field type="CARD8" name="bpp" />
+    <pad bytes="2" />
+    <field type="CARD64" name="modifier" />
+    <list type="fd" name="buffers">
+      <fieldref>num_buffers</fieldref>
+    </list>
+  </request>
+
+  <request name="BuffersFromPixmap" opcode="8">
+    <field type="PIXMAP" name="pixmap" />
+    <reply>
+      <required_start_align align="8" />
+      <field type="CARD8" name="nfd"/>
+      <field type="CARD16" name="width" />
+      <field type="CARD16" name="height" />
+      <pad bytes="4"/>
+      <field type="CARD64" name="modifier" />
+      <field type="CARD8" name="depth" />
+      <field type="CARD8" name="bpp" />
+      <pad bytes="6"/>
+      <list type="CARD32" name="strides">
+        <fieldref>nfd</fieldref>
+      </list>
+      <list type="CARD32" name="offsets">
+        <fieldref>nfd</fieldref>
+      </list>
+      <list type="fd" name="buffers">
+        <fieldref>nfd</fieldref>
+      </list>
+    </reply>
+  </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/ge.xml b/third_party/xcbproto/src/src/ge.xml
new file mode 100644
index 000000000000..3a6210d97d97
--- /dev/null
+++ b/third_party/xcbproto/src/src/ge.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2009 Open Text Corporation.  All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<xcb header="ge" extension-xname="Generic Event Extension" extension-name="GenericEvent"
+    major-version="1" minor-version="0">
+
+  <!-- Version 1 -->
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD16" name="client_major_version" />
+    <field type="CARD16" name="client_minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="major_version" />
+      <field type="CARD16" name="minor_version" />
+      <pad bytes="20" />
+    </reply>
+  </request>
+
+</xcb>
diff --git a/third_party/xcbproto/src/src/glx.xml b/third_party/xcbproto/src/src/glx.xml
new file mode 100644
index 000000000000..2e50aeaa1646
--- /dev/null
+++ b/third_party/xcbproto/src/src/glx.xml
@@ -0,0 +1,1639 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2005 Jeremy Kolb.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person ob/Sintaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<!--
+Note that on X.org servers before 6.9 (and probably others as well) the length
+field in the reply is computed incorrectly for GetFBConfigs and
+VendorPrivateWithReply vendor_code 0x10004 (GetFBConfigsSGIX). For these
+requests the reply structure begins:
+	<pad bytes="1" />
+	<field type="CARD32" name="numVisuals" />
+	<field type="CARD32" name="numProps" />
+The correct value for the length field is
+	numVisuals * numProps * 2
+but on broken servers the "* 2" was missing. A workaround that is correct for
+all implementations is to rewrite the length field on receipt on the client
+side, using the expression above.
+
+The patch that fixed this server bug in X.org CVS is here:
+	http://cvs.freedesktop.org/xorg/xserver/xorg/GL/glx/glxcmds.c?r1=1.6&r2=1.7
+-->
+
+<xcb header="glx" extension-xname="GLX" extension-name="Glx"
+    major-version="1" minor-version="4">
+
+	<import>xproto</import>
+
+	<xidtype name="PIXMAP" />
+	<xidtype name="CONTEXT" />
+	<xidtype name="PBUFFER" />
+	<xidtype name="WINDOW" />
+        <xidtype name="FBCONFIG" />
+
+        <xidunion name="DRAWABLE">
+            <type>xproto:WINDOW</type>
+            <type>PBUFFER</type>
+            <type>glx:PIXMAP</type>
+            <type>glx:WINDOW</type>
+        </xidunion>
+
+	<typedef oldname="float" newname="FLOAT32" />
+	<typedef oldname="double" newname="FLOAT64" />
+        <typedef oldname="CARD32" newname="BOOL32" />
+        <typedef oldname="CARD32" newname="CONTEXT_TAG" />
+	    
+	<!-- Errors -->
+	<error name="Generic" number="-1"> <!-- FIXME: fake number -->
+		<field type="CARD32" name="bad_value" />
+		<field type="CARD16" name="minor_opcode" />
+		<field type="CARD8" name="major_opcode" />
+		<pad bytes="21" />
+	</error>
+
+	<errorcopy name="BadContext" number="0" ref="Generic" />
+	<errorcopy name="BadContextState" number="1" ref="Generic" />
+	<errorcopy name="BadDrawable" number="2" ref="Generic" />
+	<errorcopy name="BadPixmap" number="3" ref="Generic" />
+	<errorcopy name="BadContextTag" number="4" ref="Generic" />
+	<errorcopy name="BadCurrentWindow" number="5" ref="Generic" />
+	<errorcopy name="BadRenderRequest" number="6" ref="Generic" />
+	<errorcopy name="BadLargeRequest" number="7" ref="Generic" />
+	<errorcopy name="UnsupportedPrivateRequest" number="8" ref="Generic" />
+	<errorcopy name="BadFBConfig" number="9" ref="Generic" />
+	<errorcopy name="BadPbuffer" number="10" ref="Generic" />
+	<errorcopy name="BadCurrentDrawable" number="11" ref="Generic" />
+	<errorcopy name="BadWindow" number="12" ref="Generic" />
+	<errorcopy name="GLXBadProfileARB" number="13" ref="Generic" />
+
+	<!-- Events -->
+	<event name="PbufferClobber" number="0">
+		<pad bytes="1" />
+		<field type="CARD16" name="event_type" />
+		<field type="CARD16" name="draw_type" />
+		<field type="glx:DRAWABLE" name="drawable" />
+		<field type="CARD32" name="b_mask" />
+		<field type="CARD16" name="aux_buffer" />
+		<field type="CARD16" name="x" />
+		<field type="CARD16" name="y" />
+		<field type="CARD16" name="width" />
+		<field type="CARD16" name="height" />
+		<field type="CARD16" name="count" />
+		<pad bytes="4" />
+	</event>
+
+	<event name="BufferSwapComplete" number="1">
+		<pad bytes="1" />
+		<field type="CARD16" name="event_type" />
+		<pad bytes="2" />
+		<field type="glx:DRAWABLE" name="drawable" />
+		<field type="CARD32" name="ust_hi" />
+		<field type="CARD32" name="ust_lo" />
+		<field type="CARD32" name="msc_hi" />
+		<field type="CARD32" name="msc_lo" />
+		<field type="CARD32" name="sbc" />
+	</event>
+
+	<!-- enums for PbufferClobber event/draw type -->
+	<enum name="PBCET">
+		<item name="Damaged">
+			<value>32791</value>
+		</item>
+		<item name="Saved">
+			<value>32792</value>
+		</item>
+	</enum>
+
+	<enum name="PBCDT">
+		<item name="Window">
+			<value>32793</value>
+		</item>
+		<item name="Pbuffer">
+			<value>32794</value>
+		</item>
+	</enum>
+
+	<!-- Requests -->
+	<request name="Render" opcode="1" combine-adjacent="true">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<list type="BYTE" name="data" />
+	</request>
+
+	<request name="RenderLarge" opcode="2">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD16" name="request_num" />
+		<field type="CARD16" name="request_total" />
+		<field type="CARD32" name="data_len" />
+		<list type="BYTE" name="data">
+		    <fieldref>data_len</fieldref>
+		</list>
+	</request>
+
+	<request name="CreateContext" opcode="3">
+		<field type="glx:CONTEXT" name="context" />
+		<field type="VISUALID" name="visual" />
+		<field type="CARD32" name="screen" />
+		<field type="glx:CONTEXT" name="share_list" />
+		<field type="BOOL" name="is_direct" />
+		<pad bytes="3" />
+	</request>
+
+	<request name="DestroyContext" opcode="4">
+		<field type="glx:CONTEXT" name="context" />
+	</request>
+
+	<request name="MakeCurrent" opcode="5">
+		<field type="glx:DRAWABLE" name="drawable" />
+		<field type="glx:CONTEXT" name="context" />
+		<field type="CONTEXT_TAG" name="old_context_tag" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CONTEXT_TAG" name="context_tag" />
+			<pad bytes="20" />
+		</reply>
+	</request>
+
+	<request name="IsDirect" opcode="6">
+		<field type="glx:CONTEXT" name="context" />
+		<reply>
+			<pad bytes="1" />
+			<field type="BOOL" name="is_direct" />
+			<pad bytes="23" />
+		</reply>
+	</request>
+
+	<request name="QueryVersion" opcode="7">
+		<field type="CARD32" name="major_version" />
+		<field type="CARD32" name="minor_version" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD32" name="major_version" />
+			<field type="CARD32" name="minor_version" />
+			<pad bytes="16" />
+		</reply>
+	</request>
+
+	<request name="WaitGL" opcode="8">
+		<field type="CONTEXT_TAG" name="context_tag" />
+	</request>
+
+	<request name="WaitX" opcode="9">
+		<field type="CONTEXT_TAG" name="context_tag" />
+	</request>
+
+	<request name="CopyContext" opcode="10">
+		<field type="glx:CONTEXT" name="src" />
+		<field type="glx:CONTEXT" name="dest" />
+		<field type="CARD32" name="mask" />
+		<field type="CONTEXT_TAG" name="src_context_tag" />
+	</request>
+
+	<!-- Enum for CopyContext: mask -->
+	<enum name="GC">
+		<item name="GL_CURRENT_BIT"><bit>0</bit></item>
+		<item name="GL_POINT_BIT"><bit>1</bit></item>
+		<item name="GL_LINE_BIT"><bit>2</bit></item>
+		<item name="GL_POLYGON_BIT"><bit>3</bit></item>
+		<item name="GL_POLYGON_STIPPLE_BIT"><bit>4</bit></item>
+		<item name="GL_PIXEL_MODE_BIT"><bit>5</bit></item>
+		<item name="GL_LIGHTING_BIT"><bit>6</bit></item>
+		<item name="GL_FOG_BIT"><bit>7</bit></item>
+		<item name="GL_DEPTH_BUFFER_BIT"><bit>8</bit></item>
+		<item name="GL_ACCUM_BUFFER_BIT"><bit>9</bit></item>
+		<item name="GL_STENCIL_BUFFER_BIT"><bit>10</bit></item>
+		<item name="GL_VIEWPORT_BIT"><bit>11</bit></item>
+		<item name="GL_TRANSFORM_BIT"><bit>12</bit></item>
+		<item name="GL_ENABLE_BIT"><bit>13</bit></item>
+		<item name="GL_COLOR_BUFFER_BIT"><bit>14</bit></item>
+		<item name="GL_HINT_BIT"><bit>15</bit></item>
+		<item name="GL_EVAL_BIT"><bit>16</bit></item>
+		<item name="GL_LIST_BIT"><bit>17</bit></item>
+		<item name="GL_TEXTURE_BIT"><bit>18</bit></item>
+		<item name="GL_SCISSOR_BIT"><bit>19</bit></item>
+		<item name="GL_ALL_ATTRIB_BITS"><value>16777215<!--0x000ffffff--></value></item>
+	</enum>
+
+	<request name="SwapBuffers" opcode="11">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="glx:DRAWABLE" name="drawable" />
+	</request>
+
+	<request name="UseXFont" opcode="12">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="FONT" name="font" />
+		<field type="CARD32" name="first" />
+		<field type="CARD32" name="count" />
+		<field type="CARD32" name="list_base" />
+	</request>
+
+	<request name="CreateGLXPixmap" opcode="13">
+		<field type="CARD32" name="screen" />
+		<field type="VISUALID" name="visual" />
+		<field type="xproto:PIXMAP" name="pixmap" />
+		<field type="glx:PIXMAP" name="glx_pixmap" />
+	</request>
+
+        
+	<request name="GetVisualConfigs" opcode="14">
+		<field type="CARD32" name="screen" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD32" name="num_visuals" />
+			<field type="CARD32" name="num_properties" />
+                        <pad bytes="16" />
+			<list type="CARD32" name="property_list">
+				<fieldref>length</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="DestroyGLXPixmap" opcode="15">
+		<field type="glx:PIXMAP" name="glx_pixmap" />
+	</request>
+
+	<!--
+	Context tag is not in the proto, should be part of the list of bytes
+	but every VendorPrivate and VendorPrivateWithReply request uses them
+	so it is safe to put them in.  That's how Mesa does it.
+	-->
+	<request name="VendorPrivate" opcode="16">
+		<field type="CARD32" name="vendor_code" />
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<list type="BYTE" name="data" />
+	</request>
+
+	<request name="VendorPrivateWithReply" opcode="17">
+		<field type="CARD32" name="vendor_code" />
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<list type="BYTE" name="data" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD32" name="retval" />
+			<list type="BYTE" name="data1">
+				<value>24</value>
+			</list>
+			<list type="BYTE" name="data2">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	<request name="QueryExtensionsString" opcode="18">
+		<field type="CARD32" name="screen" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<pad bytes="16" />
+		</reply>
+	</request>
+
+	<request name="QueryServerString" opcode="19">
+		<field type="CARD32" name="screen" />
+		<field type="CARD32" name="name" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="str_len" />
+			<pad bytes="16" />
+			<list type="char" name="string">
+				<fieldref>str_len</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="ClientInfo" opcode="20">
+		<field type="CARD32" name="major_version" />
+		<field type="CARD32" name="minor_version" />
+		<field type="CARD32" name="str_len" />
+		<list type="char" name="string">
+			<fieldref>str_len</fieldref>
+		</list>
+	</request>
+
+	<!-- Start of GLX 1.3 Requests -->
+
+	<request name="GetFBConfigs" opcode="21">
+		<field type="CARD32" name="screen" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD32" name="num_FB_configs" />
+			<field type="CARD32" name="num_properties" />
+                        <pad bytes="16" />
+                        <!--
+			<valueparam value-mask-type="CARD32"
+				value-mask-name="value_mask"
+                                value-list-name="value_list" />
+                            -->
+                        <list type="CARD32" name="property_list">
+				<fieldref>length</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="CreatePixmap" opcode="22">
+		<field type="CARD32" name="screen" />
+		<field type="FBCONFIG" name="fbconfig" />
+		<field type="xproto:PIXMAP" name="pixmap" />
+		<field type="glx:PIXMAP" name="glx_pixmap" />
+		<field type="CARD32" name="num_attribs" />  
+		<list type="CARD32" name="attribs">
+			<op op="*">
+				<fieldref>num_attribs</fieldref>
+				<value>2</value>
+			</op>
+		</list>
+	</request>
+
+	<request name="DestroyPixmap" opcode="23">
+		<field type="glx:PIXMAP" name="glx_pixmap" />
+	</request>
+
+	<request name="CreateNewContext" opcode="24">
+		<field type="glx:CONTEXT" name="context" />
+		<field type="FBCONFIG" name="fbconfig" />
+		<field type="CARD32" name="screen" />
+		<field type="CARD32" name="render_type" />
+		<field type="glx:CONTEXT" name="share_list" />
+		<field type="BOOL" name="is_direct" />
+		<pad bytes="3" />
+	</request>
+
+	<request name="QueryContext" opcode="25">
+		<field type="glx:CONTEXT" name="context" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD32" name="num_attribs"/>
+			<pad bytes="20" />
+			<list type="CARD32" name="attribs">
+				<op op="*">
+					<fieldref>num_attribs</fieldref>
+					<value>2</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	<request name="MakeContextCurrent" opcode="26">
+		<field type="CONTEXT_TAG" name="old_context_tag" />
+		<field type="glx:DRAWABLE" name="drawable" />
+		<field type="glx:DRAWABLE" name="read_drawable" />
+		<field type="glx:CONTEXT" name="context" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CONTEXT_TAG" name="context_tag" />
+			<pad bytes="20" />
+		</reply>
+	</request>
+
+	<request name="CreatePbuffer" opcode="27">
+		<field type="CARD32" name="screen" />
+		<field type="FBCONFIG" name="fbconfig" />
+		<field type="PBUFFER" name="pbuffer" />
+		<field type="CARD32" name="num_attribs" />
+		<list type="CARD32" name="attribs">
+			<op op="*">
+				<fieldref>num_attribs</fieldref>
+				<value>2</value>
+			</op>
+		</list>
+	</request>
+
+	<request name="DestroyPbuffer" opcode="28">
+		<field type="PBUFFER" name="pbuffer" />
+	</request>
+
+	<request name="GetDrawableAttributes" opcode="29">
+		<field type="glx:DRAWABLE" name="drawable" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD32" name="num_attribs" />
+			<pad bytes="20" />
+			<list type="CARD32" name="attribs">
+				<op op="*">
+					<fieldref>num_attribs</fieldref>
+					<value>2</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	<request name="ChangeDrawableAttributes" opcode="30">
+		<field type="glx:DRAWABLE" name="drawable" />
+		<field type="CARD32" name="num_attribs" />
+		<list type="CARD32" name="attribs">
+			<op op="*">
+				<fieldref>num_attribs</fieldref>
+				<value>2</value>
+			</op>
+		</list>
+	</request>
+
+	<request name="CreateWindow" opcode="31">
+		<field type="CARD32" name="screen" />
+		<field type="FBCONFIG" name="fbconfig" />
+		<field type="xproto:WINDOW" name="window" />
+		<field type="glx:WINDOW" name="glx_window" />
+		<field type="CARD32" name="num_attribs" />
+		<list type="CARD32" name="attribs">
+			<op op="*">
+				<fieldref>num_attribs</fieldref>
+				<value>2</value>
+			</op>
+		</list>
+	</request>
+
+	<request name="DeleteWindow" opcode="32">
+		<field type="glx:WINDOW" name="glxwindow" />
+	</request>
+
+	<!-- Start of GLX_ARB_create_context and GLX_ARB_create_context_profile
+             requests. -->
+	<request name="SetClientInfoARB" opcode="33">
+		<field type="CARD32" name="major_version" />
+		<field type="CARD32" name="minor_version" />
+		<field type="CARD32" name="num_versions" />
+		<field type="CARD32" name="gl_str_len" />
+		<field type="CARD32" name="glx_str_len" />
+		<list type="CARD32" name="gl_versions">
+			<op op="*">
+				<fieldref>num_versions</fieldref>
+				<value>2</value>
+			</op>
+		</list>
+		<list type="char" name="gl_extension_string">
+			<fieldref>gl_str_len</fieldref>
+		</list>
+		<list type="char" name="glx_extension_string">
+			<fieldref>glx_str_len</fieldref>
+		</list>
+	</request>
+
+	<request name="CreateContextAttribsARB" opcode="34">
+		<field type="glx:CONTEXT" name="context" />
+		<field type="FBCONFIG" name="fbconfig" />
+		<field type="CARD32" name="screen" />
+		<field type="glx:CONTEXT" name="share_list" />
+		<field type="BOOL" name="is_direct" />
+		<pad bytes="3" />
+		<field type="CARD32" name="num_attribs" />
+		<list type="CARD32" name="attribs">
+			<op op="*">
+				<fieldref>num_attribs</fieldref>
+				<value>2</value>
+			</op>
+		</list>
+	</request>
+
+	<request name="SetClientInfo2ARB" opcode="35">
+		<field type="CARD32" name="major_version" />
+		<field type="CARD32" name="minor_version" />
+		<field type="CARD32" name="num_versions" />
+		<field type="CARD32" name="gl_str_len" />
+		<field type="CARD32" name="glx_str_len" />
+		<list type="CARD32" name="gl_versions">
+			<op op="*">
+				<fieldref>num_versions</fieldref>
+				<value>3</value>
+			</op>
+		</list>
+		<list type="char" name="gl_extension_string">
+			<fieldref>gl_str_len</fieldref>
+		</list>
+		<list type="char" name="glx_extension_string">
+			<fieldref>glx_str_len</fieldref>
+		</list>
+	</request>
+
+	<!-- Requests for GL Non-rendering Commands (single ops) -->
+
+	<request name="NewList" opcode="101">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="list" />
+		<field type="CARD32" name="mode" />
+	</request>
+
+	<request name="EndList" opcode="102">
+		<field type="CONTEXT_TAG" name="context_tag" />
+	</request>
+
+	<request name="DeleteLists" opcode="103">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="list" />
+		<field type="INT32" name="range" />
+	</request>
+
+	<request name="GenLists" opcode="104">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="range" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD32" name="ret_val" />
+		</reply>
+	</request>
+
+	<request name="FeedbackBuffer" opcode="105">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="size" />
+		<field type="INT32" name="type" />
+	</request>
+
+	<request name="SelectBuffer" opcode="106">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="size" />
+		<!-- the reply is actually returned in the data
+		of the next RenderMode request -->
+	</request>
+
+
+	<request name="RenderMode" opcode="107">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="mode" />
+		<!--
+		This reply is only if RM was previously feedback/selection.
+		If it was in feedback mode then data is FLOAT32.
+		If previously in render mode there is no reply.
+		-->
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD32" name="ret_val" />
+			<field type="CARD32" name="n" />
+			<field type="CARD32" name="new_mode" />
+			<pad bytes="12" />
+			<list type="CARD32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<enum name="RM">
+		<item name="GL_RENDER"><value>7168</value></item>
+		<item name="GL_FEEDBACK"><value>7169</value></item>
+		<item name="GL_SELECT"><value>7170</value></item>
+	</enum>
+
+	<request name="Finish" opcode="108">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<reply>
+			<pad bytes="1" />
+		</reply>
+	</request>
+
+	<request name="PixelStoref" opcode="109">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="pname" />
+		<field type="FLOAT32" name="datum" />
+	</request>
+
+	<request name="PixelStorei" opcode="110">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="pname" />
+		<field type="INT32" name="datum" />
+	</request>
+
+	<request name="ReadPixels" opcode="111">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="x" />
+		<field type="INT32" name="y" />
+		<field type="INT32" name="width" />
+		<field type="INT32" name="height" />
+		<field type="CARD32" name="format" />
+		<field type="CARD32" name="type" />
+		<field type="BOOL" name="swap_bytes" />
+		<field type="BOOL" name="lsb_first" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="24" />
+			<list type="BYTE" name="data">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+		
+	<!-- FIXME:
+	All the Get* functions can return different stuff for replies.
+	Hopefully xcb will support multiple reply structures at some point
+	but for now... grrrr
+	Starts on page 58/180
+	-->
+	<request name="GetBooleanv" opcode="112">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="BOOL" name="datum" />
+			<pad bytes="15" />
+			<list type="BOOL" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetClipPlane" opcode="113">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="plane" />
+		<reply>
+			<required_start_align align="8" />
+			<pad bytes="1" />
+			<pad bytes="24" />
+			<list type="FLOAT64" name="data">
+				<op op="/">
+					<fieldref>length</fieldref>
+					<value>2</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetDoublev" opcode="114">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<required_start_align align="8" />
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT64" name="datum" />
+			<pad bytes="8" />
+			<list type="FLOAT64" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetError" opcode="115">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<reply>
+			<pad bytes="1" />
+			<field type="INT32" name="error" />
+		</reply>
+	</request>
+
+	<request name="GetFloatv" opcode="116">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetIntegerv" opcode="117">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetLightfv" opcode="118">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="light" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetLightiv" opcode="119">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="light" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetMapdv" opcode="120">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="query" />
+		<reply>
+			<required_start_align align="8" />
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT64" name="datum" />
+			<pad bytes="8" />
+			<list type="FLOAT64" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetMapfv" opcode="121">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="query" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetMapiv" opcode="122">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="query" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetMaterialfv" opcode="123">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="face" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetMaterialiv" opcode="124">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="face" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetPixelMapfv" opcode="125">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="map" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetPixelMapuiv" opcode="126">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="map" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="CARD32" name="datum" />
+			<pad bytes="12" />
+			<list type="CARD32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetPixelMapusv" opcode="127">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="map" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="CARD16" name="datum" />
+			<pad bytes="16" />
+			<list type="CARD16" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetPolygonStipple" opcode="128">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="BOOL" name="lsb_first" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="24" />
+			<list type="BYTE" name="data">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+
+	<request name="GetString" opcode="129">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="name" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<pad bytes="16" />
+			<list type="char" name="string">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetTexEnvfv" opcode="130">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetTexEnviv" opcode="131">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetTexGendv" opcode="132">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="coord" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<required_start_align align="8" />
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT64" name="datum" />
+			<pad bytes="8" />
+			<list type="FLOAT64" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetTexGenfv" opcode="133">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="coord" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetTexGeniv" opcode="134">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="coord" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetTexImage" opcode="135">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="INT32" name="level" />
+		<field type="CARD32" name="format" />
+		<field type="CARD32" name="type" />
+		<field type="BOOL" name="swap_bytes" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="8" />
+			<field type="INT32" name="width" />
+			<field type="INT32" name="height" />
+			<field type="INT32" name="depth" />
+			<pad bytes="4" />
+			<list type="BYTE" name="data">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+	    
+
+	<request name="GetTexParameterfv" opcode="136">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetTexParameteriv" opcode="137">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetTexLevelParameterfv" opcode="138">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="INT32" name="level" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetTexLevelParameteriv" opcode="139">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="INT32" name="level" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="IsEnabled" opcode="140" >
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="capability" />
+		<reply>
+			<pad bytes="1" />
+			<field type="BOOL32" name="ret_val" />
+		</reply>
+	</request>
+
+	<request name="IsList" opcode="141" >
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="list" />
+		<reply>
+			<pad bytes="1" />
+			<field type="BOOL32" name="ret_val" />
+		</reply>
+	</request>
+
+	<request name="Flush" opcode="142">
+		<field type="CONTEXT_TAG" name="context_tag" />
+	</request>
+
+	<request name="AreTexturesResident" opcode="143">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="n" />
+		<list type="CARD32" name="textures">
+		    <fieldref>n</fieldref>
+		</list>
+		<reply>
+			<pad bytes="1" />
+			<field type="BOOL32" name="ret_val" />
+			<pad bytes="20" />
+			<list type="BOOL" name="data">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	<request name="DeleteTextures" opcode="144">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="n" />
+		<list type="CARD32" name="textures">
+			<fieldref>n</fieldref>
+		</list>
+	</request>
+
+	<request name="GenTextures" opcode="145">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="n" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="24" />
+			<list type="CARD32" name="data">
+				<fieldref>length</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="IsTexture" opcode="146">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="texture" />
+		<reply>
+			<pad bytes="1" />
+			<field type="BOOL32" name="ret_val" />
+		</reply>
+	</request>
+
+	<request name="GetColorTable" opcode="147">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="format" />
+		<field type="CARD32" name="type" />
+		<field type="BOOL" name="swap_bytes" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="8" />
+			<field type="INT32" name="width" />
+			<pad bytes="12" />
+			<list type="BYTE" name="data">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+	
+	<request name="GetColorTableParameterfv" opcode="148">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetColorTableParameteriv" opcode="149">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetConvolutionFilter" opcode="150">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="format" />
+		<field type="CARD32" name="type" />
+		<field type="BOOL" name="swap_bytes" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="8" />
+			<field type="INT32" name="width" />
+			<field type="INT32" name="height" />
+			<pad bytes="8" />
+			<list type="BYTE" name="data">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+
+	<request name="GetConvolutionParameterfv" opcode="151">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetConvolutionParameteriv" opcode="152">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetSeparableFilter" opcode="153">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="format" />
+		<field type="CARD32" name="type" />
+		<field type="BOOL" name="swap_bytes" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="8" />
+			<field type="INT32" name="row_w" />
+			<field type="INT32" name="col_h" />
+			<pad bytes="8" />
+			<list type="BYTE" name="rows_and_cols">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetHistogram" opcode="154">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="format" />
+		<field type="CARD32" name="type" />
+		<field type="BOOL" name="swap_bytes" />
+		<field type="BOOL" name="reset" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="8" />
+			<field type="INT32" name="width" />
+			<pad bytes="12" />
+			<list type="BYTE" name="data">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+
+	<request name="GetHistogramParameterfv" opcode="155">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetHistogramParameteriv" opcode="156">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetMinmax" opcode="157">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="format" />
+		<field type="CARD32" name="type" />
+		<field type="BOOL" name="swap_bytes" />
+		<field type="BOOL" name="reset" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="24" />
+			<list type="BYTE" name="data">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetMinmaxParameterfv" opcode="158">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="FLOAT32" name="datum" />
+			<pad bytes="12" />
+			<list type="FLOAT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetMinmaxParameteriv" opcode="159">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<!--
+	GLX Extensions
+	
+	* XXX: So far only define non-rendering commands.
+	* Only those extensions that affect the GLX wire protocol are listed.
+	-->
+
+	<!--
+	GL_ARB_texture_compression
+	http://oss.sgi.com/projects/ogl-sample/registry/ARB/texture_compression.txt
+	-->
+	<request name="GetCompressedTexImageARB" opcode="160">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="INT32" name="level" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="8" />
+			<field type="INT32" name="size" />
+			<pad bytes="12" />
+			<list type="BYTE" name="data">
+				<op op="*">
+					<fieldref>length</fieldref>
+					<value>4</value>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	
+	<!--
+	GL_ARB_occlusion_query
+	http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt
+	-->
+
+	<request name="DeleteQueriesARB" opcode="161">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="n" />
+		<list type="CARD32" name="ids">
+			<fieldref>n</fieldref>
+		</list>
+	</request>
+
+	<request name="GenQueriesARB" opcode="162">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="INT32" name="n" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="24" />
+			<list type="CARD32" name="data">
+				<fieldref>length</fieldref>
+			</list>
+		</reply>
+	</request>
+	
+	<request name="IsQueryARB" opcode="163">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="id" />
+		<reply>
+			<pad bytes="1" />
+			<field type="BOOL32" name="ret_val" />
+		</reply>
+	</request>
+	
+	<request name="GetQueryivARB" opcode="164">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="target" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+	
+	<request name="GetQueryObjectivARB" opcode="165">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="id" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="INT32" name="datum" />
+			<pad bytes="12" />
+			<list type="INT32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+	
+	<request name="GetQueryObjectuivARB" opcode="166">
+		<field type="CONTEXT_TAG" name="context_tag" />
+		<field type="CARD32" name="id" />
+		<field type="CARD32" name="pname" />
+		<reply>
+			<pad bytes="1" />
+			<pad bytes="4" />
+			<field type="CARD32" name="n" />
+			<field type="CARD32" name="datum" />
+			<pad bytes="12" />
+			<list type="CARD32" name="data">
+				<fieldref>n</fieldref>
+			</list>
+		</reply>
+	</request>
+	
+	<!--
+	GL_ARB_vertex_program
+	http://oss.sgi.com/projects/ogl-sample/registry/ARB/vertex_program.txt
+	XXX: Need to write up vops
+	--> 
+
+	<!--
+	GL_ARB_fragment_program
+	http://oss.sgi.com/projects/ogl-sample/registry/ARB/fragment_program.txt
+	XXX: Need to write up vops
+	-->
+	
+	<!--
+	GL_SGIS_texture_filter4
+	http://oss.sgi.com/projects/ogl-sample/registry/SGIS/texture_filter4.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_EXT_histogram
+	http://oss.sgi.com/projects/ogl-sample/registry/EXT/histogram.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_EXT_convolution
+	http://oss.sgi.com/projects/ogl-sample/registry/EXT/convolution.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_SGI_color_table
+	http://oss.sgi.com/projects/ogl-sample/registry/SGI/color_table.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_EXT_texture_object
+	http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_object.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_SGIS_detail_texture
+	http://oss.sgi.com/projects/ogl-sample/registry/SGIS/detail_texture.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_SGIS_sharpen_texture
+	http://oss.sgi.com/projects/ogl-sample/registry/SGIS/sharpen_texture.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_SGI_make_current_read
+	http://oss.sgi.com/projects/ogl-sample/registry/SGI/make_current_read.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_EXT_import_context
+	http://oss.sgi.com/projects/ogl-sample/registry/EXT/import_context.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_SGIX_fbconfig
+	http://oss.sgi.com/projects/ogl-sample/registry/SGIX/fbconfig.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_SGIX_pbuffer
+	http://oss.sgi.com/projects/ogl-sample/registry/SGIX/pbuffer.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_EXT_pixel_transform
+	http://oss.sgi.com/projects/ogl-sample/registry/EXT/pixel_transform.txt
+	XXX: Need to write up vops
+	-->
+	
+	<!--
+	GL_NV_register_combiners
+	http://oss.sgi.com/projects/ogl-sample/registry/NV/register_combiners.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_NV_fence
+	http://oss.sgi.com/projects/ogl-sample/registry/NV/fence.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_NV_register_combiners2
+	http://oss.sgi.com/projects/ogl-sample/registry/NV/register_combiners2.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_NV_vertex_program
+	http://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_program.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_NV_vertex_program
+	http://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_program.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_NV_occlusion_query
+	http://oss.sgi.com/projects/ogl-sample/registry/NV/occlusion_query.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_NV_fragment_program
+	http://oss.sgi.com/projects/ogl-sample/registry/NV/fragment_program.txt
+	XXX: Need to write up vops
+	-->
+
+	<!--
+	GL_OES_single_precision
+	http://oss.sgi.com/projects/ogl-sample/registry/OES/single_precision.txt
+	XXX: Need to write up vops
+	-->
+	
+</xcb>
diff --git a/third_party/xcbproto/src/src/present.xml b/third_party/xcbproto/src/src/present.xml
new file mode 100644
index 000000000000..fb06e73f02fc
--- /dev/null
+++ b/third_party/xcbproto/src/src/present.xml
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Copyright © 2013 Keith Packard
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and
+that the name of the copyright holders not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.  The copyright holders make no representations
+about the suitability of this software for any purpose.  It is provided "as
+is" without express or implied warranty.
+
+THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+-->
+
+<xcb header="present" extension-xname="Present" extension-name="Present"
+  major-version="1" minor-version="2">
+  <import>xproto</import>
+  <import>randr</import>
+  <import>xfixes</import>
+  <import>sync</import>
+
+  <!-- Types -->
+
+  <enum name="Event">
+    <item name="ConfigureNotify"><value>0</value></item>
+    <item name="CompleteNotify"><value>1</value></item>
+    <item name="IdleNotify"><value>2</value></item>
+    <item name="RedirectNotify"><value>3</value></item>
+  </enum>
+
+  <enum name="EventMask">
+    <item name="NoEvent"><value>0</value></item>
+    <item name="ConfigureNotify"><bit>0</bit></item>
+    <item name="CompleteNotify"><bit>1</bit></item>
+    <item name="IdleNotify"><bit>2</bit></item>
+    <item name="RedirectNotify"><bit>3</bit></item>
+  </enum>
+
+  <enum name="Option">
+    <item name="None"><value>0</value></item>
+    <item name="Async"><bit>0</bit></item>
+    <item name="Copy"><bit>1</bit></item>
+    <item name="UST"><bit>2</bit></item>
+    <item name="Suboptimal"><bit>3</bit></item>
+  </enum>
+
+  <enum name="Capability">
+    <item name="None"><value>0</value></item>
+    <item name="Async"><bit>0</bit></item>
+    <item name="Fence"><bit>1</bit></item>
+    <item name="UST"><bit>2</bit></item>
+  </enum>
+
+  <enum name="CompleteKind">
+    <item name="Pixmap"><value>0</value></item>
+    <item name="NotifyMSC"><value>1</value></item>
+  </enum>
+
+  <enum name="CompleteMode">
+    <item name="Copy"><value>0</value></item>
+    <item name="Flip"><value>1</value></item>
+    <item name="Skip"><value>2</value></item>
+    <item name="SuboptimalCopy"><value>3</value></item>
+  </enum>
+
+  <struct name="Notify">
+    <field type="WINDOW" name="window" />
+    <field type="CARD32" name="serial" />
+  </struct>
+
+  <!-- Requests -->
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD32" name="major_version" />
+    <field type="CARD32" name="minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="major_version" />
+      <field type="CARD32" name="minor_version" />
+    </reply>
+  </request>
+
+  <request name="Pixmap" opcode="1">
+    <required_start_align align="8" />
+    <field type="WINDOW" name="window" />
+    <field type="PIXMAP" name="pixmap" />
+    <field type="CARD32" name="serial" />
+    <field type="REGION" name="valid" />
+    <field type="REGION" name="update" />
+    <field type="INT16" name="x_off" />
+    <field type="INT16" name="y_off" />
+    <field type="CRTC" name="target_crtc" />
+    <field type="FENCE" name="wait_fence" />
+    <field type="FENCE" name="idle_fence" />
+    <field type="CARD32" name="options" />
+    <pad bytes="4"/>
+    <field type="CARD64" name="target_msc" />
+    <field type="CARD64" name="divisor" />
+    <field type="CARD64" name="remainder" />
+    <list type="Notify" name="notifies"/>
+  </request>
+
+  <request name="NotifyMSC" opcode="2">
+    <required_start_align align="8" />
+    <field type="WINDOW" name="window" />
+    <field type="CARD32" name="serial" />
+    <pad bytes="4"/>
+    <field type="CARD64" name="target_msc" />
+    <field type="CARD64" name="divisor" />
+    <field type="CARD64" name="remainder" />
+  </request>
+
+  <xidtype name="EVENT"/>
+  
+  <request name="SelectInput" opcode="3">
+    <field type="EVENT" name="eid"/>
+    <field type="WINDOW" name="window" />
+    <field type="CARD32" name="event_mask" mask="EventMask" />
+  </request>
+
+  <request name="QueryCapabilities" opcode="4">
+    <field type="CARD32" name="target" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="capabilities" />
+    </reply>
+  </request>
+
+  <!-- Events -->
+
+  <event name="Generic" number="0">
+    <field type="CARD8" name="extension" />
+    <field type="CARD32" name="length" />
+    <field type="CARD16" name="evtype" />
+    <pad bytes="2" />
+    <field type="EVENT" name="event" />
+  </event>
+    
+  <event name="ConfigureNotify" number="0" xge="true">
+    <pad bytes="2" />
+    <field type="EVENT" name="event" />
+    <field type="WINDOW" name="window" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="INT16" name="off_x" />
+    <field type="INT16" name="off_y" />
+    <field type="CARD16" name="pixmap_width" />
+    <field type="CARD16" name="pixmap_height" />
+    <field type="CARD32" name="pixmap_flags" />
+  </event>
+
+  <event name="CompleteNotify" number="1" xge="true">
+    <required_start_align align="8" />
+    <field type="CARD8" name="kind" enum="CompleteKind" />
+    <field type="CARD8" name="mode" enum="CompleteMode" />
+    <field type="EVENT" name="event" />
+    <field type="WINDOW" name="window" />
+    <field type="CARD32" name="serial" />
+    <field type="CARD64" name="ust" />
+    <field type="CARD64" name="msc" />
+  </event>
+
+  <event name="IdleNotify" number="2" xge="true">
+    <pad bytes="2"/>
+    <field type="EVENT" name="event" />
+    <field type="WINDOW" name="window" />
+    <field type="CARD32" name="serial" />
+    <field type="PIXMAP" name="pixmap" />
+    <field type="FENCE" name="idle_fence" />
+  </event>
+
+  <event name="RedirectNotify" number="3" xge="true">
+    <required_start_align align="8" />
+    <field type="BOOL" name="update_window"/>
+    <pad bytes="1"/>
+    <field type="EVENT" name="event" />
+    <field type="WINDOW" name="event_window" />
+    <field type="WINDOW" name="window" />
+    <field type="PIXMAP" name="pixmap" />
+    <field type="CARD32" name="serial" />
+
+    <field type="REGION" name="valid_region" />
+    <field type="REGION" name="update_region" />
+    <field type="RECTANGLE" name="valid_rect" />
+    <field type="RECTANGLE" name="update_rect" />
+
+    <field type="INT16" name="x_off" />
+    <field type="INT16" name="y_off" />
+    <field type="CRTC" name="target_crtc" />
+    <field type="FENCE" name="wait_fence" />
+    <field type="FENCE" name="idle_fence" />
+    <field type="CARD32" name="options" />
+    <pad bytes="4"/>
+    <field type="CARD64" name="target_msc" />
+    <field type="CARD64" name="divisor" />
+    <field type="CARD64" name="remainder" />
+    <list type="Notify" name="notifies" />
+  </event>
+
+</xcb>
diff --git a/third_party/xcbproto/src/src/randr.xml b/third_party/xcbproto/src/src/randr.xml
new file mode 100644
index 000000000000..703d6ba250de
--- /dev/null
+++ b/third_party/xcbproto/src/src/randr.xml
@@ -0,0 +1,954 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2006 Jeremy Kolb, Ian Osgood
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<xcb header="randr" extension-xname="RANDR" extension-name="RandR"
+    major-version="1" minor-version="6">
+
+	<import>xproto</import>
+	<import>render</import>
+
+	<!-- XIDs -->
+	<xidtype name="MODE" />
+	<xidtype name="CRTC" />
+	<xidtype name="OUTPUT" />
+	<xidtype name="PROVIDER" />
+	<xidtype name="LEASE" />
+	
+	<!-- Errors -->
+
+	<error name="BadOutput"   number="0" />
+	<error name="BadCrtc"     number="1" />
+	<error name="BadMode"     number="2" />
+	<error name="BadProvider" number="3" />
+
+	<!-- Requests -->
+
+	<enum name="Rotation">
+		<item name="Rotate_0">  <bit>0</bit></item>
+		<item name="Rotate_90"> <bit>1</bit></item>
+		<item name="Rotate_180"><bit>2</bit></item>
+		<item name="Rotate_270"><bit>3</bit></item>
+		<item name="Reflect_X"> <bit>4</bit></item>
+		<item name="Reflect_Y"> <bit>5</bit></item>
+	</enum>
+
+	<struct name="ScreenSize">
+		<field type="CARD16" name="width" />   <!-- pixels -->
+		<field type="CARD16" name="height" />
+		<field type="CARD16" name="mwidth" />  <!-- millimeters -->
+		<field type="CARD16" name="mheight" />
+	</struct>
+	
+	<struct name="RefreshRates">
+		<field type="CARD16" name="nRates" />
+		<list type="CARD16" name="rates">
+			<fieldref>nRates</fieldref>
+		</list>
+	</struct>
+	
+	<request name="QueryVersion" opcode="0">
+		<field type="CARD32" name="major_version" />
+		<field type="CARD32" name="minor_version" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD32" name="major_version" />
+			<field type="CARD32" name="minor_version" />
+			<pad bytes="16" />
+		</reply>
+	</request>
+	
+	<!-- Skip obsolete opcode 1 so old clients fail immediately -->
+
+	<enum name="SetConfig">
+		<item name="Success"><value>0</value></item>
+		<item name="InvalidConfigTime"><value>1</value></item>
+		<item name="InvalidTime"><value>2</value></item>
+		<item name="Failed"><value>3</value></item>
+	</enum>
+
+	<!-- This is for the 1.1 version request.  I don't believe we need to specify a 1.0 request
+	as few things used randr 1.0.  The only difference is the removal of refresh and padding I think.
+	BEWARE: the docs lie!
+	-->
+	<request name="SetScreenConfig" opcode="2">
+		<field type="WINDOW" name="window" />
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="TIMESTAMP" name="config_timestamp" />
+		<field type="CARD16" name="sizeID" />
+		<field type="CARD16" name="rotation" mask="Rotation" />
+		<field type="CARD16" name="rate" />
+		<pad bytes="2" />
+		<reply>
+			<field type="CARD8" name="status" enum="SetConfig" />
+			<field type="TIMESTAMP" name="new_timestamp" />
+			<field type="TIMESTAMP" name="config_timestamp" />
+			<field type="WINDOW" name="root" />
+			<field type="CARD16" name="subpixel_order" enum="SubPixel" />
+			<pad bytes="10" />
+		</reply>
+	</request>
+	
+	<!-- opcode 3 is obsolete -->
+
+	<enum name="NotifyMask" >
+		<item name="ScreenChange">    <bit>0</bit></item>
+		<!-- New in version 1.2 -->
+		<item name="CrtcChange">      <bit>1</bit></item>
+		<item name="OutputChange">    <bit>2</bit></item>
+		<item name="OutputProperty">  <bit>3</bit></item>
+		<!-- New in version 1.4 -->
+		<item name="ProviderChange">  <bit>4</bit></item>
+		<item name="ProviderProperty"><bit>5</bit></item>
+		<item name="ResourceChange">  <bit>6</bit></item>
+		<item name="Lease">           <bit>7</bit></item>
+	</enum>
+
+	<request name="SelectInput" opcode="4">	
+		<field type="WINDOW" name="window" />
+		<field type="CARD16" name="enable" mask="NotifyMask" />
+		<pad bytes="2" />
+	</request>
+
+	<!--
+	I think this is correct.  It works. though I believe nInfo is a bit high...
+	-->
+	<request name="GetScreenInfo" opcode="5">
+		<field type="WINDOW" name="window" />
+		<reply>
+			<field type="CARD8" name="rotations" mask="Rotation" />
+			<field type="WINDOW" name="root" />
+			<field type="TIMESTAMP" name="timestamp" />
+			<field type="TIMESTAMP" name="config_timestamp" />
+			<field type="CARD16" name="nSizes" />
+			<field type="CARD16" name="sizeID" />
+			<field type="CARD16" name="rotation" mask="Rotation" />
+			<field type="CARD16" name="rate" />
+			<field type="CARD16" name="nInfo" />
+			<pad bytes="2" />
+			<list type="ScreenSize" name="sizes">
+			    <fieldref>nSizes</fieldref>
+			</list>
+			<list type="RefreshRates" name="rates">
+				<op op="-">
+					<fieldref>nInfo</fieldref>
+					<fieldref>nSizes</fieldref>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	<!-- new in version 1.2 -->
+
+	<request name="GetScreenSizeRange" opcode="6">
+		<field type="WINDOW" name="window" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD16" name="min_width" />
+			<field type="CARD16" name="min_height" />
+			<field type="CARD16" name="max_width" />
+			<field type="CARD16" name="max_height" />
+			<pad bytes="16" />
+		</reply>
+	</request>
+
+	<request name="SetScreenSize" opcode="7">
+		<field type="WINDOW" name="window" />
+		<field type="CARD16" name="width" />    <!-- pixels -->
+		<field type="CARD16" name="height" />
+		<field type="CARD32" name="mm_width" />  <!-- millimeters -->
+		<field type="CARD32" name="mm_height" />
+	</request>
+
+	<!-- for GetScreenResources.ModeInfo.ModeFlag -->
+	<enum name="ModeFlag">
+		<item name="HsyncPositive"> <bit>0</bit></item>
+		<item name="HsyncNegative"> <bit>1</bit></item>
+		<item name="VsyncPositive"> <bit>2</bit></item>
+		<item name="VsyncNegative"> <bit>3</bit></item>
+		<item name="Interlace">     <bit>4</bit></item>
+		<item name="DoubleScan">    <bit>5</bit></item>
+		<item name="Csync">         <bit>6</bit></item>
+		<item name="CsyncPositive"> <bit>7</bit></item>
+		<item name="CsyncNegative"> <bit>8</bit></item>
+		<item name="HskewPresent">  <bit>9</bit></item>
+		<item name="Bcast">         <bit>10</bit></item>
+		<item name="PixelMultiplex"><bit>11</bit></item>
+		<item name="DoubleClock">   <bit>12</bit></item>
+		<item name="HalveClock">    <bit>13</bit></item>
+	</enum>
+
+	<struct name="ModeInfo">
+		<field type="CARD32" name="id" />
+		<field type="CARD16" name="width" />
+		<field type="CARD16" name="height" />
+		<field type="CARD32" name="dot_clock" />
+		<field type="CARD16" name="hsync_start" />
+		<field type="CARD16" name="hsync_end" />
+		<field type="CARD16" name="htotal" />
+		<field type="CARD16" name="hskew" />
+		<field type="CARD16" name="vsync_start" />
+		<field type="CARD16" name="vsync_end" />
+		<field type="CARD16" name="vtotal" />
+		<field type="CARD16" name="name_len" />
+		<field type="CARD32" name="mode_flags" mask="ModeFlag" />
+		<!-- the mode name itself -->
+	</struct>
+
+	<request name="GetScreenResources" opcode="8">
+		<field type="WINDOW" name="window" />
+		<reply>
+			<pad bytes="1" />
+			<field type="TIMESTAMP" name="timestamp" />
+			<field type="TIMESTAMP" name="config_timestamp" />
+			<field type="CARD16" name="num_crtcs" />
+			<field type="CARD16" name="num_outputs" />
+			<field type="CARD16" name="num_modes" />
+			<field type="CARD16" name="names_len" />
+			<pad bytes="8" />
+			<list type="CRTC" name="crtcs">
+			    <fieldref>num_crtcs</fieldref>
+			</list>
+			<list type="OUTPUT" name="outputs">
+			    <fieldref>num_outputs</fieldref>
+			</list>
+			<list type="ModeInfo" name="modes">
+			    <fieldref>num_modes</fieldref>
+			</list>
+			<!-- FIXME: this is *not* null separated!
+			     One must use ModeInfo.name_len from each previous
+			     ModeInfo to infer the position of the name. -->
+			<list type="BYTE" name="names">
+			    <fieldref>names_len</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<!-- for GetOutputInfo.connection -->
+	<enum name="Connection">
+		<item name="Connected">    <value>0</value> </item>
+		<item name="Disconnected"> <value>1</value> </item>
+		<item name="Unknown">      <value>2</value> </item>
+	</enum>
+
+	<request name="GetOutputInfo" opcode="9">
+		<field type="OUTPUT" name="output" />
+		<field type="TIMESTAMP" name="config_timestamp" />
+		<reply>
+			<field type="CARD8" name="status" enum="SetConfig" />
+			<field type="TIMESTAMP" name="timestamp" />
+			<field type="CRTC" name="crtc" />
+			<field type="CARD32" name="mm_width" />  <!-- millimeters -->
+			<field type="CARD32" name="mm_height" />
+			<field type="CARD8" name="connection" enum="Connection" />
+			<field type="CARD8" name="subpixel_order" enum="SubPixel" />
+			<field type="CARD16" name="num_crtcs" />
+			<field type="CARD16" name="num_modes" />
+			<field type="CARD16" name="num_preferred" />
+			<field type="CARD16" name="num_clones" />
+			<field type="CARD16" name="name_len" />
+			<list type="CRTC" name="crtcs">
+			    <fieldref>num_crtcs</fieldref>
+			</list>
+			<list type="MODE" name="modes">
+			    <fieldref>num_modes</fieldref>
+			</list>
+			<list type="OUTPUT" name="clones">
+			    <fieldref>num_clones</fieldref>
+			</list>
+			<list type="BYTE" name="name">
+			    <fieldref>name_len</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="ListOutputProperties" opcode="10">
+		<field type="OUTPUT" name="output" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD16" name="num_atoms" />
+			<pad bytes="22" />
+			<list type="ATOM" name="atoms">
+				<fieldref>num_atoms</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="QueryOutputProperty" opcode="11">
+		<field type="OUTPUT" name="output" />
+		<field type="ATOM" name="property" />
+		<reply>
+			<pad bytes="1" />
+			<field type="BOOL" name="pending" />
+			<field type="BOOL" name="range" />
+			<field type="BOOL" name="immutable" />
+			<pad bytes="21" />
+			<list type="INT32" name="validValues">
+				<fieldref>length</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="ConfigureOutputProperty" opcode="12">
+		<field type="OUTPUT" name="output" />
+		<field type="ATOM" name="property" />
+		<field type="BOOL" name="pending" />
+		<field type="BOOL" name="range" />
+		<pad bytes="2" />
+		<list type="INT32" name="values" />
+	</request>
+
+	<request name="ChangeOutputProperty" opcode="13">
+		<field type="OUTPUT" name="output" />
+		<field type="ATOM" name="property" />
+		<field type="ATOM" name="type" />
+		<field type="CARD8" name="format" />
+		<field type="CARD8" name="mode" enum="PropMode" />
+		<pad bytes="2" />
+		<field type="CARD32" name="num_units" />
+		<list type="void" name="data">
+		    <op op="/">
+			<op op="*">
+			    <fieldref>num_units</fieldref>
+			    <fieldref>format</fieldref>
+			</op>
+			<value>8</value>
+		    </op>
+		</list>
+	</request>
+
+	<request name="DeleteOutputProperty" opcode="14">
+		<field type="OUTPUT" name="output" />
+		<field type="ATOM" name="property" />
+	</request>
+
+	<!-- NOTE: num_items depends on format (8/16/32) -->
+	<request name="GetOutputProperty" opcode="15">
+		<field type="OUTPUT" name="output" />
+		<field type="ATOM" name="property" />
+		<field type="ATOM" name="type" altenum="GetPropertyType" />
+		<field type="CARD32" name="long_offset" />
+		<field type="CARD32" name="long_length" />
+		<field type="BOOL" name="delete" />
+		<field type="BOOL" name="pending" />
+		<pad bytes="2" />
+		<reply>
+			<field type="CARD8" name="format" />
+			<field type="ATOM" name="type" altenum="Atom" />
+			<field type="CARD32" name="bytes_after" />
+			<field type="CARD32" name="num_items" />
+			<pad bytes="12" />
+			<list type="BYTE" name="data">
+				<!-- n * format / 8 -->
+				<op op="*">
+					<fieldref>num_items</fieldref>
+					<op op="/">
+						<fieldref>format</fieldref>
+						<value>8</value>
+					</op>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	<request name="CreateMode" opcode="16">
+		<field type="WINDOW" name="window" />
+		<field type="ModeInfo" name="mode_info" />
+		<list type="char" name="name" />
+		<reply>
+			<pad bytes="1" />
+			<field type="MODE" name="mode" />
+			<pad bytes="20" />
+		</reply>
+	</request>
+
+	<request name="DestroyMode" opcode="17">
+		<field type="MODE" name="mode" />
+	</request>
+
+	<request name="AddOutputMode" opcode="18">
+		<field type="OUTPUT" name="output" />
+		<field type="MODE" name="mode" />
+	</request>
+
+	<request name="DeleteOutputMode" opcode="19">
+		<field type="OUTPUT" name="output" />
+		<field type="MODE" name="mode" />
+	</request>
+
+	<request name="GetCrtcInfo" opcode="20">
+		<field type="CRTC" name="crtc" />
+		<field type="TIMESTAMP" name="config_timestamp" />
+		<reply>
+			<field type="CARD8" name="status" enum="SetConfig" />
+			<field type="TIMESTAMP" name="timestamp" />
+			<field type="INT16" name="x" />
+			<field type="INT16" name="y" />
+			<field type="CARD16" name="width" />
+			<field type="CARD16" name="height" />
+			<field type="MODE" name="mode" />
+			<field type="CARD16" name="rotation" mask="Rotation" />
+			<field type="CARD16" name="rotations" mask="Rotation" />
+			<field type="CARD16" name="num_outputs" />
+			<field type="CARD16" name="num_possible_outputs" />
+			<list type="OUTPUT" name="outputs">
+				<fieldref>num_outputs</fieldref>
+			</list>
+			<list type="OUTPUT" name="possible">
+				<fieldref>num_possible_outputs</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="SetCrtcConfig" opcode="21">
+		<field type="CRTC" name="crtc" />
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="TIMESTAMP" name="config_timestamp" />
+		<field type="INT16" name="x" />
+		<field type="INT16" name="y" />
+		<field type="MODE" name="mode" />
+		<field type="CARD16" name="rotation" mask="Rotation" />
+		<pad bytes="2" />
+		<list type="OUTPUT" name="outputs" />
+		<reply>
+			<field type="CARD8" name="status" enum="SetConfig" />
+			<field type="TIMESTAMP" name="timestamp" />
+			<pad bytes="20" />
+		</reply>
+	</request>
+
+	<request name="GetCrtcGammaSize" opcode="22">
+		<field type="CRTC" name="crtc" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD16" name="size" />
+			<pad bytes="22" />
+		</reply>
+	</request>
+
+	<request name="GetCrtcGamma" opcode="23">
+		<field type="CRTC" name="crtc" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD16" name="size" />
+			<pad bytes="22" />
+			<list type="CARD16" name="red">
+				<fieldref>size</fieldref>
+			</list>
+			<list type="CARD16" name="green">
+				<fieldref>size</fieldref>
+			</list>
+			<list type="CARD16" name="blue">
+				<fieldref>size</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="SetCrtcGamma" opcode="24">
+		<field type="CRTC" name="crtc" />
+		<field type="CARD16" name="size" />
+		<pad bytes="2"/>
+		<list type="CARD16" name="red">
+			<fieldref>size</fieldref>
+		</list>
+		<list type="CARD16" name="green">
+			<fieldref>size</fieldref>
+		</list>
+		<list type="CARD16" name="blue">
+			<fieldref>size</fieldref>
+		</list>
+	</request>
+
+	<!-- new in 1.3 -->
+
+	<request name="GetScreenResourcesCurrent" opcode="25">
+		<field type="WINDOW" name="window" />
+		<reply>
+			<pad bytes="1" />
+			<field type="TIMESTAMP" name="timestamp" />
+			<field type="TIMESTAMP" name="config_timestamp" />
+			<field type="CARD16" name="num_crtcs" />
+			<field type="CARD16" name="num_outputs" />
+			<field type="CARD16" name="num_modes" />
+			<field type="CARD16" name="names_len" />
+			<pad bytes="8" />
+			<list type="CRTC" name="crtcs">
+			    <fieldref>num_crtcs</fieldref>
+			</list>
+			<list type="OUTPUT" name="outputs">
+			    <fieldref>num_outputs</fieldref>
+			</list>
+			<list type="ModeInfo" name="modes">
+			    <fieldref>num_modes</fieldref>
+			</list>
+			<!-- FIXME: this is *not* null separated!
+			     One must use ModeInfo.name_len from each previous
+			     ModeInfo to infer the position of the name. -->
+			<list type="BYTE" name="names">
+			    <fieldref>names_len</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<enum name="Transform">
+		<!-- Introduced in version 1.3, but not referenced. -->
+		<item name="Unit">       <bit>0</bit></item>
+		<item name="ScaleUp">    <bit>1</bit></item>
+		<item name="ScaleDown">  <bit>2</bit></item>
+		<item name="Projective"> <bit>3</bit></item>
+	</enum>
+
+	<request name="SetCrtcTransform" opcode="26">
+		<field type="CRTC" name="crtc" />
+		<field type="TRANSFORM" name="transform" />
+		<field type="CARD16" name="filter_len" />
+		<pad bytes="2" />
+		<list type="char" name="filter_name">
+			<fieldref>filter_len</fieldref>
+		</list>
+		<pad align="4" />
+		<list type="FIXED" name="filter_params" />
+	</request>
+
+	<request name="GetCrtcTransform" opcode="27">
+		<field type="CRTC" name="crtc" />
+		<reply>
+			<pad bytes="1" />
+			<field type="TRANSFORM" name="pending_transform" />
+			<field type="BOOL" name="has_transforms" />
+			<pad bytes="3" />
+			<field type="TRANSFORM" name="current_transform" />
+			<pad bytes="4" />
+			<field type="CARD16" name="pending_len" />
+			<field type="CARD16" name="pending_nparams" />
+			<field type="CARD16" name="current_len" />
+			<field type="CARD16" name="current_nparams" />
+			<list type="char" name="pending_filter_name" >
+				<fieldref>pending_len</fieldref>
+			</list>
+			<pad align="4" />
+			<list type="FIXED" name="pending_params" >
+				<fieldref>pending_nparams</fieldref>
+			</list>
+			<list type="char" name="current_filter_name" >
+				<fieldref>current_len</fieldref>
+			</list>
+			<pad align="4" />
+			<list type="FIXED" name="current_params" >
+				<fieldref>current_nparams</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetPanning" opcode="28">
+		<field type="CRTC" name="crtc" />
+		<reply>
+			<field type="CARD8" name="status" enum="SetConfig" />
+			<field type="TIMESTAMP" name="timestamp" />
+			<field type="CARD16" name="left" />
+			<field type="CARD16" name="top" />
+			<field type="CARD16" name="width" />
+			<field type="CARD16" name="height" />
+			<field type="CARD16" name="track_left" />
+			<field type="CARD16" name="track_top" />
+			<field type="CARD16" name="track_width" />
+			<field type="CARD16" name="track_height" />
+			<field type="INT16" name="border_left" />
+			<field type="INT16" name="border_top" />
+			<field type="INT16" name="border_right" />
+			<field type="INT16" name="border_bottom" />
+		</reply>
+	</request>
+
+	<request name="SetPanning" opcode="29">
+		<field type="CRTC" name="crtc" />
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="CARD16" name="left" />
+		<field type="CARD16" name="top" />
+		<field type="CARD16" name="width" />
+		<field type="CARD16" name="height" />
+		<field type="CARD16" name="track_left" />
+		<field type="CARD16" name="track_top" />
+		<field type="CARD16" name="track_width" />
+		<field type="CARD16" name="track_height" />
+		<field type="INT16" name="border_left" />
+		<field type="INT16" name="border_top" />
+		<field type="INT16" name="border_right" />
+		<field type="INT16" name="border_bottom" />
+		<reply>
+			<field type="CARD8" name="status" enum="SetConfig" />
+			<field type="TIMESTAMP" name="timestamp" />
+		</reply>
+	</request>
+
+	<request name="SetOutputPrimary" opcode="30">
+		<field type="WINDOW" name="window" />
+		<field type="OUTPUT" name="output" />
+	</request>
+
+	<request name="GetOutputPrimary" opcode="31">
+		<field type="WINDOW" name="window" />
+		<reply>
+			<pad bytes="1" />
+			<field type="OUTPUT" name="output" />
+		</reply>
+	</request>
+
+	<!-- New in version 1.4 -->
+
+	<request name="GetProviders" opcode="32">
+		<field type="WINDOW" name="window" />
+		<reply>
+			<pad bytes="1" />
+			<field type="TIMESTAMP" name="timestamp" />
+			<field type="CARD16" name="num_providers" />
+			<pad bytes="18" />
+			<list type="PROVIDER" name="providers">
+				<fieldref>num_providers</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<enum name="ProviderCapability">
+		<item name="SourceOutput">  <bit>0</bit></item>
+		<item name="SinkOutput">    <bit>1</bit></item>
+		<item name="SourceOffload"> <bit>2</bit></item>
+		<item name="SinkOffload">   <bit>3</bit></item>
+	</enum>
+
+	<request name="GetProviderInfo" opcode="33">
+		<field type="PROVIDER" name="provider" />
+		<field type="TIMESTAMP" name="config_timestamp" />
+		<reply>
+			<field type="CARD8" name="status" />
+			<field type="TIMESTAMP" name="timestamp" />
+			<field type="CARD32" name="capabilities" mask="ProviderCapability" />
+			<field type="CARD16" name="num_crtcs" />
+			<field type="CARD16" name="num_outputs" />
+			<field type="CARD16" name="num_associated_providers" />
+			<field type="CARD16" name="name_len" />
+			<pad bytes="8" />
+			<list type="CRTC" name="crtcs">
+				<fieldref>num_crtcs</fieldref>
+			</list>
+			<list type="OUTPUT" name="outputs">
+				<fieldref>num_outputs</fieldref>
+			</list>
+			<list type="PROVIDER" name="associated_providers">
+				<fieldref>num_associated_providers</fieldref>
+			</list>
+			<list type="CARD32" name="associated_capability">
+				<fieldref>num_associated_providers</fieldref>
+			</list>
+			<list type="char" name="name">
+				<fieldref>name_len</fieldref>
+			</list>
+			<!-- XXX: Prepared for the future. Until xcbgen supports
+			          the align attribute in <pad>, we ignore the
+			          trailing pad bytes here.
+			<pad align="4" />
+			-->
+		</reply>
+	</request>
+
+	<request name="SetProviderOffloadSink" opcode="34">
+		<field type="PROVIDER" name="provider" />
+		<field type="PROVIDER" name="sink_provider" />
+		<field type="TIMESTAMP" name="config_timestamp" />
+	</request>
+
+	<request name="SetProviderOutputSource" opcode="35">
+		<field type="PROVIDER" name="provider" />
+		<field type="PROVIDER" name="source_provider" />
+		<field type="TIMESTAMP" name="config_timestamp" />
+	</request>
+
+	<request name="ListProviderProperties" opcode="36">
+		<field type="PROVIDER" name="provider" />
+		<reply>
+			<pad bytes="1" />
+			<field type="CARD16" name="num_atoms" />
+			<pad bytes="22" />
+			<list type="ATOM" name="atoms">
+				<fieldref>num_atoms</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="QueryProviderProperty" opcode="37">
+		<field type="PROVIDER" name="provider" />
+		<field type="ATOM" name="property" />
+		<reply>
+			<pad bytes="1" />
+			<field type="BOOL" name="pending" />
+			<field type="BOOL" name="range" />
+			<field type="BOOL" name="immutable" />
+			<pad bytes="21" />
+			<list type="INT32" name="valid_values">
+				<fieldref>length</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="ConfigureProviderProperty" opcode="38">
+		<field type="PROVIDER" name="provider" />
+		<field type="ATOM" name="property" />
+		<field type="BOOL" name="pending" />
+		<field type="BOOL" name="range" />
+		<pad bytes="2" />
+		<list type="INT32" name="values" />
+	</request>
+
+	<request name="ChangeProviderProperty" opcode="39">
+		<field type="PROVIDER" name="provider" />
+		<field type="ATOM" name="property" />
+		<field type="ATOM" name="type" />
+		<field type="CARD8" name="format" />
+		<field type="CARD8" name="mode" />
+		<pad bytes="2" />
+		<field type="CARD32" name="num_items" />
+		<list type="void" name="data">
+			<op op="*">
+				<fieldref>num_items</fieldref>
+				<op op="/">
+					<fieldref>format</fieldref>
+					<value>8</value>
+				</op>
+			</op>
+		</list>
+	</request>
+
+	<request name="DeleteProviderProperty" opcode="40">
+		<field type="PROVIDER" name="provider" />
+		<field type="ATOM" name="property" />
+	</request>
+
+	<request name="GetProviderProperty" opcode="41">
+		<field type="PROVIDER" name="provider" />
+		<field type="ATOM" name="property" />
+		<field type="ATOM" name="type" /> <!-- AnyProperty -->
+		<field type="CARD32" name="long_offset" />
+		<field type="CARD32" name="long_length" />
+		<field type="BOOL" name="delete" />
+		<field type="BOOL" name="pending" />
+		<pad bytes="2" />
+		<reply>
+			<field type="CARD8" name="format" />
+			<field type="ATOM" name="type" /> <!-- None -->
+			<field type="CARD32" name="bytes_after" />
+			<field type="CARD32" name="num_items" />
+			<pad bytes="12" />
+			<list type="void" name="data">
+				<op op="*">
+					<fieldref>num_items</fieldref>
+					<op op="/">
+						<fieldref>format</fieldref>
+						<value>8</value>
+					</op>
+				</op>
+			</list>
+		</reply>
+	</request>
+
+	<!-- Events -->
+
+	<event name="ScreenChangeNotify" number="0">
+		<field type="CARD8" name="rotation" mask="Rotation" />
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="TIMESTAMP" name="config_timestamp" />
+		<field type="WINDOW" name="root" />
+		<field type="WINDOW" name="request_window" />
+		<field type="CARD16" name="sizeID" />
+		<field type="CARD16" name="subpixel_order" enum="SubPixel" />
+		<field type="CARD16" name="width" />
+		<field type="CARD16" name="height" />
+		<field type="CARD16" name="mwidth" />
+		<field type="CARD16" name="mheight" />
+	</event>
+
+	<!-- New in version 1.2 -->
+
+	<!-- subcode -->
+	<enum name="Notify" >
+		<item name="CrtcChange">      <value>0</value></item>
+		<item name="OutputChange">    <value>1</value></item>
+		<item name="OutputProperty">  <value>2</value></item>
+		<item name="ProviderChange">  <value>3</value></item>
+		<item name="ProviderProperty"><value>4</value></item>
+		<item name="ResourceChange">  <value>5</value></item>
+		<item name="Lease">           <value>6</value></item>
+	</enum>
+
+	<struct name="CrtcChange">
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="WINDOW" name="window" />
+		<field type="CRTC" name="crtc" />
+		<field type="MODE" name="mode" />
+		<field type="CARD16" name="rotation" mask="Rotation" />
+		<pad bytes="2" />
+		<field type="INT16" name="x" />
+		<field type="INT16" name="y" />
+		<field type="CARD16" name="width" />
+		<field type="CARD16" name="height" />
+	</struct>
+
+	<struct name="OutputChange">
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="TIMESTAMP" name="config_timestamp" />
+		<field type="WINDOW" name="window" />
+		<field type="OUTPUT" name="output" />
+		<field type="CRTC" name="crtc" />
+		<field type="MODE" name="mode" />
+		<field type="CARD16" name="rotation" mask="Rotation" />
+		<field type="CARD8" name="connection" enum="Connection" />
+		<field type="CARD8" name="subpixel_order" enum="SubPixel" />
+	</struct>
+
+	<struct name="OutputProperty">
+		<field type="WINDOW" name="window" />
+		<field type="OUTPUT" name="output" />
+		<field type="ATOM" name="atom" />
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="CARD8" name="status" enum="Property" />
+		<pad bytes="11" />
+	</struct>
+
+	<!-- New in version 1.4 -->
+
+	<struct name="ProviderChange">
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="WINDOW" name="window" />
+		<field type="PROVIDER" name="provider" />
+		<pad bytes="16" />
+	</struct>
+
+	<struct name="ProviderProperty">
+		<field type="WINDOW" name="window" />
+		<field type="PROVIDER" name="provider" />
+		<field type="ATOM" name="atom" />
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="CARD8" name="state" />
+		<pad bytes="11" />
+	</struct>
+
+	<struct name="ResourceChange">
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="WINDOW" name="window" />
+		<pad bytes="20" />
+	</struct>
+
+	<!-- New in version 1.5 -->
+
+	<struct name="MonitorInfo">
+		<field type="ATOM" name="name" />
+		<field type="BOOL" name="primary" />
+		<field type="BOOL" name="automatic" />
+		<field type="CARD16" name="nOutput" />
+		<field type="INT16" name="x" />
+		<field type="INT16" name="y" />
+		<field type="CARD16" name="width" /> <!-- pixels -->
+		<field type="CARD16" name="height" /> <!-- pixels -->
+		<field type="CARD32" name="width_in_millimeters" />
+		<field type="CARD32" name="height_in_millimeters" />
+		<list type="OUTPUT" name="outputs">
+		    <fieldref>nOutput</fieldref>
+		</list>
+	</struct>
+
+	<request name="GetMonitors" opcode="42">
+		<field type="WINDOW" name="window" />
+		<field type="BOOL" name="get_active" />
+		<reply>
+			<pad bytes="1" />
+			<field type="TIMESTAMP" name="timestamp" />
+			<field type="CARD32" name="nMonitors" />
+			<field type="CARD32" name="nOutputs" />
+			<pad bytes="12" />
+			<list type="MonitorInfo" name="monitors">
+			    <fieldref>nMonitors</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="SetMonitor" opcode="43">
+		<field type="WINDOW" name="window" />
+		<field type="MonitorInfo" name="monitorinfo" />
+	</request>
+
+	<request name="DeleteMonitor" opcode="44">
+		<field type="WINDOW" name="window" />
+		<field type="ATOM" name="name" />
+	</request>
+
+	<!-- new in 1.6 -->
+
+	<request name="CreateLease" opcode="45">
+	  <field type="WINDOW" name="window" />
+	  <field type="LEASE" name="lid" />
+	  <field type="CARD16" name="num_crtcs" />
+	  <field type="CARD16" name="num_outputs" />
+	  <list type="CRTC" name="crtcs">
+	    <fieldref>num_crtcs</fieldref>
+	  </list>
+	  <list type="OUTPUT" name="outputs">
+	    <fieldref>num_outputs</fieldref>
+	  </list>
+	  <reply>
+	    <field type="CARD8" name="nfd" />
+	    <fd name="master_fd" />
+	    <pad bytes="24" />
+	  </reply>
+	</request>
+
+	<request name="FreeLease" opcode="46">
+	  <field type="LEASE" name="lid" />
+	  <field type="BYTE" name="terminate" />
+	</request>
+
+	<struct name="LeaseNotify">
+		<field type="TIMESTAMP" name="timestamp" />
+		<field type="WINDOW" name="window" />
+		<field type="LEASE" name="lease" />
+		<field type="CARD8" name="created" />
+		<pad bytes="15" />
+	</struct>
+
+	<union name="NotifyData">
+		<field type="CrtcChange"       name="cc" />
+		<field type="OutputChange"     name="oc" />
+		<field type="OutputProperty"   name="op" />
+		<field type="ProviderChange"   name="pc" />
+		<field type="ProviderProperty" name="pp" />
+		<field type="ResourceChange"   name="rc" />
+		<field type="LeaseNotify"      name="lc" />
+	</union>
+
+	<event name="Notify" number="1">
+		<field type="CARD8" name="subCode" enum="Notify" />
+		<field type="NotifyData" name="u" />
+	</event>
+</xcb>
diff --git a/third_party/xcbproto/src/src/record.xml b/third_party/xcbproto/src/src/record.xml
new file mode 100644
index 000000000000..74c16fe5b944
--- /dev/null
+++ b/third_party/xcbproto/src/src/record.xml
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2005 Jeremy Kolb.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person ob/Sintaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<xcb header="record" extension-xname="RECORD" extension-name="Record"
+    major-version="1" minor-version="13">
+
+    <!-- Types -->
+    <xidtype name="CONTEXT" />
+    
+    <struct name="Range8">
+	<field type="CARD8" name="first" />
+	<field type="CARD8" name="last" />
+    </struct>
+
+    <struct name="Range16">
+	<field type="CARD16" name="first" />
+	<field type="CARD16" name="last" />
+    </struct>
+
+    <struct name="ExtRange">
+	<field type="Range8" name="major" />
+	<field type="Range16" name="minor" />
+    </struct>
+
+    <struct name="Range">
+	<field type="Range8" name="core_requests" />
+	<field type="Range8" name="core_replies" />
+	<field type="ExtRange" name="ext_requests" />
+	<field type="ExtRange" name="ext_replies" />
+	<field type="Range8" name="delivered_events" />
+	<field type="Range8" name="device_events" />
+	<field type="Range8" name="errors" />
+	<field type="BOOL" name="client_started" />
+	<field type="BOOL" name="client_died" />
+    </struct>
+
+    <typedef oldname="CARD8" newname="ElementHeader" />
+    <enum name="HType">
+	<item name="FromServerTime"><bit>0</bit></item>
+	<item name="FromClientTime"><bit>1</bit></item>
+	<item name="FromClientSequence"><bit>2</bit></item>
+    </enum>
+
+    <typedef oldname="CARD32" newname="ClientSpec" />
+    <enum name="CS">
+	<item name="CurrentClients"><value>1</value></item>
+	<item name="FutureClients"><value>2</value></item>
+	<item name="AllClients"><value>3</value></item>
+    </enum>
+
+    <struct name="ClientInfo">
+	<field type="ClientSpec" name="client_resource" />
+	<field type="CARD32" name="num_ranges" />
+	<list type="Range" name="ranges">
+	    <fieldref>num_ranges</fieldref>
+	</list>
+    </struct>
+
+    <!-- Errors -->
+    <error name="BadContext" number="0">
+	<field type="CARD32" name="invalid_record" />
+    </error>
+	
+    <!-- Requests -->
+    <request name="QueryVersion" opcode="0">
+	<field type="CARD16" name="major_version" />
+	<field type="CARD16" name="minor_version" />
+	<reply>
+	    <pad bytes="1"/>
+	    <field type="CARD16" name="major_version" />
+	    <field type="CARD16" name="minor_version" />
+	</reply>
+    </request>
+
+    <request name="CreateContext" opcode="1">
+	<field type="record:CONTEXT" name="context" />
+	<field type="ElementHeader" name="element_header" />
+	<pad bytes="3" />
+	<field type="CARD32" name="num_client_specs" />
+	<field type="CARD32" name="num_ranges" />
+	<list type="ClientSpec" name="client_specs">
+	    <fieldref>num_client_specs</fieldref>
+	</list>
+	<list type="Range" name="ranges">
+	    <fieldref>num_ranges</fieldref>
+	</list>
+    </request>
+
+    <request name="RegisterClients" opcode="2">
+	<field type="record:CONTEXT" name="context" />
+	<field type="ElementHeader" name="element_header" />
+	<pad bytes="3" />
+	<field type="CARD32" name="num_client_specs" />
+	<field type="CARD32" name="num_ranges" />
+	<list type="ClientSpec" name="client_specs">
+	    <fieldref>num_client_specs</fieldref>
+	</list>
+	<list type="Range" name="ranges">
+	    <fieldref>num_ranges</fieldref>
+	</list>
+    </request>
+
+    <request name="UnregisterClients" opcode="3">
+	<field type="record:CONTEXT" name="context" />
+	<field type="CARD32" name="num_client_specs" />
+	<list type="ClientSpec" name="client_specs">
+	    <fieldref>num_client_specs</fieldref>
+	</list>
+    </request>
+
+    <request name="GetContext" opcode="4">
+	<field type="record:CONTEXT" name="context" />
+	<reply>
+	    <field type="BOOL" name="enabled" />
+	    <field type="ElementHeader" name="element_header" />
+	    <pad bytes="3" />
+	    <field type="CARD32" name="num_intercepted_clients" />
+	    <pad bytes="16" />
+	    <list type="ClientInfo" name="intercepted_clients">
+		<fieldref>num_intercepted_clients</fieldref>
+	    </list>
+	</reply>
+    </request>
+
+    <request name="EnableContext" opcode="5">
+	<field type="record:CONTEXT" name="context" />
+	<reply>
+	    <field type="CARD8" name="category" />
+	    <field type="ElementHeader" name="element_header" />
+	    <field type="BOOL" name="client_swapped" />
+	    <pad bytes="2" />
+	    <field type="CARD32" name="xid_base" />
+	    <field type="CARD32" name="server_time" />
+	    <field type="CARD32" name="rec_sequence_num" />
+	    <pad bytes="8" />
+	    <list type="BYTE" name="data">
+		<op op="*">
+		    <fieldref>length</fieldref>
+		    <value>4</value>
+		</op>
+	    </list>
+	</reply>
+    </request>
+	    
+    <request name="DisableContext" opcode="6">
+	<field type="record:CONTEXT" name="context" />
+    </request>
+
+    <request name="FreeContext" opcode="7">
+	<field type="record:CONTEXT" name="context" />
+    </request>
+    
+</xcb>
diff --git a/third_party/xcbproto/src/src/render.xml b/third_party/xcbproto/src/src/render.xml
new file mode 100644
index 000000000000..935fdcc81da3
--- /dev/null
+++ b/third_party/xcbproto/src/src/render.xml
@@ -0,0 +1,693 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2002-2004 Carl D. Worth, Jamey Sharp, Bart Massey, Josh Triplett
+All Rights Reserved.  See the file COPYING in this directory
+for licensing information.
+-->
+<xcb header="render" extension-xname="RENDER" extension-name="Render"
+    major-version="0" minor-version="11">
+  <!-- supports version 0.11 -->
+
+  <import>xproto</import>
+
+  <enum name="PictType">
+    <item name="Indexed"> <value>0</value> </item>
+    <item name="Direct">  <value>1</value> </item>
+  </enum>
+
+  <enum name="Picture">
+    <item name="None"> <value>0</value> </item>
+  </enum>
+
+  <!-- Disjoint* and Conjoint* are new in version 0.2 -->
+  <!-- PDF blend modes are new in version 0.11 -->
+  <enum name="PictOp">
+    <item name="Clear">               <value>0</value> </item>
+    <item name="Src">                 <value>1</value> </item>
+    <item name="Dst">                 <value>2</value> </item>
+    <item name="Over">                <value>3</value> </item>
+    <item name="OverReverse">         <value>4</value> </item>
+    <item name="In">                  <value>5</value> </item>
+    <item name="InReverse">           <value>6</value> </item>
+    <item name="Out">                 <value>7</value> </item>
+    <item name="OutReverse">          <value>8</value> </item>
+    <item name="Atop">                <value>9</value> </item>
+    <item name="AtopReverse">         <value>10</value> </item>
+    <item name="Xor">                 <value>11</value> </item>
+    <item name="Add">                 <value>12</value> </item>
+    <item name="Saturate">            <value>13</value> </item>
+    
+    <item name="DisjointClear">       <value>16</value></item>
+    <item name="DisjointSrc">         <value>17</value> </item>
+    <item name="DisjointDst">         <value>18</value> </item>
+    <item name="DisjointOver">        <value>19</value> </item>
+    <item name="DisjointOverReverse"> <value>20</value> </item>
+    <item name="DisjointIn">          <value>21</value> </item>
+    <item name="DisjointInReverse">   <value>22</value> </item>
+    <item name="DisjointOut">         <value>23</value> </item>
+    <item name="DisjointOutReverse">  <value>24</value> </item>
+    <item name="DisjointAtop">        <value>25</value> </item>
+    <item name="DisjointAtopReverse"> <value>26</value> </item>
+    <item name="DisjointXor">         <value>27</value> </item>
+    
+    <item name="ConjointClear">       <value>32</value></item>
+    <item name="ConjointSrc">         <value>33</value> </item>
+    <item name="ConjointDst">         <value>34</value> </item>
+    <item name="ConjointOver">        <value>35</value> </item>
+    <item name="ConjointOverReverse"> <value>36</value> </item>
+    <item name="ConjointIn">          <value>37</value> </item>
+    <item name="ConjointInReverse">   <value>38</value> </item>
+    <item name="ConjointOut">         <value>39</value> </item>
+    <item name="ConjointOutReverse">  <value>40</value> </item>
+    <item name="ConjointAtop">        <value>41</value> </item>
+    <item name="ConjointAtopReverse"> <value>42</value> </item>
+    <item name="ConjointXor">         <value>43</value> </item>
+
+    <!-- PDF blend modes are new in version 0.11 -->
+    <item name="Multiply">            <value>48</value></item>
+    <item name="Screen">              <value>49</value> </item>
+    <item name="Overlay">             <value>50</value> </item>
+    <item name="Darken">              <value>51</value> </item>
+    <item name="Lighten">             <value>52</value> </item>
+    <item name="ColorDodge">          <value>53</value> </item>
+    <item name="ColorBurn">           <value>54</value> </item>
+    <item name="HardLight">           <value>55</value> </item>
+    <item name="SoftLight">           <value>56</value> </item>
+    <item name="Difference">          <value>57</value> </item>
+    <item name="Exclusion">           <value>58</value> </item>
+    <item name="HSLHue">              <value>59</value> </item>
+    <item name="HSLSaturation">       <value>60</value> </item>
+    <item name="HSLColor">            <value>61</value> </item>
+    <item name="HSLLuminosity">       <value>62</value> </item>
+  </enum>
+
+  <enum name="PolyEdge">
+    <item name="Sharp">  <value>0</value> </item>
+    <item name="Smooth"> <value>1</value> </item>
+  </enum>
+
+  <enum name="PolyMode">
+    <item name="Precise">   <value>0</value> </item>
+    <item name="Imprecise"> <value>1</value> </item>
+  </enum>
+
+  <enum name="CP">
+    <item name="Repeat">          <bit>0</bit></item>
+    <item name="AlphaMap">        <bit>1</bit></item>
+    <item name="AlphaXOrigin">    <bit>2</bit></item>
+    <item name="AlphaYOrigin">    <bit>3</bit></item>
+    <item name="ClipXOrigin">     <bit>4</bit></item>
+    <item name="ClipYOrigin">     <bit>5</bit></item>
+    <item name="ClipMask">        <bit>6</bit></item>
+    <item name="GraphicsExposure"><bit>7</bit></item>
+    <item name="SubwindowMode">   <bit>8</bit></item>
+    <item name="PolyEdge">        <bit>9</bit></item>
+    <item name="PolyMode">        <bit>10</bit></item>
+    <item name="Dither">          <bit>11</bit></item>
+    <item name="ComponentAlpha">  <bit>12</bit></item>
+  </enum>
+
+  <enum name="SubPixel">
+    <item name="Unknown">       <value>0</value> </item>
+    <item name="HorizontalRGB"> <value>1</value> </item>
+    <item name="HorizontalBGR"> <value>2</value> </item>
+    <item name="VerticalRGB">   <value>3</value> </item>
+    <item name="VerticalBGR">   <value>4</value> </item>
+    <item name="None">          <value>5</value> </item>
+  </enum>
+
+  <!-- Extended repeat attributes introduced in 0.10 -->
+  <enum name="Repeat">
+    <item name="None">    <value>0</value> </item>
+    <item name="Normal">  <value>1</value> </item>
+    <item name="Pad">     <value>2</value> </item>
+    <item name="Reflect"> <value>3</value> </item>
+  </enum>
+
+  <typedef oldname="CARD32" newname="GLYPH" />
+  <xidtype name="GLYPHSET" />
+
+  <xidtype name="PICTURE" />
+  <xidtype name="PICTFORMAT" />
+
+  <typedef oldname="INT32" newname="FIXED" />
+
+  <error name="PictFormat" number="0" />
+  <error name="Picture" number="1" />
+  <error name="PictOp" number="2" />
+  <error name="GlyphSet" number="3" />
+  <error name="Glyph" number="4" />
+
+  <struct name="DIRECTFORMAT">
+    <field type="CARD16" name="red_shift" />
+    <field type="CARD16" name="red_mask" />
+    <field type="CARD16" name="green_shift" />
+    <field type="CARD16" name="green_mask" />
+    <field type="CARD16" name="blue_shift" />
+    <field type="CARD16" name="blue_mask" />
+    <field type="CARD16" name="alpha_shift" />
+    <field type="CARD16" name="alpha_mask" />
+  </struct>
+
+  <struct name="PICTFORMINFO">
+    <field type="PICTFORMAT" name="id" />
+    <field type="CARD8" name="type" enum="PictType" />
+    <field type="CARD8" name="depth" />
+    <pad bytes="2" />
+    <field type="DIRECTFORMAT" name="direct" />
+    <field type="COLORMAP" name="colormap" />
+  </struct>
+
+  <struct name="PICTVISUAL">
+    <field type="VISUALID" name="visual" />
+    <field type="PICTFORMAT" name="format" />
+  </struct>
+
+  <struct name="PICTDEPTH">
+    <field type="CARD8" name="depth" />
+    <pad bytes="1" />
+    <field type="CARD16" name="num_visuals" />
+    <pad bytes="4" />
+    <list type="PICTVISUAL" name="visuals">
+      <fieldref>num_visuals</fieldref>
+    </list>
+  </struct>
+
+  <struct name="PICTSCREEN">
+    <field type="CARD32" name="num_depths" />
+    <field type="PICTFORMAT" name="fallback" />
+    <list type="PICTDEPTH" name="depths">
+      <fieldref>num_depths</fieldref>
+    </list>
+  </struct>
+
+  <struct name="INDEXVALUE">
+    <field type="CARD32" name="pixel" />
+    <field type="CARD16" name="red" />
+    <field type="CARD16" name="green" />
+    <field type="CARD16" name="blue" />
+    <field type="CARD16" name="alpha" />
+  </struct>
+
+  <struct name="COLOR">
+    <field type="CARD16" name="red" />
+    <field type="CARD16" name="green" />
+    <field type="CARD16" name="blue" />
+    <field type="CARD16" name="alpha" />
+  </struct>
+
+  <struct name="POINTFIX">
+    <field type="FIXED" name="x" />
+    <field type="FIXED" name="y" />
+  </struct>
+
+  <struct name="LINEFIX">
+    <field type="POINTFIX" name="p1" />
+    <field type="POINTFIX" name="p2" />
+  </struct>
+
+  <struct name="TRIANGLE">
+    <field type="POINTFIX" name="p1" />
+    <field type="POINTFIX" name="p2" />
+    <field type="POINTFIX" name="p3" />
+  </struct>
+
+  <struct name="TRAPEZOID">
+    <field type="FIXED" name="top" />
+    <field type="FIXED" name="bottom" />
+    <field type="LINEFIX" name="left" />
+    <field type="LINEFIX" name="right" />
+  </struct>
+
+  <struct name="GLYPHINFO">
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="INT16" name="x_off" />
+    <field type="INT16" name="y_off" />
+  </struct>
+
+
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD32" name="client_major_version" />
+    <field type="CARD32" name="client_minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="major_version" />
+      <field type="CARD32" name="minor_version" />
+      <pad bytes="16" />
+    </reply>
+  </request>
+
+  <request name="QueryPictFormats" opcode="1">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="num_formats" />
+      <field type="CARD32" name="num_screens" />
+      <field type="CARD32" name="num_depths" />
+      <field type="CARD32" name="num_visuals" />
+      <field type="CARD32" name="num_subpixel" /> <!-- new in version 0.6 -->
+      <pad bytes="4" />
+      <list type="PICTFORMINFO" name="formats">
+        <fieldref>num_formats</fieldref>
+      </list>
+      <list type="PICTSCREEN" name="screens">
+        <fieldref>num_screens</fieldref>
+      </list>
+      <list type="CARD32" name="subpixels" enum="SubPixel" >
+        <fieldref>num_subpixel</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <!-- from version 0.7 -->
+  <request name="QueryPictIndexValues" opcode="2">
+    <field type="PICTFORMAT" name="format" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="num_values" />
+      <pad bytes="20" />
+      <list type="INDEXVALUE" name="values">
+        <fieldref>num_values</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <!-- opcode 3 reserved for QueryDithers -->
+
+  <request name="CreatePicture" opcode="4">
+    <field type="PICTURE" name="pid" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="PICTFORMAT" name="format" />
+    <field type="CARD32" name="value_mask" mask="CP"/>
+    <switch name="value_list">
+      <fieldref>value_mask</fieldref>
+      <bitcase>
+        <enumref ref="CP">Repeat</enumref>
+        <field type="CARD32" name="repeat" enum="Repeat"/>
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaMap</enumref>
+        <field type="PICTURE" name="alphamap" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaXOrigin</enumref>
+        <field type="INT32" name="alphaxorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaYOrigin</enumref>
+        <field type="INT32" name="alphayorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipXOrigin</enumref>
+        <field type="INT32" name="clipxorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipYOrigin</enumref>
+        <field type="INT32" name="clipyorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipMask</enumref>
+        <field type="PIXMAP" name="clipmask" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">GraphicsExposure</enumref>
+        <field type="CARD32" name="graphicsexposure" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">SubwindowMode</enumref>
+        <field type="CARD32" name="subwindowmode" enum="SubwindowMode"/>
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">PolyEdge</enumref>
+        <field type="CARD32" name="polyedge" enum="PolyEdge"/>
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">PolyMode</enumref>
+        <field type="CARD32" name="polymode" enum="PolyMode"/>
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">Dither</enumref>
+        <field type="ATOM" name="dither" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ComponentAlpha</enumref>
+        <field type="CARD32" name="componentalpha" />
+      </bitcase>
+    </switch>
+  </request>
+
+  <request name="ChangePicture" opcode="5">
+    <field type="PICTURE" name="picture" />
+    <field type="CARD32" name="value_mask" mask="CP"/>
+    <switch name="value_list">
+      <fieldref>value_mask</fieldref>
+      <bitcase>
+        <enumref ref="CP">Repeat</enumref>
+        <field type="CARD32" name="repeat" enum="Repeat"/>
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaMap</enumref>
+        <field type="PICTURE" name="alphamap" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaXOrigin</enumref>
+        <field type="INT32" name="alphaxorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaYOrigin</enumref>
+        <field type="INT32" name="alphayorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipXOrigin</enumref>
+        <field type="INT32" name="clipxorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipYOrigin</enumref>
+        <field type="INT32" name="clipyorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipMask</enumref>
+        <field type="PIXMAP" name="clipmask" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">GraphicsExposure</enumref>
+        <field type="CARD32" name="graphicsexposure" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">SubwindowMode</enumref>
+        <field type="CARD32" name="subwindowmode" enum="SubwindowMode"/>
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">PolyEdge</enumref>
+        <field type="CARD32" name="polyedge" enum="PolyEdge"/>
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">PolyMode</enumref>
+        <field type="CARD32" name="polymode" enum="PolyMode"/>
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">Dither</enumref>
+        <field type="ATOM" name="dither" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ComponentAlpha</enumref>
+        <field type="CARD32" name="componentalpha" />
+      </bitcase>
+    </switch>
+  </request>
+
+  <request name="SetPictureClipRectangles" opcode="6">
+    <field type="PICTURE" name="picture" />
+    <field type="INT16" name="clip_x_origin" />
+    <field type="INT16" name="clip_y_origin" />
+    <list type="RECTANGLE" name="rectangles" />
+  </request>
+
+  <request name="FreePicture" opcode="7">
+    <field type="PICTURE" name="picture" />
+  </request>
+
+  <request name="Composite" opcode="8">
+    <field type="CARD8" name="op" enum="PictOp" />
+    <pad bytes="3" />
+    <field type="PICTURE" name="src" />
+    <field type="PICTURE" name="mask" altenum="Picture" />
+    <field type="PICTURE" name="dst" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <field type="INT16" name="mask_x" />
+    <field type="INT16" name="mask_y" />
+    <field type="INT16" name="dst_x" />
+    <field type="INT16" name="dst_y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+  </request>
+
+  <!-- opcode 9 reserved for Scale -->
+
+  <request name="Trapezoids" opcode="10">
+    <field type="CARD8" name="op" enum="PictOp" />
+    <pad bytes="3" />
+    <field type="PICTURE" name="src" />
+    <field type="PICTURE" name="dst" />
+    <field type="PICTFORMAT" name="mask_format" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <list type="TRAPEZOID" name="traps" />
+  </request>
+
+  <request name="Triangles" opcode="11">
+    <field type="CARD8" name="op" enum="PictOp" />
+    <pad bytes="3" />
+    <field type="PICTURE" name="src" />
+    <field type="PICTURE" name="dst" />
+    <field type="PICTFORMAT" name="mask_format" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <list type="TRIANGLE" name="triangles" />
+  </request>
+
+  <request name="TriStrip" opcode="12">
+    <field type="CARD8" name="op" enum="PictOp" />
+    <pad bytes="3" />
+    <field type="PICTURE" name="src" />
+    <field type="PICTURE" name="dst" />
+    <field type="PICTFORMAT" name="mask_format" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <list type="POINTFIX" name="points" />
+  </request>
+
+  <request name="TriFan" opcode="13">
+    <field type="CARD8" name="op" enum="PictOp" />
+    <pad bytes="3" />
+    <field type="PICTURE" name="src" />
+    <field type="PICTURE" name="dst" />
+    <field type="PICTFORMAT" name="mask_format" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <list type="POINTFIX" name="points" />
+  </request>
+
+  <!-- opcode 14 reserved for ColorTrapezoids -->
+
+  <!-- opcode 15 reserved for ColorTriangles -->
+
+  <!-- opcode 16 reserved for Transform -->
+
+  <request name="CreateGlyphSet" opcode="17">
+    <field type="GLYPHSET" name="gsid" />
+    <field type="PICTFORMAT" name="format" />
+  </request>
+
+  <request name="ReferenceGlyphSet" opcode="18">
+    <field type="GLYPHSET" name="gsid" />
+    <field type="GLYPHSET" name="existing" />
+  </request>
+
+  <request name="FreeGlyphSet" opcode="19">
+    <field type="GLYPHSET" name="glyphset" />
+  </request>
+
+  <request name="AddGlyphs" opcode="20">
+    <field type="GLYPHSET" name="glyphset" />
+    <field type="CARD32" name="glyphs_len" />
+    <list type="CARD32" name="glyphids">
+      <fieldref>glyphs_len</fieldref>
+    </list>
+    <list type="GLYPHINFO" name="glyphs">
+      <fieldref>glyphs_len</fieldref>
+    </list>
+    <list type="BYTE" name="data" />
+  </request>
+
+  <!-- opcode 21 reserved for AddGlyphsFromPicture -->
+
+  <request name="FreeGlyphs" opcode="22">
+    <field type="GLYPHSET" name="glyphset" />
+    <list type="GLYPH" name="glyphs" />
+  </request>
+
+  <request name="CompositeGlyphs8" opcode="23">
+    <field type="CARD8" name="op" enum="PictOp" />
+    <pad bytes="3" />
+    <field type="PICTURE" name="src" />
+    <field type="PICTURE" name="dst" />
+    <field type="PICTFORMAT" name="mask_format" />
+    <field type="GLYPHSET" name="glyphset" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <list type="BYTE" name="glyphcmds" />
+  </request>
+
+  <request name="CompositeGlyphs16" opcode="24">
+    <field type="CARD8" name="op" enum="PictOp" />
+    <pad bytes="3" />
+    <field type="PICTURE" name="src" />
+    <field type="PICTURE" name="dst" />
+    <field type="PICTFORMAT" name="mask_format" />
+    <field type="GLYPHSET" name="glyphset" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <list type="BYTE" name="glyphcmds" />
+  </request>
+
+  <request name="CompositeGlyphs32" opcode="25">
+    <field type="CARD8" name="op" enum="PictOp" />
+    <pad bytes="3" />
+    <field type="PICTURE" name="src" />
+    <field type="PICTURE" name="dst" />
+    <field type="PICTFORMAT" name="mask_format" />
+    <field type="GLYPHSET" name="glyphset" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <list type="BYTE" name="glyphcmds" />
+  </request>
+
+  <!-- new in version 0.1 -->
+
+  <request name="FillRectangles" opcode="26">
+    <field type="CARD8" name="op" enum="PictOp" />
+    <pad bytes="3" />
+    <field type="PICTURE" name="dst" />
+    <field type="COLOR" name="color" />
+    <list type="RECTANGLE" name="rects" />
+  </request>
+
+  <!-- new in version 0.5 -->
+
+  <request name="CreateCursor" opcode="27">
+    <field type="CURSOR" name="cid" />
+    <field type="PICTURE" name="source" />
+    <field type="CARD16" name="x" />
+    <field type="CARD16" name="y" />
+  </request>
+
+  <!-- new in version 0.6 -->
+
+  <struct name="TRANSFORM">
+    <field type="FIXED" name="matrix11" />
+    <field type="FIXED" name="matrix12" />
+    <field type="FIXED" name="matrix13" />
+    <field type="FIXED" name="matrix21" />
+    <field type="FIXED" name="matrix22" />
+    <field type="FIXED" name="matrix23" />
+    <field type="FIXED" name="matrix31" />
+    <field type="FIXED" name="matrix32" />
+    <field type="FIXED" name="matrix33" />
+  </struct>
+
+  <request name="SetPictureTransform" opcode="28">
+    <field type="PICTURE" name="picture" />
+    <field type="TRANSFORM" name="transform" />
+  </request>
+
+  <request name="QueryFilters" opcode="29">
+    <field type="DRAWABLE" name="drawable" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="num_aliases" />
+      <field type="CARD32" name="num_filters" />
+      <pad bytes="16" />
+      <list type="CARD16" name="aliases">
+        <fieldref>num_aliases</fieldref>
+      </list>
+      <list type="STR" name="filters">
+        <fieldref>num_filters</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="SetPictureFilter" opcode="30">
+    <field type="PICTURE" name="picture" />
+    <field type="CARD16" name="filter_len" />
+    <pad bytes="2" />
+    <list type="char" name="filter">
+      <fieldref>filter_len</fieldref>
+    </list>
+    <pad align="4" />
+    <list type="FIXED" name="values" />
+  </request>
+
+  <!-- new in version 0.8 -->
+
+  <struct name="ANIMCURSORELT">
+    <field type="CURSOR" name="cursor" />
+    <field type="CARD32" name="delay" />
+  </struct>
+
+  <request name="CreateAnimCursor" opcode="31">
+    <field type="CURSOR" name="cid" />
+    <list type="ANIMCURSORELT" name="cursors" />
+  </request>
+
+  <!-- new in version 0.9 -->
+ 
+  <struct name="SPANFIX">
+    <field type="FIXED" name="l" />
+    <field type="FIXED" name="r" />
+    <field type="FIXED" name="y" />
+  </struct>
+
+  <struct name="TRAP">
+    <field type="SPANFIX" name="top" />
+    <field type="SPANFIX" name="bot" />
+  </struct>
+
+  <request name="AddTraps" opcode="32">
+    <field type="PICTURE" name="picture" />
+    <field type="INT16" name="x_off" />
+    <field type="INT16" name="y_off" />
+    <list type="TRAP" name="traps" />
+  </request>
+  
+  <!-- new in version 0.10 -->
+
+  <request name="CreateSolidFill" opcode="33">
+    <field type="PICTURE" name="picture" />
+    <field type="COLOR" name="color" />
+  </request>
+
+  <request name="CreateLinearGradient" opcode="34">
+    <field type="PICTURE" name="picture" />
+    <field type="POINTFIX" name="p1" />
+    <field type="POINTFIX" name="p2" />
+    <field type="CARD32" name="num_stops" />
+    <list type="FIXED" name="stops">
+      <fieldref>num_stops</fieldref>
+    </list>
+    <list type="COLOR" name="colors">
+      <fieldref>num_stops</fieldref>
+    </list>
+  </request>
+
+  <request name="CreateRadialGradient" opcode="35">
+    <field type="PICTURE" name="picture" />
+    <field type="POINTFIX" name="inner" />
+    <field type="POINTFIX" name="outer" />
+    <field type="FIXED" name="inner_radius" />
+    <field type="FIXED" name="outer_radius" />
+    <field type="CARD32" name="num_stops" />
+    <list type="FIXED" name="stops">
+      <fieldref>num_stops</fieldref>
+    </list>
+    <list type="COLOR" name="colors">
+      <fieldref>num_stops</fieldref>
+    </list>
+  </request>
+
+  <request name="CreateConicalGradient" opcode="36">
+    <field type="PICTURE" name="picture" />
+    <field type="POINTFIX" name="center" />
+    <field type="FIXED" name="angle" />        <!-- degrees -->
+    <field type="CARD32" name="num_stops" />
+    <list type="FIXED" name="stops">
+      <fieldref>num_stops</fieldref>
+    </list>
+    <list type="COLOR" name="colors">
+      <fieldref>num_stops</fieldref>
+    </list>
+  </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/res.xml b/third_party/xcbproto/src/src/res.xml
new file mode 100644
index 000000000000..be32ca18bf2a
--- /dev/null
+++ b/third_party/xcbproto/src/src/res.xml
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2006 Jeremy Kolb
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<xcb header="res" extension-xname="X-Resource" extension-name="Res"
+    major-version="1" minor-version="2">
+    <import>xproto</import>
+
+    <!-- v1.0 -->
+    <struct name="Client">
+        <field type="CARD32" name="resource_base" />
+        <field type="CARD32" name="resource_mask" />
+    </struct>
+
+    <struct name="Type">
+        <field type="ATOM" name="resource_type" />
+        <field type="CARD32" name="count" />
+    </struct>
+
+    <!-- v1.2 -->
+    <enum name="ClientIdMask">
+        <item name="ClientXID">      <bit>0</bit> </item>
+        <item name="LocalClientPID"> <bit>1</bit> </item>
+    </enum>
+
+    <struct name="ClientIdSpec">
+        <field type="CARD32" name="client" />
+        <field type="CARD32" name="mask" mask="ClientIdMask" />
+    </struct>
+
+    <struct name="ClientIdValue">
+        <field type="ClientIdSpec" name="spec" />
+        <field type="CARD32" name="length" />
+        <list type="CARD32" name="value">
+            <!-- The specification says that the length is in units of CARD32,
+                 but the specification also says that the length is 4 when a
+                 single LocalClientPid is present (ie. the length is in bytes).
+                 The current server implementation sets the length to 4 when a
+                 single CARD32 is present on the wire (length is in bytes). -->
+            <op op="/">
+                <fieldref>length</fieldref>
+                <value>4</value>
+            </op>
+        </list>
+    </struct>
+
+    <struct name="ResourceIdSpec">
+        <field type="CARD32" name="resource" />
+        <field type="CARD32" name="type" />
+    </struct>
+
+    <struct name="ResourceSizeSpec">
+        <field type="ResourceIdSpec" name="spec" />
+        <field type="CARD32" name="bytes" />
+        <field type="CARD32" name="ref_count" />
+        <field type="CARD32" name="use_count" />
+    </struct>
+
+    <struct name="ResourceSizeValue">
+        <field type="ResourceSizeSpec" name="size" />
+        <field type="CARD32" name="num_cross_references" />
+        <list type="ResourceSizeSpec" name="cross_references">
+            <fieldref>num_cross_references</fieldref>
+        </list>
+    </struct>
+
+    <!-- v1.0 -->
+    <request name="QueryVersion" opcode="0">
+        <field type="CARD8" name="client_major" />
+        <field type="CARD8" name="client_minor" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="server_major" />
+            <field type="CARD16" name="server_minor" />
+        </reply>
+    </request>
+
+    <request name="QueryClients" opcode="1">
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="num_clients" />
+            <pad bytes="20" />
+            <list type="Client" name="clients">
+                <fieldref>num_clients</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="QueryClientResources" opcode="2">
+        <field type="CARD32" name="xid" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="num_types" />
+            <pad bytes="20" />
+            <list type="Type" name="types">
+                <fieldref>num_types</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="QueryClientPixmapBytes" opcode="3">
+        <field type="CARD32" name="xid" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="bytes" />
+            <field type="CARD32" name="bytes_overflow" />
+        </reply>
+    </request>
+
+    <!-- v1.2 -->
+    <request name="QueryClientIds" opcode="4">
+        <field type="CARD32" name="num_specs" />
+        <list type="ClientIdSpec" name="specs">
+            <fieldref>num_specs</fieldref>
+        </list>
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="num_ids" />
+            <pad bytes="20" />
+            <list type="ClientIdValue" name="ids">
+                <fieldref>num_ids</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="QueryResourceBytes" opcode="5">
+        <field type="CARD32" name="client" />
+        <field type="CARD32" name="num_specs" />
+        <list type="ResourceIdSpec" name="specs">
+            <fieldref>num_specs</fieldref>
+        </list>
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="num_sizes" />
+            <pad bytes="20" />
+            <list type="ResourceSizeValue" name="sizes">
+                <fieldref>num_sizes</fieldref>
+            </list>
+        </reply>
+    </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/screensaver.xml b/third_party/xcbproto/src/src/screensaver.xml
new file mode 100644
index 000000000000..c546f94461d5
--- /dev/null
+++ b/third_party/xcbproto/src/src/screensaver.xml
@@ -0,0 +1,186 @@
+<!--
+
+Copyright (C) 2005 Vincent Torri.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person ob/Sintaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<!--
+Screen Saver Extension to the X Protocol
+Draft Standard Version 1.1
+-->
+<xcb header="screensaver" extension-xname="MIT-SCREEN-SAVER" extension-name="ScreenSaver" major-version="1" minor-version="1">
+
+  <!-- Types -->
+
+  <import>xproto</import>
+
+  <enum name="Kind">
+    <item name="Blanked">  <value>0</value> </item>
+    <item name="Internal"> <value>1</value> </item>
+    <item name="External"> <value>2</value> </item>
+  </enum>
+
+  <enum name="Event">
+    <item name="NotifyMask"><bit>0</bit></item>
+    <item name="CycleMask"> <bit>1</bit></item>
+  </enum>
+
+  <enum name="State">
+    <item name="Off">      <value>0</value> </item>
+    <item name="On">       <value>1</value> </item>
+    <item name="Cycle">    <value>2</value> </item>
+    <item name="Disabled"> <value>3</value> </item>
+  </enum>
+
+  <!-- Errors -->
+  <!-- Requests -->
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD8" name="client_major_version"/>
+    <field type="CARD8" name="client_minor_version"/>
+    <pad bytes="2"/>
+    <reply>
+      <pad bytes="1"/>
+      <field type="CARD16" name="server_major_version"/>
+      <field type="CARD16" name="server_minor_version"/>
+      <pad bytes="20"/>
+    </reply>
+  </request>
+
+  <request name="QueryInfo" opcode="1">
+    <field type="DRAWABLE" name="drawable"/>
+    <reply>
+      <field type="CARD8" name="state"/>
+      <field type="WINDOW" name="saver_window"/>
+      <field type="CARD32" name="ms_until_server"/>
+      <field type="CARD32" name="ms_since_user_input"/>
+      <field type="CARD32" name="event_mask" />
+      <field type="BYTE" name="kind" enum="Kind"/>
+      <pad bytes="7"/>
+    </reply>
+  </request>
+
+  <request name="SelectInput" opcode="2">
+    <field type="DRAWABLE" name="drawable"/>
+    <field type="CARD32" name="event_mask" mask="Event"/>
+  </request>
+
+  <request name="SetAttributes" opcode="3">
+    <field type="DRAWABLE" name="drawable"/>
+    <field type="INT16" name="x"/>
+    <field type="INT16" name="y"/>
+    <field type="CARD16" name="width"/>
+    <field type="CARD16" name="height"/>
+    <field type="CARD16" name="border_width"/>
+    <field type="BYTE" name="class" enum="WindowClass"/>
+    <field type="CARD8" name="depth"/>
+    <field type="VISUALID" name="visual"/>
+    <field type="CARD32" name="value_mask" mask="CW" />
+    <switch name="value_list">
+        <fieldref>value_mask</fieldref>
+        <bitcase>
+          <enumref ref="CW">BackPixmap</enumref>
+          <field type="PIXMAP" name="background_pixmap" altenum="BackPixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackPixel</enumref>
+          <field type="CARD32" name="background_pixel" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BorderPixmap</enumref>
+          <field type="PIXMAP" name="border_pixmap" altenum="Pixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BorderPixel</enumref>
+          <field type="CARD32" name="border_pixel" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BitGravity</enumref>
+          <field type="CARD32" name="bit_gravity" enum="Gravity"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">WinGravity</enumref>
+          <field type="CARD32" name="win_gravity" enum="Gravity"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackingStore</enumref>
+          <field type="CARD32" name="backing_store" enum="BackingStore"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackingPlanes</enumref>
+          <field type="CARD32" name="backing_planes" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackingPixel</enumref>
+          <field type="CARD32" name="backing_pixel" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">OverrideRedirect</enumref>
+          <field type="BOOL32" name="override_redirect" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">SaveUnder</enumref>
+          <field type="BOOL32" name="save_under" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">EventMask</enumref>
+          <field type="CARD32" name="event_mask" mask="EventMask"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">DontPropagate</enumref>
+          <field type="CARD32" name="do_not_propogate_mask" mask="EventMask"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">Colormap</enumref>
+          <field type="COLORMAP" name="colormap" altenum="Colormap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">Cursor</enumref>
+          <field type="CURSOR" name="cursor" altenum="Cursor"/>
+        </bitcase>
+    </switch>
+
+  </request>
+
+  <request name="UnsetAttributes" opcode="4">
+    <field type="DRAWABLE" name="drawable"/>
+  </request>
+  
+  <!-- version 1.1 -->
+  <request name="Suspend" opcode="5">
+    <field type="CARD32" name="suspend" />
+  </request>
+
+  <!-- Events -->
+
+  <event name="Notify" number="0">
+    <field type="BYTE" name="state" enum="State"/>
+    <field type="TIMESTAMP" name="time"/>
+    <field type="WINDOW" name="root"/>
+    <field type="WINDOW" name="window"/>
+    <field type="BYTE" name="kind" enum="Kind"/>
+    <field type="BOOL" name="forced"/>
+    <pad bytes="14"/>
+  </event>
+
+</xcb>
diff --git a/third_party/xcbproto/src/src/shape.xml b/third_party/xcbproto/src/src/shape.xml
new file mode 100644
index 000000000000..d75549e0592f
--- /dev/null
+++ b/third_party/xcbproto/src/src/shape.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2001-2004 Bart Massey, Jamey Sharp, and Josh Triplett.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<!-- This file describes version 1.1 of the Shape extension. -->
+<xcb header="shape" extension-xname="SHAPE" extension-name="Shape" major-version="1" minor-version="1">
+  <import>xproto</import>
+
+  <typedef oldname="CARD8" newname="OP" />
+  <typedef oldname="CARD8" newname="KIND" />
+
+  <!-- Shape attributes of type OP. -->
+  <enum name="SO">
+    <item name="Set">       <value>0</value> </item>
+    <item name="Union">     <value>1</value> </item>
+    <item name="Intersect"> <value>2</value> </item>
+    <item name="Subtract">  <value>3</value> </item>
+    <item name="Invert">    <value>4</value> </item>
+  </enum>
+
+  <!-- Shape attributes of type KIND. -->
+  <enum name="SK">
+    <item name="Bounding"> <value>0</value> </item>
+    <item name="Clip">     <value>1</value> </item>
+    <item name="Input">    <value>2</value> </item>      <!-- added in version 1.1 -->
+  </enum>
+
+  <event name="Notify" number="0">
+    <field type="KIND" name="shape_kind" enum="SK" />
+    <field type="WINDOW" name="affected_window" />
+    <field type="INT16" name="extents_x" />
+    <field type="INT16" name="extents_y" />
+    <field type="CARD16" name="extents_width" />
+    <field type="CARD16" name="extents_height" />
+    <field type="TIMESTAMP" name="server_time" />
+    <field type="BOOL" name="shaped" />
+    <pad bytes="11" />
+  </event>
+
+  <request name="QueryVersion" opcode="0">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="major_version" />
+      <field type="CARD16" name="minor_version" />
+    </reply>
+  </request>
+
+  <request name="Rectangles" opcode="1">
+    <field type="OP" name="operation" enum="SO" />
+    <field type="KIND" name="destination_kind" enum="SK" />
+    <field type="BYTE" name="ordering" enum="ClipOrdering" />
+    <pad bytes="1" />
+    <field type="WINDOW" name="destination_window" />
+    <field type="INT16" name="x_offset" />
+    <field type="INT16" name="y_offset" />
+    <list type="RECTANGLE" name="rectangles" />
+  </request>
+
+  <request name="Mask" opcode="2">
+    <field type="OP" name="operation" enum="SO" />
+    <field type="KIND" name="destination_kind" enum="SK" />
+    <pad bytes="2" />
+    <field type="WINDOW" name="destination_window" />
+    <field type="INT16" name="x_offset" />
+    <field type="INT16" name="y_offset" />
+    <field type="PIXMAP" name="source_bitmap" altenum="Pixmap" />
+  </request>
+
+  <request name="Combine" opcode="3">
+    <field type="OP" name="operation" enum="SO" />
+    <field type="KIND" name="destination_kind" enum="SK" />
+    <field type="KIND" name="source_kind" enum="SK" />
+    <pad bytes="1" />
+    <field type="WINDOW" name="destination_window" />
+    <field type="INT16" name="x_offset" />
+    <field type="INT16" name="y_offset" />
+    <field type="WINDOW" name="source_window" />
+  </request>
+
+  <request name="Offset" opcode="4">
+    <field type="KIND" name="destination_kind" enum="SK" />
+    <pad bytes="3" />
+    <field type="WINDOW" name="destination_window" />
+    <field type="INT16" name="x_offset" />
+    <field type="INT16" name="y_offset" />
+  </request>
+
+  <request name="QueryExtents" opcode="5">
+    <field type="WINDOW" name="destination_window" />
+    <reply>
+      <pad bytes="1" />
+      <field type="BOOL" name="bounding_shaped" />
+      <field type="BOOL" name="clip_shaped" />
+      <pad bytes="2" />
+      <field type="INT16" name="bounding_shape_extents_x" />
+      <field type="INT16" name="bounding_shape_extents_y" />
+      <field type="CARD16" name="bounding_shape_extents_width" />
+      <field type="CARD16" name="bounding_shape_extents_height" />
+      <field type="INT16" name="clip_shape_extents_x" />
+      <field type="INT16" name="clip_shape_extents_y" />
+      <field type="CARD16" name="clip_shape_extents_width" />
+      <field type="CARD16" name="clip_shape_extents_height" />
+    </reply>
+  </request>
+
+  <request name="SelectInput" opcode="6">
+    <field type="WINDOW" name="destination_window" />
+    <field type="BOOL" name="enable" />
+    <pad bytes="3" />
+  </request>
+
+  <request name="InputSelected" opcode="7">
+    <field type="WINDOW" name="destination_window" />
+    <reply>
+      <field type="BOOL" name="enabled" />
+    </reply>
+  </request>
+
+  <request name="GetRectangles" opcode="8">
+    <field type="WINDOW" name="window" />
+    <field type="KIND" name="source_kind" enum="SK" />
+    <pad bytes="3" />
+    <reply>
+      <field type="BYTE" name="ordering" enum="ClipOrdering" />
+      <field type="CARD32" name="rectangles_len" />
+      <pad bytes="20" />
+      <list type="RECTANGLE" name="rectangles">
+        <fieldref>rectangles_len</fieldref>
+      </list>
+    </reply>
+  </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/shm.xml b/third_party/xcbproto/src/src/shm.xml
new file mode 100644
index 000000000000..c2605da0e2cb
--- /dev/null
+++ b/third_party/xcbproto/src/src/shm.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2001-2004 Bart Massey, Jamey Sharp, and Josh Triplett.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<xcb header="shm" extension-xname="MIT-SHM" extension-name="Shm"
+    major-version="1" minor-version="2">
+  <import>xproto</import>
+
+  <xidtype name="SEG" />
+
+  <event name="Completion" number="0">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD16" name="minor_event" />
+    <field type="BYTE" name="major_event" />
+    <pad bytes="1" />
+    <field type="SEG" name="shmseg" />
+    <field type="CARD32" name="offset" />
+  </event>
+
+  <errorcopy name="BadSeg" number="0" ref="Value" />
+
+  <request name="QueryVersion" opcode="0">
+    <reply>
+      <field type="BOOL" name="shared_pixmaps" />
+      <field type="CARD16" name="major_version" />
+      <field type="CARD16" name="minor_version" />
+      <field type="CARD16" name="uid" />
+      <field type="CARD16" name="gid" />
+      <field type="CARD8" name="pixmap_format" />
+      <pad bytes="15" />
+    </reply>
+  </request>
+
+  <request name="Attach" opcode="1">
+    <field type="SEG" name="shmseg" />
+    <field type="CARD32" name="shmid" />
+    <field type="BOOL" name="read_only" />
+    <pad bytes="3" />
+  </request>
+
+  <request name="Detach" opcode="2">
+    <field type="SEG" name="shmseg" />
+  </request>
+
+  <request name="PutImage" opcode="3">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="CARD16" name="total_width" />
+    <field type="CARD16" name="total_height" />
+    <field type="CARD16" name="src_x" />
+    <field type="CARD16" name="src_y" />
+    <field type="CARD16" name="src_width" />
+    <field type="CARD16" name="src_height" />
+    <field type="INT16" name="dst_x" />
+    <field type="INT16" name="dst_y" />
+    <field type="CARD8" name="depth" />
+    <field type="CARD8" name="format" />
+    <field type="BOOL" name="send_event" />
+    <pad bytes="1" />
+    <field type="SEG" name="shmseg" />
+    <field type="CARD32" name="offset" />
+  </request>
+
+  <request name="GetImage" opcode="4">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD32" name="plane_mask" />
+    <field type="CARD8" name="format" />
+    <pad bytes="3" />
+    <field type="SEG" name="shmseg" />
+    <field type="CARD32" name="offset" />
+    <reply>
+      <field type="CARD8" name="depth" />
+      <field type="VISUALID" name="visual" />
+      <field type="CARD32" name="size" />
+    </reply>
+  </request>
+
+  <request name="CreatePixmap" opcode="5">
+    <field type="PIXMAP" name="pid" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD8" name="depth" />
+    <pad bytes="3" />
+    <field type="SEG" name="shmseg" />
+    <field type="CARD32" name="offset" />
+  </request>
+
+  <request name="AttachFd" opcode="6">
+    <field type="SEG" name="shmseg" />
+    <fd name="shm_fd" />
+    <field type="BOOL" name="read_only" />
+    <pad bytes="3" />
+  </request>
+
+  <request name="CreateSegment" opcode="7">
+    <field type="SEG" name="shmseg" />
+    <field type="CARD32" name="size" />
+    <field type="BOOL" name="read_only" />
+    <pad bytes="3" />
+    <reply>
+      <field type="CARD8" name="nfd" />
+      <fd name="shm_fd" />
+      <pad bytes="24" />
+    </reply>
+  </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/sync.xml b/third_party/xcbproto/src/src/sync.xml
new file mode 100644
index 000000000000..33ce178717ed
--- /dev/null
+++ b/third_party/xcbproto/src/src/sync.xml
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2004 Mikko Torni and Josh Triplett.
+All Rights Reserved.  See the file COPYING in this directory
+for licensing information.
+-->
+<xcb header="sync" extension-xname="SYNC" extension-name="Sync"
+    major-version="3" minor-version="1">
+  <import>xproto</import>
+
+  <xidtype name="ALARM" />
+
+  <enum name="ALARMSTATE">
+    <item name="Active">    <value>0</value> </item>
+    <item name="Inactive">  <value>1</value> </item>
+    <item name="Destroyed"> <value>2</value> </item>
+  </enum>
+
+  <xidtype name="COUNTER" />
+
+  <xidtype name="FENCE" />
+
+  <enum name="TESTTYPE">
+    <item name="PositiveTransition"> <value>0</value> </item>
+    <item name="NegativeTransition"> <value>1</value> </item>
+    <item name="PositiveComparison"> <value>2</value> </item>
+    <item name="NegativeComparison"> <value>3</value> </item>
+  </enum>
+
+  <enum name="VALUETYPE">
+    <item name="Absolute"> <value>0</value> </item>
+    <item name="Relative"> <value>1</value> </item>
+  </enum>
+
+  <enum name="CA">
+    <item name="Counter">  <bit>0</bit></item>
+    <item name="ValueType"><bit>1</bit></item>
+    <item name="Value">    <bit>2</bit></item>
+    <item name="TestType"> <bit>3</bit></item>
+    <item name="Delta">    <bit>4</bit></item>
+    <item name="Events">   <bit>5</bit></item>
+  </enum>
+
+  <struct name="INT64">
+    <field type="INT32" name="hi" />
+    <field type="CARD32" name="lo" />
+  </struct>
+
+  <struct name="SYSTEMCOUNTER">
+    <field type="COUNTER" name="counter" />
+    <field type="sync:INT64" name="resolution" />
+    <field type="CARD16" name="name_len" />
+    <list type="char" name="name">
+      <fieldref>name_len</fieldref>
+    </list>
+    <pad align="4" />
+  </struct>
+
+  <struct name="TRIGGER">
+    <field type="COUNTER" name="counter" />
+    <field type="CARD32" name="wait_type" enum="VALUETYPE" />
+    <field type="sync:INT64" name="wait_value" />
+    <field type="CARD32" name="test_type" enum="TESTTYPE" />
+  </struct>
+
+  <struct name="WAITCONDITION">
+    <field type="TRIGGER" name="trigger" />
+    <field type="sync:INT64" name="event_threshold" />
+  </struct>
+
+  <error name="Counter" number="0">
+    <field type="CARD32" name="bad_counter" />
+    <field type="CARD16" name="minor_opcode" />
+    <field type="CARD8" name="major_opcode" />
+  </error>
+
+  <error name="Alarm" number="1">
+    <field type="CARD32" name="bad_alarm" />
+    <field type="CARD16" name="minor_opcode" />
+    <field type="CARD8" name="major_opcode" />
+  </error>
+    
+  <request name="Initialize" opcode="0">
+    <field type="CARD8" name="desired_major_version" />
+    <field type="CARD8" name="desired_minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD8" name="major_version" />
+      <field type="CARD8" name="minor_version" />
+      <pad bytes="22" />
+    </reply>
+  </request>
+
+  <request name="ListSystemCounters" opcode="1">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="counters_len" />
+      <pad bytes="20" />
+      <list type="SYSTEMCOUNTER" name="counters">
+        <fieldref>counters_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="CreateCounter" opcode="2">
+    <field type="COUNTER" name="id" />
+    <field type="sync:INT64" name="initial_value" />
+  </request>
+
+  <request name="DestroyCounter" opcode="6">
+    <field type="COUNTER" name="counter" />
+  </request>
+
+  <request name="QueryCounter" opcode="5">
+    <field type="COUNTER" name="counter" />
+    <reply>
+      <pad bytes="1" />
+      <field type="sync:INT64" name="counter_value" />
+    </reply>
+  </request>
+
+  <request name="Await" opcode="7">
+    <list type="WAITCONDITION" name="wait_list" />
+  </request>
+
+  <request name="ChangeCounter" opcode="4">
+    <field type="COUNTER" name="counter" />
+    <field type="sync:INT64" name="amount" />
+  </request>
+
+  <request name="SetCounter" opcode="3">
+    <field type="COUNTER" name="counter" />
+    <field type="sync:INT64" name="value" />
+  </request>
+
+  <request name="CreateAlarm" opcode="8">
+    <field type="ALARM" name="id" />
+    <field type="CARD32" name="value_mask" mask="CA" />
+    <switch name="value_list">
+      <fieldref>value_mask</fieldref>
+      <bitcase>
+        <enumref ref="CA">Counter</enumref>
+        <field type="COUNTER" name="counter" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CA">ValueType</enumref>
+        <field type="CARD32" name="valueType" enum="VALUETYPE" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CA">Value</enumref>
+        <field type="sync:INT64" name="value" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CA">TestType</enumref>
+        <field type="CARD32" name="testType" enum="TESTTYPE" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CA">Delta</enumref>
+        <field type="sync:INT64" name="delta" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CA">Events</enumref>
+        <field type="CARD32" name="events" />
+      </bitcase>
+    </switch>
+  </request>
+
+  <request name="ChangeAlarm" opcode="9">
+    <field type="ALARM" name="id" />
+    <field type="CARD32" name="value_mask" mask="CA" />
+    <switch name="value_list">
+      <fieldref>value_mask</fieldref>
+      <bitcase>
+        <enumref ref="CA">Counter</enumref>
+        <field type="COUNTER" name="counter" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CA">ValueType</enumref>
+        <field type="CARD32" name="valueType" enum="VALUETYPE" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CA">Value</enumref>
+        <field type="sync:INT64" name="value" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CA">TestType</enumref>
+        <field type="CARD32" name="testType" enum="TESTTYPE" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CA">Delta</enumref>
+        <field type="sync:INT64" name="delta" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CA">Events</enumref>
+        <field type="CARD32" name="events" />
+      </bitcase>
+    </switch>
+  </request>
+
+  <request name="DestroyAlarm" opcode="11">
+    <field type="ALARM" name="alarm" />
+  </request>
+
+  <request name="QueryAlarm" opcode="10">
+    <field type="ALARM" name="alarm" />
+    <reply>
+      <pad bytes="1" />
+      <field type="TRIGGER" name="trigger" />
+      <field type="sync:INT64" name="delta" />
+      <field type="BOOL" name="events" />
+      <field type="CARD8" name="state" enum="ALARMSTATE" />
+      <pad bytes="2" />
+    </reply>
+  </request>
+
+  <request name="SetPriority" opcode="12">
+    <field type="CARD32" name="id" />
+    <field type="INT32" name="priority" />
+  </request>
+    
+  <request name="GetPriority" opcode="13">
+    <field type="CARD32" name="id" />
+    <reply>
+      <pad bytes="1" />
+      <field type="INT32" name="priority" />
+    </reply>
+  </request>
+
+  <request name="CreateFence" opcode="14">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="FENCE" name="fence" />
+    <field type="BOOL" name="initially_triggered" />
+  </request>
+
+  <request name="TriggerFence" opcode="15">
+    <field type="FENCE" name="fence" />
+  </request>
+
+  <request name="ResetFence" opcode="16">
+    <field type="FENCE" name="fence" />
+  </request>
+
+  <request name="DestroyFence" opcode="17">
+    <field type="FENCE" name="fence" />
+  </request>
+
+  <request name="QueryFence" opcode="18">
+    <field type="FENCE" name="fence" />
+    <reply>
+      <pad bytes="1" />
+      <field type="BOOL" name="triggered" />
+      <pad bytes="23" />
+    </reply>
+  </request>
+
+  <request name="AwaitFence" opcode="19">
+    <list type="FENCE" name="fence_list" />
+  </request>
+
+  <event name="CounterNotify" number="0">
+    <field type="CARD8" name="kind" />
+    <field type="COUNTER" name="counter" />
+    <field type="sync:INT64" name="wait_value" />
+    <field type="sync:INT64" name="counter_value" />
+    <field type="TIMESTAMP" name="timestamp" />
+    <field type="CARD16" name="count" />
+    <field type="BOOL" name="destroyed" />
+    <pad bytes="1" />
+  </event>
+
+  <event name="AlarmNotify" number="1">
+    <field type="CARD8" name="kind" />
+    <field type="ALARM" name="alarm" />
+    <field type="sync:INT64" name="counter_value" />
+    <field type="sync:INT64" name="alarm_value" />
+    <field type="TIMESTAMP" name="timestamp" />
+    <field type="CARD8" name="state" enum="ALARMSTATE" />
+    <pad bytes="3" />
+  </event>
+</xcb>
diff --git a/third_party/xcbproto/src/src/xc_misc.xml b/third_party/xcbproto/src/src/xc_misc.xml
new file mode 100644
index 000000000000..139ca22f02f4
--- /dev/null
+++ b/third_party/xcbproto/src/src/xc_misc.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2004 Mikko Torni and Josh Triplett.
+All Rights Reserved.  See the file COPYING in this directory
+for licensing information.
+-->
+<xcb header="xc_misc" extension-xname="XC-MISC" extension-name="XCMisc"
+    extension-multiword="true" major-version="1" minor-version="1">
+  <request name="GetVersion" opcode="0">
+    <field type="CARD16" name="client_major_version" />
+    <field type="CARD16" name="client_minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="server_major_version" />
+      <field type="CARD16" name="server_minor_version" />
+    </reply>
+  </request>
+
+  <request name="GetXIDRange" opcode="1">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="start_id" />
+      <field type="CARD32" name="count" />
+    </reply>
+  </request>
+
+  <request name="GetXIDList" opcode="2">
+    <field type="CARD32" name="count" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="ids_len" />
+      <pad bytes="20" />
+      <list type="CARD32" name="ids">
+        <fieldref>ids_len</fieldref>
+      </list>
+    </reply>
+  </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/xcb.xsd b/third_party/xcbproto/src/src/xcb.xsd
new file mode 100644
index 000000000000..dc3d7cc181c7
--- /dev/null
+++ b/third_party/xcbproto/src/src/xcb.xsd
@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2004 Josh Triplett.  All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+  <!-- The root element -->
+  <xsd:element name="xcb">
+    <xsd:complexType>
+      <xsd:group ref="macro" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:attribute name="header" type="xsd:string" use="required" />
+      <xsd:attribute name="extension-xname" type="xsd:string" use="optional" />
+      <xsd:attribute name="extension-name"  type="xsd:string" use="optional" />
+      <xsd:attribute name="extension-multiword" type="xsd:boolean" use="optional" default="false" />
+      <xsd:attribute name="major-version"   type="xsd:integer" use="optional" />
+      <xsd:attribute name="minor-version"   type="xsd:integer" use="optional" />
+    </xsd:complexType>
+  </xsd:element>
+
+  <!-- Padding -->
+  <xsd:element name="pad">
+    <xsd:complexType>
+      <xsd:attribute name="bytes" type="xsd:integer" use="optional" />
+      <xsd:attribute name="align" type="xsd:integer" use="optional" />
+      <xsd:attribute name="serialize" type="xsd:boolean" use="optional" />
+    </xsd:complexType>
+  </xsd:element>
+
+  <!-- Alignment -->
+  <xsd:element name="required_start_align" >
+    <xsd:complexType>
+      <xsd:attribute name="align" type="xsd:integer" use="required" />
+      <xsd:attribute name="offset" type="xsd:integer" use="optional" />
+    </xsd:complexType>
+  </xsd:element>
+
+  <!-- Type for fields or parameters with attributes "name" and "type" -->
+  <xsd:complexType name="var">
+    <xsd:attribute name="name" type="xsd:string" use="required" />
+    <xsd:attribute name="type" type="xsd:string" use="required" />
+    <xsd:attribute name="enum" type="xsd:string" use="optional" />
+    <xsd:attribute name="altenum" type="xsd:string" use="optional" />
+    <xsd:attribute name="mask" type="xsd:string" use="optional" />
+    <xsd:attribute name="altmask" type="xsd:string" use="optional" />
+  </xsd:complexType>
+
+  <!-- case expression -->
+  <xsd:complexType name="caseexpr">
+    <xsd:sequence>
+      <!-- case expression: -->
+      <xsd:group ref="expression" minOccurs="1" maxOccurs="unbounded" />
+      <!-- match -->
+      <xsd:group ref="fields" minOccurs="1" maxOccurs="unbounded" />
+      <xsd:choice>
+        <xsd:element ref="switch" minOccurs="0" maxOccurs="unbounded" />
+      </xsd:choice>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="optional" />
+  </xsd:complexType>
+
+  <!-- switch expression -->
+  <xsd:complexType name="switchexpr">
+    <xsd:sequence>
+      <!-- switch(expression) -->
+      <xsd:group ref="expression" minOccurs="1" maxOccurs="1" />
+      <xsd:element ref="required_start_align" minOccurs="0" maxOccurs="1" />
+      <xsd:choice>
+        <!-- bitcase expression - bit test -->
+        <xsd:element name="bitcase" type="caseexpr" minOccurs="0" maxOccurs="unbounded" />
+        <!-- case expression - value test -->
+        <xsd:element name="case" type="caseexpr" minOccurs="0" maxOccurs="unbounded" />
+      </xsd:choice>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required" />
+  </xsd:complexType>
+
+  <xsd:element name="switch" type="switchexpr" />
+
+  <!-- field replaces FIELD, PARAM, and REPLY. -->
+  <xsd:element name="field" type="var" />
+
+  <!-- fd passing parameter -->
+  <xsd:element name="fd">
+    <xsd:complexType>
+      <xsd:attribute name="name" type="xsd:string" use="required" />
+    </xsd:complexType>
+  </xsd:element>
+
+  <!-- list replaces ARRAYFIELD, LISTPARAM, and ARRAYREPLY.  The name and type
+       are specified as attributes.  The content is an expression giving the
+       length. -->
+  <xsd:element name="list">
+    <xsd:complexType>
+      <xsd:complexContent>
+        <xsd:extension base="var">
+          <xsd:group ref="expression" minOccurs="0" maxOccurs="1" />
+        </xsd:extension>
+      </xsd:complexContent>
+    </xsd:complexType>
+  </xsd:element>
+
+  <!-- Expressions -->
+  <xsd:group name="expression">
+    <xsd:choice>
+      <xsd:element name="op">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:group ref="expression" />
+            <xsd:group ref="expression" />
+          </xsd:sequence>
+          <xsd:attribute name="op" use="required">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:string">
+                <xsd:pattern value="\+|-|\*|/|&amp;|&lt;&lt;" />
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:attribute>
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="unop">
+         <xsd:complexType>
+            <xsd:sequence>
+              <xsd:group ref="expression" />
+            </xsd:sequence>
+            <xsd:attribute name="op" use="required">
+              <xsd:simpleType>
+                <xsd:restriction base="xsd:string">
+                  <xsd:pattern value="~" />
+                </xsd:restriction>
+              </xsd:simpleType>
+            </xsd:attribute>
+         </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="fieldref" type="xsd:string" />
+      <xsd:element name="paramref">
+        <xsd:complexType>
+          <xsd:simpleContent>
+            <xsd:extension base="xsd:string">
+              <xsd:attribute name="type" use="required" type="xsd:string" />
+            </xsd:extension>
+          </xsd:simpleContent>
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="enumref">
+        <xsd:complexType>
+          <xsd:simpleContent>
+            <xsd:extension base="xsd:string">
+              <xsd:attribute name="ref" use="required" type="xsd:string" />
+            </xsd:extension>
+          </xsd:simpleContent>
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="popcount">
+        <xsd:complexType>
+          <xsd:group ref="expression" />
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="sumof">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:group ref="expression" minOccurs="0" maxOccurs="1"/>
+          </xsd:sequence>
+          <xsd:attribute name="ref" use="required" type="xsd:string" />
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="listelement-ref" />
+      <xsd:element name="value" type="xsd:integer" />
+      <xsd:element name="bit" type="bitType" />
+    </xsd:choice>
+  </xsd:group>
+  
+  <!-- Fields in requests that are calculated from other information, not
+       supplied by the caller. -->
+  <xsd:element name="exprfield" >
+    <xsd:complexType>
+      <xsd:complexContent>
+        <xsd:extension base="var">
+          <xsd:group ref="expression" />
+        </xsd:extension>
+      </xsd:complexContent>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:group name="fields">
+    <xsd:choice>
+      <xsd:element ref="pad" />
+      <xsd:element ref="field" />
+      <xsd:element ref="list" />
+      <xsd:element ref="fd" />
+      <xsd:element ref="required_start_align" />
+    </xsd:choice>
+  </xsd:group>
+
+  <!-- Type for a structure -->
+  <xsd:complexType name="struct">
+    <xsd:sequence>
+      <xsd:group ref="fields" minOccurs="1" maxOccurs="unbounded" />
+      <xsd:choice minOccurs="0" maxOccurs="1">
+        <xsd:element ref="switch" />
+      </xsd:choice>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required" />
+  </xsd:complexType>
+
+  <!-- Type for a packet structure -->
+  <xsd:complexType name="packet-struct">
+    <xsd:sequence>
+      <xsd:group ref="fields" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required" />
+    <xsd:attribute name="number" type="xsd:integer" use="required" />
+  </xsd:complexType>
+
+  <!-- Type for a packet structure copy -->
+  <xsd:complexType name="packet-struct-copy">
+    <xsd:attribute name="name" type="xsd:string" use="required" />
+    <xsd:attribute name="number" type="xsd:integer" use="required" />
+    <xsd:attribute name="ref" type="xsd:string" use="required" />
+  </xsd:complexType>
+
+  <!-- Type for a structure that is an event
+       which can be of an event type from a set of event types -->
+  <xsd:complexType name="eventstruct">
+    <xsd:sequence>
+      <xsd:element name="allowed">
+        <xsd:complexType>
+          <xsd:attribute name="extension" type="xsd:string" use="required" />
+          <xsd:attribute name="xge" type="xsd:boolean" use="required" />
+          <xsd:attribute name="opcode-min" type="xsd:integer" use="required" />
+          <xsd:attribute name="opcode-max" type="xsd:integer" use="required" />
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required" />
+  </xsd:complexType>
+
+  <!-- Type for bit values -->
+  <xsd:simpleType name="bitType">
+    <xsd:restriction base="xsd:integer">
+      <xsd:minInclusive value="0" />
+      <xsd:maxExclusive value="32" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- Type for documentation -->
+  <xsd:group name="doc-fields">
+    <xsd:sequence>
+      <xsd:element name="field">
+        <xsd:complexType>
+          <xsd:simpleContent>
+            <xsd:extension base="xsd:string">
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:extension>
+          </xsd:simpleContent>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:sequence>
+  </xsd:group>
+
+  <xsd:group name="error-fields">
+    <xsd:sequence>
+      <xsd:element name="error">
+        <xsd:complexType>
+          <xsd:simpleContent>
+            <xsd:extension base="xsd:string">
+              <xsd:attribute name="type" type="xsd:string" />
+            </xsd:extension>
+          </xsd:simpleContent>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:sequence>
+  </xsd:group>
+
+  <xsd:group name="see-fields">
+    <xsd:sequence>
+      <xsd:element name="see">
+        <xsd:complexType>
+          <xsd:attribute name="name" type="xsd:string" />
+          <xsd:attribute name="type" type="xsd:string" />
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:sequence>
+  </xsd:group>
+
+  <xsd:element name="doc">
+    <xsd:complexType mixed="true">
+      <xsd:sequence>
+        <xsd:element name="brief" type="xsd:string" minOccurs="0" maxOccurs="1" />
+        <xsd:element name="description" type="xsd:string" minOccurs="0" maxOccurs="1" />
+        <xsd:element name="example" type="xsd:string" minOccurs="0" maxOccurs="1" />
+        <xsd:group ref="doc-fields" minOccurs="0" maxOccurs="unbounded" />
+        <xsd:group ref="error-fields" minOccurs="0" maxOccurs="unbounded" />
+        <xsd:group ref="see-fields" minOccurs="0" maxOccurs="unbounded" />
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:group name="macro">
+    <xsd:choice>
+      <xsd:element name="request">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:choice minOccurs="0" maxOccurs="unbounded">
+              <xsd:group ref="fields" />
+              <xsd:element ref="exprfield" />
+            </xsd:choice>
+            <xsd:choice minOccurs="0" maxOccurs="1">
+              <xsd:element ref="switch" />
+            </xsd:choice>
+            <xsd:element name="reply" minOccurs="0" maxOccurs="1">
+              <xsd:complexType>
+                <xsd:sequence>
+                  <xsd:choice minOccurs="1" maxOccurs="unbounded">
+                    <xsd:group ref="fields" />
+                  </xsd:choice>
+                  <xsd:choice minOccurs="0" maxOccurs="1">
+                    <xsd:element ref="switch" />
+                  </xsd:choice>
+                  <xsd:element ref="doc" minOccurs="0" maxOccurs="1" />
+                </xsd:sequence>
+              </xsd:complexType>
+            </xsd:element>
+            <xsd:element ref="doc" minOccurs="0" maxOccurs="1" />
+          </xsd:sequence>
+          <xsd:attribute name="name" type="xsd:string" use="required" />
+          <xsd:attribute name="opcode" type="xsd:integer" use="required" />
+          <xsd:attribute name="combine-adjacent" type="xsd:boolean"
+                         use="optional" default="false" />
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="event">
+        <xsd:complexType>
+          <xsd:complexContent>
+            <xsd:extension base="packet-struct">
+              <xsd:sequence>
+                <xsd:element ref="doc" minOccurs="0" maxOccurs="1" />
+              </xsd:sequence>
+              <xsd:attribute name="no-sequence-number" type="xsd:boolean"
+                             use="optional" default="false" />
+              <xsd:attribute name="xge" type="xsd:boolean"
+                             use="optional" default="false" />
+            </xsd:extension>
+          </xsd:complexContent>
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="eventcopy" type="packet-struct-copy" />
+      <xsd:element name="error" type="packet-struct" />
+      <xsd:element name="errorcopy" type="packet-struct-copy" />
+      <xsd:element name="struct" type="struct" />
+      <xsd:element name="union" type="struct" />
+      <xsd:element name="eventstruct" type="eventstruct" />
+      <xsd:element name="xidtype">
+        <xsd:complexType>
+          <xsd:attribute name="name" type="xsd:string" use="required" />
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="xidunion">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="type" type="xsd:string"
+                         minOccurs="1" maxOccurs="unbounded" />
+          </xsd:sequence>
+          <xsd:attribute name="name" type="xsd:string" use="required" />
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="enum">
+        <xsd:complexType>
+          <xsd:sequence minOccurs="1" maxOccurs="unbounded">
+            <xsd:element name="item">
+              <xsd:complexType>
+                <xsd:choice minOccurs="1" maxOccurs="1">
+                  <xsd:element name="value" type="xsd:unsignedInt" />
+                  <xsd:element name="bit" type="bitType" />
+                </xsd:choice>
+                <xsd:attribute name="name" type="xsd:string" use="required" />
+              </xsd:complexType>
+            </xsd:element>
+            <xsd:element ref="doc" minOccurs="0" maxOccurs="1" />
+          </xsd:sequence>
+          <xsd:attribute name="name" type="xsd:string" use="required" />
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="typedef">
+        <xsd:complexType>
+          <xsd:attribute name="oldname" type="xsd:string" use="required" />
+          <xsd:attribute name="newname" type="xsd:string" use="required" />
+        </xsd:complexType>
+      </xsd:element>
+      <!-- The import element allows a protocol description to reference the
+           declarations of another protocol description. -->
+      <xsd:element name="import" type="xsd:string" />
+    </xsd:choice>
+  </xsd:group>
+</xsd:schema>
diff --git a/third_party/xcbproto/src/src/xevie.xml b/third_party/xcbproto/src/src/xevie.xml
new file mode 100644
index 000000000000..bafa9900b4ba
--- /dev/null
+++ b/third_party/xcbproto/src/src/xevie.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2004 Josh Triplett.  All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<!-- This file describes version 1 of XEVIE. -->
+<xcb header="xevie" extension-xname="XEVIE" extension-name="Xevie"
+    major-version="1" minor-version="0">
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD16" name="client_major_version" />
+    <field type="CARD16" name="client_minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="server_major_version" />
+      <field type="CARD16" name="server_minor_version" />
+      <pad bytes="20" />
+    </reply>
+  </request>
+
+  <request name="Start" opcode="1">
+    <field type="CARD32" name="screen" />
+    <reply>
+      <pad bytes="1" />
+      <pad bytes="24" />
+    </reply>
+  </request>
+
+  <request name="End" opcode="2">
+    <field type="CARD32" name="cmap" />
+    <reply>
+      <pad bytes="1" />
+      <pad bytes="24" />
+    </reply>
+  </request>
+
+  <enum name="Datatype">
+    <item name="Unmodified"> <value>0</value> </item>
+    <item name="Modified">   <value>1</value> </item>
+  </enum>
+
+  <!-- The Send request needs to send an arbitrary Event; this type is used
+       to reserve the necessary structure size. -->
+  <struct name="Event">
+    <pad bytes="32" />
+  </struct>
+
+  <request name="Send" opcode="3">
+    <field type="Event" name="event" />
+    <field type="CARD32" name="data_type" /> <!-- Datatype -->
+    <pad bytes="64" />
+    <reply>
+      <pad bytes="1" />
+      <pad bytes="24" />
+    </reply>
+  </request>
+
+  <request name="SelectInput" opcode="4">
+    <field type="CARD32" name="event_mask" />
+    <reply>
+      <pad bytes="1" />
+      <pad bytes="24" />
+    </reply>
+  </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/xf86dri.xml b/third_party/xcbproto/src/src/xf86dri.xml
new file mode 100644
index 000000000000..5bfc5727aa31
--- /dev/null
+++ b/third_party/xcbproto/src/src/xf86dri.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2005 Jeremy Kolb.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person ob/Sintaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<xcb header="xf86dri" extension-xname="XFree86-DRI" extension-name="XF86Dri"
+    major-version="4" minor-version="1">
+
+    <!-- Using http://dri.sourceforge.net/doc/dri_extensions_low_level.txt -->
+
+    <!-- Types -->
+
+    <struct name="DrmClipRect">
+	<field type="INT16" name="x1" />
+	<field type="INT16" name="y1" />
+	<field type="INT16" name="x2" />
+	<field type="INT16" name="x3" />
+    </struct>
+	
+    <!-- Requests -->
+    <request name="QueryVersion" opcode="0">
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD16" name="dri_major_version" />
+	    <field type="CARD16" name="dri_minor_version" />
+	    <field type="CARD32" name="dri_minor_patch" />
+	</reply>
+    </request>
+
+    <request name="QueryDirectRenderingCapable" opcode="1">
+	<field type="CARD32" name="screen" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="BOOL" name="is_capable" />
+	</reply>
+    </request>
+
+    <request name="OpenConnection" opcode="2">
+	<field type="CARD32" name="screen" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="sarea_handle_low" />
+	    <field type="CARD32" name="sarea_handle_high" />
+	    <field type="CARD32" name="bus_id_len" />
+	    <pad bytes="12" />
+	    <list type="char" name="bus_id">
+		<fieldref>bus_id_len</fieldref>
+	    </list>
+	</reply>
+    </request>
+
+    <request name="CloseConnection" opcode="3">
+	<field type="CARD32" name="screen" />
+    </request>
+
+    <request name="GetClientDriverName" opcode="4">
+	<field type="CARD32" name="screen" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="client_driver_major_version" />
+	    <field type="CARD32" name="client_driver_minor_version" />
+	    <field type="CARD32" name="client_driver_patch_version" />
+	    <field type="CARD32" name="client_driver_name_len" />
+	    <pad bytes="8" />
+	    <list type="char" name="client_driver_name">
+		<fieldref>client_driver_name_len</fieldref>
+	    </list>
+	</reply>
+    </request>
+
+    <request name="CreateContext" opcode="5">
+	<field type="CARD32" name="screen" />
+	<field type="CARD32" name="visual" />
+	<field type="CARD32" name="context" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="hw_context" />
+	</reply>
+    </request>
+
+    <request name="DestroyContext" opcode="6">
+	<field type="CARD32" name="screen" />
+	<field type="CARD32" name="context" />
+    </request>
+
+    <request name="CreateDrawable" opcode="7">
+	<field type="CARD32" name="screen" />
+	<field type="CARD32" name="drawable" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="hw_drawable_handle" />
+	</reply>
+    </request>
+
+    <request name="DestroyDrawable" opcode="8">
+	<field type="CARD32" name="screen" />
+	<field type="CARD32" name="drawable" />
+    </request>
+
+    <request name="GetDrawableInfo" opcode="9">
+	<field type="CARD32" name="screen" />
+	<field type="CARD32" name="drawable" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="drawable_table_index" />
+	    <field type="CARD32" name="drawable_table_stamp" />
+	    <field type="INT16" name="drawable_origin_X" />
+	    <field type="INT16" name="drawable_origin_Y" />
+	    <field type="INT16" name="drawable_size_W" />
+	    <field type="INT16" name="drawable_size_H" />
+	    <field type="CARD32" name="num_clip_rects" />
+	    <field type="INT16" name="back_x" />
+	    <field type="INT16" name="back_y" />
+	    <field type="CARD32" name="num_back_clip_rects" />
+	    <list type="DrmClipRect" name="clip_rects">
+		<fieldref>num_clip_rects</fieldref>
+	    </list>
+	    <list type="DrmClipRect" name="back_clip_rects">
+		<fieldref>num_back_clip_rects</fieldref>
+	    </list>
+	</reply>
+    </request>
+
+    <request name="GetDeviceInfo" opcode="10">
+	<field type="CARD32" name="screen" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="framebuffer_handle_low" />
+	    <field type="CARD32" name="framebuffer_handle_high" />
+	    <field type="CARD32" name="framebuffer_origin_offset" />
+	    <field type="CARD32" name="framebuffer_size" />
+	    <field type="CARD32" name="framebuffer_stride" />
+	    <field type="CARD32" name="device_private_size" />
+	    <list type="CARD32" name="device_private">
+		<fieldref>device_private_size</fieldref>
+	    </list>
+	</reply>
+    </request>
+
+    <!-- Not in this doc, but specified in Mesa/src/glx/x11/xf86dri.h -->
+    <request name="AuthConnection" opcode="11">
+	<field type="CARD32" name="screen" />
+	<field type="CARD32" name="magic" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="authenticated" />
+	</reply>
+    </request>	    
+</xcb>
diff --git a/third_party/xcbproto/src/src/xf86vidmode.xml b/third_party/xcbproto/src/src/xf86vidmode.xml
new file mode 100644
index 000000000000..a165c11d959b
--- /dev/null
+++ b/third_party/xcbproto/src/src/xf86vidmode.xml
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2009 Open Text Corporation.  All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<xcb header="xf86vidmode" extension-xname="XFree86-VidModeExtension" extension-name="XF86VidMode"
+    major-version="2" minor-version="2">
+
+    <!-- In places where there are multiple versions of the protocol, this
+	 describes version 2.2. If you do not call xcb_xf86vidmode_set_client_version()
+	 then some requests may fail and some replies may not be what you expect. -->
+
+    <typedef oldname="CARD32" newname="SYNCRANGE" />  <!-- Min and Max fixed-decimal-point values -->
+    <typedef oldname="CARD32" newname="DOTCLOCK" />   <!-- A single fixed-decimal-point value -->
+
+    <enum name="ModeFlag">
+	<item name="Positive_HSync">	<bit>0</bit></item>
+	<item name="Negative_HSync">	<bit>1</bit></item>
+	<item name="Positive_VSync">	<bit>2</bit></item>
+	<item name="Negative_VSync">	<bit>3</bit></item>
+	<item name="Interlace">		<bit>4</bit></item>
+	<item name="Composite_Sync">	<bit>5</bit></item>
+	<item name="Positive_CSync">	<bit>6</bit></item>
+	<item name="Negative_CSync">	<bit>7</bit></item>
+	<item name="HSkew">		<bit>8</bit></item>
+	<item name="Broadcast">		<bit>9</bit></item>
+	<item name="Pixmux">		<bit>10</bit></item>
+	<item name="Double_Clock">	<bit>11</bit></item>
+	<item name="Half_Clock">	<bit>12</bit></item>
+    </enum>
+
+    <enum name="ClockFlag">
+	<item name="Programable">	<bit>0</bit></item>
+    </enum>
+
+    <enum name="Permission">
+	<item name="Read">		<bit>0</bit></item>
+	<item name="Write">		<bit>1</bit></item>
+    </enum>
+
+    <struct name="ModeInfo">
+	<field type="DOTCLOCK" name="dotclock" />
+	<field type="CARD16" name= "hdisplay" />
+	<field type="CARD16" name= "hsyncstart" />
+	<field type="CARD16" name= "hsyncend" />
+	<field type="CARD16" name= "htotal" />
+	<field type="CARD32" name= "hskew" />
+	<field type="CARD16" name= "vdisplay" />
+	<field type="CARD16" name= "vsyncstart" />
+	<field type="CARD16" name= "vsyncend" />
+	<field type="CARD16" name= "vtotal" />
+	<pad bytes="4" />
+	<field type="CARD32" name="flags" mask="ModeFlag" />
+	<pad bytes="12" />
+	<field type="CARD32" name="privsize" />
+    </struct>
+
+    <request name="QueryVersion" opcode="0">
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD16" name="major_version" />
+	    <field type="CARD16" name="minor_version" />
+	</reply>
+    </request>
+
+    <request name="GetModeLine" opcode="1">
+	<field type="CARD16" name="screen" />
+	<pad bytes="2" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="DOTCLOCK" name="dotclock" />
+	    <field type="CARD16" name= "hdisplay" />
+	    <field type="CARD16" name= "hsyncstart" />
+	    <field type="CARD16" name= "hsyncend" />
+	    <field type="CARD16" name= "htotal" />
+	    <field type="CARD16" name= "hskew" />
+	    <field type="CARD16" name= "vdisplay" />
+	    <field type="CARD16" name= "vsyncstart" />
+	    <field type="CARD16" name= "vsyncend" />
+	    <field type="CARD16" name= "vtotal" />
+	    <pad bytes="2" />
+	    <field type="CARD32" name="flags" mask="ModeFlag" />
+	    <pad bytes="12" />
+	    <field type="CARD32" name="privsize" />
+	    <list type="CARD8" name="private">
+		<fieldref>privsize</fieldref>
+	    </list>
+	</reply>
+    </request>
+
+    <request name="ModModeLine" opcode="2">
+	<field type="CARD32" name="screen" />
+	<field type="CARD16" name= "hdisplay" />
+	<field type="CARD16" name= "hsyncstart" />
+	<field type="CARD16" name= "hsyncend" />
+	<field type="CARD16" name= "htotal" />
+	<field type="CARD16" name= "hskew" />
+	<field type="CARD16" name= "vdisplay" />
+	<field type="CARD16" name= "vsyncstart" />
+	<field type="CARD16" name= "vsyncend" />
+	<field type="CARD16" name= "vtotal" />
+	<pad bytes="2" />
+	<field type="CARD32" name="flags" mask="ModeFlag" />
+	<pad bytes="12" />
+	<field type="CARD32" name="privsize" />
+	<list type="CARD8" name="private">
+	    <fieldref>privsize</fieldref>
+	</list>
+    </request>
+
+    <request name="SwitchMode" opcode="3">
+	<field type="CARD16" name="screen" />
+	<field type="CARD16" name="zoom" />
+    </request>
+
+    <request name="GetMonitor" opcode="4">
+	<field type="CARD16" name="screen" />
+	<pad bytes="2" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD8" name="vendor_length" />
+	    <field type="CARD8" name="model_length" />
+	    <field type="CARD8" name="num_hsync" />
+	    <field type="CARD8" name="num_vsync" />
+	    <pad bytes="20" />
+	    <list type="SYNCRANGE" name="hsync">
+		<fieldref>num_hsync</fieldref>
+	    </list>
+	    <list type="SYNCRANGE" name="vsync">
+		<fieldref>num_vsync</fieldref>
+	    </list>
+	    <list type="char" name="vendor">
+		<fieldref>vendor_length</fieldref>
+	    </list>
+	    <list type="void" name="alignment_pad">
+		<op op="-">
+		    <op op="&amp;">
+			<op op="+">
+			    <fieldref>vendor_length</fieldref>
+			    <value>3</value>
+			</op>
+			<unop op="~">
+			    <value>3</value>
+			</unop>
+		    </op>
+		    <fieldref>vendor_length</fieldref>
+		</op>
+	    </list>
+	    <list type="char" name="model">
+		<fieldref>model_length</fieldref>
+	    </list>
+	</reply>
+    </request>
+
+    <request name="LockModeSwitch" opcode="5">
+	<field type="CARD16" name="screen" />
+	<field type="CARD16" name="lock" />
+    </request>
+
+    <request name="GetAllModeLines" opcode="6">
+	<field type="CARD16" name="screen" />
+	<pad bytes="2" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="modecount" />
+	    <pad bytes="20" />
+	    <list type="ModeInfo" name="modeinfo">
+		<fieldref>modecount</fieldref>
+	    </list>
+	</reply>
+    </request>
+
+    <request name="AddModeLine" opcode="7">
+	<field type="CARD32" name="screen" />
+	<field type="DOTCLOCK" name="dotclock" />
+	<field type="CARD16" name= "hdisplay" />
+	<field type="CARD16" name= "hsyncstart" />
+	<field type="CARD16" name= "hsyncend" />
+	<field type="CARD16" name= "htotal" />
+	<field type="CARD16" name= "hskew" />
+	<field type="CARD16" name= "vdisplay" />
+	<field type="CARD16" name= "vsyncstart" />
+	<field type="CARD16" name= "vsyncend" />
+	<field type="CARD16" name= "vtotal" />
+	<pad bytes="2" />
+	<field type="CARD32" name="flags" mask="ModeFlag" />
+	<pad bytes="12" />
+	<field type="CARD32" name="privsize" />
+	<field type="DOTCLOCK" name="after_dotclock" />
+	<field type="CARD16" name= "after_hdisplay" />
+	<field type="CARD16" name= "after_hsyncstart" />
+	<field type="CARD16" name= "after_hsyncend" />
+	<field type="CARD16" name= "after_htotal" />
+	<field type="CARD16" name= "after_hskew" />
+	<field type="CARD16" name= "after_vdisplay" />
+	<field type="CARD16" name= "after_vsyncstart" />
+	<field type="CARD16" name= "after_vsyncend" />
+	<field type="CARD16" name= "after_vtotal" />
+	<pad bytes="2" />
+	<field type="CARD32" name="after_flags" mask="ModeFlag" />
+	<pad bytes="12" />
+	<list type="CARD8" name="private">
+	    <fieldref>privsize</fieldref>
+	</list>
+    </request>
+
+    <request name="DeleteModeLine" opcode="8">
+	<field type="CARD32" name="screen" />
+	<field type="DOTCLOCK" name="dotclock" />
+	<field type="CARD16" name= "hdisplay" />
+	<field type="CARD16" name= "hsyncstart" />
+	<field type="CARD16" name= "hsyncend" />
+	<field type="CARD16" name= "htotal" />
+	<field type="CARD16" name= "hskew" />
+	<field type="CARD16" name= "vdisplay" />
+	<field type="CARD16" name= "vsyncstart" />
+	<field type="CARD16" name= "vsyncend" />
+	<field type="CARD16" name= "vtotal" />
+	<pad bytes="2" />
+	<field type="CARD32" name="flags" mask="ModeFlag" />
+	<pad bytes="12" />
+	<field type="CARD32" name="privsize" />
+	<list type="CARD8" name="private">
+	    <fieldref>privsize</fieldref>
+	</list>
+    </request>
+
+    <request name="ValidateModeLine" opcode="9">
+	<field type="CARD32" name="screen" />
+	<field type="DOTCLOCK" name="dotclock" />
+	<field type="CARD16" name= "hdisplay" />
+	<field type="CARD16" name= "hsyncstart" />
+	<field type="CARD16" name= "hsyncend" />
+	<field type="CARD16" name= "htotal" />
+	<field type="CARD16" name= "hskew" />
+	<field type="CARD16" name= "vdisplay" />
+	<field type="CARD16" name= "vsyncstart" />
+	<field type="CARD16" name= "vsyncend" />
+	<field type="CARD16" name= "vtotal" />
+	<pad bytes="2" />
+	<field type="CARD32" name="flags" mask="ModeFlag" />
+	<pad bytes="12" />
+	<field type="CARD32" name="privsize" />
+	<list type="CARD8" name="private">
+	    <fieldref>privsize</fieldref>
+	</list>
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="status" />
+	    <pad bytes="20" />
+	</reply>
+    </request>
+
+    <request name="SwitchToMode" opcode="10">
+	<field type="CARD32" name="screen" />
+	<field type="DOTCLOCK" name="dotclock" />
+	<field type="CARD16" name= "hdisplay" />
+	<field type="CARD16" name= "hsyncstart" />
+	<field type="CARD16" name= "hsyncend" />
+	<field type="CARD16" name= "htotal" />
+	<field type="CARD16" name= "hskew" />
+	<field type="CARD16" name= "vdisplay" />
+	<field type="CARD16" name= "vsyncstart" />
+	<field type="CARD16" name= "vsyncend" />
+	<field type="CARD16" name= "vtotal" />
+	<pad bytes="2" />
+	<field type="CARD32" name="flags" mask="ModeFlag" />
+	<pad bytes="12" />
+	<field type="CARD32" name="privsize" />
+	<list type="CARD8" name="private">
+	    <fieldref>privsize</fieldref>
+	</list>
+    </request>
+
+    <request name="GetViewPort" opcode="11">
+	<field type="CARD16" name="screen" />
+	<pad bytes="2" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="x" />
+	    <field type="CARD32" name="y" />
+	    <pad bytes="16" />
+	</reply>
+    </request>
+
+    <request name="SetViewPort" opcode="12">
+	<field type="CARD16" name="screen" />
+	<pad bytes="2" />
+	<field type="CARD32" name="x" />
+	<field type="CARD32" name="y" />
+    </request>
+
+    <!-- new for version 2.x  -->
+    <request name="GetDotClocks" opcode="13">
+	<field type="CARD16" name="screen" />
+	<pad bytes="2" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="flags" mask="ClockFlag" />
+	    <field type="CARD32" name="clocks" />
+	    <field type="CARD32" name="maxclocks" />
+	    <pad bytes="12" />
+	    <list type="CARD32" name="clock">
+		<!-- Only if flags does not include Programable:
+		    (1 - (flags & 1)) * clocks
+		-->
+		<op op="*">
+		    <op op = "-">
+			<value>1</value>
+			<op op="&amp;">
+			    <fieldref>flags</fieldref>
+			    <value>1</value>
+			</op>
+		    </op>
+		    <fieldref>clocks</fieldref>
+		</op>
+	    </list>
+	</reply>
+    </request>
+
+    <request name="SetClientVersion" opcode="14">
+	<field type="CARD16" name="major" />
+	<field type="CARD16" name="minor" />
+    </request>
+
+    <request name="SetGamma" opcode="15">
+	<field type="CARD16" name="screen" />
+	<pad bytes="2" />
+	<field type="CARD32" name="red" />
+	<field type="CARD32" name="green" />
+	<field type="CARD32" name="blue" />
+	<pad bytes="12" />
+    </request>
+
+    <request name="GetGamma" opcode="16">
+	<field type="CARD16" name="screen" />
+	<pad bytes="26" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="red" />
+	    <field type="CARD32" name="green" />
+	    <field type="CARD32" name="blue" />
+	    <pad bytes="12" />
+	</reply>
+    </request>
+
+    <request name="GetGammaRamp" opcode="17">
+	<field type="CARD16" name="screen" />
+	<field type="CARD16" name="size" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD16" name="size" />
+	    <pad bytes="22" />
+	    <list type="CARD16" name="red">
+		<op op="&amp;">
+		    <op op = "+">
+			<fieldref>size</fieldref>
+			<value>1</value>
+		    </op>
+		    <unop op="~">
+			<value>1</value>
+		    </unop>
+		</op>
+	    </list>
+	    <list type="CARD16" name="green">
+		<op op="&amp;">
+		    <op op = "+">
+			<fieldref>size</fieldref>
+			<value>1</value>
+		    </op>
+		    <unop op="~">
+			<value>1</value>
+		    </unop>
+		</op>
+	    </list>
+	    <list type="CARD16" name="blue">
+		<op op="&amp;">
+		    <op op = "+">
+			<fieldref>size</fieldref>
+			<value>1</value>
+		    </op>
+		    <unop op="~">
+			<value>1</value>
+		    </unop>
+		</op>
+	    </list>
+	</reply>
+    </request>
+
+    <request name="SetGammaRamp" opcode="18">
+	<field type="CARD16" name="screen" />
+	<field type="CARD16" name="size" />
+	<list type="CARD16" name="red">
+	    <op op="&amp;">
+		<op op = "+">
+		    <fieldref>size</fieldref>
+		    <value>1</value>
+		</op>
+		<unop op="~">
+		    <value>1</value>
+		</unop>
+	    </op>
+	</list>
+	<list type="CARD16" name="green">
+	    <op op="&amp;">
+		<op op = "+">
+		    <fieldref>size</fieldref>
+		    <value>1</value>
+		</op>
+		<unop op="~">
+		    <value>1</value>
+		</unop>
+	    </op>
+	</list>
+	<list type="CARD16" name="blue">
+	    <op op="&amp;">
+		<op op = "+">
+		    <fieldref>size</fieldref>
+		    <value>1</value>
+		</op>
+		<unop op="~">
+		    <value>1</value>
+		</unop>
+	    </op>
+	</list>
+    </request>
+
+    <request name="GetGammaRampSize" opcode="19">
+	<field type="CARD16" name="screen" />
+	<pad bytes="2" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD16" name="size" />
+	    <pad bytes="22" />
+	</reply>
+    </request>
+
+    <request name="GetPermissions" opcode="20">
+	<field type="CARD16" name="screen" />
+	<pad bytes="2" />
+	<reply>
+	    <pad bytes="1" />
+	    <field type="CARD32" name="permissions" mask="Permission" />
+	    <pad bytes="20" />
+	</reply>
+    </request>
+
+    <error name="BadClock" number="0" />
+    <error name="BadHTimings" number="1" />
+    <error name="BadVTimings" number="2" />
+    <error name="ModeUnsuitable" number="3" />
+    <error name="ExtensionDisabled" number="4" />
+    <error name="ClientNotLocal" number="5" />
+    <error name="ZoomLocked" number="6" />
+
+</xcb>
diff --git a/third_party/xcbproto/src/src/xfixes.xml b/third_party/xcbproto/src/src/xfixes.xml
new file mode 100644
index 000000000000..0a3d5ffeed48
--- /dev/null
+++ b/third_party/xcbproto/src/src/xfixes.xml
@@ -0,0 +1,362 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2004 Josh Triplett.  All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<!-- This file describes version 4 of XFixes. -->
+<xcb header="xfixes" extension-xname="XFIXES" extension-name="XFixes"
+    major-version="5" minor-version="0">
+  <import>xproto</import>
+  <import>render</import>
+  <import>shape</import>
+
+  <!-- Version 1 -->
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD32" name="client_major_version" />
+    <field type="CARD32" name="client_minor_version" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="major_version" />
+      <field type="CARD32" name="minor_version" />
+      <pad bytes="16" />
+    </reply>
+  </request>
+
+  <enum name="SaveSetMode">
+    <item name="Insert"> <value>0</value> </item>
+    <item name="Delete"> <value>1</value> </item>
+  </enum>
+
+  <enum name="SaveSetTarget">
+    <item name="Nearest"> <value>0</value> </item>
+    <item name="Root">    <value>1</value> </item>
+  </enum>
+
+  <enum name="SaveSetMapping">
+    <item name="Map">   <value>0</value> </item>
+    <item name="Unmap"> <value>1</value> </item>
+  </enum>
+
+  <request name="ChangeSaveSet" opcode="1">
+    <field type="BYTE" name="mode"   enum="SaveSetMode" />
+    <field type="BYTE" name="target" enum="SaveSetTarget" />
+    <field type="BYTE" name="map"    enum="SaveSetMapping" />
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+  </request>
+
+  <enum name="SelectionEvent">
+    <item name="SetSelectionOwner">      <value>0</value> </item>
+    <item name="SelectionWindowDestroy"> <value>1</value> </item>
+    <item name="SelectionClientClose">   <value>2</value> </item>
+  </enum>
+
+  <enum name="SelectionEventMask">
+    <item name="SetSelectionOwner">     <bit>0</bit></item>
+    <item name="SelectionWindowDestroy"><bit>1</bit></item>
+    <item name="SelectionClientClose">  <bit>2</bit></item>
+  </enum>
+
+  <event name="SelectionNotify" number="0">
+    <field type="CARD8"     name="subtype" enum="SelectionEvent" />
+    <field type="WINDOW"    name="window" />
+    <field type="WINDOW"    name="owner" />
+    <field type="ATOM"      name="selection" />
+    <field type="TIMESTAMP" name="timestamp" />
+    <field type="TIMESTAMP" name="selection_timestamp" />
+    <pad bytes="8" />
+  </event>
+
+  <request name="SelectSelectionInput" opcode="2">
+    <field type="WINDOW" name="window" />
+    <field type="ATOM"   name="selection" />
+    <field type="CARD32" name="event_mask" mask="SelectionEventMask" />
+  </request>
+
+  <enum name="CursorNotify">
+    <item name="DisplayCursor"> <value>0</value> </item>
+  </enum>
+
+  <enum name="CursorNotifyMask">
+    <item name="DisplayCursor"><bit>0</bit></item>
+  </enum>
+
+  <event name="CursorNotify" number="1">
+    <field type="CARD8"     name="subtype" enum="CursorNotify" />
+    <field type="WINDOW"    name="window" />
+    <field type="CARD32"    name="cursor_serial" />
+    <field type="TIMESTAMP" name="timestamp" />
+    <field type="ATOM"      name="name" altenum="Atom" /> <!-- Added in version 2 -->
+    <pad bytes="12" />
+  </event>
+
+  <request name="SelectCursorInput" opcode="3">
+    <field type="WINDOW" name="window" />
+    <field type="CARD32" name="event_mask" mask="CursorNotifyMask" />
+  </request>
+
+  <request name="GetCursorImage" opcode="4">
+    <reply>
+      <pad bytes="1" />
+      <field type="INT16"  name="x" />
+      <field type="INT16"  name="y" />
+      <field type="CARD16" name="width" />
+      <field type="CARD16" name="height" />
+      <field type="CARD16" name="xhot" />
+      <field type="CARD16" name="yhot" />
+      <field type="CARD32" name="cursor_serial" />
+      <pad bytes="8" />
+      <list  type="CARD32" name="cursor_image">
+        <op op="*">
+          <fieldref>width</fieldref>
+          <fieldref>height</fieldref>
+        </op>
+      </list>
+    </reply>
+  </request>
+
+  <!-- Version 2 -->
+
+  <xidtype name="REGION" />
+
+  <error name="BadRegion" number="0" />
+
+  <enum name="Region">
+    <item name="None"> <value>0</value> </item>
+  </enum>
+
+  <request name="CreateRegion" opcode="5">
+    <field type="REGION"    name="region" />
+    <list  type="RECTANGLE" name="rectangles" />
+  </request>
+
+  <request name="CreateRegionFromBitmap" opcode="6">
+    <field type="REGION" name="region" />
+    <field type="PIXMAP" name="bitmap" />
+  </request>
+
+  <request name="CreateRegionFromWindow" opcode="7">
+    <field type="REGION"     name="region" />
+    <field type="WINDOW"     name="window" />
+    <field type="shape:KIND" name="kind"   enum="SK" />
+    <pad bytes="3" />
+  </request>
+
+  <request name="CreateRegionFromGC" opcode="8">
+    <field type="REGION"   name="region" />
+    <field type="GCONTEXT" name="gc" />
+  </request>
+
+  <request name="CreateRegionFromPicture" opcode="9">
+    <field type="REGION"  name="region" />
+    <field type="PICTURE" name="picture" />
+  </request>
+
+  <request name="DestroyRegion" opcode="10">
+    <field type="REGION"  name="region" />
+  </request>
+
+  <request name="SetRegion" opcode="11">
+    <field type="REGION"    name="region" />
+    <list  type="RECTANGLE" name="rectangles" />
+  </request>
+
+  <request name="CopyRegion" opcode="12">
+    <field type="REGION" name="source" />
+    <field type="REGION" name="destination" />
+  </request>
+
+  <request name="UnionRegion" opcode="13">
+    <field type="REGION" name="source1" />
+    <field type="REGION" name="source2" />
+    <field type="REGION" name="destination" />
+  </request>
+
+  <request name="IntersectRegion" opcode="14">
+    <field type="REGION" name="source1" />
+    <field type="REGION" name="source2" />
+    <field type="REGION" name="destination" />
+  </request>
+
+  <request name="SubtractRegion" opcode="15">
+    <field type="REGION" name="source1" />
+    <field type="REGION" name="source2" />
+    <field type="REGION" name="destination" />
+  </request>
+
+  <request name="InvertRegion" opcode="16">
+    <field type="REGION"    name="source" />
+    <field type="RECTANGLE" name="bounds" />
+    <field type="REGION"    name="destination" />
+  </request>
+
+  <request name="TranslateRegion" opcode="17">
+    <field type="REGION" name="region" />
+    <field type="INT16"  name="dx" />
+    <field type="INT16"  name="dy" />
+  </request>
+
+  <request name="RegionExtents" opcode="18"> 	
+    <field type="REGION" name="source" />
+    <field type="REGION" name="destination" />
+  </request>
+
+  <request name="FetchRegion" opcode="19">
+    <field type="REGION" name="region" />
+    <reply>
+      <pad bytes="1" />
+      <field type="RECTANGLE" name="extents" />
+      <pad bytes="16" />
+      <list  type="RECTANGLE" name="rectangles">
+	<op op='/'>
+		<fieldref>length</fieldref>
+		<value>2</value>
+	</op>
+      </list>
+    </reply>
+  </request>
+
+  <request name="SetGCClipRegion" opcode="20">
+    <field type="GCONTEXT" name="gc" />
+    <field type="REGION"   name="region" altenum="Region" />
+    <field type="INT16"    name="x_origin" />
+    <field type="INT16"    name="y_origin" />
+  </request>
+
+  <request name="SetWindowShapeRegion" opcode="21">
+    <field type="WINDOW"     name="dest" />
+    <field type="shape:KIND" name="dest_kind" enum="SK" />
+    <pad bytes="3" />
+    <field type="INT16"      name="x_offset" />
+    <field type="INT16"      name="y_offset" />
+    <field type="REGION"     name="region" altenum="Region" />
+  </request>
+
+  <request name="SetPictureClipRegion" opcode="22">
+    <field type="PICTURE" name="picture" />
+    <field type="REGION"  name="region" altenum="Region" />
+    <field type="INT16"   name="x_origin" />
+    <field type="INT16"   name="y_origin" />
+  </request>
+
+  <request name="SetCursorName" opcode="23">
+    <field type="CURSOR" name="cursor" />
+    <field type="CARD16" name="nbytes" />
+    <pad bytes="2" />
+    <list  type="char"   name="name"><fieldref>nbytes</fieldref></list>
+  </request>
+
+  <request name="GetCursorName" opcode="24">
+    <field type="CURSOR" name="cursor" />
+    <reply>
+      <pad bytes="1" />
+      <field type="ATOM"   name="atom" altenum="Atom" />
+      <field type="CARD16" name="nbytes" />
+      <pad bytes="18" />
+      <list  type="char"   name="name"><fieldref>nbytes</fieldref></list>
+    </reply>
+  </request>
+
+  <request name="GetCursorImageAndName" opcode="25">
+    <reply>
+      <pad bytes="1" />
+      <field type="INT16"  name="x" />
+      <field type="INT16"  name="y" />
+      <field type="CARD16" name="width" />
+      <field type="CARD16" name="height" />
+      <field type="CARD16" name="xhot" />
+      <field type="CARD16" name="yhot" />
+      <field type="CARD32" name="cursor_serial" />
+      <field type="ATOM"   name="cursor_atom" altenum="Atom" />
+      <field type="CARD16" name="nbytes" />
+      <pad bytes="2" />
+      <list  type="CARD32" name="cursor_image">
+        <op op="*">
+          <fieldref>width</fieldref>
+          <fieldref>height</fieldref>
+        </op>
+      </list>
+      <list  type="char"   name="name"><fieldref>nbytes</fieldref></list>
+    </reply>
+  </request>
+
+  <request name="ChangeCursor" opcode="26">
+    <field type="CURSOR" name="source" />
+    <field type="CURSOR" name="destination" />
+  </request>
+
+  <request name="ChangeCursorByName" opcode="27">
+    <field type="CURSOR" name="src" />
+    <field type="CARD16" name="nbytes" />
+    <pad bytes="2" />
+    <list  type="char"   name="name"><fieldref>nbytes</fieldref></list>
+  </request>
+
+  <!-- Version 3 -->
+  <request name="ExpandRegion" opcode="28">
+    <field type="REGION" name="source" />
+    <field type="REGION" name="destination" />
+    <field type="CARD16" name="left" />
+    <field type="CARD16" name="right" />
+    <field type="CARD16" name="top" />
+    <field type="CARD16" name="bottom" />
+  </request>
+  
+  <!-- Version 4 -->
+  <request name="HideCursor" opcode="29">
+    <field type="WINDOW" name="window" />
+  </request>
+
+  <request name="ShowCursor" opcode="30">
+    <field type="WINDOW" name="window" />
+  </request>
+
+  <!-- Version 5 -->
+
+  <xidtype name="BARRIER" />
+
+  <enum name="BarrierDirections">
+    <item name="PositiveX"><bit>0</bit></item>
+    <item name="PositiveY"><bit>1</bit></item>
+    <item name="NegativeX"><bit>2</bit></item>
+    <item name="NegativeY"><bit>3</bit></item>
+  </enum>
+
+  <request name="CreatePointerBarrier" opcode="31">
+    <field type="BARRIER" name="barrier" />
+    <field type="WINDOW" name="window" />
+    <field type="CARD16" name="x1" />
+    <field type="CARD16" name="y1" />
+    <field type="CARD16" name="x2" />
+    <field type="CARD16" name="y2" />
+    <field type="CARD32" name="directions" mask="BarrierDirections" />
+    <pad bytes="2" />
+    <field type="CARD16" name="num_devices" />
+    <list type="CARD16" name="devices"><fieldref>num_devices</fieldref></list>
+  </request>
+
+  <request name="DeletePointerBarrier" opcode="32">
+    <field type="BARRIER" name="barrier" />
+  </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/xinerama.xml b/third_party/xcbproto/src/src/xinerama.xml
new file mode 100644
index 000000000000..b2747eeab51f
--- /dev/null
+++ b/third_party/xcbproto/src/src/xinerama.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2006 Jeremy Kolb.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<xcb header="xinerama" extension-xname="XINERAMA" extension-name="Xinerama"
+    major-version="1" minor-version="1">
+
+    <!-- Version 1.1 -->
+
+    <import>xproto</import>
+
+    <struct name="ScreenInfo">
+        <field type="INT16" name="x_org" />
+        <field type="INT16" name="y_org" />
+        <field type="CARD16" name="width" />
+        <field type="CARD16" name="height" />
+    </struct>
+
+    <request name="QueryVersion" opcode="0">
+        <field type="CARD8" name="major" />
+        <field type="CARD8" name="minor" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="major" />
+            <field type="CARD16" name="minor" />
+        </reply>
+    </request>
+
+    <request name="GetState" opcode="1">
+        <field type="WINDOW" name="window" />
+        <reply>
+            <field type="BYTE" name="state" />
+            <field type="WINDOW" name="window" />
+        </reply>
+    </request>
+
+    <request name="GetScreenCount" opcode="2">
+        <field type="WINDOW" name="window" />
+        <reply>
+            <field type="BYTE" name="screen_count" />
+            <field type="WINDOW" name="window" />
+        </reply>
+    </request>
+
+    <request name="GetScreenSize" opcode="3">
+        <field type="WINDOW" name="window" />
+        <field type="CARD32" name="screen" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="width" />
+            <field type="CARD32" name="height" />
+            <field type="WINDOW" name="window" />
+            <field type="CARD32" name="screen" />
+        </reply>
+    </request>
+
+    <request name="IsActive" opcode="4">
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="state" />
+        </reply>
+    </request>
+
+    <request name="QueryScreens" opcode="5">
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="number" />
+            <pad bytes="20" />
+            <list type="ScreenInfo" name="screen_info">
+                <fieldref>number</fieldref>
+            </list>
+        </reply>
+    </request>
+
+</xcb>
diff --git a/third_party/xcbproto/src/src/xinput.xml b/third_party/xcbproto/src/src/xinput.xml
new file mode 100644
index 000000000000..5f88a9857033
--- /dev/null
+++ b/third_party/xcbproto/src/src/xinput.xml
@@ -0,0 +1,2651 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2006 Peter Hutterer
+Copyright (C) 2013 Daniel Martin
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<!-- Specifications:
+     http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XIproto.txt
+     http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XI2proto.txt
+-->
+
+<xcb header="xinput" extension-xname="XInputExtension" extension-name="Input"
+     major-version="2" minor-version="3">
+    <import>xfixes</import>
+    <import>xproto</import>
+
+    <!-- ⋅⋅⋅ Types (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <typedef oldname="CARD32" newname="EventClass" />
+    <typedef oldname="CARD8"  newname="KeyCode" />
+
+    <!-- ⋅⋅⋅ Types (v2.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <typedef oldname="CARD16" newname="DeviceId" />
+    <typedef oldname="INT32"  newname="FP1616" />
+
+    <struct name="FP3232">
+        <field type="INT32"  name="integral" />
+        <field type="CARD32" name="frac" />
+    </struct>
+
+    <!-- ⋅⋅⋅ Requests (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <!-- GetExtensionVersion -->
+
+    <request name="GetExtensionVersion" opcode="1">
+        <field type="CARD16" name="name_len" />
+        <pad bytes="2" />
+        <list type="char" name="name">
+            <fieldref>name_len</fieldref>
+        </list>
+        <reply>
+            <field type="CARD8"  name="xi_reply_type" />
+            <field type="CARD16" name="server_major" />
+            <field type="CARD16" name="server_minor" />
+            <field type="BOOL"   name="present" />
+            <pad bytes="19" />
+        </reply>
+    </request>
+
+    <!-- ListInputDevices -->
+
+    <enum name="DeviceUse">
+        <item name="IsXPointer">           <value>0</value> </item>
+        <item name="IsXKeyboard">          <value>1</value> </item>
+        <item name="IsXExtensionDevice">   <value>2</value> </item>
+        <item name="IsXExtensionKeyboard"> <value>3</value> </item>
+        <item name="IsXExtensionPointer">  <value>4</value> </item>
+    </enum>
+
+    <enum name="InputClass">
+        <item name="Key">       <value>0</value> </item>
+        <item name="Button">    <value>1</value> </item>
+        <item name="Valuator">  <value>2</value> </item>
+        <item name="Feedback">  <value>3</value> </item>
+        <item name="Proximity"> <value>4</value> </item>
+        <item name="Focus">     <value>5</value> </item>
+        <item name="Other">     <value>6</value> </item>
+        <!--
+               value Attach=7 is still contained in XI.h as "#define AttachClass"
+               but it was never transmitted over the protocol.
+               (It was used to tag a fake class created by libXi).
+
+               Even the creation of that fake class has been dropped
+               from libXi in 2009 by the following change:
+               http://cgit.freedesktop.org/xorg/lib/libXi/commit/?id=62858c426e6de1b99df660251737233afd335302
+
+               <item name="Attach">    <value>7</value> </item>
+        -->
+    </enum>
+
+    <enum name="ValuatorMode">
+        <item name="Relative"> <value>0</value> </item>
+        <item name="Absolute"> <value>1</value> </item>
+    </enum>
+
+    <struct name="DeviceInfo">
+        <field type="ATOM"  name="device_type" />
+        <field type="CARD8" name="device_id" />
+        <field type="CARD8" name="num_class_info" />
+        <field type="CARD8" name="device_use" enum="DeviceUse" />
+        <pad bytes="1" />
+    </struct>
+
+    <struct name="KeyInfo">
+        <field type="CARD8"   name="class_id" enum="InputClass" />
+        <field type="CARD8"   name="len" />
+        <field type="KeyCode" name="min_keycode" />
+        <field type="KeyCode" name="max_keycode" />
+        <field type="CARD16"  name="num_keys" />
+        <pad bytes="2" />
+    </struct>
+
+    <struct name="ButtonInfo">
+        <field type="CARD8"  name="class_id" enum="InputClass" />
+        <field type="CARD8"  name="len" />
+        <field type="CARD16" name="num_buttons" />
+    </struct>
+
+    <struct name="AxisInfo">
+        <field type="CARD32" name="resolution" />
+        <field type="INT32"  name="minimum" />
+        <field type="INT32"  name="maximum" />
+    </struct>
+
+    <struct name="ValuatorInfo">
+        <field type="CARD8"   name="class_id" enum="InputClass" />
+        <field type="CARD8"   name="len" />
+        <field type="CARD8"   name="axes_len" />
+        <field type="CARD8"   name="mode" enum="ValuatorMode" />
+        <field type="CARD32"  name="motion_size" />
+        <list type="AxisInfo" name="axes">
+            <fieldref>axes_len</fieldref>
+        </list>
+    </struct>
+
+    <struct name="InputInfo">
+        <field type="CARD8" name="class_id" enum="InputClass" />
+        <field type="CARD8" name="len" />
+        <switch name="info">
+            <fieldref>class_id</fieldref>
+            <required_start_align align="4" offset="2" />
+            <case name="key">
+                <enumref ref="InputClass">Key</enumref>
+                <field type="KeyCode" name="min_keycode" />
+                <field type="KeyCode" name="max_keycode" />
+                <field type="CARD16"  name="num_keys" />
+                <pad bytes="2" />
+            </case>
+            <case name="button">
+                <enumref ref="InputClass">Button</enumref>
+                <field type="CARD16"    name="num_buttons" />
+            </case>
+            <case name="valuator">
+                <enumref ref="InputClass">Valuator</enumref>
+                <required_start_align align="4" offset="2" />
+                <field type="CARD8"   name="axes_len" />
+                <field type="CARD8"   name="mode" enum="ValuatorMode" />
+                <field type="CARD32"  name="motion_size" />
+                <list type="AxisInfo" name="axes">
+                    <fieldref>axes_len</fieldref>
+                </list>
+            </case>
+	</switch>
+    </struct>
+
+    <struct name="DeviceName">
+        <field type="CARD8" name="len" />
+        <list type="char"  name="string">
+            <fieldref>len</fieldref>
+        </list>
+    </struct>
+
+    <request name="ListInputDevices" opcode="2">
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="devices_len" />
+            <pad bytes="23" />
+            <list type="DeviceInfo" name="devices">
+                <fieldref>devices_len</fieldref>
+            </list>
+            <list type="InputInfo" name="infos">
+                <sumof ref="devices">
+			<fieldref>num_class_info</fieldref>
+		</sumof>
+            </list>
+            <list type="STR" name="names">
+                <fieldref>devices_len</fieldref>
+            </list>
+            <pad align="4" />
+        </reply>
+    </request>
+
+    <!-- OpenDevice -->
+    <typedef oldname="CARD8" newname="EventTypeBase" />
+
+    <struct name="InputClassInfo">
+        <field type="CARD8" name="class_id" enum="InputClass" />
+        <field type="EventTypeBase" name="event_type_base" />
+    </struct>
+
+    <request name="OpenDevice" opcode="3">
+        <field type="CARD8" name="device_id" />
+        <pad bytes="3" />
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="num_classes" />
+            <pad bytes="23" />
+            <list type="InputClassInfo" name="class_info">
+                <fieldref>num_classes</fieldref>
+            </list>
+            <pad align="4" />
+        </reply>
+    </request>
+
+    <!-- CloseDevice -->
+
+    <request name="CloseDevice" opcode="4">
+        <field type="CARD8" name="device_id" />
+        <pad bytes="3" />
+    </request>
+
+    <!-- SetDeviceMode -->
+
+    <request name="SetDeviceMode" opcode="5">
+        <field type="CARD8" name="device_id" />
+        <field type="CARD8" name="mode" enum="ValuatorMode" />
+        <pad bytes="2" />
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <!-- values for status: 0: Success, 1: AlreadyGrabbed -->
+            <field type="CARD8" name="status" enum="GrabStatus" />
+            <pad bytes="23" />
+        </reply>
+    </request>
+
+    <!-- SelectExtensionEvent -->
+
+    <request name="SelectExtensionEvent" opcode="6">
+        <field type="WINDOW" name="window" />
+        <field type="CARD16" name="num_classes" />
+        <pad bytes="2" />
+        <list type="EventClass" name="classes">
+            <fieldref>num_classes</fieldref>
+        </list>
+    </request>
+
+    <!-- GetSelectedExtensionEvents -->
+
+    <request name="GetSelectedExtensionEvents" opcode="7">
+        <field type="WINDOW" name="window" />
+        <reply>
+            <field type="CARD8"  name="xi_reply_type" />
+            <field type="CARD16" name="num_this_classes" />
+            <field type="CARD16" name="num_all_classes" />
+            <pad bytes="20" />
+            <list type="EventClass" name="this_classes">
+                <fieldref>num_this_classes</fieldref>
+            </list>
+            <list type="EventClass" name="all_classes">
+                <fieldref>num_all_classes</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- ChangeDeviceDontPropagateList -->
+
+    <enum name="PropagateMode">
+        <item name="AddToList">      <value>0</value> </item>
+        <item name="DeleteFromList"> <value>1</value> </item>
+    </enum>
+
+    <request name="ChangeDeviceDontPropagateList" opcode="8">
+        <field type="WINDOW" name="window" />
+        <field type="CARD16" name="num_classes" />
+        <field type="CARD8"  name="mode" enum="PropagateMode" />
+        <pad bytes="1" />
+        <list type="EventClass" name="classes">
+            <fieldref>num_classes</fieldref>
+        </list>
+    </request>
+
+    <!-- GetDeviceDontPropagateList -->
+
+    <request name="GetDeviceDontPropagateList" opcode="9">
+        <field type="WINDOW" name="window" />
+        <reply>
+            <field type="CARD8"  name="xi_reply_type" />
+            <field type="CARD16" name="num_classes" />
+            <pad bytes="22" />
+            <list type="EventClass" name="classes">
+                <fieldref>num_classes</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- GetDeviceMotionEvents -->
+
+    <struct name="DeviceTimeCoord">
+        <field type="TIMESTAMP" name="time" />
+        <list type="INT32" name="axisvalues">
+            <paramref type="CARD8">num_axes</paramref>
+        </list>
+    </struct>
+
+    <request name="GetDeviceMotionEvents" opcode="10">
+        <field type="TIMESTAMP" name="start" />
+        <field type="TIMESTAMP" name="stop" altenum="Time" />
+        <field type="CARD8"     name="device_id" />
+        <pad bytes="3"/>
+        <reply>
+            <field type="CARD8"  name="xi_reply_type" />
+            <field type="CARD32" name="num_events" />
+            <field type="CARD8"  name="num_axes" />
+            <field type="CARD8"  name="device_mode" enum="ValuatorMode" />
+            <pad bytes="18" />
+            <list type="DeviceTimeCoord" name="events">
+                <fieldref>num_events</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- ChangeKeyboardDevice -->
+
+    <request name="ChangeKeyboardDevice" opcode="11">
+        <field type="CARD8" name="device_id" />
+        <pad bytes="3" />
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <!-- only the following GrabStatus-values are valid here:
+                 "Success", "AlreadyGrabbed", and "Frozen"
+            -->
+            <field type="CARD8" name="status" enum="GrabStatus" />
+            <pad bytes="23" />
+        </reply>
+    </request>
+
+    <!-- ChangePointerDevice -->
+
+    <request name="ChangePointerDevice" opcode="12">
+        <field type="CARD8" name="x_axis" />
+        <field type="CARD8" name="y_axis" />
+        <field type="CARD8" name="device_id" />
+        <pad bytes="1" />
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <!-- only the following GrabStatus-values are valid here:
+                 "Success", "AlreadyGrabbed", and "Frozen"
+            -->
+            <field type="CARD8" name="status" enum="GrabStatus" />
+            <pad bytes="23" />
+        </reply>
+    </request>
+
+    <!-- GrabDevice -->
+
+    <request name="GrabDevice" opcode="13">
+        <field type="WINDOW"    name="grab_window" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="CARD16"    name="num_classes" />
+        <field type="CARD8"     name="this_device_mode" enum="GrabMode" />
+        <field type="CARD8"     name="other_device_mode" enum="GrabMode" />
+        <field type="BOOL"      name="owner_events" />
+        <field type="CARD8"     name="device_id" />
+        <pad bytes="2" />
+        <list type="EventClass" name="classes">
+            <fieldref>num_classes</fieldref>
+        </list>
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="status" enum="GrabStatus" />
+            <pad bytes="23" />
+        </reply>
+    </request>
+
+    <!-- UngrabDevice -->
+
+    <request name="UngrabDevice" opcode="14">
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="CARD8"     name="device_id" />
+        <pad bytes="3" />
+    </request>
+
+    <!-- GrabDeviceKey -->
+
+    <enum name="ModifierDevice">
+	<item name="UseXKeyboard"><value>255</value></item> <!-- 0xff -->
+    </enum>
+
+    <request name="GrabDeviceKey" opcode="15">
+        <field type="WINDOW" name="grab_window" />
+        <field type="CARD16" name="num_classes" />
+        <field type="CARD16" name="modifiers" mask="ModMask" />
+        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
+        <field type="CARD8"  name="grabbed_device" />
+        <field type="CARD8"  name="key" altenum="Grab" />
+        <field type="CARD8"  name="this_device_mode" enum="GrabMode" />
+        <field type="CARD8"  name="other_device_mode" enum="GrabMode" />
+        <field type="BOOL"   name="owner_events" />
+        <pad bytes="2" />
+        <list type="EventClass" name="classes">
+            <fieldref>num_classes</fieldref>
+        </list>
+    </request>
+
+    <!-- UngrabDeviceKey -->
+
+    <request name="UngrabDeviceKey" opcode="16">
+        <field type="WINDOW" name="grabWindow" />
+        <field type="CARD16" name="modifiers" mask="ModMask" />
+        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
+        <field type="CARD8"  name="key" altenum="Grab" />
+        <field type="CARD8"  name="grabbed_device" />
+    </request>
+
+    <!-- GrabDeviceButton -->
+
+    <request name="GrabDeviceButton" opcode="17">
+        <field type="WINDOW" name="grab_window" />
+        <field type="CARD8"  name="grabbed_device" />
+        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
+        <field type="CARD16" name="num_classes" />
+        <field type="CARD16" name="modifiers" mask="ModMask" />
+        <field type="CARD8"  name="this_device_mode" enum="GrabMode" />
+        <field type="CARD8"  name="other_device_mode" enum="GrabMode" />
+        <field type="CARD8"  name="button" altenum="Grab" />
+        <field type="BOOL"   name="owner_events" />
+        <pad bytes="2" />
+        <list type="EventClass" name="classes">
+            <fieldref>num_classes</fieldref>
+        </list>
+    </request>
+
+    <!-- UngrabDeviceButton -->
+
+    <request name="UngrabDeviceButton" opcode="18">
+        <field type="WINDOW" name="grab_window" />
+        <field type="CARD16" name="modifiers" mask="ModMask" />
+        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
+        <field type="CARD8"  name="button" altenum="Grab" />
+        <field type="CARD8"  name="grabbed_device" />
+        <pad bytes="3" />
+    </request>
+
+    <!-- AllowDeviceEvents -->
+
+    <enum name="DeviceInputMode">
+        <item name="AsyncThisDevice">   <value>0</value> </item>
+        <item name="SyncThisDevice">    <value>1</value> </item>
+        <item name="ReplayThisDevice">  <value>2</value> </item>
+        <item name="AsyncOtherDevices"> <value>3</value> </item>
+        <item name="AsyncAll">          <value>4</value> </item>
+        <item name="SyncAll">           <value>5</value> </item>
+    </enum>
+
+    <request name="AllowDeviceEvents" opcode="19">
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="CARD8"     name="mode" enum="DeviceInputMode" />
+        <field type="CARD8"     name="device_id" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- GetDeviceFocus -->
+
+    <request name="GetDeviceFocus" opcode="20">
+        <field type="CARD8" name="device_id" />
+        <pad bytes="3" />
+        <reply>
+            <field type="CARD8"     name="xi_reply_type" />
+            <field type="WINDOW"    name="focus" altenum="InputFocus" />
+            <field type="TIMESTAMP" name="time" />
+            <field type="CARD8"     name="revert_to" enum="InputFocus" />
+            <pad bytes="15" />
+        </reply>
+    </request>
+
+    <!-- SetDeviceFocus -->
+
+    <request name="SetDeviceFocus" opcode="21">
+        <field type="WINDOW"    name="focus" altenum="InputFocus" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="CARD8"     name="revert_to" enum="InputFocus" />
+        <field type="CARD8"     name="device_id" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- GetFeedbackControl -->
+
+    <enum name="FeedbackClass">
+        <item name="Keyboard"> <value>0</value> </item>
+        <item name="Pointer">  <value>1</value> </item>
+        <item name="String">   <value>2</value> </item>
+        <item name="Integer">  <value>3</value> </item>
+        <item name="Led">      <value>4</value> </item>
+        <item name="Bell">     <value>5</value> </item>
+    </enum>
+
+    <struct name="KbdFeedbackState">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <field type="CARD16" name="pitch" />
+        <field type="CARD16" name="duration" />
+        <field type="CARD32" name="led_mask" />
+        <field type="CARD32" name="led_values" />
+        <field type="BOOL"   name="global_auto_repeat" />
+        <field type="CARD8"  name="click" />
+        <field type="CARD8"  name="percent" />
+        <pad bytes="1" />
+        <list type="CARD8" name="auto_repeats">
+            <value>32</value>
+        </list>
+    </struct>
+
+    <struct name="PtrFeedbackState">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <pad bytes="2" />
+        <field type="CARD16" name="accel_num" />
+        <field type="CARD16" name="accel_denom" />
+        <field type="CARD16" name="threshold" />
+    </struct>
+
+    <struct name="IntegerFeedbackState">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <field type="CARD32" name="resolution" />
+        <field type="INT32"  name="min_value" />
+        <field type="INT32"  name="max_value" />
+    </struct>
+
+    <struct name="StringFeedbackState">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <field type="CARD16" name="max_symbols" />
+        <field type="CARD16" name="num_keysyms" />
+        <list type="KEYSYM"  name="keysyms">
+            <fieldref>num_keysyms</fieldref>
+        </list>
+    </struct>
+
+    <struct name="BellFeedbackState">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <field type="CARD8"  name="percent" />
+        <pad bytes="3" />
+        <field type="CARD16" name="pitch" />
+        <field type="CARD16" name="duration" />
+    </struct>
+
+    <struct name="LedFeedbackState">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <field type="CARD32" name="led_mask" />
+        <field type="CARD32" name="led_values" />
+    </struct>
+
+    <struct name="FeedbackState">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <switch name="data">
+            <fieldref>class_id</fieldref>
+            <case name="keyboard">
+                <enumref ref="FeedbackClass">Keyboard</enumref>
+                <field type="CARD16" name="pitch" />
+                <field type="CARD16" name="duration" />
+                <field type="CARD32" name="led_mask" />
+                <field type="CARD32" name="led_values" />
+                <field type="BOOL"   name="global_auto_repeat" />
+                <field type="CARD8"  name="click" />
+                <field type="CARD8"  name="percent" />
+                <pad bytes="1" />
+                <list type="CARD8" name="auto_repeats">
+                    <value>32</value>
+                </list>
+            </case>
+            <case name="pointer">
+                <enumref ref="FeedbackClass">Pointer</enumref>
+                <pad bytes="2" />
+                <field type="CARD16" name="accel_num" />
+                <field type="CARD16" name="accel_denom" />
+                <field type="CARD16" name="threshold" />
+            </case>
+            <case name="string">
+                <enumref ref="FeedbackClass">String</enumref>
+                <field type="CARD16" name="max_symbols" />
+                <field type="CARD16" name="num_keysyms" />
+                <list type="KEYSYM"  name="keysyms">
+	            <fieldref>num_keysyms</fieldref>
+	        </list>
+            </case>
+            <case name="integer">
+                <enumref ref="FeedbackClass">Integer</enumref>
+                <field type="CARD32" name="resolution" />
+                <field type="INT32"  name="min_value" />
+                <field type="INT32"  name="max_value" />
+            </case>
+            <case name="led">
+                <enumref ref="FeedbackClass">Led</enumref>
+                <field type="CARD32" name="led_mask" />
+                <field type="CARD32" name="led_values" />
+            </case>
+            <case name="bell">
+                <enumref ref="FeedbackClass">Bell</enumref>
+                <field type="CARD8"  name="percent" />
+                <pad bytes="3" />
+                <field type="CARD16" name="pitch" />
+                <field type="CARD16" name="duration" />
+            </case>
+        </switch>
+    </struct>
+
+    <request name="GetFeedbackControl" opcode="22">
+        <field type="CARD8" name="device_id" />
+        <pad bytes="3" />
+        <reply>
+            <field type="CARD8"  name="xi_reply_type" />
+            <field type="CARD16" name="num_feedbacks" />
+            <pad bytes="22" />
+            <list type="FeedbackState" name="feedbacks">
+                <fieldref>num_feedbacks</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- ChangeFeedbackControl -->
+
+    <struct name="KbdFeedbackCtl">
+        <field type="CARD8"   name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"   name="feedback_id" />
+        <field type="CARD16"  name="len" />
+        <field type="KeyCode" name="key" />
+        <field type="CARD8"   name="auto_repeat_mode" />
+        <field type="INT8"    name="key_click_percent" />
+        <field type="INT8"    name="bell_percent" />
+        <field type="INT16"   name="bell_pitch" />
+        <field type="INT16"   name="bell_duration" />
+        <field type="CARD32"  name="led_mask" />
+        <field type="CARD32"  name="led_values" />
+    </struct>
+
+    <struct name="PtrFeedbackCtl">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <pad bytes="2" />
+        <field type="INT16"  name="num" />
+        <field type="INT16"  name="denom" />
+        <field type="INT16"  name="threshold" />
+    </struct>
+
+    <struct name="IntegerFeedbackCtl">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <field type="INT32"  name="int_to_display" />
+    </struct>
+
+    <struct name="StringFeedbackCtl">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <pad bytes="2" />
+        <field type="CARD16" name="num_keysyms" />
+        <list type="KEYSYM"  name="keysyms">
+            <fieldref>num_keysyms</fieldref>
+        </list>
+    </struct>
+
+    <struct name="BellFeedbackCtl">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <field type="INT8"   name="percent" />
+        <pad bytes="3" />
+        <field type="INT16"  name="pitch" />
+        <field type="INT16"  name="duration" />
+    </struct>
+
+    <struct name="LedFeedbackCtl">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <field type="CARD32" name="led_mask" />
+        <field type="CARD32" name="led_values" />
+    </struct>
+
+    <struct name="FeedbackCtl">
+        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
+        <field type="CARD8"  name="feedback_id" />
+        <field type="CARD16" name="len" />
+        <switch name="data">
+	    <fieldref>class_id</fieldref>
+            <case name="keyboard">
+                <enumref ref="FeedbackClass">Keyboard</enumref>
+		<field type="KeyCode" name="key" />
+		<field type="CARD8"   name="auto_repeat_mode" />
+		<field type="INT8"    name="key_click_percent" />
+		<field type="INT8"    name="bell_percent" />
+		<field type="INT16"   name="bell_pitch" />
+		<field type="INT16"   name="bell_duration" />
+		<field type="CARD32"  name="led_mask" />
+		<field type="CARD32"  name="led_values" />
+            </case>
+            <case name="pointer">
+                <enumref ref="FeedbackClass">Pointer</enumref>
+		<pad bytes="2" />
+		<field type="INT16"  name="num" />
+		<field type="INT16"  name="denom" />
+		<field type="INT16"  name="threshold" />
+            </case>
+            <case name="string">
+                <enumref ref="FeedbackClass">String</enumref>
+		<pad bytes="2" />
+		<field type="CARD16" name="num_keysyms" />
+		<list type="KEYSYM"  name="keysyms">
+		    <fieldref>num_keysyms</fieldref>
+		</list>
+            </case>
+            <case name="integer">
+                <enumref ref="FeedbackClass">Integer</enumref>
+	        <field type="INT32"  name="int_to_display" />
+            </case>
+            <case name="led">
+                <enumref ref="FeedbackClass">Led</enumref>
+		<field type="CARD32" name="led_mask" />
+		<field type="CARD32" name="led_values" />
+            </case>
+            <case name="bell">
+                <enumref ref="FeedbackClass">Bell</enumref>
+		<field type="INT8"   name="percent" />
+		<pad bytes="3" />
+		<field type="INT16"  name="pitch" />
+		<field type="INT16"  name="duration" />
+            </case>
+	</switch>
+    </struct>
+
+    <enum name="ChangeFeedbackControlMask">
+        <item name="KeyClickPercent">  <bit>0</bit> </item> <!-- 0x01 -->
+        <item name="Percent">          <bit>1</bit> </item> <!-- 0x02 -->
+        <item name="Pitch">            <bit>2</bit> </item> <!-- 0x04 -->
+        <item name="Duration">         <bit>3</bit> </item> <!-- 0x08 -->
+        <item name="Led">              <bit>4</bit> </item> <!-- 0x10 -->
+        <item name="LedMode">          <bit>5</bit> </item> <!-- 0x20 -->
+        <item name="Key">              <bit>6</bit> </item> <!-- 0x40 -->
+        <item name="AutoRepeatMode">   <bit>7</bit> </item> <!-- 0x80 -->
+        <item name="String">           <bit>0</bit> </item> <!-- 0x01 -->
+        <item name="Integer">          <bit>0</bit> </item> <!-- 0x01 -->
+        <item name="AccelNum">         <bit>0</bit> </item> <!-- 0x01 -->
+        <item name="AccelDenom">       <bit>1</bit> </item> <!-- 0x02 -->
+        <item name="Threshold">        <bit>2</bit> </item> <!-- 0x04 -->
+    </enum>
+
+    <request name="ChangeFeedbackControl" opcode="23">
+        <field type="CARD32"      name="mask" mask="ChangeFeedbackControlMask" />
+        <field type="CARD8"       name="device_id" />
+        <field type="CARD8"       name="feedback_id" />
+        <pad bytes="2" />
+        <field type="FeedbackCtl" name="feedback" />
+    </request>
+
+    <!-- GetDeviceKeyMapping -->
+
+    <request name="GetDeviceKeyMapping" opcode="24">
+        <field type="CARD8"   name="device_id" />
+        <field type="KeyCode" name="first_keycode" />
+        <field type="CARD8"   name="count" />
+        <pad bytes="1" />
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="keysyms_per_keycode" />
+            <pad bytes="23" />
+            <list type="KEYSYM" name="keysyms">
+                <!-- 'length' is a field in the header -->
+                <fieldref>length</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- ChangeDeviceKeyMapping -->
+
+    <request name="ChangeDeviceKeyMapping" opcode="25">
+        <field type="CARD8"   name="device_id" />
+        <field type="KeyCode" name="first_keycode" />
+        <field type="CARD8"   name="keysyms_per_keycode" />
+        <field type="CARD8"   name="keycode_count" />
+        <list type="KEYSYM"   name="keysyms">
+            <op op="*">
+                <fieldref>keycode_count</fieldref>
+                <fieldref>keysyms_per_keycode</fieldref>
+            </op>
+        </list>
+    </request>
+
+    <!-- GetDeviceModifierMapping -->
+
+    <request name="GetDeviceModifierMapping" opcode="26">
+        <field type="CARD8" name="device_id" />
+        <pad bytes="3" />
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="keycodes_per_modifier" />
+            <pad bytes="23" />
+            <list type="CARD8"  name="keymaps">
+                <op op="*">
+                    <fieldref>keycodes_per_modifier</fieldref>
+                    <value>8</value>
+                </op>
+            </list>
+        </reply>
+    </request>
+
+    <!-- SetDeviceModifierMapping -->
+
+    <request name="SetDeviceModifierMapping" opcode="27">
+        <field type="CARD8" name="device_id" />
+        <field type="CARD8" name="keycodes_per_modifier" />
+        <pad bytes="2" />
+        <list type="CARD8" name="keymaps">
+            <op op="*">
+                <fieldref>keycodes_per_modifier</fieldref>
+                <value>8</value>
+            </op>
+        </list>
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="status" enum="MappingStatus" />
+            <pad bytes="23" />
+        </reply>
+    </request>
+
+    <!-- GetDeviceButtonMapping -->
+
+    <request name="GetDeviceButtonMapping" opcode="28">
+        <field type="CARD8" name="device_id" />
+        <pad bytes="3" />
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="map_size" />
+            <pad bytes="23" />
+            <list type="CARD8" name="map">
+                <fieldref>map_size</fieldref>
+            </list>
+            <pad align="4" />
+        </reply>
+    </request>
+
+    <!-- SetDeviceButtonMapping -->
+
+    <request name="SetDeviceButtonMapping" opcode="29">
+        <field type="CARD8" name="device_id" />
+        <field type="CARD8" name="map_size" />
+        <pad bytes="2" />
+        <list type="CARD8" name="map">
+            <fieldref>map_size</fieldref>
+        </list>
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="status" enum="MappingStatus" />
+            <pad bytes="23" />
+        </reply>
+    </request>
+
+    <!-- QueryDeviceState -->
+
+    <struct name="KeyState">
+        <field type="CARD8" name="class_id" enum="InputClass" />
+        <field type="CARD8" name="len" />
+        <field type="CARD8" name="num_keys" />
+        <pad bytes="1" />
+        <list type="CARD8" name="keys">
+            <value>32</value>
+        </list>
+    </struct>
+
+    <struct name="ButtonState">
+        <field type="CARD8" name="class_id" enum="InputClass" />
+        <field type="CARD8" name="len" />
+        <field type="CARD8" name="num_buttons" />
+        <pad bytes="1" />
+        <list type="CARD8" name="buttons">
+            <value>32</value>
+        </list>
+    </struct>
+
+    <enum name="ValuatorStateModeMask">
+        <item name="DeviceModeAbsolute"> <bit>0</bit> </item>
+        <item name="OutOfProximity">     <bit>1</bit> </item>
+    </enum>
+
+    <struct name="ValuatorState">
+        <field type="CARD8" name="class_id" enum="InputClass" />
+        <field type="CARD8" name="len" />
+        <field type="CARD8" name="num_valuators" />
+        <field type="CARD8" name="mode" mask="ValuatorStateModeMask" />
+        <list type="INT32" name="valuators">
+            <fieldref>num_valuators</fieldref>
+        </list>
+    </struct>
+
+    <struct name="InputState">
+        <field type="CARD8" name="class_id" enum="InputClass" />
+        <field type="CARD8" name="len" />
+        <switch name="data">
+            <fieldref>class_id</fieldref>
+            <required_start_align align="4" offset="2" />
+            <case name="key">
+                <enumref ref="InputClass">Key</enumref>
+                <required_start_align align="4" offset="2" />
+                <field type="CARD8" name="num_keys" />
+                <pad bytes="1" />
+                <list type="CARD8" name="keys">
+                    <value>32</value>
+                </list>
+            </case>
+            <case name="button">
+                <enumref ref="InputClass">Button</enumref>
+                <field type="CARD8" name="num_buttons" />
+                <pad bytes="1" />
+                <list type="CARD8" name="buttons">
+                    <value>32</value>
+                </list>
+            </case>
+            <case name="valuator">
+                <enumref ref="InputClass">Valuator</enumref>
+                <required_start_align align="4" offset="2" />
+                <field type="CARD8" name="num_valuators" />
+                <field type="CARD8" name="mode" mask="ValuatorStateModeMask" />
+                <list type="INT32" name="valuators">
+                    <fieldref>num_valuators</fieldref>
+                </list>
+            </case>
+        </switch>
+    </struct>
+
+    <request name="QueryDeviceState" opcode="30">
+        <field type="CARD8" name="device_id" />
+        <pad bytes="3" />
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="num_classes" />
+            <pad bytes="23" />
+            <list type="InputState" name="classes">
+                <fieldref>num_classes</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- SendExtensionEvent (opcode 16) has to be defined after the events
+         because we do not support backward references -->
+
+    <!-- DeviceBell -->
+
+    <request name="DeviceBell" opcode="32">
+        <field type="CARD8" name="device_id" />
+        <field type="CARD8" name="feedback_id" />
+        <field type="CARD8" name="feedback_class" />
+        <field type="INT8"  name="percent" />
+    </request>
+
+    <!-- SetDeviceValuators -->
+
+    <request name="SetDeviceValuators" opcode="33">
+        <field type="CARD8" name="device_id" />
+        <field type="CARD8" name="first_valuator" />
+        <field type="CARD8" name="num_valuators" />
+        <pad bytes="1" />
+        <list type="INT32" name="valuators">
+            <fieldref>num_valuators</fieldref>
+        </list>
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="status" enum="GrabStatus" />
+            <pad bytes="23" />
+        </reply>
+    </request>
+
+    <!-- GetDeviceControl -->
+
+    <enum name="DeviceControl">
+        <item name="resolution"> <value>1</value> </item>
+        <item name="abs_calib">  <value>2</value> </item>
+        <item name="core">       <value>3</value> </item>
+        <item name="enable">     <value>4</value> </item>
+        <item name="abs_area">   <value>5</value> </item>
+    </enum>
+
+    <struct name="DeviceResolutionState">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <field type="CARD32" name="num_valuators" />
+        <list type="CARD32"  name="resolution_values">
+            <fieldref>num_valuators</fieldref>
+        </list>
+        <list type="CARD32" name="resolution_min">
+            <fieldref>num_valuators</fieldref>
+        </list>
+        <list type="CARD32" name="resolution_max">
+            <fieldref>num_valuators</fieldref>
+        </list>
+    </struct>
+
+    <struct name="DeviceAbsCalibState">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <field type="INT32"  name="min_x" />
+        <field type="INT32"  name="max_x" />
+        <field type="INT32"  name="min_y" />
+        <field type="INT32"  name="max_y" />
+        <field type="CARD32" name="flip_x" />
+        <field type="CARD32" name="flip_y" />
+        <field type="CARD32" name="rotation" />
+        <field type="CARD32" name="button_threshold" />
+    </struct>
+
+    <struct name="DeviceAbsAreaState">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <field type="CARD32" name="offset_x" />
+        <field type="CARD32" name="offset_y" />
+        <field type="CARD32" name="width" />
+        <field type="CARD32" name="height" />
+        <field type="CARD32" name="screen" />
+        <field type="CARD32" name="following" />
+    </struct>
+
+    <struct name="DeviceCoreState">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <field type="CARD8"  name="status" />
+        <field type="CARD8"  name="iscore" />
+        <pad bytes="2" />
+    </struct>
+
+    <struct name="DeviceEnableState">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <field type="CARD8"  name="enable" />
+        <pad bytes="3" />
+    </struct>
+
+    <struct name="DeviceState">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <switch name="data">
+            <fieldref>control_id</fieldref>
+            <case name="resolution">
+                <enumref ref="DeviceControl">resolution</enumref>
+                <field type="CARD32" name="num_valuators" />
+                <list type="CARD32"  name="resolution_values">
+                    <fieldref>num_valuators</fieldref>
+                </list>
+                <list type="CARD32" name="resolution_min">
+                    <fieldref>num_valuators</fieldref>
+                </list>
+                <list type="CARD32" name="resolution_max">
+                    <fieldref>num_valuators</fieldref>
+                </list>
+            </case>
+            <case name="abs_calib">
+                <enumref ref="DeviceControl">abs_calib</enumref>
+                <field type="INT32"  name="min_x" />
+                <field type="INT32"  name="max_x" />
+                <field type="INT32"  name="min_y" />
+                <field type="INT32"  name="max_y" />
+                <field type="CARD32" name="flip_x" />
+                <field type="CARD32" name="flip_y" />
+                <field type="CARD32" name="rotation" />
+                <field type="CARD32" name="button_threshold" />
+            </case>
+            <case name="core">
+                <enumref ref="DeviceControl">core</enumref>
+                <field type="CARD8"  name="status" />
+                <field type="CARD8"  name="iscore" />
+                <pad bytes="2" />
+            </case>
+            <case name="enable">
+                <enumref ref="DeviceControl">enable</enumref>
+                <field type="CARD8"  name="enable" />
+                <pad bytes="3" />
+            </case>
+            <case name="abs_area">
+                <enumref ref="DeviceControl">abs_area</enumref>
+                <field type="CARD32" name="offset_x" />
+                <field type="CARD32" name="offset_y" />
+                <field type="CARD32" name="width" />
+                <field type="CARD32" name="height" />
+                <field type="CARD32" name="screen" />
+                <field type="CARD32" name="following" />
+            </case>
+        </switch>
+    </struct>
+
+    <request name="GetDeviceControl" opcode="34">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD8"  name="device_id" />
+        <pad bytes="1" />
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="status" altenum="GrabStatus" />
+            <pad bytes="23" />
+            <field type="DeviceState" name="control" />
+        </reply>
+    </request>
+
+    <!-- ChangeDeviceControl -->
+
+    <struct name="DeviceResolutionCtl">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <field type="CARD8"  name="first_valuator" />
+        <field type="CARD8"  name="num_valuators" />
+        <pad bytes="2" />
+        <list type="CARD32"  name="resolution_values">
+            <fieldref>num_valuators</fieldref>
+        </list>
+    </struct>
+
+    <struct name="DeviceAbsCalibCtl">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <field type="INT32"  name="min_x" />
+        <field type="INT32"  name="max_x" />
+        <field type="INT32"  name="min_y" />
+        <field type="INT32"  name="max_y" />
+        <field type="CARD32" name="flip_x" />
+        <field type="CARD32" name="flip_y" />
+        <field type="CARD32" name="rotation" />
+        <field type="CARD32" name="button_threshold" />
+    </struct>
+
+    <struct name="DeviceAbsAreaCtrl">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <field type="CARD32" name="offset_x" />
+        <field type="CARD32" name="offset_y" />
+        <field type="INT32"  name="width" />
+        <field type="INT32"  name="height" />
+        <field type="INT32"  name="screen" />
+        <field type="CARD32" name="following" />
+    </struct>
+
+    <struct name="DeviceCoreCtrl">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <field type="CARD8"  name="status" />
+        <pad bytes="3" />
+    </struct>
+
+    <struct name="DeviceEnableCtrl">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <field type="CARD8"  name="enable" />
+        <pad bytes="3" />
+    </struct>
+
+    <struct name="DeviceCtl">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD16" name="len" />
+        <switch name="data">
+            <fieldref>control_id</fieldref>
+            <case name="resolution">
+                <enumref ref="DeviceControl">resolution</enumref>
+                <field type="CARD8"  name="first_valuator" />
+                <field type="CARD8"  name="num_valuators" />
+                <pad bytes="2" />
+                <list type="CARD32"  name="resolution_values">
+                    <fieldref>num_valuators</fieldref>
+                </list>
+            </case>
+            <case name="abs_calib">
+                <enumref ref="DeviceControl">abs_calib</enumref>
+                <field type="INT32"  name="min_x" />
+                <field type="INT32"  name="max_x" />
+                <field type="INT32"  name="min_y" />
+                <field type="INT32"  name="max_y" />
+                <field type="CARD32" name="flip_x" />
+                <field type="CARD32" name="flip_y" />
+                <field type="CARD32" name="rotation" />
+                <field type="CARD32" name="button_threshold" />
+            </case>
+            <case name="core">
+                <enumref ref="DeviceControl">core</enumref>
+                <field type="CARD8"  name="status" />
+                <pad bytes="3" />
+            </case>
+            <case name="enable">
+                <enumref ref="DeviceControl">enable</enumref>
+                <field type="CARD8"  name="enable" />
+                <pad bytes="3" />
+            </case>
+            <case name="abs_area">
+                <enumref ref="DeviceControl">abs_area</enumref>
+                <field type="CARD32" name="offset_x" />
+                <field type="CARD32" name="offset_y" />
+                <field type="INT32"  name="width" />
+                <field type="INT32"  name="height" />
+                <field type="INT32"  name="screen" />
+                <field type="CARD32" name="following" />
+            </case>
+        </switch>
+    </struct>
+
+    <request name="ChangeDeviceControl" opcode="35">
+        <field type="CARD16" name="control_id" enum="DeviceControl" />
+        <field type="CARD8"  name="device_id" />
+        <pad bytes="1" />
+        <field type="DeviceCtl" name="control" />
+        <reply>
+            <field type="CARD8" name="xi_reply_type" />
+            <field type="CARD8" name="status" altenum="GrabStatus" />
+            <pad bytes="23" />
+        </reply>
+    </request>
+
+    <!-- ⋅⋅⋅ Requests (v1.5) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <!-- ListDeviceProperties -->
+
+    <request name="ListDeviceProperties" opcode="36">
+        <field type="CARD8"  name="device_id" />
+        <pad bytes="3" />
+        <reply>
+            <field type="CARD8"  name="xi_reply_type" />
+            <field type="CARD16" name="num_atoms" />
+            <pad bytes="22" />
+            <list type="ATOM" name="atoms">
+                <fieldref>num_atoms</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- ChangeDeviceProperty -->
+
+    <enum name="PropertyFormat">
+        <item name="8Bits">  <value>8</value> </item>
+        <item name="16Bits"> <value>16</value> </item>
+        <item name="32Bits"> <value>32</value> </item>
+    </enum>
+
+    <request name="ChangeDeviceProperty" opcode="37">
+        <field type="ATOM"  name="property" />
+        <field type="ATOM"  name="type" />
+        <field type="CARD8" name="device_id" />
+        <field type="CARD8" name="format" enum="PropertyFormat" />
+        <field type="CARD8" name="mode" enum="PropMode" />
+        <pad bytes="1" />
+        <field type="CARD32" name="num_items" />
+        <switch name="items">
+            <fieldref>format</fieldref>
+            <case>
+                <enumref ref="PropertyFormat">8Bits</enumref>
+                <list type="CARD8" name="data8">
+                    <fieldref>num_items</fieldref>
+                </list>
+                <pad align="4" />
+            </case>
+            <case>
+                <enumref ref="PropertyFormat">16Bits</enumref>
+                <list type="CARD16" name="data16">
+                    <fieldref>num_items</fieldref>
+                </list>
+                <pad align="4" />
+            </case>
+            <case>
+                <enumref ref="PropertyFormat">32Bits</enumref>
+                <list type="CARD32" name="data32">
+                    <fieldref>num_items</fieldref>
+                </list>
+            </case>
+        </switch>
+    </request>
+
+    <!-- DeleteDeviceProperty -->
+
+    <request name="DeleteDeviceProperty" opcode="38">
+        <field type="ATOM"  name="property" />
+        <field type="CARD8" name="device_id" />
+        <pad bytes="3" />
+    </request>
+
+    <!-- GetDeviceProperty -->
+
+    <request name="GetDeviceProperty" opcode="39">
+        <field type="ATOM"   name="property" />
+        <field type="ATOM"   name="type" />
+        <field type="CARD32" name="offset" />
+        <field type="CARD32" name="len" />
+        <field type="CARD8"  name="device_id" />
+        <field type="BOOL"   name="delete" />
+        <pad bytes="2" />
+        <reply>
+            <field type="CARD8"  name="xi_reply_type" />
+            <field type="ATOM"   name="type" />
+            <field type="CARD32" name="bytes_after" />
+            <field type="CARD32" name="num_items" />
+            <field type="CARD8"  name="format" enum="PropertyFormat" />
+            <field type="CARD8"  name="device_id" />
+            <pad bytes="10" />
+            <switch name="items">
+                <fieldref>format</fieldref>
+                <case>
+                    <enumref ref="PropertyFormat">8Bits</enumref>
+                    <list type="CARD8" name="data8">
+                        <fieldref>num_items</fieldref>
+                    </list>
+                    <pad align="4" />
+                </case>
+                <case>
+                    <enumref ref="PropertyFormat">16Bits</enumref>
+                    <list type="CARD16" name="data16">
+                        <fieldref>num_items</fieldref>
+                    </list>
+                    <pad align="4" />
+                </case>
+                <case>
+                    <enumref ref="PropertyFormat">32Bits</enumref>
+                    <list type="CARD32" name="data32">
+                        <fieldref>num_items</fieldref>
+                    </list>
+                </case>
+            </switch>
+        </reply>
+    </request>
+
+    <!-- ⋅⋅⋅ Requests (v2.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <!-- XIQueryPointer -->
+
+    <enum name="Device">
+        <item name="All">       <value>0</value> </item>
+        <item name="AllMaster"> <value>1</value> </item>
+    </enum>
+
+    <struct name="GroupInfo">
+        <field type="CARD8" name="base" />
+        <field type="CARD8" name="latched" />
+        <field type="CARD8" name="locked" />
+        <field type="CARD8" name="effective" />
+    </struct>
+
+    <struct name="ModifierInfo">
+        <field type="CARD32" name="base" />
+        <field type="CARD32" name="latched" />
+        <field type="CARD32" name="locked" />
+        <field type="CARD32" name="effective" />
+    </struct>
+
+    <request name="XIQueryPointer" opcode="40">
+        <field type="WINDOW"   name="window" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+        <reply>
+            <pad bytes="1" />
+            <field type="WINDOW"       name="root" />
+            <field type="WINDOW"       name="child" />
+            <field type="FP1616"       name="root_x" />
+            <field type="FP1616"       name="root_y" />
+            <field type="FP1616"       name="win_x" />
+            <field type="FP1616"       name="win_y" />
+            <field type="BOOL"         name="same_screen" />
+            <pad bytes="1" />
+            <field type="CARD16"       name="buttons_len" />
+            <field type="ModifierInfo" name="mods" />
+            <field type="GroupInfo"    name="group" />
+            <list type="CARD32" name="buttons">
+                <fieldref>buttons_len</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- XIWarpPointer -->
+
+    <request name="XIWarpPointer" opcode="41">
+        <field type="WINDOW"   name="src_win" />
+        <field type="WINDOW"   name="dst_win" />
+        <field type="FP1616"   name="src_x" />
+        <field type="FP1616"   name="src_y" />
+        <field type="CARD16"   name="src_width" />
+        <field type="CARD16"   name="src_height" />
+        <field type="FP1616"   name="dst_x" />
+        <field type="FP1616"   name="dst_y" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- XIChangeCursor -->
+
+    <request name="XIChangeCursor" opcode="42">
+        <field type="WINDOW"   name="window" />
+        <field type="CURSOR"   name="cursor" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- XIChangeHierarchy -->
+
+    <enum name="HierarchyChangeType">
+        <item name="AddMaster">    <value>1</value> </item>
+        <item name="RemoveMaster"> <value>2</value> </item>
+        <item name="AttachSlave">  <value>3</value> </item>
+        <item name="DetachSlave">  <value>4</value> </item>
+    </enum>
+
+    <enum name="ChangeMode">
+        <item name="Attach"> <value>1</value> </item>
+        <item name="Float">  <value>2</value> </item>
+    </enum>
+
+    <struct name="AddMaster">
+        <field type="CARD16" name="type" enum="HierarchyChangeType" />
+        <field type="CARD16" name="len" />
+        <field type="CARD16" name="name_len" />
+        <field type="BOOL"   name="send_core" />
+        <field type="BOOL"   name="enable" />
+        <list type="char" name="name">
+            <fieldref>name_len</fieldref>
+        </list>
+        <pad align="4" />
+    </struct>
+
+    <struct name="RemoveMaster">
+        <field type="CARD16"   name="type" enum="HierarchyChangeType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="CARD8"    name="return_mode" enum="ChangeMode" />
+        <pad bytes="1" />
+        <field type="DeviceId" name="return_pointer" altenum="Device" />
+        <field type="DeviceId" name="return_keyboard" altenum="Device" />
+    </struct>
+
+    <struct name="AttachSlave">
+        <field type="CARD16"   name="type" enum="HierarchyChangeType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="DeviceId" name="master" altenum="Device" />
+    </struct>
+
+    <struct name="DetachSlave">
+        <field type="CARD16"   name="type" enum="HierarchyChangeType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </struct>
+
+    <struct name="HierarchyChange">
+        <field type="CARD16" name="type" enum="HierarchyChangeType" />
+        <field type="CARD16" name="len" />
+        <switch name="data">
+            <fieldref>type</fieldref>
+            <case name="add_master">
+                <enumref ref="HierarchyChangeType">AddMaster</enumref>
+                <field type="CARD16" name="name_len" />
+                <field type="BOOL"   name="send_core" />
+                <field type="BOOL"   name="enable" />
+                <list type="char" name="name">
+                    <fieldref>name_len</fieldref>
+                </list>
+                <pad align="4" />
+            </case>
+            <case name="remove_master">
+                <enumref ref="HierarchyChangeType">RemoveMaster</enumref>
+                <field type="DeviceId" name="deviceid" altenum="Device" />
+                <field type="CARD8"    name="return_mode" enum="ChangeMode" />
+                <pad bytes="1" />
+                <field type="DeviceId" name="return_pointer" altenum="Device" />
+                <field type="DeviceId" name="return_keyboard" altenum="Device" />
+            </case>
+            <case name="attach_slave">
+                <enumref ref="HierarchyChangeType">AttachSlave</enumref>
+                <field type="DeviceId" name="deviceid" altenum="Device" />
+                <field type="DeviceId" name="master" altenum="Device" />
+            </case>
+            <case name="detach_slave">
+                <enumref ref="HierarchyChangeType">DetachSlave</enumref>
+                <field type="DeviceId" name="deviceid" altenum="Device" />
+                <pad bytes="2" />
+            </case>
+        </switch>
+    </struct>
+
+    <request name="XIChangeHierarchy" opcode="43">
+        <field type="CARD8" name="num_changes" />
+        <pad bytes="3" />
+        <list type="HierarchyChange" name="changes">
+            <fieldref>num_changes</fieldref>
+        </list>
+    </request>
+
+    <!-- XISetClientPointer -->
+
+    <request name="XISetClientPointer" opcode="44">
+        <field type="WINDOW"   name="window" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- XIGetClientPointer -->
+
+    <request name="XIGetClientPointer" opcode="45">
+        <field type="WINDOW" name="window" />
+        <reply>
+            <pad bytes="1" />
+            <field type="BOOL"     name="set" />
+            <pad bytes="1" />
+            <field type="DeviceId" name="deviceid" altenum="Device" />
+            <pad bytes="20" />
+        </reply>
+    </request>
+
+    <!-- XISelectEvents -->
+
+    <enum name="XIEventMask">
+        <item name="DeviceChanged">    <bit>1</bit> </item>
+        <item name="KeyPress">         <bit>2</bit> </item>
+        <item name="KeyRelease">       <bit>3</bit> </item>
+        <item name="ButtonPress">      <bit>4</bit> </item>
+        <item name="ButtonRelease">    <bit>5</bit> </item>
+        <item name="Motion">           <bit>6</bit> </item>
+        <item name="Enter">            <bit>7</bit> </item>
+        <item name="Leave">            <bit>8</bit> </item>
+        <item name="FocusIn">          <bit>9</bit> </item>
+        <item name="FocusOut">         <bit>10</bit> </item>
+        <item name="Hierarchy">        <bit>11</bit> </item>
+        <item name="Property">         <bit>12</bit> </item>
+        <!-- ⋅⋅⋅ Events (v2.1) ⋅⋅⋅ -->
+        <item name="RawKeyPress">      <bit>13</bit> </item>
+        <item name="RawKeyRelease">    <bit>14</bit> </item>
+        <item name="RawButtonPress">   <bit>15</bit> </item>
+        <item name="RawButtonRelease"> <bit>16</bit> </item>
+        <item name="RawMotion">        <bit>17</bit> </item>
+        <!-- ⋅⋅⋅ Events (v2.2) ⋅⋅⋅ -->
+        <item name="TouchBegin">       <bit>18</bit> </item>
+        <item name="TouchUpdate">      <bit>19</bit> </item>
+        <item name="TouchEnd">         <bit>20</bit> </item>
+        <item name="TouchOwnership">   <bit>21</bit> </item>
+        <item name="RawTouchBegin">    <bit>22</bit> </item>
+        <item name="RawTouchUpdate">   <bit>23</bit> </item>
+        <item name="RawTouchEnd">      <bit>24</bit> </item>
+        <!-- ⋅⋅⋅ Events (v2.3) ⋅⋅⋅ -->
+        <item name="BarrierHit">       <bit>25</bit> </item>
+        <item name="BarrierLeave">     <bit>26</bit> </item>
+    </enum>
+
+    <struct name="EventMask">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="CARD16"   name="mask_len" />
+        <list type="CARD32" name="mask" mask="XIEventMask">
+            <fieldref>mask_len</fieldref>
+        </list>
+    </struct>
+
+    <request name="XISelectEvents" opcode="46">
+        <field type="WINDOW" name="window" />
+        <field type="CARD16" name="num_mask" />
+        <pad bytes="2" />
+        <list type="EventMask" name="masks">
+            <fieldref>num_mask</fieldref>
+        </list>
+    </request>
+
+    <!-- XIQueryVersion -->
+
+    <request name="XIQueryVersion" opcode="47">
+        <field type="CARD16" name="major_version" />
+        <field type="CARD16" name="minor_version" />
+
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="major_version" />
+            <field type="CARD16" name="minor_version" />
+            <pad bytes="20" />
+        </reply>
+    </request>
+
+    <!-- XIQueryDevice -->
+
+    <enum name="DeviceClassType">
+        <item name="Key">      <value>0</value> </item>
+        <item name="Button">   <value>1</value> </item>
+        <item name="Valuator"> <value>2</value> </item>
+        <item name="Scroll">   <value>3</value> </item>
+        <item name="Touch">    <value>8</value> </item>
+    </enum>
+
+    <enum name="DeviceType">
+        <item name="MasterPointer">  <value>1</value> </item>
+        <item name="MasterKeyboard"> <value>2</value> </item>
+        <item name="SlavePointer">   <value>3</value> </item>
+        <item name="SlaveKeyboard">  <value>4</value> </item>
+        <item name="FloatingSlave">  <value>5</value> </item>
+    </enum>
+
+    <enum name="ScrollFlags">
+        <item name="NoEmulation"> <bit>0</bit> </item>
+        <item name="Preferred">   <bit>1</bit> </item>
+    </enum>
+
+    <enum name="ScrollType">
+        <item name="Vertical">   <value>1</value> </item>
+        <item name="Horizontal"> <value>2</value> </item>
+    </enum>
+
+    <enum name="TouchMode">
+        <item name="Direct">    <value>1</value> </item>
+        <item name="Dependent"> <value>2</value> </item>
+    </enum>
+
+    <struct name="ButtonClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <field type="CARD16"   name="num_buttons" />
+        <list type="CARD32"    name="state">
+            <op op="/">
+                <op op="+">
+                    <fieldref>num_buttons</fieldref>
+                    <value>31</value>
+                </op>
+                <value>32</value>
+            </op>
+        </list>
+        <list type="ATOM" name="labels">
+            <fieldref>num_buttons</fieldref>
+        </list>
+    </struct>
+
+    <struct name="KeyClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <field type="CARD16"   name="num_keys" />
+        <list type="CARD32" name="keys">
+            <fieldref>num_keys</fieldref>
+        </list>
+    </struct>
+
+    <struct name="ScrollClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <field type="CARD16"   name="number" />
+        <field type="CARD16"   name="scroll_type" enum="ScrollType" />
+        <pad bytes="2" />
+        <field type="CARD32"   name="flags" mask="ScrollFlags" />
+        <field type="FP3232"   name="increment" />
+    </struct>
+
+    <struct name="TouchClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <field type="CARD8"    name="mode" enum="TouchMode" />
+        <field type="CARD8"    name="num_touches" />
+    </struct>
+
+    <struct name="ValuatorClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <field type="CARD16"   name="number" />
+        <field type="ATOM"     name="label" />
+        <field type="FP3232"   name="min" />
+        <field type="FP3232"   name="max" />
+        <field type="FP3232"   name="value" />
+        <field type="CARD32"   name="resolution" />
+        <field type="CARD8"    name="mode" enum="ValuatorMode" />
+        <pad bytes="3" />
+    </struct>
+
+    <struct name="DeviceClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+	<switch name="data">
+	    <fieldref>type</fieldref>
+	    <required_start_align align="4" offset="2" />
+	    <case name="key">
+		<enumref ref="DeviceClassType">Key</enumref>
+		<required_start_align align="4" offset="2" />
+		<field type="CARD16"   name="num_keys" />
+		<list type="CARD32" name="keys">
+		    <fieldref>num_keys</fieldref>
+		</list>
+	    </case>
+	    <case name="button">
+		<enumref ref="DeviceClassType">Button</enumref>
+		<required_start_align align="4" offset="2" />
+		<field type="CARD16"   name="num_buttons" />
+		<list type="CARD32"    name="state">
+		    <op op="/">
+		        <op op="+">
+		            <fieldref>num_buttons</fieldref>
+		            <value>31</value>
+		        </op>
+		        <value>32</value>
+		    </op>
+		</list>
+		<list type="ATOM" name="labels">
+		    <fieldref>num_buttons</fieldref>
+		</list>
+	    </case>
+	    <case name="valuator">
+		<enumref ref="DeviceClassType">Valuator</enumref>
+		<required_start_align align="4" offset="2" />
+		<field type="CARD16"   name="number" />
+		<field type="ATOM"     name="label" />
+		<field type="FP3232"   name="min" />
+		<field type="FP3232"   name="max" />
+		<field type="FP3232"   name="value" />
+		<field type="CARD32"   name="resolution" />
+		<field type="CARD8"    name="mode" enum="ValuatorMode" />
+		<pad bytes="3" />
+	    </case>
+	    <case name="scroll">
+		<enumref ref="DeviceClassType">Scroll</enumref>
+                <required_start_align align="4" offset="2" />
+		<field type="CARD16"   name="number" />
+		<field type="CARD16"   name="scroll_type" enum="ScrollType" />
+		<pad bytes="2" />
+		<field type="CARD32"   name="flags" mask="ScrollFlags" />
+		<field type="FP3232"   name="increment" />
+	    </case>
+	    <case name="touch">
+		<enumref ref="DeviceClassType">Touch</enumref>
+		<field type="CARD8"    name="mode" enum="TouchMode" />
+		<field type="CARD8"    name="num_touches" />
+	    </case>
+	</switch>
+    </struct>
+
+    <struct name="XIDeviceInfo">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="CARD16"   name="type" enum="DeviceType" />
+        <field type="DeviceId" name="attachment" altenum="Device" />
+        <field type="CARD16"   name="num_classes" />
+        <field type="CARD16"   name="name_len" />
+        <field type="BOOL"     name="enabled" />
+        <pad bytes="1" />
+        <list type="char" name="name">
+            <fieldref>name_len</fieldref>
+        </list>
+        <pad align="4" />
+        <list type="DeviceClass" name="classes">
+            <fieldref>num_classes</fieldref>
+        </list>
+    </struct>
+
+    <request name="XIQueryDevice" opcode="48">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="num_infos" />
+            <pad bytes="22" />
+            <list type="XIDeviceInfo" name="infos">
+                <fieldref>num_infos</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- XISetFocus -->
+
+    <request name="XISetFocus" opcode="49">
+        <field type="WINDOW"    name="window" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- XIGetFocus -->
+
+    <request name="XIGetFocus" opcode="50">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+        <reply>
+            <pad bytes="1" />
+            <field type="WINDOW" name="focus" />
+            <pad bytes="20" />
+        </reply>
+    </request>
+
+    <!-- XIGrabDevice -->
+
+    <enum name="GrabOwner">
+        <item name="NoOwner"> <value>0</value> </item>
+        <item name="Owner">   <value>1</value> </item>
+    </enum>
+
+    <request name="XIGrabDevice" opcode="51">
+        <field type="WINDOW"    name="window" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="CURSOR"    name="cursor" />
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="CARD8"     name="mode" enum="GrabMode" />
+        <field type="CARD8"     name="paired_device_mode" enum="GrabMode" />
+        <field type="BOOL"      name="owner_events" enum="GrabOwner" />
+        <pad bytes="1" />
+        <field type="CARD16"    name="mask_len" />
+        <list type="CARD32" name="mask">
+            <fieldref>mask_len</fieldref>
+        </list>
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD8" name="status" enum="GrabStatus" />
+            <pad bytes="23" />
+        </reply>
+    </request>
+
+    <!-- XIUngrabDevice -->
+
+    <request name="XIUngrabDevice" opcode="52">
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- XIAllowEvents -->
+
+    <enum name="EventMode">
+        <item name="AsyncDevice">       <value>0</value> </item>
+        <item name="SyncDevice">        <value>1</value> </item>
+        <item name="ReplayDevice">      <value>2</value> </item>
+        <item name="AsyncPairedDevice"> <value>3</value> </item>
+        <item name="AsyncPair">         <value>4</value> </item>
+        <item name="SyncPair">          <value>5</value> </item>
+        <item name="AcceptTouch">       <value>6</value> </item>
+        <item name="RejectTouch">       <value>7</value> </item>
+    </enum>
+
+    <request name="XIAllowEvents" opcode="53">
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="CARD8"     name="event_mode" enum="EventMode" />
+        <pad bytes="1" />
+        <field type="CARD32"    name="touchid" />
+        <field type="WINDOW"    name="grab_window" />
+    </request>
+
+    <!-- XIPassiveGrabDevice -->
+
+    <enum name="GrabMode22">
+        <item name="Sync">  <value>0</value> </item>
+        <item name="Async"> <value>1</value> </item>
+        <item name="Touch"> <value>2</value> </item>
+    </enum>
+
+    <enum name="GrabType">
+        <item name="Button">     <value>0</value> </item>
+        <item name="Keycode">    <value>1</value> </item>
+        <item name="Enter">      <value>2</value> </item>
+        <item name="FocusIn">    <value>3</value> </item>
+        <item name="TouchBegin"> <value>4</value> </item>
+    </enum>
+
+    <enum name="ModifierMask">
+        <item name="Any"> <bit>31</bit> </item>
+    </enum>
+
+    <struct name="GrabModifierInfo">
+        <field type="CARD32" name="modifiers" altenum="ModifierMask" />
+        <field type="CARD8"  name="status" enum="GrabStatus" />
+        <pad bytes="3" />
+    </struct>
+
+    <request name="XIPassiveGrabDevice" opcode="54">
+        <!-- field "time" is unused and its value is undefined -->
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="WINDOW"    name="grab_window" />
+        <field type="CURSOR"    name="cursor" />
+        <field type="CARD32"    name="detail" />
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="CARD16"    name="num_modifiers" />
+        <field type="CARD16"    name="mask_len" />
+        <field type="CARD8"     name="grab_type" enum="GrabType" />
+        <field type="CARD8"     name="grab_mode" enum="GrabMode22" />
+        <field type="CARD8"     name="paired_device_mode" enum="GrabMode" />
+        <field type="BOOL"      name="owner_events" enum="GrabOwner" />
+        <pad bytes="2" />
+        <list type="CARD32" name="mask">
+            <fieldref>mask_len</fieldref>
+        </list>
+        <list type="CARD32" name="modifiers">
+            <fieldref>num_modifiers</fieldref>
+        </list>
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="num_modifiers" />
+            <pad bytes="22" />
+            <list type="GrabModifierInfo" name="modifiers">
+                <fieldref>num_modifiers</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- XIPassiveUngrabDevice -->
+
+    <request name="XIPassiveUngrabDevice" opcode="55">
+        <field type="WINDOW"   name="grab_window" />
+        <field type="CARD32"   name="detail" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="CARD16"   name="num_modifiers" />
+        <field type="CARD8"    name="grab_type" enum="GrabType" />
+        <pad bytes="3" />
+        <list type="CARD32" name="modifiers">
+            <fieldref>num_modifiers</fieldref>
+        </list>
+    </request>
+
+    <!-- XIListProperties -->
+
+    <request name="XIListProperties" opcode="56">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="num_properties" />
+            <pad bytes="22" />
+            <list type="ATOM" name="properties">
+                <fieldref>num_properties</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- XIChangeProperty -->
+
+    <request name="XIChangeProperty" opcode="57">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="CARD8"    name="mode" enum="PropMode" />
+        <field type="CARD8"    name="format" enum="PropertyFormat" />
+        <field type="ATOM"     name="property" />
+        <field type="ATOM"     name="type" />
+        <field type="CARD32"   name="num_items" />
+        <switch name="items">
+            <fieldref>format</fieldref>
+            <case>
+                <enumref ref="PropertyFormat">8Bits</enumref>
+                <list type="CARD8" name="data8">
+                    <fieldref>num_items</fieldref>
+                </list>
+                <pad align="4" />
+            </case>
+            <case>
+                <enumref ref="PropertyFormat">16Bits</enumref>
+                <list type="CARD16" name="data16">
+                    <fieldref>num_items</fieldref>
+                </list>
+                <pad align="4" />
+            </case>
+            <case>
+                <enumref ref="PropertyFormat">32Bits</enumref>
+                <list type="CARD32" name="data32">
+                    <fieldref>num_items</fieldref>
+                </list>
+            </case>
+        </switch>
+    </request>
+
+    <!-- XIDeleteProperty -->
+
+    <request name="XIDeleteProperty" opcode="58">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="ATOM"     name="property" />
+    </request>
+
+    <!-- XIGetProperty -->
+
+    <request name="XIGetProperty" opcode="59">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="BOOL"     name="delete" />
+        <pad bytes="1" />
+        <field type="ATOM"     name="property" />
+        <field type="ATOM"     name="type" />
+        <field type="CARD32"   name="offset" />
+        <field type="CARD32"   name="len" />
+        <reply>
+            <pad bytes="1" />
+            <field type="ATOM"   name="type" />
+            <field type="CARD32" name="bytes_after" />
+            <field type="CARD32" name="num_items" />
+            <field type="CARD8"  name="format" enum="PropertyFormat" />
+            <pad bytes="11" />
+            <switch name="items">
+                <fieldref>format</fieldref>
+                <case>
+                    <enumref ref="PropertyFormat">8Bits</enumref>
+                    <list type="CARD8" name="data8">
+                        <fieldref>num_items</fieldref>
+                    </list>
+                    <pad align="4" />
+                </case>
+                <case>
+                    <enumref ref="PropertyFormat">16Bits</enumref>
+                    <list type="CARD16" name="data16">
+                        <fieldref>num_items</fieldref>
+                    </list>
+                    <pad align="4" />
+                </case>
+                <case>
+                    <enumref ref="PropertyFormat">32Bits</enumref>
+                    <list type="CARD32" name="data32">
+                        <fieldref>num_items</fieldref>
+                    </list>
+                </case>
+            </switch>
+        </reply>
+    </request>
+
+    <!-- XIGetSelectedEvents -->
+
+    <request name="XIGetSelectedEvents" opcode="60">
+        <field type="WINDOW" name="window" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="num_masks" />
+            <pad bytes="22" />
+            <list type="EventMask" name="masks">
+                <fieldref>num_masks</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- ⋅⋅⋅ Requests (v2.3) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <!-- XIBarrierReleasePointer -->
+
+    <struct name="BarrierReleasePointerInfo">
+        <field type="DeviceId" name="deviceid" />
+        <pad bytes="2" />
+        <field type="BARRIER"  name="barrier" />
+        <field type="CARD32"   name="eventid" />
+    </struct>
+
+    <request name="XIBarrierReleasePointer" opcode="61">
+        <field type="CARD32" name="num_barriers" />
+        <list type="BarrierReleasePointerInfo" name="barriers">
+            <fieldref>num_barriers</fieldref>
+        </list>
+    </request>
+
+    <!-- ⋅⋅⋅ Events (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+    <!-- Notes:
+         - A 'len' field in a v1++ structure is in bytes.
+    -->
+
+    <event name="DeviceValuator" number="0">
+        <field type="CARD8"  name="device_id" />
+        <field type="CARD16" name="device_state" />
+        <field type="CARD8"  name="num_valuators" />
+        <field type="CARD8"  name="first_valuator" />
+        <list type="INT32"   name="valuators">
+            <value>6</value>
+        </list>
+    </event>
+
+    <!-- the highest bit in a CARD8 device_id-field indicates that more
+	events will follow -->
+    <enum name="MoreEventsMask">
+	<item name="MoreEvents"> <bit>7</bit> </item> <!-- 0x80 -->
+    </enum>
+
+    <event name="DeviceKeyPress" number="1">
+        <field type="BYTE"      name="detail" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" altenum="Window" />
+        <field type="INT16"     name="root_x" />
+        <field type="INT16"     name="root_y" />
+        <field type="INT16"     name="event_x" />
+        <field type="INT16"     name="event_y" />
+        <field type="CARD16"    name="state" mask="KeyButMask" />
+        <field type="BOOL"      name="same_screen" />
+        <field type="CARD8"     name="device_id" altmask="MoreEventsMask" />
+    </event>
+
+    <eventcopy name="DeviceKeyRelease"    number="2" ref="DeviceKeyPress" />
+    <eventcopy name="DeviceButtonPress"   number="3" ref="DeviceKeyPress" />
+    <eventcopy name="DeviceButtonRelease" number="4" ref="DeviceKeyPress" />
+    <eventcopy name="DeviceMotionNotify"  number="5" ref="DeviceKeyPress" />
+
+    <event name="DeviceFocusIn" number="6">
+        <field type="BYTE"      name="detail" enum="xproto:NotifyDetail" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="WINDOW"    name="window" />
+        <field type="BYTE"      name="mode" enum="xproto:NotifyMode" />
+        <field type="CARD8"     name="device_id" />
+        <pad bytes="18" />
+    </event>
+
+    <eventcopy name="DeviceFocusOut" number="7" ref="DeviceFocusIn" />
+    <eventcopy name="ProximityIn"    number="8" ref="DeviceKeyPress" />
+    <eventcopy name="ProximityOut"   number="9" ref="DeviceKeyPress" />
+
+    <enum name="ClassesReportedMask">
+        <item name="OutOfProximity">     <bit>7</bit> </item> <!-- 0x80 -->
+            <!-- 0 = InProxmity, 1 = OutOfProximity -->
+
+        <item name="DeviceModeAbsolute"> <bit>6</bit> </item> <!-- 0x40 -->
+            <!-- 0 = Relative, 1 = Absolute -->
+
+        <item name="ReportingValuators"> <bit>2</bit> </item> <!-- 0x04 -->
+        <item name="ReportingButtons">   <bit>1</bit> </item> <!-- 0x02 -->
+        <item name="ReportingKeys">      <bit>0</bit> </item> <!-- 0x01 -->
+    </enum>
+
+    <event name="DeviceStateNotify" number="10">
+        <field type="BYTE"      name="device_id" altmask="MoreEventsMask" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="CARD8"     name="num_keys" />
+        <field type="CARD8"     name="num_buttons" />
+        <field type="CARD8"     name="num_valuators" />
+        <field type="CARD8"     name="classes_reported" mask="ClassesReportedMask" />
+        <list type="CARD8"      name="buttons">
+            <value>4</value>
+        </list>
+        <list type="CARD8" name="keys">
+            <value>4</value>
+        </list>
+        <list type="CARD32" name="valuators">
+            <value>3</value>
+        </list>
+    </event>
+
+    <event name="DeviceMappingNotify" number="11">
+        <field type="BYTE"    name="device_id" />
+        <field type="CARD8"   name="request" enum="Mapping" />
+        <field type="KeyCode" name="first_keycode" />
+        <field type="CARD8"   name="count" />
+        <pad bytes="1" />
+        <field type="TIMESTAMP" name="time" />
+        <pad bytes="20" />
+    </event>
+
+    <enum name="ChangeDevice">
+	<item name="NewPointer">  <value>0</value> </item>
+	<item name="NewKeyboard"> <value>1</value> </item>
+    </enum>
+
+    <event name="ChangeDeviceNotify" number="12">
+        <field type="BYTE"      name="device_id" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="CARD8"     name="request" enum="ChangeDevice" />
+        <pad bytes="23" />
+    </event>
+
+    <event name="DeviceKeyStateNotify" number="13">
+        <field type="BYTE" name="device_id" altmask="MoreEventsMask" />
+        <list type="CARD8" name="keys">
+            <value>28</value>
+        </list>
+    </event>
+
+    <event name="DeviceButtonStateNotify" number="14">
+        <field type="BYTE" name="device_id" altmask="MoreEventsMask" />
+        <list type="CARD8" name="buttons">
+            <value>28</value>
+        </list>
+    </event>
+
+    <!-- ⋅⋅⋅ Events (v1.4) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <enum name="DeviceChange">
+        <item name="Added">          <value>0</value> </item>
+        <item name="Removed">        <value>1</value> </item>
+        <item name="Enabled">        <value>2</value> </item>
+        <item name="Disabled">       <value>3</value> </item>
+        <item name="Unrecoverable">  <value>4</value> </item>
+        <item name="ControlChanged"> <value>5</value> </item>
+    </enum>
+
+    <event name="DevicePresenceNotify" number="15">
+        <pad bytes="1" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="BYTE"      name="devchange" enum="DeviceChange" />
+        <field type="BYTE"      name="device_id" />
+        <field type="CARD16"    name="control" />
+        <pad bytes="20" />
+    </event>
+
+    <!-- ⋅⋅⋅ Events (v1.5) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <event name="DevicePropertyNotify" number="16">
+        <field type="BYTE"      name="state" enum="Property" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="ATOM"      name="property" />
+        <pad bytes="19" />
+        <field type="CARD8"     name="device_id" />
+    </event>
+
+    <!-- ⋅⋅⋅ Events (v2.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+    <!-- Notes:
+         - A 'len' field in a v2++ structure is in 4 byte units.
+    -->
+
+    <enum name="ChangeReason">
+        <item name="SlaveSwitch">  <value>1</value> </item>
+        <item name="DeviceChange"> <value>2</value> </item>
+    </enum>
+
+    <event name="DeviceChanged" number="1" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD16"    name="num_classes" />
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <field type="CARD8"     name="reason" enum="ChangeReason" />
+        <pad bytes="11" />
+        <!-- 32 byte boundary -->
+        <list type="DeviceClass" name="classes">
+            <fieldref>num_classes</fieldref>
+        </list>
+    </event>
+
+    <enum name="KeyEventFlags">
+        <item name="KeyRepeat"> <bit>16</bit> </item>
+    </enum>
+
+    <event name="KeyPress" number="2" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" />
+        <!-- 32 byte boundary -->
+        <field type="FP1616"    name="root_x" />
+        <field type="FP1616"    name="root_y" />
+        <field type="FP1616"    name="event_x" />
+        <field type="FP1616"    name="event_y" />
+        <field type="CARD16"    name="buttons_len" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="CARD32"       name="flags" mask="KeyEventFlags" />
+        <field type="ModifierInfo" name="mods" />
+        <field type="GroupInfo"    name="group" />
+        <list type="CARD32" name="button_mask">
+            <fieldref>buttons_len</fieldref>
+        </list>
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+    </event>
+
+    <eventcopy name="KeyRelease" number="3" ref="KeyPress" />
+
+    <enum name="PointerEventFlags">
+        <item name="PointerEmulated"> <bit>16</bit> </item>
+    </enum>
+
+    <event name="ButtonPress" number="4" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" />
+        <!-- 32 byte boundary -->
+        <field type="FP1616"    name="root_x" />
+        <field type="FP1616"    name="root_y" />
+        <field type="FP1616"    name="event_x" />
+        <field type="FP1616"    name="event_y" />
+        <field type="CARD16"    name="buttons_len" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="CARD32"       name="flags" mask="PointerEventFlags" />
+        <field type="ModifierInfo" name="mods" />
+        <field type="GroupInfo"    name="group" />
+        <list type="CARD32" name="button_mask">
+            <fieldref>buttons_len</fieldref>
+        </list>
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+    </event>
+
+    <eventcopy name="ButtonRelease" number="5" ref="ButtonPress" />
+    <eventcopy name="Motion"        number="6" ref="ButtonPress" />
+
+    <enum name="NotifyMode">
+        <item name="Normal">        <value>0</value> </item>
+        <item name="Grab">          <value>1</value> </item>
+        <item name="Ungrab">        <value>2</value> </item>
+        <item name="WhileGrabbed">  <value>3</value> </item>
+        <item name="PassiveGrab">   <value>4</value> </item>
+        <item name="PassiveUngrab"> <value>5</value> </item>
+    </enum>
+
+    <enum name="NotifyDetail">
+        <item name="Ancestor">         <value>0</value> </item>
+        <item name="Virtual">          <value>1</value> </item>
+        <item name="Inferior">         <value>2</value> </item>
+        <item name="Nonlinear">        <value>3</value> </item>
+        <item name="NonlinearVirtual"> <value>4</value> </item>
+        <item name="Pointer">          <value>5</value> </item>
+        <item name="PointerRoot">      <value>6</value> </item>
+        <item name="None">             <value>7</value> </item>
+    </enum>
+
+    <event name="Enter" number="7" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <field type="CARD8"     name="mode" enum="xinput:NotifyMode" />
+        <field type="CARD8"     name="detail" enum="xinput:NotifyDetail" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" />
+        <!-- 32 byte boundary -->
+        <field type="FP1616"       name="root_x" />
+        <field type="FP1616"       name="root_y" />
+        <field type="FP1616"       name="event_x" />
+        <field type="FP1616"       name="event_y" />
+        <field type="BOOL"         name="same_screen" />
+        <field type="BOOL"         name="focus" />
+        <field type="CARD16"       name="buttons_len" />
+        <field type="ModifierInfo" name="mods" />
+        <field type="GroupInfo"    name="group" />
+        <list type="CARD32" name="buttons">
+            <fieldref>buttons_len</fieldref>
+        </list>
+    </event>
+
+    <eventcopy name="Leave"    number="8" ref="Enter" />
+    <eventcopy name="FocusIn"  number="9" ref="Enter" />
+    <eventcopy name="FocusOut" number="10" ref="Enter" />
+
+    <enum name="HierarchyMask">
+        <item name="MasterAdded">    <bit>0</bit> </item>
+        <item name="MasterRemoved">  <bit>1</bit> </item>
+        <item name="SlaveAdded">     <bit>2</bit> </item>
+        <item name="SlaveRemoved">   <bit>3</bit> </item>
+        <item name="SlaveAttached">  <bit>4</bit> </item>
+        <item name="SlaveDetached">  <bit>5</bit> </item>
+        <item name="DeviceEnabled">  <bit>6</bit> </item>
+        <item name="DeviceDisabled"> <bit>7</bit> </item>
+    </enum>
+
+    <struct name="HierarchyInfo">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="DeviceId" name="attachment" altenum="Device" />
+        <field type="CARD8"    name="type" enum="DeviceType"/>
+        <field type="BOOL"     name="enabled" />
+        <pad bytes="2" />
+        <field type="CARD32"   name="flags" mask="HierarchyMask" />
+    </struct>
+
+    <event name="Hierarchy" number="11" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="flags" mask="HierarchyMask" />
+        <field type="CARD16"    name="num_infos" />
+        <pad bytes="10" />
+        <!-- 32 byte boundary -->
+        <list type="HierarchyInfo" name="infos">
+            <fieldref>num_infos</fieldref>
+        </list>
+    </event>
+
+    <enum name="PropertyFlag">
+        <item name="Deleted">  <value>0</value> </item>
+        <item name="Created">  <value>1</value> </item>
+        <item name="Modified"> <value>2</value> </item>
+    </enum>
+
+    <event name="Property" number="12" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="ATOM"      name="property" />
+        <field type="CARD8"     name="what" enum="PropertyFlag" />
+        <pad bytes="11" />
+        <!-- 32 byte boundary -->
+    </event>
+
+    <!-- ⋅⋅⋅ Events (v2.1) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <event name="RawKeyPress" number="13" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="DeviceId"  name="sourceid" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="CARD32"    name="flags" mask="KeyEventFlags"/>
+        <pad bytes="4" />
+        <!-- 32 byte boundary -->
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+        <list type="FP3232" name="axisvalues_raw">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+    </event>
+
+    <eventcopy name="RawKeyRelease" number="14" ref="RawKeyPress" />
+
+    <event name="RawButtonPress" number="15" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="DeviceId"  name="sourceid" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="CARD32"    name="flags" mask="PointerEventFlags"/>
+        <pad bytes="4" />
+        <!-- 32 byte boundary -->
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+        <list type="FP3232" name="axisvalues_raw">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+    </event>
+
+    <eventcopy name="RawButtonRelease" number="16" ref="RawButtonPress" />
+    <eventcopy name="RawMotion"        number="17" ref="RawButtonPress" />
+
+    <!-- ⋅⋅⋅ Events (v2.2) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <enum name="TouchEventFlags">
+        <item name="TouchPendingEnd">       <bit>16</bit> </item>
+        <item name="TouchEmulatingPointer"> <bit>17</bit> </item>
+    </enum>
+
+    <event name="TouchBegin" number="18" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" />
+        <!-- 32 byte boundary -->
+        <field type="FP1616"    name="root_x" />
+        <field type="FP1616"    name="root_y" />
+        <field type="FP1616"    name="event_x" />
+        <field type="FP1616"    name="event_y" />
+        <field type="CARD16"    name="buttons_len" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="CARD32"       name="flags" mask="TouchEventFlags" />
+        <field type="ModifierInfo" name="mods" />
+        <field type="GroupInfo"    name="group" />
+        <list type="CARD32" name="button_mask">
+            <fieldref>buttons_len</fieldref>
+        </list>
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+    </event>
+
+    <eventcopy name="TouchUpdate" number="19" ref="TouchBegin" />
+    <eventcopy name="TouchEnd"    number="20" ref="TouchBegin" />
+
+    <enum name="TouchOwnershipFlags">
+        <!-- XXX: Remove this enum? Currently, no flag is defined. -->
+        <item name="None"> <value>0</value> </item>
+    </enum>
+
+    <event name="TouchOwnership" number="21" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="touchid" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" />
+        <!-- 32 byte boundary -->
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="CARD32"    name="flags" enum="TouchOwnershipFlags" />
+        <pad bytes="8" />
+    </event>
+
+    <event name="RawTouchBegin" number="22" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="DeviceId"  name="sourceid" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="CARD32"    name="flags" mask="TouchEventFlags"/>
+        <pad bytes="4" />
+        <!-- 32 byte boundary -->
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+        <list type="FP3232" name="axisvalues_raw">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+    </event>
+
+    <eventcopy name="RawTouchUpdate" number="23" ref="RawTouchBegin" />
+    <eventcopy name="RawTouchEnd"    number="24" ref="RawTouchBegin" />
+
+    <!-- ⋅⋅⋅ Events (v2.3) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <enum name="BarrierFlags">
+	<item name="PointerReleased"> <bit>0</bit> </item>
+	<item name="DeviceIsGrabbed"> <bit>1</bit> </item>
+    </enum>
+
+    <event name="BarrierHit" number="25" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="eventid" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="BARRIER"   name="barrier" />
+        <!-- 32 byte boundary -->
+        <field type="CARD32"    name="dtime" />
+        <field type="CARD32"    name="flags" mask="BarrierFlags" />
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="FP1616"    name="root_x" />
+        <field type="FP1616"    name="root_y" />
+        <field type="FP3232"    name="dx" />
+        <field type="FP3232"    name="dy" />
+    </event>
+
+    <eventcopy name="BarrierLeave" number="26" ref="BarrierHit" />
+
+    <!-- ⋅⋅⋅ Requests that depend on events ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <!-- SendExtensionEvent -->
+    <eventstruct name="EventForSend">
+        <allowed extension="Input" xge="false" opcode-min="0" opcode-max="16" />
+        <!-- We need not allow the newer events which are based on
+             the GenericEvent extension:
+             The wire-protocol-spec
+             https://cgit.freedesktop.org/xorg/lib/libXi/tree/specs/encoding.xml?idĺibXi-1.7.9#n1793
+             only allows fixed sized events, which seems
+             to rule out GenericEvent.
+
+             The xlib-implementation also assumes fixed-sized events.
+             https://cgit.freedesktop.org/xorg/lib/libXi/tree/src/XSndExEv.c?id=libXi-1.7.9#n106
+
+             The Xserver also allows only non-GE events:
+	     https:g/xorg/xserver/tree/Xi/sendexev.c?id=xorg-server-1.19.1#n144
+        -->
+    </eventstruct>
+
+    <request name="SendExtensionEvent" opcode="31">
+        <field type="WINDOW" name="destination" />
+        <field type="CARD8"  name="device_id" />
+        <field type="BOOL"   name="propagate" />
+        <field type="CARD16" name="num_classes" />
+        <field type="CARD8"  name="num_events" />
+        <pad bytes="3" />
+        <list type="EventForSend" name="events">
+            <fieldref>num_events</fieldref>
+        </list>
+        <list type="EventClass" name="classes">
+            <fieldref>num_classes</fieldref>
+        </list>
+    </request>
+
+
+    <!-- ⋅⋅⋅ Errors (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <error name="Device"     number="0" />
+    <error name="Event"      number="1" />
+    <error name="Mode"       number="2" />
+    <error name="DeviceBusy" number="3" />
+    <error name="Class"      number="4" />
+
+</xcb>
diff --git a/third_party/xcbproto/src/src/xkb.xml b/third_party/xcbproto/src/src/xkb.xml
new file mode 100644
index 000000000000..8778c073f18f
--- /dev/null
+++ b/third_party/xcbproto/src/src/xkb.xml
@@ -0,0 +1,2589 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+Copyright (C) 2009 Open Text Corporation.  All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<xcb header="xkb" extension-xname="XKEYBOARD" extension-name="xkb"
+	major-version="1" minor-version="0">
+
+	<import>xproto</import>
+
+	<!-- Common Types -->
+	<enum name="Const">
+		<item name="MaxLegalKeyCode"> <value>255</value> </item>
+		<item name="PerKeyBitArraySize">
+			<value>32</value>
+		</item>
+		<item name="KeyNameLength">
+			<value>4</value>
+		</item>
+	</enum>
+
+	<enum name="EventType">
+		<item name="NewKeyboardNotify">      <bit>0</bit> </item>
+		<item name="MapNotify">              <bit>1</bit> </item>
+		<item name="StateNotify">            <bit>2</bit> </item>
+		<item name="ControlsNotify">         <bit>3</bit> </item>
+		<item name="IndicatorStateNotify">   <bit>4</bit> </item>
+		<item name="IndicatorMapNotify">     <bit>5</bit> </item>
+		<item name="NamesNotify">            <bit>6</bit> </item>
+		<item name="CompatMapNotify">        <bit>7</bit> </item>
+		<item name="BellNotify">             <bit>8</bit> </item>
+		<item name="ActionMessage">          <bit>9</bit> </item>
+		<item name="AccessXNotify">          <bit>10</bit> </item>
+		<item name="ExtensionDeviceNotify">  <bit>11</bit> </item>
+	</enum>
+
+	<enum name="NKNDetail">
+		<item name="Keycodes"> <bit>0</bit> </item>
+		<item name="Geometry"> <bit>1</bit> </item>
+		<item name="DeviceID"> <bit>2</bit> </item>
+	</enum>
+
+	<enum name="AXNDetail">
+		<item name="SKPress">      <bit>0</bit> </item>
+		<item name="SKAccept">     <bit>1</bit> </item>
+		<item name="SKReject">     <bit>2</bit> </item>
+		<item name="SKRelease">    <bit>3</bit> </item>
+		<item name="BKAccept">     <bit>4</bit> </item>
+		<item name="BKReject">     <bit>5</bit> </item>
+		<item name="AXKWarning">   <bit>6</bit> </item>
+	</enum>
+
+	<enum name="MapPart">
+		<item name="KeyTypes">            <bit>0</bit> </item>
+		<item name="KeySyms">             <bit>1</bit> </item>
+		<item name="ModifierMap">         <bit>2</bit> </item>
+		<item name="ExplicitComponents">  <bit>3</bit> </item>
+		<item name="KeyActions">          <bit>4</bit> </item>
+		<item name="KeyBehaviors">        <bit>5</bit> </item>
+		<item name="VirtualMods">         <bit>6</bit> </item>
+		<item name="VirtualModMap">       <bit>7</bit> </item>
+	</enum>
+
+	<enum name="SetMapFlags">
+		<item name="ResizeTypes">       <bit>0</bit> </item>
+		<item name="RecomputeActions">  <bit>1</bit> </item>
+	</enum>
+
+	<enum name="StatePart">
+		<item name="ModifierState">     <bit>0</bit> </item>
+		<item name="ModifierBase">      <bit>1</bit> </item>
+		<item name="ModifierLatch">     <bit>2</bit> </item>
+		<item name="ModifierLock">      <bit>3</bit> </item>
+		<item name="GroupState">        <bit>4</bit> </item>
+		<item name="GroupBase">         <bit>5</bit> </item>
+		<item name="GroupLatch">        <bit>6</bit> </item>
+		<item name="GroupLock">         <bit>7</bit> </item>
+		<item name="CompatState">       <bit>8</bit> </item>
+		<item name="GrabMods">          <bit>9</bit> </item>
+		<item name="CompatGrabMods">    <bit>10</bit> </item>
+		<item name="LookupMods">        <bit>11</bit> </item>
+		<item name="CompatLookupMods">  <bit>12</bit> </item>
+		<item name="PointerButtons">    <bit>13</bit> </item>
+	</enum>
+
+	<enum name="BoolCtrl">
+		<item name="RepeatKeys">           <bit>0</bit> </item>
+		<item name="SlowKeys">             <bit>1</bit> </item>
+		<item name="BounceKeys">           <bit>2</bit> </item>
+		<item name="StickyKeys">           <bit>3</bit> </item>
+		<item name="MouseKeys">            <bit>4</bit> </item>
+		<item name="MouseKeysAccel">       <bit>5</bit> </item>
+		<item name="AccessXKeys">          <bit>6</bit> </item>
+		<item name="AccessXTimeoutMask">   <bit>7</bit> </item>
+		<item name="AccessXFeedbackMask">  <bit>8</bit> </item>
+		<item name="AudibleBellMask">      <bit>9</bit> </item>
+		<item name="Overlay1Mask">         <bit>10</bit> </item>
+		<item name="Overlay2Mask">         <bit>11</bit> </item>
+		<item name="IgnoreGroupLockMask">  <bit>12</bit> </item>
+	</enum>
+
+	<!-- XXX: one zero less than XKB specification says,
+	          uses the same values as libX11 -->
+	<enum name="Control" >
+		<item name="GroupsWrap">      <bit>27</bit> </item>
+		<item name="InternalMods">    <bit>28</bit> </item>
+		<item name="IgnoreLockMods">  <bit>29</bit> </item>
+		<item name="PerKeyRepeat">    <bit>30</bit> </item>
+		<item name="ControlsEnabled"> <bit>31</bit> </item>
+	</enum>
+
+	<enum name="AXOption">
+		<item name="SKPressFB">     <bit>0</bit> </item>
+		<item name="SKAcceptFB">    <bit>1</bit> </item>
+		<item name="FeatureFB">     <bit>2</bit> </item>
+		<item name="SlowWarnFB">    <bit>3</bit> </item>
+		<item name="IndicatorFB">   <bit>4</bit> </item>
+		<item name="StickyKeysFB">  <bit>5</bit> </item>
+		<item name="TwoKeys">       <bit>6</bit> </item>
+		<item name="LatchToLock">   <bit>7</bit> </item>
+		<item name="SKReleaseFB">   <bit>8</bit> </item>
+		<item name="SKRejectFB">    <bit>9</bit> </item>
+		<item name="BKRejectFB">    <bit>10</bit> </item>
+		<item name="DumbBell">      <bit>11</bit> </item>
+	</enum>
+
+	<typedef oldname="CARD16" newname="DeviceSpec" />
+
+	<enum name="LedClassResult">
+		<item name="KbdFeedbackClass"> <value>0</value> </item>
+		<item name="LedFeedbackClass"> <value>4</value> </item>
+	</enum>
+
+	<enum name="LedClass">
+		<item name="KbdFeedbackClass"> <value>0</value> </item>
+		<item name="LedFeedbackClass"> <value>4</value> </item>
+		<item name="DfltXIClass">      <value>768</value> </item>	<!--0x300-->
+		<item name="AllXIClasses">     <value>1280</value> </item>	<!--0x500-->
+	</enum>
+	<typedef oldname="CARD16" newname="LedClassSpec" />
+
+	<enum name="BellClassResult">
+		<item name="KbdFeedbackClass">  <value>0</value> </item>
+		<item name="BellFeedbackClass"> <value>5</value> </item>
+	</enum>
+
+	<enum name="BellClass">
+		<item name="KbdFeedbackClass">  <value>0</value> </item>
+		<item name="BellFeedbackClass"> <value>5</value> </item>
+		<item name="DfltXIClass">       <value>768</value> </item>	<!--0x300-->
+	</enum>
+	<typedef oldname="CARD16" newname="BellClassSpec" />
+
+	<enum name="ID">
+		<item name="UseCoreKbd">  <value>256</value> </item>    <!-- 0x100 -->
+		<item name="UseCorePtr">  <value>512</value> </item>    <!-- 0x200 -->
+		<item name="DfltXIClass"> <value>768</value> </item>    <!-- 0x300 -->
+		<item name="DfltXIId">   <value>1024</value> </item>    <!-- 0x400 -->
+		<item name="AllXIClass"> <value>1280</value> </item>    <!-- 0x500 -->
+		<item name="AllXIId">    <value>1536</value> </item>    <!-- 0x600 -->
+		<item name="XINone">     <value>65280</value> </item>	<!--0xff00-->
+	</enum>
+	<typedef oldname="CARD16" newname="IDSpec" />
+
+	<enum name="Group">
+		<item name="1"> <value>0</value> </item>
+		<item name="2"> <value>1</value> </item>
+		<item name="3"> <value>2</value> </item>
+		<item name="4"> <value>3</value> </item>
+	</enum>
+
+	<enum name="Groups">
+		<item name="Any"> <value>254</value> </item>
+		<item name="All"> <value>255</value> </item>
+	</enum>
+
+	<enum name="SetOfGroup">
+		<item name="Group1"> <bit>0</bit> </item>
+		<item name="Group2"> <bit>1</bit> </item>
+		<item name="Group3"> <bit>2</bit> </item>
+		<item name="Group4"> <bit>3</bit> </item>
+	</enum>
+
+	<enum name="SetOfGroups">
+		<item name="Any"> <bit>7</bit> </item>
+	</enum>
+
+	<enum name="GroupsWrap">
+		<item name="WrapIntoRange">     <value>0</value> </item>
+		<item name="ClampIntoRange">    <bit>6</bit> </item>
+		<item name="RedirectIntoRange"> <bit>7</bit> </item>
+	</enum>
+
+	<enum name="VModsHigh">
+		<item name="15"> <bit>7</bit> </item>
+		<item name="14"> <bit>6</bit> </item>
+		<item name="13"> <bit>5</bit> </item>
+		<item name="12"> <bit>4</bit> </item>
+		<item name="11"> <bit>3</bit> </item>
+		<item name="10"> <bit>2</bit> </item>
+		<item name="9">  <bit>1</bit> </item>
+		<item name="8">  <bit>0</bit> </item>
+	</enum>
+
+	<enum name="VModsLow">
+		<item name="7"> <bit>7</bit> </item>
+		<item name="6"> <bit>6</bit> </item>
+		<item name="5"> <bit>5</bit> </item>
+		<item name="4"> <bit>4</bit> </item>
+		<item name="3"> <bit>3</bit> </item>
+		<item name="2"> <bit>2</bit> </item>
+		<item name="1"> <bit>1</bit> </item>
+		<item name="0"> <bit>0</bit> </item>
+	</enum>
+
+	<enum name="VMod">
+		<item name="15"> <bit>15</bit> </item>
+		<item name="14"> <bit>14</bit> </item>
+		<item name="13"> <bit>13</bit> </item>
+		<item name="12"> <bit>12</bit> </item>
+		<item name="11"> <bit>11</bit> </item>
+		<item name="10"> <bit>10</bit> </item>
+		<item name="9">  <bit>9</bit> </item>
+		<item name="8">  <bit>8</bit> </item>
+		<item name="7">  <bit>7</bit> </item>
+		<item name="6">  <bit>6</bit> </item>
+		<item name="5">  <bit>5</bit> </item>
+		<item name="4">  <bit>4</bit> </item>
+		<item name="3">  <bit>3</bit> </item>
+		<item name="2">  <bit>2</bit> </item>
+		<item name="1">  <bit>1</bit> </item>
+		<item name="0">  <bit>0</bit> </item>
+	</enum>
+
+	<enum name="Explicit">
+		<item name="VModMap">     <bit>7</bit> </item>
+		<item name="Behavior">    <bit>6</bit> </item>
+		<item name="AutoRepeat">  <bit>5</bit> </item>
+		<item name="Interpret">   <bit>4</bit> </item>
+		<item name="KeyType4">    <bit>3</bit> </item>
+		<item name="KeyType3">    <bit>2</bit> </item>
+		<item name="KeyType2">    <bit>1</bit> </item>
+		<item name="KeyType1">    <bit>0</bit> </item>
+	</enum>
+
+	<enum name="SymInterpretMatch">
+		<item name="NoneOf">      <value>0</value> </item>
+		<item name="AnyOfOrNone"> <value>1</value> </item>
+		<item name="AnyOf">       <value>2</value> </item>
+		<item name="AllOf">       <value>3</value> </item>
+		<item name="Exactly">     <value>4</value> </item>
+	</enum>
+
+	<enum name="SymInterpMatch">
+		<item name="LevelOneOnly"> <bit>7</bit> </item>
+		<item name="OpMask">       <value>127</value> </item>	<!--0x7f-->
+	</enum>
+
+	<enum name="IMFlag">
+		<item name="NoExplicit">  <bit>7</bit> </item>
+		<item name="NoAutomatic"> <bit>6</bit> </item>
+		<item name="LEDDrivesKB"> <bit>5</bit> </item>
+	</enum>
+
+	<enum name="IMModsWhich">
+		<item name="UseCompat">    <bit>4</bit> </item>
+		<item name="UseEffective"> <bit>3</bit> </item>
+		<item name="UseLocked">    <bit>2</bit> </item>
+		<item name="UseLatched">   <bit>1</bit> </item>
+		<item name="UseBase">      <bit>0</bit> </item>
+	</enum>
+
+	<enum name="IMGroupsWhich">
+		<item name="UseCompat">    <bit>4</bit> </item>
+		<item name="UseEffective"> <bit>3</bit> </item>
+		<item name="UseLocked">    <bit>2</bit> </item>
+		<item name="UseLatched">   <bit>1</bit> </item>
+		<item name="UseBase">      <bit>0</bit> </item>
+	</enum>
+
+	<struct name="IndicatorMap">
+		<field name="flags" type="CARD8" enum="IMFlag" />
+		<field name="whichGroups" type="CARD8" enum="IMGroupsWhich" />
+		<field name="groups" type="CARD8" enum="SetOfGroup" />
+		<field name="whichMods" type="CARD8" enum="IMModsWhich" />
+		<field name="mods" type="CARD8" mask="ModMask" />
+		<field name="realMods" type="CARD8" mask="ModMask" />
+		<field name="vmods" type="CARD16" mask="VMod" />
+		<field name="ctrls" type="CARD32" mask="BoolCtrl" />
+	</struct>
+
+	<enum name="CMDetail">
+		<item name="SymInterp">   <bit>0</bit> </item>
+		<item name="GroupCompat"> <bit>1</bit> </item>
+	</enum>
+
+	<enum name="NameDetail">
+		<item name="Keycodes">        <bit>0</bit> </item>
+		<item name="Geometry">        <bit>1</bit> </item>
+		<item name="Symbols">         <bit>2</bit> </item>
+		<item name="PhysSymbols">     <bit>3</bit> </item>
+		<item name="Types">           <bit>4</bit> </item>
+		<item name="Compat">          <bit>5</bit> </item>
+		<item name="KeyTypeNames">    <bit>6</bit> </item>
+		<item name="KTLevelNames">    <bit>7</bit> </item>
+		<item name="IndicatorNames">  <bit>8</bit> </item>
+		<item name="KeyNames">        <bit>9</bit> </item>
+		<item name="KeyAliases">      <bit>10</bit> </item>
+		<item name="VirtualModNames"> <bit>11</bit> </item>
+		<item name="GroupNames">      <bit>12</bit> </item>
+		<item name="RGNames">         <bit>13</bit> </item>
+	</enum>
+
+	<enum name="GBNDetail">
+		<item name="Types">         <bit>0</bit> </item>
+		<item name="CompatMap">     <bit>1</bit> </item>
+		<item name="ClientSymbols"> <bit>2</bit> </item>
+		<item name="ServerSymbols"> <bit>3</bit> </item>
+		<item name="IndicatorMaps"> <bit>4</bit> </item>
+		<item name="KeyNames">      <bit>5</bit> </item>
+		<item name="Geometry">      <bit>6</bit> </item>
+		<item name="OtherNames">    <bit>7</bit> </item>
+	</enum>
+
+	<enum name="XIFeature">
+		<item name="Keyboards">      <bit>0</bit> </item>
+		<item name="ButtonActions">  <bit>1</bit> </item>
+		<item name="IndicatorNames"> <bit>2</bit> </item>
+		<item name="IndicatorMaps">  <bit>3</bit> </item>
+		<item name="IndicatorState"> <bit>4</bit> </item>
+	</enum>
+
+	<enum name="PerClientFlag">
+		<item name="DetectableAutoRepeat">   <bit>0</bit> </item>
+		<item name="GrabsUseXKBState">       <bit>1</bit> </item>
+		<item name="AutoResetControls">      <bit>2</bit> </item>
+		<item name="LookupStateWhenGrabbed"> <bit>3</bit> </item>
+		<item name="SendEventUsesXKBState">  <bit>4</bit> </item>
+	</enum>
+
+	<struct name="ModDef">
+		<field name="mask" type="CARD8" mask="ModMask" />
+		<field name="realMods" type="CARD8" mask="ModMask" />
+		<field name="vmods" type="CARD16" mask="VMod" />
+	</struct>
+
+	<struct name="KeyName">
+		<list name="name" type="char">
+			<value>4</value>
+		</list>
+	</struct>
+
+	<struct name="KeyAlias">
+		<list name="real" type="char">
+			<value>4</value>
+		</list>
+		<list name="alias" type="char">
+			<value>4</value>
+		</list>
+	</struct>
+
+	<struct name="CountedString16">
+		<field name="length" type="CARD16" />
+		<list name="string" type="char">
+			<fieldref>length</fieldref>
+		</list>
+		<list type="void" name="alignment_pad">
+			<op op="-">
+				<op op="&amp;">
+					<op op="+">
+						<fieldref>length</fieldref>
+						<value>5</value>
+					</op>
+					<unop op="~">
+						<value>3</value>
+					</unop>
+				</op>
+				<op op="+">
+					<fieldref>length</fieldref>
+					<value>2</value>
+				</op>
+			</op>
+		</list>
+	</struct>
+
+	<struct name="KTMapEntry">
+		<field name="active" type="BOOL" />
+		<field name="mods_mask" type="CARD8" mask="ModMask" />
+		<field name="level" type="CARD8" />
+		<field name="mods_mods" type="CARD8" mask="ModMask" />
+		<field name="mods_vmods" type="CARD16" mask="VMod" />
+		<pad bytes="2" />
+	</struct>
+
+	<struct name="KeyType">
+		<field name="mods_mask" type="CARD8" mask="ModMask" />
+		<field name="mods_mods" type="CARD8" mask="ModMask" />
+		<field name="mods_vmods" type="CARD16" mask="VMod" />
+		<field name="numLevels" type="CARD8" />
+		<field name="nMapEntries" type="CARD8" />
+		<field name="hasPreserve" type="BOOL" />
+		<pad bytes="1" />
+		<list name="map" type="KTMapEntry">
+			<fieldref>nMapEntries</fieldref>
+		</list>
+		<list name="preserve" type="ModDef">
+		    <op op="*">
+			<fieldref>hasPreserve</fieldref>
+			<fieldref>nMapEntries</fieldref>
+		    </op>
+		</list>
+	</struct>
+
+	<struct name="KeySymMap">
+		<list name="kt_index" type="CARD8">
+			<value>4</value>
+		</list>
+		<field name="groupInfo" type="CARD8" />
+		<field name="width" type="CARD8" />
+		<field name="nSyms" type="CARD16" />
+		<list name="syms" type="KEYSYM">
+			<fieldref>nSyms</fieldref>
+		</list>
+	</struct>
+
+	<!-- Key Behaviors -->
+
+	<struct name="CommonBehavior">
+		<field name="type" type="CARD8" />
+		<field name="data" type="CARD8" />
+	</struct>
+
+	<struct name="DefaultBehavior">
+		<field name="type" type="CARD8" />
+		<pad bytes="1" />
+	</struct>
+
+	<typedef oldname="DefaultBehavior" newname="LockBehavior" />
+
+	<struct name="RadioGroupBehavior">
+		<field name="type" type="CARD8" />
+		<field name="group" type="CARD8" />
+	</struct>
+
+	<struct name="OverlayBehavior">
+		<field name="type" type="CARD8" />
+		<field name="key" type="KEYCODE" />
+	</struct>
+
+	<typedef oldname="LockBehavior" newname="PermamentLockBehavior" />
+	<typedef oldname="RadioGroupBehavior" newname="PermamentRadioGroupBehavior" />
+	<typedef oldname="OverlayBehavior" newname="PermamentOverlayBehavior" />
+
+	<union name="Behavior">
+		<field name="common" type="CommonBehavior" />
+		<field name="default" type="DefaultBehavior" />
+		<field name="lock" type="LockBehavior" />
+		<field name="radioGroup" type="RadioGroupBehavior" />
+		<field name="overlay1" type="OverlayBehavior" />
+		<field name="overlay2" type="OverlayBehavior" />
+		<field name="permamentLock" type="PermamentLockBehavior" />
+		<field name="permamentRadioGroup" type="PermamentRadioGroupBehavior" />
+		<field name="permamentOverlay1" type="PermamentOverlayBehavior" />
+		<field name="permamentOverlay2" type="PermamentOverlayBehavior" />
+		<field name="type" type="CARD8" />
+	</union>
+
+	<enum name="BehaviorType">
+		<item name="Default">             <value>0</value> </item>	<!--0x00-->
+		<item name="Lock">                <value>1</value> </item>	<!--0x01-->
+		<item name="RadioGroup">          <value>2</value> </item>	<!--0x02-->
+		<item name="Overlay1">            <value>3</value> </item>	<!--0x03-->
+		<item name="Overlay2">            <value>4</value> </item>	<!--0x04-->
+		<item name="PermamentLock">       <value>129</value> </item>	<!--0x81-->
+		<item name="PermamentRadioGroup"> <value>130</value> </item>	<!--0x82-->
+		<item name="PermamentOverlay1">   <value>131</value> </item>	<!--0x83-->
+		<item name="PermamentOverlay2">   <value>132</value> </item>	<!--0x84-->
+	</enum>
+
+	<struct name="SetBehavior">
+		<field name="keycode" type="KEYCODE" />
+		<field name="behavior" type="Behavior" />
+		<pad bytes="1" />
+	</struct>
+
+	<struct name="SetExplicit">
+		<field name="keycode" type="KEYCODE" />
+		<field name="explicit" type="CARD8" mask="Explicit" />
+	</struct>
+
+	<struct name="KeyModMap">
+		<field name="keycode" type="KEYCODE" />
+		<field name="mods" type="CARD8" mask="ModMask" />
+	</struct>
+
+	<struct name="KeyVModMap">
+		<field name="keycode" type="KEYCODE" />
+		<pad bytes="1" />
+		<field name="vmods" type="CARD16" mask="VMod" />
+	</struct>
+
+	<struct name="KTSetMapEntry">
+		<field name="level" type="CARD8" />
+		<field name="realMods" type="CARD8" mask="ModMask" />
+		<field name="virtualMods" type="CARD16" mask="VMod" />
+	</struct>
+
+	<struct name="SetKeyType">
+		<field name="mask" type="CARD8" mask="ModMask" />
+		<field name="realMods" type="CARD8" mask="ModMask" />
+		<field name="virtualMods" type="CARD16" mask="VMod" />
+		<field name="numLevels" type="CARD8" />
+		<field name="nMapEntries" type="CARD8" />
+		<field name="preserve" type="BOOL" />
+		<pad bytes="1" />
+		<list name="entries" type="KTSetMapEntry">
+			<fieldref>nMapEntries</fieldref>
+		</list>
+		<list name="preserve_entries" type="KTSetMapEntry">
+		    <op op = "*">
+			<fieldref>preserve</fieldref>
+			<fieldref>nMapEntries</fieldref>
+		    </op>
+		</list>
+	</struct>
+
+	<typedef oldname="char" newname="STRING8" />
+
+	<!-- XXX: Property is broken
+	<struct name="Property">
+		<field name="nameLength" type="CARD16" />
+		<list name="name" type="STRING8">
+			<fieldref>nameLength</fieldref>
+		</list>
+		<field name="valueLength" type="CARD16" />
+		<list name="value" type="STRING8">
+			<fieldref>valueLength</fieldref>
+		</list>
+	</struct>
+	-->
+	<!-- XXX: This would be the correct Property structure as per spec.,
+		  but it's broken atm. too. Add it anyway here, so we don't
+		  loose that information.
+	<struct name="Property">
+		<field name="name" type="CountedString16" />
+		<field name="value" type="CountedString16" />
+	</struct>
+	-->
+
+	<struct name="Outline">
+		<field name="nPoints" type="CARD8" />
+		<field name="cornerRadius" type="CARD8" />
+		<pad bytes="2" />
+		<list name="points" type="POINT">
+			<fieldref>nPoints</fieldref>
+		</list>
+	</struct>
+
+	<struct name="Shape">
+		<field name="name" type="ATOM" />
+		<field name="nOutlines" type="CARD8" />
+		<field name="primaryNdx" type="CARD8" />
+		<field name="approxNdx" type="CARD8" />
+		<pad bytes="1" />
+		<list name="outlines" type="Outline">
+			<fieldref>nOutlines</fieldref>
+		</list>
+	</struct>
+
+	<struct name="Key">
+		<list name="name" type="STRING8">
+			<value>4</value>
+		</list>
+		<field name="gap" type="INT16" />
+		<field name="shapeNdx" type="CARD8" />
+		<field name="colorNdx" type="CARD8" />
+	</struct>
+
+	<struct name="OverlayKey">
+		<list name="over" type="STRING8">
+			<value>4</value>
+		</list>
+		<list name="under" type="STRING8">
+			<value>4</value>
+		</list>
+	</struct>
+
+	<struct name="OverlayRow">
+		<field name="rowUnder" type="CARD8" />
+		<field name="nKeys" type="CARD8" />
+		<pad bytes="2" />
+		<list name="keys" type="OverlayKey">
+			<fieldref>nKeys</fieldref>
+		</list>
+	</struct>
+
+	<struct name="Overlay">
+		<field name="name" type="ATOM" />
+		<field name="nRows" type="CARD8" />
+		<pad bytes="3" />
+		<list name="rows" type="OverlayRow">
+			<fieldref>nRows</fieldref>
+		</list>
+	</struct>
+
+	<struct name="Row">
+		<field name="top" type="INT16" />
+		<field name="left" type="INT16" />
+		<field name="nKeys" type="CARD8" />
+		<field name="vertical" type="BOOL" />
+		<pad bytes="2" />
+		<list name="keys" type="Key">
+			<fieldref>nKeys</fieldref>
+		</list>
+	</struct>
+
+	<enum name="DoodadType">
+		<item name="Outline">   <value>1</value> </item>
+		<item name="Solid">     <value>2</value> </item>
+		<item name="Text">      <value>3</value> </item>
+		<item name="Indicator"> <value>4</value> </item>
+		<item name="Logo">      <value>5</value> </item>
+	</enum>
+
+	<!-- XXX: doodads are broken
+	<struct name="CommonDoodad">
+		<field name="name" type="ATOM" />
+		<field name="type" type="CARD8" enum="DoodadType" />
+		<field name="priority" type="CARD8" />
+		<field name="top" type="INT16" />
+		<field name="left" type="INT16" />
+		<field name="angle" type="INT16" />
+		<pad bytes="8" />
+	</struct>
+
+	<struct name="ShapeDoodad">
+		<field name="name" type="ATOM" />
+		<field name="type" type="CARD8" enum="DoodadType" />
+		<field name="priority" type="CARD8" />
+		<field name="top" type="INT16" />
+		<field name="left" type="INT16" />
+		<field name="angle" type="INT16" />
+		<field name="colorNdx" type="CARD8" />
+		<field name="shapeNdx" type="CARD8" />
+		<pad bytes="6" />
+	</struct>
+
+	<struct name="TextDoodad">
+		<field name="name" type="ATOM" />
+		<field name="type" type="CARD8" enum="DoodadType" />
+		<field name="priority" type="CARD8" />
+		<field name="top" type="INT16" />
+		<field name="left" type="INT16" />
+		<field name="angle" type="INT16" />
+		<field name="width" type="CARD16" />
+		<field name="height" type="CARD16" />
+		<field name="colorNdx" type="CARD8" />
+		<pad bytes="3" />
+		<field name="text" type="CountedString16" />
+		<field name="font" type="CountedString16" />
+	</struct>
+
+	<struct name="IndicatorDoodad">
+		<field name="name" type="ATOM" />
+		<field name="type" type="CARD8" enum="DoodadType" />
+		<field name="priority" type="CARD8" />
+		<field name="top" type="INT16" />
+		<field name="left" type="INT16" />
+		<field name="angle" type="INT16" />
+		<field name="shapeNdx" type="CARD8" />
+		<field name="onColorNdx" type="CARD8" />
+		<field name="offColorNdx" type="CARD8" />
+		<pad bytes="5" />
+	</struct>
+
+	<struct name="LogoDoodad">
+		<field name="name" type="ATOM" />
+		<field name="type" type="CARD8" enum="DoodadType" />
+		<field name="priority" type="CARD8" />
+		<field name="top" type="INT16" />
+		<field name="left" type="INT16" />
+		<field name="angle" type="INT16" />
+		<field name="colorNdx" type="CARD8" />
+		<field name="shapeNdx" type="CARD8" />
+		<pad bytes="6" />
+		<field name="logoName" type="CountedString16" />
+	</struct>
+
+	<union name="Doodad">
+		<field name="common" type="CommonDoodad" />
+		<field name="shape" type="ShapeDoodad" />
+		<field name="text" type="TextDoodad" />
+		<field name="indicator" type="IndicatorDoodad" />
+		<field name="logo" type="LogoDoodad" />
+	</union>
+
+	<struct name="Section">
+		<field name="name" type="ATOM" />
+		<field name="top" type="INT16" />
+		<field name="left" type="INT16" />
+		<field name="width" type="CARD16" />
+		<field name="height" type="CARD16" />
+		<field name="angle" type="INT16" />
+		<field name="priority" type="CARD8" />
+		<field name="nRows" type="CARD8" />
+		<field name="nDoodads" type="CARD8" />
+		<field name="nOverlays" type="CARD8" />
+		<pad bytes="2" />
+		<list name="rows" type="Row">
+			<fieldref>nRows</fieldref>
+		</list>
+		<list name="doodads" type="Doodad">
+			<fieldref>nDoodads</fieldref>
+		</list>
+		<list name="overlays" type="Overlay">
+			<fieldref>nOverlays</fieldref>
+		</list>
+	</struct>
+	-->
+
+	<struct name="Listing">
+		<field name="flags" type="CARD16" />
+		<field name="length" type="CARD16" />
+		<list name="string" type="STRING8">
+			<fieldref>length</fieldref>
+		</list>
+		<pad align="2" />
+	</struct>
+
+	<struct name="DeviceLedInfo">
+		<field name="ledClass" type="LedClassSpec" enum="LedClass" />
+		<field name="ledID" type="IDSpec" altenum="ID" />
+		<field name="namesPresent" type="CARD32" />
+		<field name="mapsPresent" type="CARD32" />
+		<field name="physIndicators" type="CARD32" />
+		<field name="state" type="CARD32" />
+		<list name="names" type="ATOM">
+			<popcount>
+				<fieldref>namesPresent</fieldref>
+			</popcount>
+		</list>
+		<list name="maps" type="IndicatorMap">
+			<popcount>
+				<fieldref>mapsPresent</fieldref>
+			</popcount>
+		</list>
+	</struct>
+
+	<!-- Errors -->
+
+	<enum name="Error">
+		<item name="BadDevice"> <value>255</value> </item>	<!--0xff-->
+		<item name="BadClass">  <value>254</value> </item>	<!--0xfe-->
+		<item name="BadId">     <value>253</value> </item>	<!--0xfd-->
+	</enum>
+
+	<error name="Keyboard" number="0">
+		<field name="value" type="CARD32" />
+		<field name="minorOpcode" type="CARD16" />
+		<field name="majorOpcode" type="CARD8" />
+		<pad bytes="21" />
+	</error>
+
+	<!-- Key Actions -->
+
+	<enum name="SA">
+		<item name="ClearLocks">    <bit>0</bit> </item>
+		<item name="LatchToLock">   <bit>1</bit> </item>
+		<item name="UseModMapMods"> <bit>2</bit> </item>
+		<item name="GroupAbsolute"> <bit>2</bit> </item>
+	</enum>
+
+	<enum name="SAType">
+		<item name="NoAction">       <value>0</value> </item>
+		<item name="SetMods">        <value>1</value> </item>
+		<item name="LatchMods">      <value>2</value> </item>
+		<item name="LockMods">       <value>3</value> </item>
+		<item name="SetGroup">       <value>4</value> </item>
+		<item name="LatchGroup">     <value>5</value> </item>
+		<item name="LockGroup">      <value>6</value> </item>
+		<item name="MovePtr">        <value>7</value> </item>
+		<item name="PtrBtn">         <value>8</value> </item>
+		<item name="LockPtrBtn">     <value>9</value> </item>
+		<item name="SetPtrDflt">     <value>10</value> </item>
+		<item name="ISOLock">        <value>11</value> </item>
+		<item name="Terminate">      <value>12</value> </item>
+		<item name="SwitchScreen">   <value>13</value> </item>
+		<item name="SetControls">    <value>14</value> </item>
+		<item name="LockControls">   <value>15</value> </item>
+		<item name="ActionMessage">  <value>16</value> </item>
+		<item name="RedirectKey">    <value>17</value> </item>
+		<item name="DeviceBtn">      <value>18</value> </item>
+		<item name="LockDeviceBtn">  <value>19</value> </item>
+		<item name="DeviceValuator"> <value>20</value> </item>
+	</enum>
+
+	<struct name="SANoAction">
+		<field name="type" type="CARD8" enum="SAType" />
+		<pad bytes="7" />
+	</struct>
+
+	<struct name="SASetMods">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" mask="SA" />
+		<field name="mask" type="CARD8" mask="ModMask" />
+		<field name="realMods" type="CARD8" mask="ModMask" />
+		<field name="vmodsHigh" type="CARD8" mask="VModsHigh" />
+		<field name="vmodsLow" type="CARD8" mask="VModsLow" />
+		<pad bytes="2" />
+	</struct>
+
+	<typedef oldname="SASetMods" newname="SALatchMods" />
+
+	<typedef oldname="SASetMods" newname="SALockMods" />
+
+	<struct name="SASetGroup">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" mask="SA" />
+		<field name="group" type="INT8" />
+		<pad bytes="5" />
+	</struct>
+
+	<typedef oldname="SASetGroup" newname="SALatchGroup" />
+
+	<typedef oldname="SASetGroup" newname="SALockGroup" />
+
+	<enum name="SAMovePtrFlag">
+		<item name="NoAcceleration"> <bit>0</bit> </item>
+		<item name="MoveAbsoluteX">  <bit>1</bit> </item>
+		<item name="MoveAbsoluteY">  <bit>2</bit> </item>
+	</enum>
+
+	<struct name="SAMovePtr">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" mask="SAMovePtrFlag" />
+		<field name="xHigh" type="INT8" />
+		<field name="xLow" type="CARD8" />
+		<field name="yHigh" type="INT8" />
+		<field name="yLow" type="CARD8" />
+		<pad bytes="2" />
+	</struct>
+
+	<struct name="SAPtrBtn">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" />
+		<field name="count" type="CARD8" />
+		<field name="button" type="CARD8" />
+		<pad bytes="4" />
+	</struct>
+
+	<struct name="SALockPtrBtn">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" />
+		<pad bytes="1" />
+		<field name="button" type="CARD8" />
+		<pad bytes="4" />
+	</struct>
+
+	<enum name="SASetPtrDfltFlag">
+		<!-- The spec says 0x02 but Xlib uses 0x04. -->
+		<item name="DfltBtnAbsolute">  <bit>2</bit> </item>
+		<item name="AffectDfltButton"> <bit>0</bit> </item>
+	</enum>
+
+	<struct name="SASetPtrDflt">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" mask="SASetPtrDfltFlag" />
+		<field name="affect" type="CARD8" mask="SASetPtrDfltFlag" />
+		<field name="value" type="INT8" />
+		<pad bytes="4" />
+	</struct>
+
+	<enum name="SAIsoLockFlag">
+		<item name="NoLock">         <bit>0</bit> </item>
+		<item name="NoUnlock">       <bit>1</bit> </item>
+		<item name="UseModMapMods">  <bit>2</bit> </item>
+		<item name="GroupAbsolute">  <bit>2</bit> </item>
+		<item name="ISODfltIsGroup"> <bit>3</bit> </item>
+	</enum>
+
+	<enum name="SAIsoLockNoAffect">
+		<item name="Ctrls"> <bit>3</bit> </item>
+		<item name="Ptr">   <bit>4</bit> </item>
+		<item name="Group"> <bit>5</bit> </item>
+		<item name="Mods">  <bit>6</bit> </item>
+	</enum>
+
+	<struct name="SAIsoLock">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" mask="SAIsoLockFlag" />
+		<field name="mask" type="CARD8" mask="ModMask" />
+		<field name="realMods" type="CARD8" mask="ModMask" />
+		<field name="group" type="INT8" />
+		<field name="affect" type="CARD8" mask="SAIsoLockNoAffect" />
+		<field name="vmodsHigh" type="CARD8" mask="VModsHigh" />
+		<field name="vmodsLow" type="CARD8" mask="VModsLow" />
+	</struct>
+
+	<struct name="SATerminate">
+		<field name="type" type="CARD8" enum="SAType" />
+		<pad bytes="7" />
+	</struct>
+
+	<enum name="SwitchScreenFlag">
+		<item name="Application"> <bit>0</bit> </item>
+		<item name="Absolute" >   <bit>2</bit> </item>
+	</enum>
+
+	<struct name="SASwitchScreen">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" />
+		<field name="newScreen" type="INT8" />
+		<pad bytes="5" />
+	</struct>
+
+	<enum name="BoolCtrlsHigh">
+		<item name="AccessXFeedback"> <bit>0</bit> </item>
+		<item name="AudibleBell">     <bit>1</bit> </item>
+		<item name="Overlay1">        <bit>2</bit> </item>
+		<item name="Overlay2">        <bit>3</bit> </item>
+		<item name="IgnoreGroupLock"> <bit>4</bit> </item>
+	</enum>
+
+	<enum name="BoolCtrlsLow">
+		<item name="RepeatKeys">     <bit>0</bit> </item>
+		<item name="SlowKeys">       <bit>1</bit> </item>
+		<item name="BounceKeys">     <bit>2</bit> </item>
+		<item name="StickyKeys">     <bit>3</bit> </item>
+		<item name="MouseKeys">      <bit>4</bit> </item>
+		<item name="MouseKeysAccel"> <bit>5</bit> </item>
+		<item name="AccessXKeys">    <bit>6</bit> </item>
+		<item name="AccessXTimeout"> <bit>7</bit> </item>
+	</enum>
+
+	<struct name="SASetControls">
+		<field name="type" type="CARD8" enum="SAType" />
+		<pad bytes="3" />
+		<field name="boolCtrlsHigh" type="CARD8" mask="BoolCtrlsHigh" />
+		<field name="boolCtrlsLow"  type="CARD8" mask="BoolCtrlsLow" />
+		<pad bytes="2" />
+	</struct>
+
+	<typedef oldname="SASetControls" newname="SALockControls" />
+
+	<enum name="ActionMessageFlag">
+		<item name="OnPress">     <bit>0</bit> </item>
+		<item name="OnRelease">   <bit>1</bit> </item>
+		<item name="GenKeyEvent"> <bit>2</bit> </item>
+	</enum>
+
+	<struct name="SAActionMessage">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" mask="ActionMessageFlag" />
+		<list name="message" type="CARD8">
+			<value>6</value>
+		</list>
+	</struct>
+
+	<struct name="SARedirectKey">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="newkey" type="KEYCODE" />
+		<field name="mask" type="CARD8" mask="ModMask" />
+		<field name="realModifiers" type="CARD8" mask="ModMask" />
+		<field name="vmodsMaskHigh" type="CARD8" mask="VModsHigh"/>
+		<field name="vmodsMaskLow" type="CARD8" mask="VModsLow"/>
+		<field name="vmodsHigh" type="CARD8" mask="VModsHigh"/>
+		<field name="vmodsLow" type="CARD8" mask="VModsLow"/>
+	</struct>
+
+	<struct name="SADeviceBtn">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" />
+		<field name="count" type="CARD8" />
+		<field name="button" type="CARD8" />
+		<field name="device" type="CARD8" />
+		<pad bytes="3" />
+	</struct>
+
+	<enum name="LockDeviceFlags">
+		<item name="NoLock">   <bit>0</bit> </item>
+		<item name="NoUnlock"> <bit>1</bit> </item>
+	</enum>
+
+	<struct name="SALockDeviceBtn">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="flags" type="CARD8" mask="LockDeviceFlags" />
+		<pad bytes="1" />
+		<field name="button" type="CARD8" />
+		<field name="device" type="CARD8" />
+		<pad bytes="3" />
+	</struct>
+
+	<enum name="SAValWhat">
+		<item name="IgnoreVal">      <value>0</value> </item>
+		<item name="SetValMin">      <value>1</value> </item>
+		<item name="SetValCenter">   <value>2</value> </item>
+		<item name="SetValMax">      <value>3</value> </item>
+		<item name="SetValRelative"> <value>4</value> </item>
+		<item name="SetValAbsolute"> <value>5</value> </item>
+	</enum>
+
+	<struct name="SADeviceValuator">
+		<field name="type" type="CARD8" enum="SAType" />
+		<field name="device" type="CARD8" />
+		<field name="val1what" type="CARD8" enum="SAValWhat" />
+		<field name="val1index" type="CARD8" />
+		<field name="val1value" type="CARD8" />
+		<field name="val2what" type="CARD8" enum="SAValWhat" />
+		<field name="val2index" type="CARD8" />
+		<field name="val2value" type="CARD8" />
+	</struct>
+
+	<struct name="SIAction">
+		<field name="type" type="CARD8" enum="SAType" />
+		<list name="data" type="CARD8">
+			<value>7</value>
+		</list>
+	</struct>
+
+	<struct name="SymInterpret">
+		<field name="sym" type="KEYSYM" />
+		<field name="mods" type="CARD8" mask="ModMask" />
+		<!-- "match" may also have XkbSI_LevelOneOnly (0x80) or'd into it -->
+		<field name="match" type="CARD8" altenum="SymInterpretMatch" />
+		<field name="virtualMod" type="CARD8" mask="VModsLow" />
+		<field name="flags" type="CARD8" />
+		<field name="action" type="SIAction" />
+	</struct>
+
+	<union name="Action">
+		<field name="noaction" type="SANoAction" />
+		<field name="setmods" type="SASetMods" />
+		<field name="latchmods" type="SALatchMods" />
+		<field name="lockmods" type="SALockMods" />
+		<field name="setgroup" type="SASetGroup" />
+		<field name="latchgroup" type="SALatchGroup" />
+		<field name="lockgroup" type="SALockGroup" />
+		<field name="moveptr" type="SAMovePtr" />
+		<field name="ptrbtn" type="SAPtrBtn" />
+		<field name="lockptrbtn" type="SALockPtrBtn" />
+		<field name="setptrdflt" type="SASetPtrDflt" />
+		<field name="isolock" type="SAIsoLock" />
+		<field name="terminate" type="SATerminate" />
+		<field name="switchscreen" type="SASwitchScreen" />
+		<field name="setcontrols" type="SASetControls" />
+		<field name="lockcontrols" type="SALockControls" />
+		<field name="message" type="SAActionMessage" />
+		<field name="redirect" type="SARedirectKey" />
+		<field name="devbtn" type="SADeviceBtn" />
+		<field name="lockdevbtn" type="SALockDeviceBtn" />
+		<field name="devval" type="SADeviceValuator" />
+		<field name="type" type="CARD8" enum="SAType" />
+	</union>
+
+	<!-- Requests -->
+
+	<request name="UseExtension" opcode="0">
+		<field name="wantedMajor" type="CARD16" />
+		<field name="wantedMinor" type="CARD16" />
+		<reply>
+			<field name="supported" type="BOOL" />
+			<field name="serverMajor" type="CARD16" />
+			<field name="serverMinor" type="CARD16" />
+			<pad bytes="20" />
+		</reply>
+	</request>
+
+	<request name="SelectEvents" opcode="1">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="affectWhich" type="CARD16" mask="EventType" />
+		<field name="clear" type="CARD16" mask="EventType" />
+		<field name="selectAll" type="CARD16" mask="EventType" />
+		<field name="affectMap" type="CARD16" mask="MapPart" />
+		<field name="map" type="CARD16" mask="MapPart" />
+		<switch name="details">
+			<op op="&amp;">
+				<fieldref>affectWhich</fieldref>
+				<op op="&amp;">
+					<unop op="~"><fieldref>clear</fieldref></unop>
+					<unop op="~"><fieldref>selectAll</fieldref></unop>
+				</op>
+			</op>
+			<bitcase>
+				<enumref ref="EventType">NewKeyboardNotify</enumref>
+				<field name="affectNewKeyboard" type="CARD16" mask="NKNDetail" />
+				<field name="newKeyboardDetails" type="CARD16" mask="NKNDetail" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="EventType">StateNotify</enumref>
+				<field name="affectState" type="CARD16" mask="StatePart" />
+				<field name="stateDetails" type="CARD16" mask="StatePart" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="EventType">ControlsNotify</enumref>
+				<field name="affectCtrls" type="CARD32" mask="Control" />
+				<field name="ctrlDetails" type="CARD32" mask="Control" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="EventType">IndicatorStateNotify</enumref>
+				<field name="affectIndicatorState" type="CARD32" />
+				<field name="indicatorStateDetails" type="CARD32" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="EventType">IndicatorMapNotify</enumref>
+				<field name="affectIndicatorMap" type="CARD32" />
+				<field name="indicatorMapDetails" type="CARD32" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="EventType">NamesNotify</enumref>
+				<field name="affectNames" type="CARD16" mask="NameDetail" />
+				<field name="namesDetails" type="CARD16" mask="NameDetail" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="EventType">CompatMapNotify</enumref>
+				<field name="affectCompat" type="CARD8" mask="CMDetail" />
+				<field name="compatDetails" type="CARD8" mask="CMDetail" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="EventType">BellNotify</enumref>
+				<field name="affectBell" type="CARD8" />
+				<field name="bellDetails" type="CARD8" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="EventType">ActionMessage</enumref>
+				<field name="affectMsgDetails" type="CARD8" />
+				<field name="msgDetails" type="CARD8" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="EventType">AccessXNotify</enumref>
+				<field name="affectAccessX" type="CARD16" mask="AXNDetail" />
+				<field name="accessXDetails" type="CARD16" mask="AXNDetail" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="EventType">ExtensionDeviceNotify</enumref>
+				<field name="affectExtDev" type="CARD16" mask="XIFeature" />
+				<field name="extdevDetails" type="CARD16" mask="XIFeature" />
+			</bitcase>
+		</switch>
+	</request>
+
+	<request name="Bell" opcode="3">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="bellClass" type="BellClassSpec" />
+		<field name="bellID" type="IDSpec" />
+		<field name="percent" type="INT8" />
+		<field name="forceSound" type="BOOL" />
+		<field name="eventOnly" type="BOOL" />
+		<pad bytes="1" />
+		<field name="pitch" type="INT16" />
+		<field name="duration" type="INT16" />
+		<pad bytes="2" />
+		<field name="name" type="ATOM" />
+		<field name="window" type="WINDOW" />
+	</request>
+
+	<request name="GetState" opcode="4">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<pad bytes="2" />
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="mods" type="CARD8" mask="ModMask" />
+			<field name="baseMods" type="CARD8" mask="ModMask" />
+			<field name="latchedMods" type="CARD8" mask="ModMask" />
+			<field name="lockedMods" type="CARD8" mask="ModMask" />
+			<field name="group" type="CARD8" enum="Group" />
+			<field name="lockedGroup" type="CARD8" enum="Group" />
+			<field name="baseGroup" type="INT16" />
+			<field name="latchedGroup" type="INT16" />
+			<field name="compatState" type="CARD8" mask="ModMask" />
+			<field name="grabMods" type="CARD8" mask="ModMask" />
+			<field name="compatGrabMods" type="CARD8" mask="ModMask" />
+                        <field name="lookupMods" type="CARD8" mask="ModMask" />
+			<field name="compatLookupMods" type="CARD8" mask="ModMask" />
+			<pad bytes="1" />
+			<field name="ptrBtnState" type="CARD16" mask="KeyButMask" />
+			<pad bytes="6" />
+		</reply>
+	</request>
+
+	<request name="LatchLockState" opcode="5">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="affectModLocks" type="CARD8" mask="ModMask" />
+		<field name="modLocks" type="CARD8" mask="ModMask" />
+		<field name="lockGroup" type="BOOL" />
+		<field name="groupLock" type="CARD8" enum="Group" />
+		<field name="affectModLatches" type="CARD8" mask="ModMask" />
+		<pad bytes="1" /> <!-- This pad is a workaround to prevent an API break,
+		                       which the following field (correct fix) would cause.
+		<field name="modLatches" type="CARD8" mask="ModMask" />
+		-->
+		<pad bytes="1" />
+		<field name="latchGroup" type="BOOL" />
+		<field name="groupLatch" type="CARD16" />
+	</request>
+
+	<request name="GetControls" opcode="6">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<pad bytes="2" />
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="mouseKeysDfltBtn" type="CARD8" />
+			<field name="numGroups" type="CARD8" />
+			<field name="groupsWrap" type="CARD8" />
+			<field name="internalModsMask" type="CARD8" mask="ModMask" />
+			<field name="ignoreLockModsMask" type="CARD8" mask="ModMask" />
+			<field name="internalModsRealMods" type="CARD8" mask="ModMask" />
+			<field name="ignoreLockModsRealMods" type="CARD8" mask="ModMask" />
+			<pad bytes="1" />
+			<field name="internalModsVmods" type="CARD16" mask="VMod" />
+			<field name="ignoreLockModsVmods" type="CARD16" mask="VMod" />
+			<field name="repeatDelay" type="CARD16" />
+			<field name="repeatInterval" type="CARD16" />
+			<field name="slowKeysDelay" type="CARD16" />
+			<field name="debounceDelay" type="CARD16" />
+			<field name="mouseKeysDelay" type="CARD16" />
+			<field name="mouseKeysInterval" type="CARD16" />
+			<field name="mouseKeysTimeToMax" type="CARD16" />
+			<field name="mouseKeysMaxSpeed" type="CARD16" />
+			<field name="mouseKeysCurve" type="INT16" />
+			<field name="accessXOption" type="CARD16" mask="AXOption" />
+			<field name="accessXTimeout" type="CARD16" />
+			<field name="accessXTimeoutOptionsMask" type="CARD16" mask="AXOption" />
+			<field name="accessXTimeoutOptionsValues" type="CARD16" mask="AXOption" />
+			<pad bytes="2" />
+			<field name="accessXTimeoutMask" type="CARD32" mask="BoolCtrl" />
+			<field name="accessXTimeoutValues" type="CARD32" mask="BoolCtrl" />
+			<field name="enabledControls" type="CARD32" mask="BoolCtrl" />
+			<list name="perKeyRepeat" type="CARD8">
+				<value>32</value>
+			</list>
+		</reply>
+	</request>
+
+	<request name="SetControls" opcode="7">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="affectInternalRealMods" type="CARD8" mask="ModMask" />
+		<field name="internalRealMods" type="CARD8" mask="ModMask" />
+		<field name="affectIgnoreLockRealMods" type="CARD8" mask="ModMask" />
+		<field name="ignoreLockRealMods" type="CARD8" mask="ModMask" />
+		<field name="affectInternalVirtualMods" type="CARD16" mask="VMod" />
+		<field name="internalVirtualMods" type="CARD16" mask="VMod" />
+		<field name="affectIgnoreLockVirtualMods" type="CARD16" mask="VMod" />
+		<field name="ignoreLockVirtualMods" type="CARD16" mask="VMod" />
+		<field name="mouseKeysDfltBtn" type="CARD8" />
+		<field name="groupsWrap" type="CARD8" />
+		<field name="accessXOptions" type="CARD16" mask="AXOption" />
+		<pad bytes="2" />
+		<field name="affectEnabledControls" type="CARD32" mask="BoolCtrl" />
+		<field name="enabledControls" type="CARD32" mask="BoolCtrl" />
+		<field name="changeControls" type="CARD32" mask="Control" />
+		<field name="repeatDelay" type="CARD16" />
+		<field name="repeatInterval" type="CARD16" />
+		<field name="slowKeysDelay" type="CARD16" />
+		<field name="debounceDelay" type="CARD16" />
+		<field name="mouseKeysDelay" type="CARD16" />
+		<field name="mouseKeysInterval" type="CARD16" />
+		<field name="mouseKeysTimeToMax" type="CARD16" />
+		<field name="mouseKeysMaxSpeed" type="CARD16" />
+		<field name="mouseKeysCurve" type="INT16" />
+		<field name="accessXTimeout" type="CARD16" />
+		<field name="accessXTimeoutMask" type="CARD32" mask="BoolCtrl" />
+		<field name="accessXTimeoutValues" type="CARD32" mask="BoolCtrl" />
+		<field name="accessXTimeoutOptionsMask" type="CARD16" mask="AXOption" />
+		<field name="accessXTimeoutOptionsValues" type="CARD16" mask="AXOption" />
+		<list name="perKeyRepeat" type="CARD8">
+			<value>32</value>
+		</list>
+	</request>
+
+	<request name="GetMap" opcode="8">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="full" type="CARD16" mask="MapPart" />
+		<field name="partial" type="CARD16" mask="MapPart" />
+		<field name="firstType" type="CARD8" />
+		<field name="nTypes" type="CARD8" />
+		<field name="firstKeySym" type="KEYCODE" />
+		<field name="nKeySyms" type="CARD8" />
+		<field name="firstKeyAction" type="KEYCODE" />
+		<field name="nKeyActions" type="CARD8" />
+		<field name="firstKeyBehavior" type="KEYCODE" />
+		<field name="nKeyBehaviors" type="CARD8" />
+		<field name="virtualMods" type="CARD16" mask="VMod" />
+		<field name="firstKeyExplicit" type="KEYCODE" />
+		<field name="nKeyExplicit" type="CARD8" />
+		<field name="firstModMapKey" type="KEYCODE" />
+		<field name="nModMapKeys" type="CARD8" />
+		<field name="firstVModMapKey" type="KEYCODE" />
+		<field name="nVModMapKeys" type="CARD8" />
+		<pad bytes="2" />
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<pad bytes="2" />
+			<field name="minKeyCode" type="KEYCODE" />
+			<field name="maxKeyCode" type="KEYCODE" />
+			<field name="present" type="CARD16" mask="MapPart" />
+			<field name="firstType" type="CARD8" />
+			<field name="nTypes" type="CARD8" />
+			<field name="totalTypes" type="CARD8" />
+			<field name="firstKeySym" type="KEYCODE" />
+			<field name="totalSyms" type="CARD16" />
+			<field name="nKeySyms" type="CARD8" />
+			<field name="firstKeyAction" type="KEYCODE" />
+			<field name="totalActions" type="CARD16" />
+			<field name="nKeyActions" type="CARD8" />
+			<field name="firstKeyBehavior" type="KEYCODE" />
+			<field name="nKeyBehaviors" type="CARD8" />
+			<field name="totalKeyBehaviors" type="CARD8" />
+			<field name="firstKeyExplicit" type="KEYCODE" />
+			<field name="nKeyExplicit" type="CARD8" />
+			<field name="totalKeyExplicit" type="CARD8" />
+			<field name="firstModMapKey" type="KEYCODE" />
+			<field name="nModMapKeys" type="CARD8" />
+			<field name="totalModMapKeys" type="CARD8" />
+			<field name="firstVModMapKey" type="KEYCODE" />
+			<field name="nVModMapKeys" type="CARD8" />
+			<field name="totalVModMapKeys" type="CARD8" />
+			<pad bytes="1" />
+			<field name="virtualMods" type="CARD16" mask="VMod" />
+			<switch name="map">
+				<fieldref>present</fieldref>
+				<bitcase>
+					<enumref ref="MapPart">KeyTypes</enumref>
+					<list name="types_rtrn" type="KeyType">
+						<fieldref>nTypes</fieldref>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="MapPart">KeySyms</enumref>
+					<list name="syms_rtrn" type="KeySymMap">
+						<fieldref>nKeySyms</fieldref>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="MapPart">KeyActions</enumref>
+					<list name="acts_rtrn_count" type="CARD8">
+						<fieldref>nKeyActions</fieldref>
+					</list>
+                                        <pad align="4" serialize="true"/>
+					<list name="acts_rtrn_acts" type="Action">
+						<fieldref>totalActions</fieldref>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="MapPart">KeyBehaviors</enumref>
+					<list name="behaviors_rtrn" type="SetBehavior">
+						<fieldref>totalKeyBehaviors</fieldref>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="MapPart">VirtualMods</enumref>
+					<list name="vmods_rtrn" type="CARD8" mask="ModMask">
+						<popcount><fieldref>virtualMods</fieldref></popcount>
+					</list>
+                                        <pad align="4" serialize="true" />
+				</bitcase>
+				<bitcase>
+					<enumref ref="MapPart">ExplicitComponents</enumref>
+					<list name="explicit_rtrn" type="SetExplicit">
+						<fieldref>totalKeyExplicit</fieldref>
+					</list>
+                                        <pad align="4" serialize="true" />
+				</bitcase>
+				<bitcase>
+					<enumref ref="MapPart">ModifierMap</enumref>
+					<list name="modmap_rtrn" type="KeyModMap">
+						<fieldref>totalModMapKeys</fieldref>
+					</list>
+                                        <pad align="4" serialize="true" />
+				</bitcase>
+				<bitcase>
+					<enumref ref="MapPart">VirtualModMap</enumref>
+					<list name="vmodmap_rtrn" type="KeyVModMap">
+						<fieldref>totalVModMapKeys</fieldref>
+					</list>
+				</bitcase>
+			</switch>
+		</reply>
+	</request>
+
+	<request name="SetMap" opcode="9">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="present" type="CARD16" mask="MapPart" />
+		<field name="flags" type="CARD16" mask="SetMapFlags" />
+		<field name="minKeyCode" type="KEYCODE" />
+		<field name="maxKeyCode" type="KEYCODE" />
+		<field name="firstType" type="CARD8" />
+		<field name="nTypes" type="CARD8" />
+		<field name="firstKeySym" type="KEYCODE" />
+		<field name="nKeySyms" type="CARD8" />
+		<field name="totalSyms" type="CARD16" />
+		<field name="firstKeyAction" type="KEYCODE" />
+		<field name="nKeyActions" type="CARD8" />
+		<field name="totalActions" type="CARD16" />
+		<field name="firstKeyBehavior" type="KEYCODE" />
+		<field name="nKeyBehaviors" type="CARD8" />
+		<field name="totalKeyBehaviors" type="CARD8" />
+		<field name="firstKeyExplicit" type="KEYCODE" />
+		<field name="nKeyExplicit" type="CARD8" />
+		<field name="totalKeyExplicit" type="CARD8" />
+		<field name="firstModMapKey" type="KEYCODE" />
+		<field name="nModMapKeys" type="CARD8" />
+		<field name="totalModMapKeys" type="CARD8" />
+		<field name="firstVModMapKey" type="KEYCODE" />
+		<field name="nVModMapKeys" type="CARD8" />
+		<field name="totalVModMapKeys" type="CARD8" />
+		<field name="virtualMods" type="CARD16" mask="VMod" />
+		<switch name="values">
+			<fieldref>present</fieldref>
+			<bitcase>
+				<enumref ref="MapPart">KeyTypes</enumref>
+				<list name="types" type="SetKeyType">
+					<fieldref>nTypes</fieldref>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="MapPart">KeySyms</enumref>
+				<list name="syms" type="KeySymMap">
+					<fieldref>nKeySyms</fieldref>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="MapPart">KeyActions</enumref>
+				<list name="actionsCount" type="CARD8">
+					<fieldref>nKeyActions</fieldref>
+				</list>
+				<pad align="4" />
+				<list name="actions" type="Action">
+					<fieldref>totalActions</fieldref>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="MapPart">KeyBehaviors</enumref>
+				<list name="behaviors" type="SetBehavior">
+					<fieldref>totalKeyBehaviors</fieldref>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="MapPart">VirtualMods</enumref>
+				<list name="vmods" type="CARD8">
+					<popcount><fieldref>virtualMods</fieldref></popcount>
+				</list>
+				<pad align="4" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="MapPart">ExplicitComponents</enumref>
+				<list name="explicit" type="SetExplicit">
+					<fieldref>totalKeyExplicit</fieldref>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="MapPart">ModifierMap</enumref>
+				<list name="modmap" type="KeyModMap">
+					<fieldref>totalModMapKeys</fieldref>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="MapPart">VirtualModMap</enumref>
+				<list name="vmodmap" type="KeyVModMap">
+					<fieldref>totalVModMapKeys</fieldref>
+				</list>
+			</bitcase>
+		</switch>
+	</request>
+
+	<request name="GetCompatMap" opcode="10">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="groups" type="CARD8" mask="SetOfGroup" />
+		<field name="getAllSI" type="BOOL" />
+		<field name="firstSI" type="CARD16" />
+		<field name="nSI" type="CARD16" />
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="groupsRtrn" type="CARD8" mask="SetOfGroup" />
+			<pad bytes="1" />
+			<field name="firstSIRtrn" type="CARD16" />
+			<field name="nSIRtrn" type="CARD16" />
+			<field name="nTotalSI" type="CARD16" />
+			<pad bytes="16" />
+			<list name="si_rtrn" type="SymInterpret">
+				<fieldref>nSIRtrn</fieldref>
+			</list>
+			<list name="group_rtrn" type="ModDef">
+				<popcount>
+					<fieldref>groupsRtrn</fieldref>
+				</popcount>
+			</list>
+		</reply>
+	</request>
+
+	<request name="SetCompatMap" opcode="11">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<pad bytes="1" />
+		<field name="recomputeActions" type="BOOL" />
+		<field name="truncateSI" type="BOOL" />
+		<field name="groups" type="CARD8" mask="SetOfGroup" />
+		<field name="firstSI" type="CARD16" />
+		<field name="nSI" type="CARD16" />
+		<pad bytes="2"/>
+		<list name="si" type="SymInterpret">
+			<fieldref>nSI</fieldref>
+		</list>
+		<list name="groupMaps" type="ModDef">
+			<popcount>
+				<fieldref>groups</fieldref>
+			</popcount>
+		</list>
+	</request>
+
+	<request name="GetIndicatorState" opcode="12">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<pad bytes="2" />
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="state" type="CARD32" />
+			<pad bytes="20" />
+		</reply>
+	</request>
+
+	<request name="GetIndicatorMap" opcode="13">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<pad bytes="2" />
+		<field name="which" type="CARD32" />
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="which" type="CARD32" />
+			<field name="realIndicators" type="CARD32" />
+			<field name="nIndicators" type="CARD8" />
+			<pad bytes="15" />
+			<list name="maps" type="IndicatorMap">
+				<popcount><fieldref>which</fieldref></popcount>
+			</list>
+		</reply>
+	</request>
+
+	<request name="SetIndicatorMap" opcode="14">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<pad bytes="2" />
+		<field name="which" type="CARD32" />
+		<list name="maps" type="IndicatorMap">
+			<popcount>
+				<fieldref>which</fieldref>
+			</popcount>
+		</list>
+	</request>
+
+	<request name="GetNamedIndicator" opcode="15">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="ledClass" type="LedClassSpec" enum="LedClass" />
+		<field name="ledID" type="IDSpec" altenum="ID" />
+		<pad bytes="2" />
+		<field name="indicator" type="ATOM" />
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="indicator" type="ATOM" />
+			<field name="found" type="BOOL" />
+			<field name="on" type="BOOL" />
+			<field name="realIndicator" type="BOOL" />
+			<field name="ndx" type="CARD8" />
+			<field name="map_flags" type="CARD8" mask="IMFlag" />
+			<field name="map_whichGroups" type="CARD8" mask="IMGroupsWhich" />
+			<field name="map_groups" type="CARD8" mask="SetOfGroups" />
+			<field name="map_whichMods" type="CARD8" mask="IMModsWhich" />
+			<field name="map_mods" type="CARD8" mask="ModMask" />
+			<field name="map_realMods" type="CARD8" mask="ModMask" />
+			<field name="map_vmod" type="CARD16" mask="VMod" />
+			<field name="map_ctrls" type="CARD32" mask="BoolCtrl" />
+			<field name="supported" type="BOOL" />
+			<pad bytes="3" />
+		</reply>
+	</request>
+
+	<request name="SetNamedIndicator" opcode="16" >
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="ledClass" type="LedClassSpec" enum="LedClass" />
+		<field name="ledID" type="IDSpec" altenum="ID" />
+		<pad bytes="2" />
+		<field name="indicator" type="ATOM" />
+		<field name="setState" type="BOOL" />
+		<field name="on" type="BOOL" />
+		<field name="setMap" type="BOOL" />
+		<field name="createMap" type="BOOL" />
+		<pad bytes="1" />
+		<field name="map_flags" type="CARD8" mask="IMFlag" />
+		<field name="map_whichGroups" type="CARD8" mask="IMGroupsWhich" />
+		<field name="map_groups" type="CARD8" mask="SetOfGroups" />
+		<field name="map_whichMods" type="CARD8" mask="IMModsWhich" />
+		<field name="map_realMods" type="CARD8" mask="ModMask" />
+		<field name="map_vmods" type="CARD16" mask="VMod" />
+		<field name="map_ctrls" type="CARD32" mask="BoolCtrl" />
+	</request>
+
+	<request name="GetNames" opcode="17">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<pad bytes="2" />
+		<field name="which" type="CARD32" mask="NameDetail" />
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="which" type="CARD32" mask="NameDetail" />
+			<field name="minKeyCode" type="KEYCODE" />
+			<field name="maxKeyCode" type="KEYCODE" />
+			<field name="nTypes" type="CARD8" />
+			<field name="groupNames" type="CARD8" mask="SetOfGroup" />
+			<field name="virtualMods" type="CARD16" mask="VMod" />
+			<field name="firstKey" type="KEYCODE" />
+			<field name="nKeys" type="CARD8" />
+			<field name="indicators" type="CARD32" />
+			<field name="nRadioGroups" type="CARD8" />
+			<field name="nKeyAliases" type="CARD8" />
+			<field name="nKTLevels" type="CARD16" />
+			<pad bytes="4" />
+			<switch name="valueList">
+				<fieldref>which</fieldref>
+				<bitcase>
+					<enumref ref="NameDetail">Keycodes</enumref>
+					<field name="keycodesName" type="ATOM" />
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">Geometry</enumref>
+					<field name="geometryName" type="ATOM" />
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">Symbols</enumref>
+					<field name="symbolsName" type="ATOM" />
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">PhysSymbols</enumref>
+					<field name="physSymbolsName" type="ATOM" />
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">Types</enumref>
+					<field name="typesName" type="ATOM" />
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">Compat</enumref>
+					<field name="compatName" type="ATOM" />
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">KeyTypeNames</enumref>
+					<list name="typeNames" type="ATOM">
+						<fieldref>nTypes</fieldref>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">KTLevelNames</enumref>
+					<list name="nLevelsPerType" type="CARD8">
+					  <!-- Xlib uses NTypes here - 
+					       the spec says nKTLevels is correct, but
+					       it does not work in reality
+					       <fieldref>nKTLevels</fieldref> -->
+					        <fieldref>nTypes</fieldref>
+					</list>
+					<pad align="4" serialize="true" />
+					<list name="ktLevelNames" type="ATOM">
+						<sumof ref="nLevelsPerType" />
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">IndicatorNames</enumref>
+					<list name="indicatorNames" type="ATOM">
+						<popcount>
+							<fieldref>indicators</fieldref>
+						</popcount>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">VirtualModNames</enumref>
+					<list name="virtualModNames" type="ATOM">
+						<popcount>
+							<fieldref>virtualMods</fieldref>
+						</popcount>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">GroupNames</enumref>
+					<list name="groups" type="ATOM">
+						<popcount>
+							<fieldref>groupNames</fieldref>
+						</popcount>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">KeyNames</enumref>
+					<list name="keyNames" type="KeyName">
+						<fieldref>nKeys</fieldref>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">KeyAliases</enumref>
+					<list name="keyAliases" type="KeyAlias">
+						<fieldref>nKeyAliases</fieldref>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="NameDetail">RGNames</enumref>
+					<list name="radioGroupNames" type="ATOM">
+						<fieldref>nRadioGroups</fieldref>
+					</list>
+				</bitcase>
+			</switch>
+		</reply>
+	</request>
+
+	<request name="SetNames" opcode="18">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="virtualMods" type="CARD16" mask="VMod" />
+		<field name="which" type="CARD32" mask="NameDetail" />
+		<field name="firstType" type="CARD8" />
+		<field name="nTypes" type="CARD8" />
+		<field name="firstKTLevelt" type="CARD8" />
+		<field name="nKTLevels" type="CARD8" />
+		<field name="indicators" type="CARD32" />
+		<field name="groupNames" type="CARD8" mask="SetOfGroup" />
+		<field name="nRadioGroups" type="CARD8" />
+		<field name="firstKey" type="KEYCODE" />
+		<field name="nKeys" type="CARD8" />
+		<field name="nKeyAliases" type="CARD8"/>
+		<pad bytes="1" />
+		<field name="totalKTLevelNames" type="CARD16" />
+		<switch name="values">
+			<fieldref>which</fieldref>
+			<bitcase>
+				<enumref ref="NameDetail">Keycodes</enumref>
+				<field name="keycodesName" type="ATOM" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">Geometry</enumref>
+				<field name="geometryName" type="ATOM" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">Symbols</enumref>
+				<field name="symbolsName" type="ATOM" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">PhysSymbols</enumref>
+				<field name="physSymbolsName" type="ATOM" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">Types</enumref>
+				<field name="typesName" type="ATOM" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">Compat</enumref>
+				<field name="compatName" type="ATOM" />
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">KeyTypeNames</enumref>
+				<list name="typeNames" type="ATOM">
+					<fieldref>nTypes</fieldref>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">KTLevelNames</enumref>
+				<list name="nLevelsPerType" type="CARD8">
+					<fieldref>nTypes</fieldref>
+				</list>
+				<pad align="4"/>
+				<list name="ktLevelNames" type="ATOM">
+					<sumof ref="nLevelsPerType" />
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">IndicatorNames</enumref>
+				<list name="indicatorNames" type="ATOM">
+					<popcount>
+						<fieldref>indicators</fieldref>
+					</popcount>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">VirtualModNames</enumref>
+				<list name="virtualModNames" type="ATOM">
+					<popcount>
+						<fieldref>virtualMods</fieldref>
+					</popcount>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">GroupNames</enumref>
+				<list name="groups" type="ATOM">
+					<popcount>
+						<fieldref>groupNames</fieldref>
+					</popcount>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">KeyNames</enumref>
+				<list name="keyNames" type="KeyName">
+					<fieldref>nKeys</fieldref>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">KeyAliases</enumref>
+				<list name="keyAliases" type="KeyAlias">
+					<fieldref>nKeyAliases</fieldref>
+				</list>
+			</bitcase>
+			<bitcase>
+				<enumref ref="NameDetail">RGNames</enumref>
+				<list name="radioGroupNames" type="ATOM">
+					<fieldref>nRadioGroups</fieldref>
+				</list>
+			</bitcase>
+		</switch>
+	</request>
+
+	<!-- XXX: Property and doodads are broken, which renders GetGeometry useless
+	<request name="GetGeometry" opcode="19">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<pad bytes="2" />
+		<field name="name" type="ATOM" />
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="name" type="ATOM" />
+			<field name="found" type="BOOL" />
+			<pad bytes="1" />
+			<field name="widthMM" type="CARD16" />
+			<field name="heightMM" type="CARD16" />
+			<field name="nProperties" type="CARD16" />
+			<field name="nColors" type="CARD16" />
+			<field name="nShapes" type="CARD16" />
+			<field name="nSections" type="CARD16" />
+			<field name="nDoodads" type="CARD16" />
+			<field name="nKeyAliases" type="CARD16" />
+			<field name="baseColorNdx" type="CARD8" />
+			<field name="labelColorNdx" type="CARD8" />
+			<field name="labelFont" type="CountedString16" />
+			<list name="properties" type="Property">
+				<fieldref>nProperties</fieldref>
+			</list>
+			<list name="colors" type="CountedString16">
+				<fieldref>nColors</fieldref>
+			</list>
+			<list name="shapes" type="Shape">
+				<fieldref>nShapes</fieldref>
+			</list>
+			<list name="sections" type="Section">
+				<fieldref>nSections</fieldref>
+			</list>
+			<list name="doodads" type="Doodad">
+				<fieldref>nDoodads</fieldref>
+			</list>
+			<list name="keyAliases" type="KeyAlias">
+				<fieldref>nKeyAliases</fieldref>
+			</list>
+		</reply>
+	</request>
+	-->
+
+	<!-- XXX: Property and doodads are broken, which renders SetGeometry useless
+	<request name="SetGeometry" opcode="20">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="nShapes" type="CARD8" />
+		<field name="nSections" type="CARD8" />
+		<field name="name" type="ATOM" />
+		<field name="widthMM" type="CARD16" />
+		<field name="heightMM" type="CARD16" />
+		<field name="nProperties" type="CARD16" />
+		<field name="nColors" type="CARD16" />
+		<field name="nDoodads" type="CARD16" />
+		<field name="nKeyAliases" type="CARD16" />
+		<field name="baseColorNdx" type="CARD8" />
+		<field name="labelColorNdx" type="CARD8" />
+		<pad bytes="2" />
+		<field name="labelFont" type="CountedString16" />
+		<list name="properties" type="Property">
+			<fieldref>nProperties</fieldref>
+		</list>
+		<list name="colors" type="CountedString16">
+			<fieldref>nColors</fieldref>
+		</list>
+		<list name="shapes" type="Shape">
+			<fieldref>nShapes</fieldref>
+		</list>
+		<list name="sections" type="Section">
+			<fieldref>nSections</fieldref>
+		</list>
+		<list name="doodads" type="Doodad">
+			<fieldref>nDoodads</fieldref>
+		</list>
+		<list name="keyAliases" type="KeyAlias">
+			<fieldref>nKeyAliases</fieldref>
+		</list>
+	</request>
+	-->
+
+	<request name="PerClientFlags" opcode="21">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<pad bytes="2" />
+		<field name="change" type="CARD32" mask="PerClientFlag" />
+		<field name="value" type="CARD32" mask="PerClientFlag" />
+		<field name="ctrlsToChange" type="CARD32" mask="BoolCtrl" />
+		<field name="autoCtrls" type="CARD32" mask="BoolCtrl" />
+		<field name="autoCtrlsValues" type="CARD32" mask="BoolCtrl" />
+		<reply>
+			<field name="deviceID" type="CARD8"/>
+			<field name="supported" type="CARD32" mask="PerClientFlag" />
+			<field name="value" type="CARD32" mask="PerClientFlag" />
+			<field name="autoCtrls" type="CARD32" mask="BoolCtrl" />
+			<field name="autoCtrlsValues" type="CARD32" mask="BoolCtrl" />
+			<pad bytes="8" />
+		</reply>
+	</request>
+
+	<request name="ListComponents" opcode="22">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="maxNames" type="CARD16" />
+		<!-- XXX: Intermixed fixed size fields and lists are broken
+		<field name="keymapsSpecLen" type="CARD8" />
+		<list name="keymapsSpec" type="STRING8">
+			<fieldref>keymapsSpecLen</fieldref>
+		</list>
+		<field name="keycodesSpecLen" type="CARD8" />
+		<list name="keycodesSpec" type="STRING8">
+			<fieldref>keycodesSpecLen</fieldref>
+		</list>
+		<field name="typesSpecLen" type="CARD8" />
+		<list name="typesSpec" type="STRING8">
+			<fieldref>typesSpecLen</fieldref>
+		</list>
+		<field name="compatMapSpecLen" type="CARD8" />
+		<list name="compatMapSpec" type="STRING8">
+			<fieldref>compatMapSpecLen</fieldref>
+		</list>
+		<field name="symbolsSpecLen" type="CARD8" />
+		<list name="symbolsSpec" type="STRING8">
+			<fieldref>symbolsSpecLen</fieldref>
+		</list>
+		<field name="geometrySpecLen" type="CARD8" />
+		<list name="geometrySpec" type="STRING8">
+			<fieldref>geometrySpecLen</fieldref>
+		</list>
+		-->
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="nKeymaps" type="CARD16" />
+			<field name="nKeycodes" type="CARD16" />
+			<field name="nTypes" type="CARD16" />
+			<field name="nCompatMaps" type="CARD16" />
+			<field name="nSymbols" type="CARD16" />
+			<field name="nGeometries" type="CARD16" />
+			<field name="extra" type="CARD16" />
+			<pad bytes="10" />
+			<list name="keymaps" type="Listing">
+				<fieldref>nKeymaps</fieldref>
+			</list>
+			<list name="keycodes" type="Listing">
+				<fieldref>nKeycodes</fieldref>
+			</list>
+			<list name="types" type="Listing">
+				<fieldref>nTypes</fieldref>
+			</list>
+			<list name="compatMaps" type="Listing">
+				<fieldref>nCompatMaps</fieldref>
+			</list>
+			<list name="symbols" type="Listing">
+				<fieldref>nSymbols</fieldref>
+			</list>
+			<list name="geometries" type="Listing">
+				<fieldref>nGeometries</fieldref>
+			</list>
+		</reply>
+	</request>
+
+	<request name="GetKbdByName" opcode="23">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="need" type="CARD16" mask="GBNDetail" />
+		<field name="want" type="CARD16" mask="GBNDetail" />
+		<field name="load" type="BOOL" />
+		<pad bytes="1" />
+		<!-- XXX: Intermixed fixed size fields and lists are broken
+		<field name="keymapsSpecLen" type="CARD8" />
+		<list name="keymapsSpec" type="STRING8">
+			<fieldref>keymapsSpecLen</fieldref>
+		</list>
+		<field name="keycodesSpecLen" type="CARD8" />
+		<list name="keycodesSpec" type="STRING8">
+			<fieldref>keycodesSpecLen</fieldref>
+		</list>
+		<field name="typesSpecLen" type="CARD8" />
+		<list name="typesSpec" type="STRING8">
+			<fieldref>typesSpecLen</fieldref>
+		</list>
+		<field name="compatMapSpecLen" type="CARD8" />
+		<list name="compatMapSpec" type="STRING8">
+			<fieldref>compatMapSpecLen</fieldref>
+		</list>
+		<field name="symbolsSpecLen" type="CARD8" />
+		<list name="symbolsSpec" type="STRING8">
+			<fieldref>symbolsSpecLen</fieldref>
+		</list>
+		<field name="geometrySpecLen" type="CARD8" />
+		<list name="geometrySpec" type="STRING8">
+			<fieldref>geometrySpecLen</fieldref>
+		</list>
+		-->
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="minKeyCode" type="KEYCODE" />
+			<field name="maxKeyCode" type="KEYCODE" />
+			<field name="loaded" type="BOOL" />
+			<field name="newKeyboard" type="BOOL" />
+			<field name="found" type="CARD16" mask="GBNDetail" />
+			<field name="reported" type="CARD16" mask="GBNDetail" />
+			<pad bytes="16" />
+			<switch name="replies">
+				<fieldref>reported</fieldref>
+				<bitcase name="types">
+					<enumref ref="GBNDetail">Types</enumref>
+					<enumref ref="GBNDetail">ClientSymbols</enumref>
+					<enumref ref="GBNDetail">ServerSymbols</enumref>
+					<!-- from the spec, this has to be a GetMap reply -->
+					<field name="getmap_type" type="CARD8" />
+				        <!-- done 'emulating' GetMap reply header-->
+					<field name="typeDeviceID" type="CARD8" />
+					<!-- from the spec, this has to be a GetMap reply -->
+					<field name="getmap_sequence" type="CARD16" />
+					<field name="getmap_length" type="CARD32" />
+				        <!-- done 'emulating' GetMap reply header-->
+					<pad bytes="2" />
+					<field name="typeMinKeyCode" type="KEYCODE" />
+					<field name="typeMaxKeyCode" type="KEYCODE" />
+					<field name="present" type="CARD16" mask="MapPart" />
+					<field name="firstType" type="CARD8" />
+					<field name="nTypes" type="CARD8" />
+					<field name="totalTypes" type="CARD8" />
+					<field name="firstKeySym" type="KEYCODE" />
+					<field name="totalSyms" type="CARD16" />
+					<field name="nKeySyms" type="CARD8" />
+					<field name="firstKeyAction" type="KEYCODE" />
+					<field name="totalActions" type="CARD16" />
+					<field name="nKeyActions" type="CARD8" />
+					<field name="firstKeyBehavior" type="KEYCODE" />
+					<field name="nKeyBehaviors" type="CARD8" />
+					<field name="totalKeyBehaviors" type="CARD8" />
+					<field name="firstKeyExplicit" type="KEYCODE" />
+					<field name="nKeyExplicit" type="CARD8" />
+					<field name="totalKeyExplicit" type="CARD8" />
+					<field name="firstModMapKey" type="KEYCODE" />
+					<field name="nModMapKeys" type="CARD8" />
+					<field name="totalModMapKeys" type="CARD8" />
+					<field name="firstVModMapKey" type="KEYCODE" />
+					<field name="nVModMapKeys" type="CARD8" />
+					<field name="totalVModMapKeys" type="CARD8" />
+					<pad bytes="1" />
+					<field name="virtualMods" type="CARD16" mask="VMod" />
+					<switch name="map">
+						<fieldref>present</fieldref>
+						<bitcase>
+							<enumref ref="MapPart">KeyTypes</enumref>
+							<list name="types_rtrn" type="KeyType">
+								<fieldref>nTypes</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">KeySyms</enumref>
+							<list name="syms_rtrn" type="KeySymMap">
+								<fieldref>nKeySyms</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">KeyActions</enumref>
+							<list name="acts_rtrn_count" type="CARD8">
+								<fieldref>nKeyActions</fieldref>
+							</list>
+							<pad align="4" />
+							<list name="acts_rtrn_acts" type="Action">
+								<fieldref>totalActions</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">KeyBehaviors</enumref>
+							<list name="behaviors_rtrn" type="SetBehavior">
+								<fieldref>totalKeyBehaviors</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">VirtualMods</enumref>
+							<list name="vmods_rtrn" type="CARD8" mask="ModMask">
+								<popcount><fieldref>virtualMods</fieldref></popcount>
+							</list>
+							<pad align="4" />
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">ExplicitComponents</enumref>
+							<list name="explicit_rtrn" type="SetExplicit">
+								<fieldref>totalKeyExplicit</fieldref>
+							</list>
+							<pad align="4" />
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">ModifierMap</enumref>
+							<list name="modmap_rtrn" type="KeyModMap">
+								<fieldref>totalModMapKeys</fieldref>
+							</list>
+							<pad align="4" />
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">VirtualModMap</enumref>
+							<list name="vmodmap_rtrn" type="KeyVModMap">
+								<fieldref>totalVModMapKeys</fieldref>
+							</list>
+						</bitcase>
+					</switch>
+				</bitcase>
+				<bitcase name="compat_map">
+					<enumref ref="GBNDetail">CompatMap</enumref>
+					<!-- from the spec, this has to include a reply header -->
+					<field name="compatmap_type" type="CARD8" />
+					<field name="compatDeviceID" type="CARD8" />
+					<field name="compatmap_sequence" type="CARD16" />
+					<field name="compatmap_length" type="CARD32" />
+					<!-- done 'emulating' reply header -->
+					<field name="groupsRtrn" type="CARD8" mask="SetOfGroup" />
+					<pad bytes="1" />
+					<field name="firstSIRtrn" type="CARD16" />
+					<field name="nSIRtrn" type="CARD16" />
+					<field name="nTotalSI" type="CARD16" />
+					<pad bytes="16" />
+					<list name="si_rtrn" type="SymInterpret">
+						<fieldref>nSIRtrn</fieldref>
+					</list>
+					<list name="group_rtrn" type="ModDef">
+						<popcount>
+							<fieldref>groupsRtrn</fieldref>
+						</popcount>
+					</list>
+				</bitcase>
+				<bitcase name="indicator_maps">
+					<enumref ref="GBNDetail">IndicatorMaps</enumref>
+					<!-- from the spec, this has to include a reply header -->
+					<field name="indicatormap_type" type="CARD8" />
+					<field name="indicatorDeviceID" type="CARD8" />
+					<field name="indicatormap_sequence" type="CARD16" />
+					<field name="indicatormap_length" type="CARD32" />
+					<!-- done 'emulating' reply header -->
+					<field name="which" type="CARD32" />
+					<field name="realIndicators" type="CARD32" />
+					<field name="nIndicators" type="CARD8" />
+					<pad bytes="15" />
+					<list name="maps" type="IndicatorMap">
+						<fieldref>nIndicators</fieldref>
+					</list>
+				</bitcase>
+				<bitcase name="key_names">
+					<enumref ref="GBNDetail">KeyNames</enumref>
+					<enumref ref="GBNDetail">OtherNames</enumref>
+					<!-- from the spec, this has to include a reply header -->
+					<field name="keyname_type" type="CARD8" />
+					<field name="keyDeviceID" type="CARD8" />
+					<field name="keyname_sequence" type="CARD16" />
+					<field name="keyname_length" type="CARD32" />
+					<!-- done 'emulating' reply header -->
+					<field name="which" type="CARD32" mask="NameDetail" />
+					<field name="keyMinKeyCode" type="KEYCODE" />
+					<field name="keyMaxKeyCode" type="KEYCODE" />
+					<field name="nTypes" type="CARD8" />
+					<field name="groupNames" type="CARD8" mask="SetOfGroup" />
+					<field name="virtualMods" type="CARD16" mask="VMod" />
+					<field name="firstKey" type="KEYCODE" />
+					<field name="nKeys" type="CARD8" />
+					<field name="indicators" type="CARD32" />
+					<field name="nRadioGroups" type="CARD8" />
+					<field name="nKeyAliases" type="CARD8" />
+					<field name="nKTLevels" type="CARD16" />
+					<pad bytes="4" />
+					<switch name="valueList">
+						<fieldref>which</fieldref>
+						<bitcase>
+							<enumref ref="NameDetail">Keycodes</enumref>
+							<field name="keycodesName" type="ATOM" />
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">Geometry</enumref>
+							<field name="geometryName" type="ATOM" />
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">Symbols</enumref>
+							<field name="symbolsName" type="ATOM" />
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">PhysSymbols</enumref>
+							<field name="physSymbolsName" type="ATOM" />
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">Types</enumref>
+							<field name="typesName" type="ATOM" />
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">Compat</enumref>
+							<field name="compatName" type="ATOM" />
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">KeyTypeNames</enumref>
+							<list name="typeNames" type="ATOM">
+								<fieldref>nTypes</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">KTLevelNames</enumref>
+							<list name="nLevelsPerType" type="CARD8">
+								<fieldref>nTypes</fieldref>
+							</list>
+							<pad align="4" />
+							<list name="ktLevelNames" type="ATOM">
+								<sumof ref="nLevelsPerType" />
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">IndicatorNames</enumref>
+							<list name="indicatorNames" type="ATOM">
+								<popcount>
+									<fieldref>indicators</fieldref>
+								</popcount>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">VirtualModNames</enumref>
+							<list name="virtualModNames" type="ATOM">
+								<popcount>
+									<fieldref>virtualMods</fieldref>
+								</popcount>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">GroupNames</enumref>
+							<list name="groups" type="ATOM">
+								<popcount>
+									<fieldref>groupNames</fieldref>
+								</popcount>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">KeyNames</enumref>
+							<list name="keyNames" type="KeyName">
+								<fieldref>nKeys</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">KeyAliases</enumref>
+							<list name="keyAliases" type="KeyAlias">
+								<fieldref>nKeyAliases</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="NameDetail">RGNames</enumref>
+							<list name="radioGroupNames" type="ATOM">
+								<fieldref>nRadioGroups</fieldref>
+							</list>
+						</bitcase>
+					</switch>
+				</bitcase>
+				<bitcase name="geometry">
+					<enumref ref="GBNDetail">Geometry</enumref>
+					<!-- from the spec, this has to include a reply header -->
+					<field name="geometry_type" type="CARD8" />
+					<field name="geometryDeviceID" type="CARD8" />
+					<field name="geometry_sequence" type="CARD16" />
+					<field name="geometry_length" type="CARD32" />
+					<!-- done 'emulating' reply header -->
+					<field name="name" type="ATOM" />
+					<field name="geometryFound" type="BOOL" />
+					<pad bytes="1" />
+					<field name="widthMM" type="CARD16" />
+					<field name="heightMM" type="CARD16" />
+					<field name="nProperties" type="CARD16" />
+					<field name="nColors" type="CARD16" />
+					<field name="nShapes" type="CARD16" />
+					<field name="nSections" type="CARD16" />
+					<field name="nDoodads" type="CARD16" />
+					<field name="nKeyAliases" type="CARD16" />
+					<field name="baseColorNdx" type="CARD8" />
+					<field name="labelColorNdx" type="CARD8" />
+					<field name="labelFont" type="CountedString16" />
+					<!-- XXX: Property is broken
+					<list name="properties" type="Property">
+						<fieldref>nProperties</fieldref>
+					</list>
+					<list name="colors" type="CountedString16">
+						<fieldref>nColors</fieldref>
+					</list>
+					<list name="shapes" type="Shape">
+						<fieldref>nShapes</fieldref>
+					</list>
+					-->
+					<!-- XXX: doodads are broken
+					<list name="sections" type="Section">
+						<fieldref>nSections</fieldref>
+					</list>
+					<list name="doodads" type="Doodad">
+						<fieldref>nDoodads</fieldref>
+					</list>
+					<list name="keyAliases" type="KeyAlias">
+						<fieldref>nKeyAliases</fieldref>
+					</list>
+					-->
+				</bitcase>
+			</switch>
+		</reply>
+	</request>
+
+	<request name="GetDeviceInfo" opcode="24">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="wanted" type="CARD16" mask="XIFeature" />
+		<field name="allButtons" type="BOOL" />
+		<field name="firstButton" type="CARD8" />
+		<field name="nButtons" type="CARD8" />
+		<pad bytes="1" />
+		<field name="ledClass" type="LedClassSpec" enum="LedClass" />
+		<field name="ledID" type="IDSpec" altenum="ID" />
+		<reply>
+			<field name="deviceID" type="CARD8" />
+			<field name="present" type="CARD16" mask="XIFeature" />
+			<field name="supported" type="CARD16" mask="XIFeature" />
+			<field name="unsupported" type="CARD16" mask="XIFeature" />
+			<field name="nDeviceLedFBs" type="CARD16" />
+			<field name="firstBtnWanted" type="CARD8" />
+			<field name="nBtnsWanted" type="CARD8" />
+			<field name="firstBtnRtrn" type="CARD8" />
+			<field name="nBtnsRtrn" type="CARD8" />
+			<field name="totalBtns" type="CARD8" />
+			<field name="hasOwnState" type="BOOL" />
+			<field name="dfltKbdFB" type="CARD16" altenum="ID" />
+			<field name="dfltLedFB" type="CARD16" altenum="ID" />
+			<pad bytes="2" />
+			<field name="devType" type="ATOM" />
+			<field name="nameLen" type="CARD16" />
+			<list name="name" type="STRING8">
+				<fieldref>nameLen</fieldref>
+			</list>
+			<pad align="4" />
+			<list name="btnActions" type="Action">
+				<fieldref>nBtnsRtrn</fieldref>
+			</list>
+			<list name="leds" type="DeviceLedInfo">
+				<fieldref>nDeviceLedFBs</fieldref>
+			</list>
+		</reply>
+	</request>
+
+
+	<request name="SetDeviceInfo" opcode="25">
+		<field name="deviceSpec" type="DeviceSpec" />
+		<field name="firstBtn" type="CARD8" />
+		<field name="nBtns" type="CARD8" />
+		<field name="change" type="CARD16" mask="XIFeature" />
+		<field name="nDeviceLedFBs" type="CARD16" />
+		<list name="btnActions" type="Action">
+			<fieldref>nBtns</fieldref>
+		</list>
+		<list name="leds" type="DeviceLedInfo">
+			<fieldref>nDeviceLedFBs</fieldref>
+		</list>
+	</request>
+
+	<request name="SetDebuggingFlags" opcode="101">
+		<field name="msgLength" type="CARD16" />
+		<pad bytes="2" />
+		<field name="affectFlags" type="CARD32" />
+		<field name="flags" type="CARD32" />
+		<field name="affectCtrls" type="CARD32" />
+		<field name="ctrls" type="CARD32" />
+		<list name="message" type="STRING8">
+			<fieldref>msgLength</fieldref>
+		</list>
+		<reply>
+			<pad bytes="1" />
+			<field name="currentFlags" type="CARD32" />
+			<field name="currentCtrls" type="CARD32" />
+			<field name="supportedFlags" type="CARD32" />
+			<field name="supportedCtrls" type="CARD32" />
+			<pad bytes="8" />
+		</reply>
+	</request>
+
+	<!-- Events -->
+
+	<event name="NewKeyboardNotify" number="0">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<field name="oldDeviceID" type="CARD8" />
+		<field name="minKeyCode" type="KEYCODE" />
+		<field name="maxKeyCode" type="KEYCODE" />
+		<field name="oldMinKeyCode" type="KEYCODE" />
+		<field name="oldMaxKeyCode" type="KEYCODE" />
+		<field name="requestMajor" type="CARD8" />
+		<field name="requestMinor" type="CARD8" />
+		<field name="changed" type="CARD16" mask="NKNDetail" />
+		<pad bytes="14" />
+	</event>
+
+	<event name="MapNotify" number="1">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<field name="ptrBtnActions" type="CARD8" />
+		<field name="changed" type="CARD16" mask="MapPart" />
+		<field name="minKeyCode" type="KEYCODE" />
+		<field name="maxKeyCode" type="KEYCODE" />
+		<field name="firstType" type="CARD8" />
+		<field name="nTypes" type="CARD8" />
+		<field name="firstKeySym" type="KEYCODE" />
+		<field name="nKeySyms" type="CARD8" />
+		<field name="firstKeyAct" type="KEYCODE" />
+		<field name="nKeyActs" type="CARD8" />
+		<field name="firstKeyBehavior" type="KEYCODE" />
+		<field name="nKeyBehavior" type="CARD8" />
+		<field name="firstKeyExplicit" type="KEYCODE" />
+		<field name="nKeyExplicit" type="CARD8" />
+		<field name="firstModMapKey" type="KEYCODE" />
+		<field name="nModMapKeys" type="CARD8" />
+		<field name="firstVModMapKey" type="KEYCODE" />
+		<field name="nVModMapKeys" type="CARD8" />
+		<field name="virtualMods" type="CARD16" mask="VMod" />
+		<pad bytes="2" />
+	</event>
+
+	<event name="StateNotify" number="2">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<field name="mods" type="CARD8" mask="ModMask" />
+		<field name="baseMods" type="CARD8" mask="ModMask" />
+		<field name="latchedMods" type="CARD8" mask="ModMask" />
+		<field name="lockedMods" type="CARD8" mask="ModMask" />
+		<field name="group" type="CARD8" enum="Group" />
+		<field name="baseGroup" type="INT16" />
+		<field name="latchedGroup" type="INT16" />
+		<field name="lockedGroup" type="CARD8" enum="Group" />
+		<field name="compatState" type="CARD8" mask="ModMask" />
+		<field name="grabMods" type="CARD8" mask="ModMask" />
+		<field name="compatGrabMods" type="CARD8" mask="ModMask" />
+		<field name="lookupMods" type="CARD8" mask="ModMask" />
+		<field name="compatLoockupMods" type="CARD8" mask="ModMask" />
+		<field name="ptrBtnState" type="CARD16" mask="KeyButMask" />
+		<field name="changed" type="CARD16" mask="StatePart" />
+		<field name="keycode" type="KEYCODE" />
+		<field name="eventType" type="CARD8" />
+		<field name="requestMajor" type="CARD8" />
+		<field name="requestMinor" type="CARD8" />
+	</event>
+
+	<event name="ControlsNotify" number="3">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<field name="numGroups" type="CARD8" />
+		<pad bytes="2" />
+		<field name="changedControls" type="CARD32" mask="Control" />
+		<field name="enabledControls" type="CARD32" mask="BoolCtrl" />
+		<field name="enabledControlChanges" type="CARD32" mask="BoolCtrl" />
+		<field name="keycode" type="KEYCODE" />
+		<field name="eventType" type="CARD8" />
+		<field name="requestMajor" type="CARD8" />
+		<field name="requestMinor" type="CARD8" />
+		<pad bytes="4" />
+	</event>
+
+	<event name="IndicatorStateNotify" number="4">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<pad bytes="3" />
+		<field name="state" type="CARD32" />
+		<field name="stateChanged" type="CARD32" />
+		<pad bytes="12" />
+	</event>
+
+	<event name="IndicatorMapNotify" number="5">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<pad bytes="3" />
+		<field name="state" type="CARD32" />
+		<field name="mapChanged" type="CARD32" />
+		<pad bytes="12" />
+	</event>
+
+	<event name="NamesNotify" number="6">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<pad bytes="1" />
+		<field name="changed" type="CARD16" mask="NameDetail" />
+		<field name="firstType" type="CARD8" />
+		<field name="nTypes" type="CARD8" />
+		<field name="firstLevelName" type="CARD8" />
+		<field name="nLevelNames" type="CARD8" />
+		<pad bytes="1" />
+		<field name="nRadioGroups" type="CARD8" />
+		<field name="nKeyAliases" type="CARD8" />
+		<field name="changedGroupNames" type="CARD8" mask="SetOfGroup" />
+		<field name="changedVirtualMods" type="CARD16" mask="VMod" />
+		<field name="firstKey" type="KEYCODE" />
+		<field name="nKeys" type="CARD8" />
+		<field name="changedIndicators" type="CARD32" />
+		<pad bytes="4" />
+	</event>
+
+	<event name="CompatMapNotify" number="7">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<field name="changedGroups" type="CARD8" mask="SetOfGroup" />
+		<field name="firstSI" type="CARD16" />
+		<field name="nSI" type="CARD16" />
+		<field name="nTotalSI" type="CARD16" />
+		<pad bytes="16" />
+	</event>
+
+	<event name="BellNotify" number="8">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<field name="bellClass" type="CARD8" enum="BellClassResult" />
+		<field name="bellID" type="CARD8" />
+		<field name="percent" type="CARD8" />
+		<field name="pitch" type="CARD16" />
+		<field name="duration" type="CARD16" />
+		<field name="name" type="ATOM" />
+		<field name="window" type="WINDOW" />
+		<field name="eventOnly" type="BOOL" />
+		<pad bytes="7" />
+	</event>
+
+	<event name="ActionMessage" number="9">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<field name="keycode" type="KEYCODE" />
+		<field name="press" type="BOOL" />
+		<field name="keyEventFollows" type="BOOL" />
+		<field name="mods" type="CARD8" mask="ModMask" />
+		<field name="group" type="CARD8" enum="Group" />
+		<list name="message" type="STRING8">
+			<value>8</value>
+		</list>
+		<pad bytes="10" />
+	</event>
+
+	<event name="AccessXNotify" number="10">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<field name="keycode" type="KEYCODE" />
+		<field name="detailt" type="CARD16" mask="AXNDetail" />
+		<field name="slowKeysDelay" type="CARD16" />
+		<field name="debounceDelay" type="CARD16" />
+		<pad bytes="16" />
+	</event>
+
+	<event name="ExtensionDeviceNotify" number="11">
+		<field name="xkbType" type="CARD8" />
+		<field name="time" type="TIMESTAMP" />
+		<field name="deviceID" type="CARD8" />
+		<pad bytes="1" />
+		<field name="reason" type="CARD16" mask="XIFeature" />
+		<field name="ledClass" type="CARD16" enum="LedClassResult" />
+		<field name="ledID" type="CARD16" />
+		<field name="ledsDefined" type="CARD32" />
+		<field name="ledState" type="CARD32" />
+		<field name="firstButton" type="CARD8" />
+		<field name="nButtons" type="CARD8" />
+		<field name="supported" type="CARD16" mask="XIFeature" />
+		<field name="unsupported" type="CARD16" mask="XIFeature" />
+		<pad bytes="2" />
+	</event>
+</xcb>
diff --git a/third_party/xcbproto/src/src/xprint.xml b/third_party/xcbproto/src/src/xprint.xml
new file mode 100644
index 000000000000..f9af65fa6046
--- /dev/null
+++ b/third_party/xcbproto/src/src/xprint.xml
@@ -0,0 +1,329 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2005 Jeremy Kolb.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person ob/Sintaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<xcb header="xprint" extension-xname="XpExtension" extension-name="XPrint"
+    extension-multiword="true" major-version="1" minor-version="0">
+
+    <!-- Conforms to XPRINT 1.0 -->
+
+    <import>xproto</import>
+    
+    <typedef oldname="char" newname="STRING8" />
+
+    <!-- Types -->
+    <struct name="PRINTER">
+        <field type="CARD32" name="nameLen" />
+        <list type="STRING8" name="name">
+            <fieldref>nameLen</fieldref>
+        </list>
+        <pad align="4" />
+        <field type="CARD32" name="descLen" />
+        <list type="STRING8" name="description">
+            <fieldref>descLen</fieldref>
+        </list>
+        <pad align="4" />
+    </struct>
+
+    <!--<typedef oldname="CARD32" newname="PCONTEXT" />-->
+    <xidtype name="PCONTEXT" />
+
+    <!-- "PrintGetDocumentData" -->
+    <enum name="GetDoc">
+        <item name="Finished"><value>0</value></item>
+            <item name="SecondConsumer"><value>1</value></item>
+    </enum>
+
+    <!-- Event Mask ("PrintSelectInput") -->
+    <enum name="EvMask">
+        <item name="NoEventMask"><value>0</value></item>
+        <item name="PrintMask"><bit>0</bit></item>
+        <item name="AttributeMask"><bit>1</bit></item>
+    </enum>
+
+    <!-- "PrintNotify" detail -->
+    <enum name="Detail">
+        <item name="StartJobNotify"><value>1</value></item>
+        <item name="EndJobNotify"><value>2</value></item>
+        <item name="StartDocNotify"><value>3</value></item>
+        <item name="EndDocNotify"><value>4</value></item>
+        <item name="StartPageNotify"><value>5</value></item>
+        <item name="EndPageNotify"><value>6</value></item>
+    </enum>
+
+    <!-- "AttributeNotify" detail -->
+    <enum name="Attr">
+        <item name="JobAttr"><value>1</value></item>
+        <item name="DocAttr"><value>2</value></item>
+        <item name="PageAttr"><value>3</value></item>
+        <item name="PrinterAttr"><value>4</value></item>
+        <item name="ServerAttr"><value>5</value></item>
+        <item name="MediumAttr"><value>6</value></item>
+        <item name="SpoolerAttr"><value>7</value></item>
+    </enum>
+    
+    
+    <!-- Requests -->
+    <request name="PrintQueryVersion" opcode="0">
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="major_version" />
+            <field type="CARD16" name="minor_version" />
+        </reply>
+    </request>
+
+    <request name="PrintGetPrinterList" opcode="1">
+        <field type="CARD32" name="printerNameLen" />
+        <field type="CARD32" name="localeLen" />
+        <list type="STRING8" name="printer_name">
+            <fieldref>printerNameLen</fieldref>
+        </list>
+        <!-- There's some padding in here... -->
+        <list type="STRING8" name="locale">
+            <fieldref>localeLen</fieldref>
+        </list>
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="listCount" />
+            <pad bytes="20" />
+            <list type="PRINTER" name="printers">
+                <fieldref>listCount</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="PrintRehashPrinterList" opcode="20" />
+
+    <request name="CreateContext" opcode="2">
+        <field type="CARD32" name="context_id" />
+        <field type="CARD32" name="printerNameLen" />
+        <field type="CARD32" name="localeLen" />
+        <list type="STRING8" name="printerName">
+            <fieldref>printerNameLen</fieldref>
+        </list>
+        <!-- padding -->
+        <list type="STRING8" name="locale">
+            <fieldref>localeLen</fieldref>
+        </list>
+    </request>
+
+    <request name="PrintSetContext" opcode="3">
+        <field type="CARD32" name="context" />
+    </request>
+
+    <request name="PrintGetContext" opcode="4">
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="context" />
+        </reply>
+    </request>
+
+    <request name="PrintDestroyContext" opcode="5">
+        <field type="CARD32" name="context" />
+    </request>
+
+    <request name="PrintGetScreenOfContext" opcode="6">
+        <reply>
+            <pad bytes="1" />
+            <field type="WINDOW" name="root" />
+        </reply>
+    </request>
+
+    <request name="PrintStartJob" opcode="7">
+        <field type="CARD8" name="output_mode"/>
+    </request>
+
+    <request name="PrintEndJob" opcode="8">
+        <field type="BOOL"  name="cancel" />
+    </request>
+
+    <request name="PrintStartDoc" opcode="9">
+        <field type="CARD8" name="driver_mode" />
+    </request>
+
+    <request name="PrintEndDoc" opcode="10">
+        <field type="BOOL" name="cancel" />
+    </request>
+
+    <request name="PrintPutDocumentData" opcode="11">
+        <field type="DRAWABLE" name="drawable" />
+        <field type="CARD32" name="len_data" />
+        <field type="CARD16" name="len_fmt" />
+        <field type="CARD16" name="len_options" />
+        <list type="BYTE" name="data">
+            <fieldref>len_data</fieldref>
+        </list>
+        <!-- padding -->
+        <list type="STRING8" name="doc_format">
+            <fieldref>len_fmt</fieldref>
+        </list>
+        <!-- padding -->
+        <list type="STRING8" name="options">
+            <fieldref>len_options</fieldref>
+        </list>
+    </request>
+
+    <request name="PrintGetDocumentData" opcode="12">
+        <field type="PCONTEXT" name="context" />
+        <field type="CARD32" name="max_bytes" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="status_code" />
+            <field type="CARD32" name="finished_flag" />
+            <field type="CARD32" name="dataLen" />
+            <pad bytes="12" />
+            <list type="BYTE" name="data">
+                <fieldref>dataLen</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="PrintStartPage" opcode="13">
+        <field type="WINDOW" name="window" />
+    </request>
+
+    <request name="PrintEndPage" opcode="14">
+        <field type="BOOL" name="cancel" />
+        <pad bytes="3" />
+    </request>
+
+    <request name="PrintSelectInput" opcode="15">
+        <field type="PCONTEXT" name="context" />
+        <field type="CARD32" name="event_mask" />
+    </request>
+
+    <request name="PrintInputSelected" opcode="16">
+        <field type="PCONTEXT" name="context" />
+        <reply>
+           <pad bytes="1" />
+           <field type="CARD32" name="event_mask" />
+           <field type="CARD32" name="all_events_mask" />
+        </reply>
+    </request>
+
+    <request name="PrintGetAttributes" opcode="17">
+        <field type="PCONTEXT" name="context" />
+        <field type="CARD8" name="pool" />
+        <pad bytes="3" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="stringLen" />
+            <pad bytes="20" />
+            <list type="STRING8" name="attributes">
+                <fieldref>stringLen</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="PrintGetOneAttributes" opcode="19">
+        <field type="PCONTEXT" name="context" />
+        <field type="CARD32" name="nameLen" />
+        <field type="CARD8" name="pool" />
+        <pad bytes="3" />
+        <list type="STRING8" name="name">
+            <fieldref>nameLen</fieldref>
+        </list>
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="valueLen" />
+            <pad bytes="20" />
+            <list type="STRING8" name="value">
+                <fieldref>valueLen</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="PrintSetAttributes" opcode="18">
+        <field type="PCONTEXT" name="context" />
+        <field type="CARD32" name="stringLen" />
+        <field type="CARD8" name="pool" />
+        <field type="CARD8" name="rule" />
+        <pad bytes="2" />
+        <list type="STRING8" name="attributes" />
+    </request>
+
+    <request name="PrintGetPageDimensions" opcode="21">
+        <field type="PCONTEXT" name="context" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="width" />
+            <field type="CARD16" name="height" />
+            <field type="CARD16" name="offset_x" />
+            <field type="CARD16" name="offset_y" />
+            <field type="CARD16" name="reproducible_width" />
+            <field type="CARD16" name="reproducible_height" />
+        </reply>
+    </request>
+
+    <request name="PrintQueryScreens" opcode="22">
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="listCount" />
+            <pad bytes="20" />
+            <list type="WINDOW" name="roots">
+                <fieldref>listCount</fieldref>
+            </list>
+            <!-- There may be a WINDOW rootWindow here... -->
+        </reply>
+    </request>
+
+    <request name="PrintSetImageResolution" opcode="23">
+        <field type="PCONTEXT" name="context" />
+        <field type="CARD16" name="image_resolution" />
+        <reply>
+            <field type="BOOL" name="status" />
+            <field type="CARD16" name="previous_resolutions" />
+        </reply>
+    </request>
+
+    <request name="PrintGetImageResolution" opcode="24">
+        <field type="PCONTEXT" name="context" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="image_resolution" />
+        </reply>
+    </request>
+
+
+    <!-- Events -->
+    <event name="Notify" number="0">
+        <field type="CARD8" name="detail" />
+        <field type="PCONTEXT" name="context" />
+        <field type="BOOL" name="cancel" />
+    </event>
+
+    <event name="AttributNotify" number="1">
+        <field type="CARD8" name="detail" />
+        <field type="PCONTEXT" name="context" />
+    </event>
+
+    <!-- Errors -->
+    <error name="BadContext" number="0" />
+    <error name="BadSequence" number="1" />
+
+</xcb>
+
diff --git a/third_party/xcbproto/src/src/xproto.xml b/third_party/xcbproto/src/src/xproto.xml
new file mode 100644
index 000000000000..dea48dfed70f
--- /dev/null
+++ b/third_party/xcbproto/src/src/xproto.xml
@@ -0,0 +1,5620 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2001-2004 Bart Massey, Jamey Sharp, and Josh Triplett.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<xcb header="xproto">
+  <!-- Core protocol types -->
+  
+  <struct name="CHAR2B">
+    <field type="CARD8" name="byte1" />
+    <field type="CARD8" name="byte2" />
+  </struct>
+  
+  <xidtype name="WINDOW" />
+  
+  <xidtype name="PIXMAP" />
+  
+  <xidtype name="CURSOR" />
+  
+  <xidtype name="FONT" />
+  
+  <xidtype name="GCONTEXT" />
+  
+  <xidtype name="COLORMAP" />
+  
+  <xidtype name="ATOM" />
+  
+  <xidunion name="DRAWABLE">
+    <type>WINDOW</type>
+    <type>PIXMAP</type>
+  </xidunion>
+  
+  <xidunion name="FONTABLE">
+    <type>FONT</type>
+    <type>GCONTEXT</type>
+  </xidunion>
+  
+  <typedef oldname="CARD32" newname="BOOL32" />
+  <typedef oldname="CARD32" newname="VISUALID" />
+
+  <typedef oldname="CARD32" newname="TIMESTAMP" />
+
+  <typedef oldname="CARD32" newname="KEYSYM" />
+
+  <typedef oldname="CARD8" newname="KEYCODE" />
+ 
+  <typedef oldname="CARD32" newname="KEYCODE32" />
+
+  <typedef oldname="CARD8" newname="BUTTON" />
+
+  <struct name="POINT">
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+  </struct>
+
+  <struct name="RECTANGLE">
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+  </struct>
+
+  <struct name="ARC">
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="INT16" name="angle1" />
+    <field type="INT16" name="angle2" />
+  </struct>
+
+  <!-- Connection setup-related types -->
+
+  <struct name="FORMAT">
+    <field type="CARD8" name="depth" />
+    <field type="CARD8" name="bits_per_pixel" />
+    <field type="CARD8" name="scanline_pad" />
+    <pad bytes="5" />
+  </struct>
+
+  <enum name="VisualClass">
+    <item name="StaticGray"> <value>0</value></item>
+    <item name="GrayScale">  <value>1</value></item>
+    <item name="StaticColor"><value>2</value></item>
+    <item name="PseudoColor"><value>3</value></item>
+    <item name="TrueColor">  <value>4</value></item>
+    <item name="DirectColor"><value>5</value></item>
+  </enum>
+
+  <struct name="VISUALTYPE">
+    <field type="VISUALID" name="visual_id" />
+    <field type="CARD8" name="class" enum="VisualClass" />
+    <field type="CARD8" name="bits_per_rgb_value" />
+    <field type="CARD16" name="colormap_entries" />
+    <field type="CARD32" name="red_mask" />
+    <field type="CARD32" name="green_mask" />
+    <field type="CARD32" name="blue_mask" />
+    <pad bytes="4" />
+  </struct>
+
+  <struct name="DEPTH">
+    <field type="CARD8" name="depth" />
+    <pad bytes="1" />
+    <field type="CARD16" name="visuals_len" />
+    <pad bytes="4" />
+    <list type="VISUALTYPE" name="visuals">
+      <fieldref>visuals_len</fieldref>
+    </list>
+  </struct>
+
+  <enum name="EventMask">
+    <item name="NoEvent">           <value>0</value></item>
+    <item name="KeyPress">            <bit>0</bit></item>
+    <item name="KeyRelease">          <bit>1</bit></item>
+    <item name="ButtonPress">         <bit>2</bit></item>
+    <item name="ButtonRelease">       <bit>3</bit></item>
+    <item name="EnterWindow">         <bit>4</bit></item>
+    <item name="LeaveWindow">         <bit>5</bit></item>
+    <item name="PointerMotion">       <bit>6</bit></item>
+    <item name="PointerMotionHint">   <bit>7</bit></item>
+    <item name="Button1Motion">       <bit>8</bit></item>
+    <item name="Button2Motion">       <bit>9</bit></item>
+    <item name="Button3Motion">       <bit>10</bit></item>
+    <item name="Button4Motion">       <bit>11</bit></item>
+    <item name="Button5Motion">       <bit>12</bit></item>
+    <item name="ButtonMotion">        <bit>13</bit></item>
+    <item name="KeymapState">         <bit>14</bit></item>
+    <item name="Exposure">            <bit>15</bit></item>
+    <item name="VisibilityChange">    <bit>16</bit></item>
+    <item name="StructureNotify">     <bit>17</bit></item>
+    <item name="ResizeRedirect">      <bit>18</bit></item>
+    <item name="SubstructureNotify">  <bit>19</bit></item>
+    <item name="SubstructureRedirect"><bit>20</bit></item>
+    <item name="FocusChange">         <bit>21</bit></item>
+    <item name="PropertyChange">      <bit>22</bit></item>
+    <item name="ColorMapChange">      <bit>23</bit></item>
+    <item name="OwnerGrabButton">     <bit>24</bit></item>
+  </enum>
+
+  <enum name="BackingStore">
+    <item name="NotUseful"> <value>0</value></item>
+    <item name="WhenMapped"><value>1</value></item>
+    <item name="Always">    <value>2</value></item>
+  </enum>
+
+  <struct name="SCREEN">
+    <field type="WINDOW" name="root" />
+    <field type="COLORMAP" name="default_colormap" />
+    <field type="CARD32" name="white_pixel" />
+    <field type="CARD32" name="black_pixel" />
+    <field type="CARD32" name="current_input_masks" mask="EventMask" />
+    <field type="CARD16" name="width_in_pixels" />
+    <field type="CARD16" name="height_in_pixels" />
+    <field type="CARD16" name="width_in_millimeters" />
+    <field type="CARD16" name="height_in_millimeters" />
+    <field type="CARD16" name="min_installed_maps" />
+    <field type="CARD16" name="max_installed_maps" />
+    <field type="VISUALID" name="root_visual" />
+    <field type="BYTE" name="backing_stores" enum="BackingStore" />
+    <field type="BOOL" name="save_unders" />
+    <field type="CARD8" name="root_depth" />
+    <field type="CARD8" name="allowed_depths_len" />
+    <list type="DEPTH" name="allowed_depths">
+      <fieldref>allowed_depths_len</fieldref>
+    </list>
+  </struct>
+
+  <struct name="SetupRequest">
+    <field type="CARD8" name="byte_order" />
+    <pad bytes="1" />
+    <field type="CARD16" name="protocol_major_version" />
+    <field type="CARD16" name="protocol_minor_version" />
+    <field type="CARD16" name="authorization_protocol_name_len" />
+    <field type="CARD16" name="authorization_protocol_data_len" />
+    <pad bytes="2" />
+    <list type="char" name="authorization_protocol_name">
+      <fieldref>authorization_protocol_name_len</fieldref>
+    </list>
+    <pad align="4" />
+    <list type="char" name="authorization_protocol_data">
+      <fieldref>authorization_protocol_data_len</fieldref>
+    </list>
+    <pad align="4" />
+  </struct>
+
+  <struct name="SetupFailed">
+    <field type="CARD8" name="status" /> <!-- always 0 -> Failed -->
+    <field type="CARD8" name="reason_len" />
+    <field type="CARD16" name="protocol_major_version" />
+    <field type="CARD16" name="protocol_minor_version" />
+    <field type="CARD16" name="length" />
+    <list type="char" name="reason">
+      <fieldref>reason_len</fieldref>
+    </list>
+  </struct>
+
+  <struct name="SetupAuthenticate">
+    <field type="CARD8" name="status" /> <!-- always 2 -> Authenticate -->
+    <pad bytes="5" />
+    <field type="CARD16" name="length" />
+    <list type="char" name="reason">
+      <op op="*">
+        <fieldref>length</fieldref>
+        <value>4</value>
+      </op>
+    </list>
+  </struct>
+
+  <enum name="ImageOrder">
+    <item name="LSBFirst"><value>0</value></item>
+    <item name="MSBFirst"><value>1</value></item>
+  </enum>
+
+  <struct name="Setup">
+    <field type="CARD8" name="status" /> <!-- always 1 -> Success -->
+    <pad bytes="1" />
+    <field type="CARD16" name="protocol_major_version" />
+    <field type="CARD16" name="protocol_minor_version" />
+    <field type="CARD16" name="length" />
+    <field type="CARD32" name="release_number" />
+    <field type="CARD32" name="resource_id_base" />
+    <field type="CARD32" name="resource_id_mask" />
+    <field type="CARD32" name="motion_buffer_size" />
+    <field type="CARD16" name="vendor_len" />
+    <field type="CARD16" name="maximum_request_length" />
+    <field type="CARD8" name="roots_len" />
+    <field type="CARD8" name="pixmap_formats_len" />
+    <field type="CARD8" name="image_byte_order" enum="ImageOrder" />
+    <field type="CARD8" name="bitmap_format_bit_order" enum="ImageOrder" />
+    <field type="CARD8" name="bitmap_format_scanline_unit" />
+    <field type="CARD8" name="bitmap_format_scanline_pad" />
+    <field type="KEYCODE" name="min_keycode" />
+    <field type="KEYCODE" name="max_keycode" />
+    <pad bytes="4" />
+    <list type="char" name="vendor">
+      <fieldref>vendor_len</fieldref>
+    </list>
+    <pad align="4" />
+    <list type="FORMAT" name="pixmap_formats">
+      <fieldref>pixmap_formats_len</fieldref>
+    </list>
+    <list type="SCREEN" name="roots">
+      <fieldref>roots_len</fieldref>
+    </list>
+  </struct>
+
+  <!-- Core event types -->
+  
+  <enum name="ModMask">
+    <item name="Shift">  <bit>0</bit></item>
+    <item name="Lock">   <bit>1</bit></item>
+    <item name="Control"><bit>2</bit></item>
+    <item name="1">      <bit>3</bit></item>
+    <item name="2">      <bit>4</bit></item>
+    <item name="3">      <bit>5</bit></item>
+    <item name="4">      <bit>6</bit></item>
+    <item name="5">      <bit>7</bit></item>
+    <item name="Any">    <bit>15</bit></item>
+  </enum>
+
+  <enum name="KeyButMask">
+    <item name="Shift">  <bit>0</bit></item>
+    <item name="Lock">   <bit>1</bit></item>
+    <item name="Control"><bit>2</bit></item>
+    <item name="Mod1">   <bit>3</bit></item>
+    <item name="Mod2">   <bit>4</bit></item>
+    <item name="Mod3">   <bit>5</bit></item>
+    <item name="Mod4">   <bit>6</bit></item>
+    <item name="Mod5">   <bit>7</bit></item>
+    <item name="Button1"><bit>8</bit></item>
+    <item name="Button2"><bit>9</bit></item>
+    <item name="Button3"><bit>10</bit></item>
+    <item name="Button4"><bit>11</bit></item>
+    <item name="Button5"><bit>12</bit></item>
+  </enum>
+
+  <enum name="Window">
+    <item name="None"> <value>0</value></item>
+  </enum>
+
+  <event name="KeyPress" number="2">
+    <field type="KEYCODE" name="detail" />
+    <field type="TIMESTAMP" name="time" />
+    <field type="WINDOW" name="root" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="child" altenum="Window" />
+    <field type="INT16" name="root_x" />
+    <field type="INT16" name="root_y" />
+    <field type="INT16" name="event_x" />
+    <field type="INT16" name="event_y" />
+    <field type="CARD16" name="state" mask="KeyButMask" />
+    <field type="BOOL" name="same_screen" />
+    <pad bytes="1" />
+    <doc>
+      <brief>a key was pressed/released</brief>
+      <field name="detail"><![CDATA[
+The keycode (a number representing a physical key on the keyboard) of the key
+which was pressed.
+      ]]></field>
+      <field name="time"><![CDATA[
+Time when the event was generated (in milliseconds).
+      ]]></field>
+      <field name="root"><![CDATA[
+The root window of `child`.
+      ]]></field>
+      <field name="same_screen"><![CDATA[
+Whether the `event` window is on the same screen as the `root` window.
+      ]]></field>
+      <field name="event_x"><![CDATA[
+If `same_screen` is true, this is the X coordinate relative to the `event`
+window's origin. Otherwise, `event_x` will be set to zero.
+      ]]></field>
+      <field name="event_y"><![CDATA[
+If `same_screen` is true, this is the Y coordinate relative to the `event`
+window's origin. Otherwise, `event_y` will be set to zero.
+      ]]></field>
+      <field name="root_x"><![CDATA[
+The X coordinate of the pointer relative to the `root` window at the time of
+the event.
+      ]]></field>
+      <field name="root_y"><![CDATA[
+The Y coordinate of the pointer relative to the `root` window at the time of
+the event.
+      ]]></field>
+      <field name="state"><![CDATA[
+The logical state of the pointer buttons and modifier keys just prior to the
+event.
+      ]]></field>
+      <see type="request" name="GrabKey" />
+      <see type="request" name="GrabKeyboard" />
+    </doc>
+  </event>
+
+  <eventcopy name="KeyRelease" number="3" ref="KeyPress" />
+
+  <enum name="ButtonMask">
+    <item name="1">      <bit>8</bit></item>
+    <item name="2">      <bit>9</bit></item>
+    <item name="3">      <bit>10</bit></item>
+    <item name="4">      <bit>11</bit></item>
+    <item name="5">      <bit>12</bit></item>
+    <item name="Any">    <bit>15</bit></item>
+  </enum>
+
+  <event name="ButtonPress" number="4">
+    <field type="BUTTON" name="detail" />
+    <field type="TIMESTAMP" name="time" />
+    <field type="WINDOW" name="root" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="child" altenum="Window" />
+    <field type="INT16" name="root_x" />
+    <field type="INT16" name="root_y" />
+    <field type="INT16" name="event_x" />
+    <field type="INT16" name="event_y" />
+    <field type="CARD16" name="state" mask="KeyButMask" />
+    <field type="BOOL" name="same_screen" />
+    <pad bytes="1" />
+    <doc>
+      <brief>a mouse button was pressed/released</brief>
+      <field name="detail"><![CDATA[
+The keycode (a number representing a physical key on the keyboard) of the key
+which was pressed.
+      ]]></field>
+      <field name="time"><![CDATA[
+Time when the event was generated (in milliseconds).
+      ]]></field>
+      <field name="root"><![CDATA[
+The root window of `child`.
+      ]]></field>
+      <field name="same_screen"><![CDATA[
+Whether the `event` window is on the same screen as the `root` window.
+      ]]></field>
+      <field name="event_x"><![CDATA[
+If `same_screen` is true, this is the X coordinate relative to the `event`
+window's origin. Otherwise, `event_x` will be set to zero.
+      ]]></field>
+      <field name="event_y"><![CDATA[
+If `same_screen` is true, this is the Y coordinate relative to the `event`
+window's origin. Otherwise, `event_y` will be set to zero.
+      ]]></field>
+      <field name="root_x"><![CDATA[
+The X coordinate of the pointer relative to the `root` window at the time of
+the event.
+      ]]></field>
+      <field name="root_y"><![CDATA[
+The Y coordinate of the pointer relative to the `root` window at the time of
+the event.
+      ]]></field>
+      <field name="state"><![CDATA[
+The logical state of the pointer buttons and modifier keys just prior to the
+event.
+      ]]></field>
+      <see type="request" name="GrabButton" />
+      <see type="request" name="GrabPointer" />
+    </doc>
+  </event>
+
+  <eventcopy name="ButtonRelease" number="5" ref="ButtonPress" />
+
+  <!-- MotionNotify detail -->
+  <enum name="Motion">
+    <item name="Normal"><value>0</value></item>
+    <item name="Hint">  <value>1</value></item>
+  </enum>
+
+  <event name="MotionNotify" number="6">
+    <field type="BYTE" name="detail" enum="Motion" />
+    <field type="TIMESTAMP" name="time" />
+    <field type="WINDOW" name="root" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="child" altenum="Window" />
+    <field type="INT16" name="root_x" />
+    <field type="INT16" name="root_y" />
+    <field type="INT16" name="event_x" />
+    <field type="INT16" name="event_y" />
+    <field type="CARD16" name="state" mask="KeyButMask" />
+    <field type="BOOL" name="same_screen" />
+    <pad bytes="1" />
+    <doc>
+      <brief>a key was pressed</brief>
+      <field name="detail"><![CDATA[
+The keycode (a number representing a physical key on the keyboard) of the key
+which was pressed.
+      ]]></field>
+      <field name="time"><![CDATA[
+Time when the event was generated (in milliseconds).
+      ]]></field>
+      <field name="root"><![CDATA[
+The root window of `child`.
+      ]]></field>
+      <field name="same_screen"><![CDATA[
+Whether the `event` window is on the same screen as the `root` window.
+      ]]></field>
+      <field name="event_x"><![CDATA[
+If `same_screen` is true, this is the X coordinate relative to the `event`
+window's origin. Otherwise, `event_x` will be set to zero.
+      ]]></field>
+      <field name="event_y"><![CDATA[
+If `same_screen` is true, this is the Y coordinate relative to the `event`
+window's origin. Otherwise, `event_y` will be set to zero.
+      ]]></field>
+      <field name="root_x"><![CDATA[
+The X coordinate of the pointer relative to the `root` window at the time of
+the event.
+      ]]></field>
+      <field name="root_y"><![CDATA[
+The Y coordinate of the pointer relative to the `root` window at the time of
+the event.
+      ]]></field>
+      <field name="state"><![CDATA[
+The logical state of the pointer buttons and modifier keys just prior to the
+event.
+      ]]></field>
+      <see type="request" name="GrabKey" />
+      <see type="request" name="GrabKeyboard" />
+    </doc>
+  </event>
+
+  <enum name="NotifyDetail">
+    <item name="Ancestor">        <value>0</value></item>
+    <item name="Virtual">         <value>1</value></item>
+    <item name="Inferior">        <value>2</value></item>
+    <item name="Nonlinear">       <value>3</value></item>
+    <item name="NonlinearVirtual"><value>4</value></item>
+    <item name="Pointer">         <value>5</value></item>
+    <item name="PointerRoot">     <value>6</value></item>
+    <item name="None">            <value>7</value></item>
+  </enum>
+
+  <enum name="NotifyMode">
+    <item name="Normal">      <value>0</value></item>
+    <item name="Grab">        <value>1</value></item>
+    <item name="Ungrab">      <value>2</value></item>
+    <item name="WhileGrabbed"><value>3</value></item>
+  </enum>
+
+  <event name="EnterNotify" number="7">
+    <field type="BYTE" name="detail" enum="NotifyDetail" />
+    <field type="TIMESTAMP" name="time" />
+    <field type="WINDOW" name="root" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="child" altenum="Window" />
+    <field type="INT16" name="root_x" />
+    <field type="INT16" name="root_y" />
+    <field type="INT16" name="event_x" />
+    <field type="INT16" name="event_y" />
+    <field type="CARD16" name="state" mask="KeyButMask" />
+    <field type="BYTE" name="mode" enum="NotifyMode" />
+    <field type="BYTE" name="same_screen_focus" />
+    <doc>
+      <brief>the pointer is in a different window</brief>
+      <field name="event"><![CDATA[
+The window on which the event was generated.
+      ]]></field>
+      <field name="child"><![CDATA[
+If the `event` window has subwindows and the final pointer position is in one
+of them, then `child` is set to that subwindow, `XCB_WINDOW_NONE` otherwise.
+      ]]></field>
+      <field name="root"><![CDATA[
+The root window for the final cursor position.
+      ]]></field>
+      <field name="root_x"><![CDATA[
+The pointer X coordinate relative to `root`'s origin at the time of the event.
+      ]]></field>
+      <field name="root_y"><![CDATA[
+The pointer Y coordinate relative to `root`'s origin at the time of the event.
+      ]]></field>
+      <field name="event_x"><![CDATA[
+If `event` is on the same screen as `root`, this is the pointer X coordinate
+relative to the event window's origin.
+      ]]></field>
+      <field name="event_y"><![CDATA[
+If `event` is on the same screen as `root`, this is the pointer Y coordinate
+relative to the event window's origin.
+      ]]></field>
+      <field name="mode" />
+    </doc>
+  </event>
+
+  <eventcopy name="LeaveNotify" number="8" ref="EnterNotify" />
+
+  <event name="FocusIn" number="9">
+    <field type="BYTE" name="detail" enum="NotifyDetail" />
+    <field type="WINDOW" name="event" />
+    <field type="BYTE" name="mode" enum="NotifyMode" />
+    <pad bytes="3" />
+    <doc>
+      <brief>NOT YET DOCUMENTED</brief>
+      <field name="event"><![CDATA[
+The window on which the focus event was generated. This is the window used by
+the X server to report the event.
+      ]]></field>
+      <!-- enum documentation is sufficient -->
+      <field name="detail" />
+      <field name="mode" />
+    </doc>
+  </event>
+
+  <eventcopy name="FocusOut" number="10" ref="FocusIn" />
+
+  <event name="KeymapNotify" number="11" no-sequence-number="true">
+    <list type="CARD8" name="keys"><value>31</value></list>
+  </event>
+
+  <event name="Expose" number="12">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="CARD16" name="x" />
+    <field type="CARD16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD16" name="count" />
+    <pad bytes="2" />
+    <doc>
+      <brief>NOT YET DOCUMENTED</brief>
+      <field name="window"><![CDATA[
+The exposed (damaged) window.
+      ]]></field>
+      <field name="x"><![CDATA[
+The X coordinate of the left-upper corner of the exposed rectangle, relative to
+the `window`'s origin.
+      ]]></field>
+      <field name="y"><![CDATA[
+The Y coordinate of the left-upper corner of the exposed rectangle, relative to
+the `window`'s origin.
+      ]]></field>
+      <field name="width"><![CDATA[
+The width of the exposed rectangle.
+      ]]></field>
+      <field name="height"><![CDATA[
+The height of the exposed rectangle.
+      ]]></field>
+      <field name="count"><![CDATA[
+The amount of `Expose` events following this one. Simple applications that do
+not want to optimize redisplay by distinguishing between subareas of its window
+can just ignore all Expose events with nonzero counts and perform full
+redisplays on events with zero counts.
+      ]]></field>
+    </doc>
+  </event>
+
+  <event name="GraphicsExposure" number="13">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD16" name="x" />
+    <field type="CARD16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD16" name="minor_opcode" />
+    <field type="CARD16" name="count" />
+    <field type="CARD8" name="major_opcode" />
+    <pad bytes="3" />
+  </event>
+
+  <event name="NoExposure" number="14">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD16" name="minor_opcode" />
+    <field type="CARD8" name="major_opcode" />
+    <pad bytes="1" />
+  </event>
+
+  <enum name="Visibility">
+    <item name="Unobscured">       <value>0</value></item>
+    <item name="PartiallyObscured"><value>1</value></item>
+    <item name="FullyObscured">    <value>2</value></item>
+  </enum>
+
+  <event name="VisibilityNotify" number="15">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="BYTE" name="state" enum="Visibility" />
+    <pad bytes="3" />
+  </event>
+
+  <event name="CreateNotify" number="16">
+    <pad bytes="1" />
+    <field type="WINDOW" name="parent" />
+    <field type="WINDOW" name="window" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD16" name="border_width" />
+    <field type="BOOL" name="override_redirect" />
+    <pad bytes="1" />
+  </event>
+
+  <event name="DestroyNotify" number="17">
+    <pad bytes="1" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="window" />
+    <doc>
+      <brief>a window is destroyed</brief>
+      <field name="event"><![CDATA[
+The reconfigured window or its parent, depending on whether `StructureNotify`
+or `SubstructureNotify` was selected.
+      ]]></field>
+      <field name="window"><![CDATA[
+The window that is destroyed.
+      ]]></field>
+      <see type="request" name="DestroyWindow" />
+    </doc>
+  </event>
+
+  <event name="UnmapNotify" number="18">
+    <pad bytes="1" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="window" />
+    <field type="BOOL" name="from_configure" />
+    <pad bytes="3" />
+    <doc>
+      <brief>a window is unmapped</brief>
+      <field name="event"><![CDATA[
+The reconfigured window or its parent, depending on whether `StructureNotify`
+or `SubstructureNotify` was selected.
+      ]]></field>
+      <field name="window"><![CDATA[
+The window that was unmapped.
+      ]]></field>
+      <field name="from_configure"><![CDATA[
+Set to 1 if the event was generated as a result of a resizing of the window's
+parent when `window` had a win_gravity of `UnmapGravity`.
+      ]]></field>
+      <see type="request" name="UnmapWindow" />
+    </doc>
+  </event>
+
+  <event name="MapNotify" number="19">
+    <pad bytes="1" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="window" />
+    <field type="BOOL" name="override_redirect" />
+    <pad bytes="3" />
+    <doc>
+      <brief>a window was mapped</brief>
+      <field name="event"><![CDATA[
+The window which was mapped or its parent, depending on whether
+`StructureNotify` or `SubstructureNotify` was selected.
+      ]]></field>
+      <field name="window"><![CDATA[
+The window that was mapped.
+      ]]></field>
+      <field name="override_redirect"><![CDATA[
+Window managers should ignore this window if `override_redirect` is 1.
+      ]]></field>
+      <see type="request" name="MapWindow" />
+    </doc>
+  </event>
+
+  <event name="MapRequest" number="20">
+    <pad bytes="1" />
+    <field type="WINDOW" name="parent" />
+    <field type="WINDOW" name="window" />
+    <doc>
+      <brief>window wants to be mapped</brief>
+      <field name="parent"><![CDATA[
+The parent of `window`.
+      ]]></field>
+      <field name="window"><![CDATA[
+The window to be mapped.
+      ]]></field>
+      <see type="request" name="MapWindow" />
+    </doc>
+  </event>
+
+  <event name="ReparentNotify" number="21">
+    <pad bytes="1" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="window" />
+    <field type="WINDOW" name="parent" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="BOOL" name="override_redirect" />
+    <pad bytes="3" />
+  </event>
+
+  <event name="ConfigureNotify" number="22">
+    <pad bytes="1" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="window" />
+    <field type="WINDOW" name="above_sibling" altenum="Window" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD16" name="border_width" />
+    <field type="BOOL" name="override_redirect" />
+    <pad bytes="1" />
+    <doc>
+      <brief>NOT YET DOCUMENTED</brief>
+      <field name="event"><![CDATA[
+The reconfigured window or its parent, depending on whether `StructureNotify`
+or `SubstructureNotify` was selected.
+      ]]></field>
+      <field name="window"><![CDATA[
+The window whose size, position, border, and/or stacking order was changed.
+      ]]></field>
+      <field name="above_sibling"><![CDATA[
+If `XCB_NONE`, the `window` is on the bottom of the stack with respect to
+sibling windows. However, if set to a sibling window, the `window` is placed on
+top of this sibling window.
+      ]]></field>
+      <field name="x"><![CDATA[
+The X coordinate of the upper-left outside corner of `window`, relative to the
+parent window's origin.
+      ]]></field>
+      <field name="y"><![CDATA[
+The Y coordinate of the upper-left outside corner of `window`, relative to the
+parent window's origin.
+      ]]></field>
+      <field name="width"><![CDATA[
+The inside width of `window`, not including the border.
+      ]]></field>
+      <field name="height"><![CDATA[
+The inside height of `window`, not including the border.
+      ]]></field>
+      <field name="border_width"><![CDATA[
+The border width of `window`.
+      ]]></field>
+      <field name="override_redirect"><![CDATA[
+Window managers should ignore this window if `override_redirect` is 1.
+      ]]></field>
+      <see type="request" name="FreeColormap" />
+    </doc>
+  </event>
+
+  <event name="ConfigureRequest" number="23">
+    <field type="BYTE" name="stack_mode" enum="StackMode" />
+    <field type="WINDOW" name="parent" />
+    <field type="WINDOW" name="window" />
+    <field type="WINDOW" name="sibling" altenum="Window" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD16" name="border_width" />
+    <field type="CARD16" name="value_mask" mask="ConfigWindow" />
+  </event>
+
+  <event name="GravityNotify" number="24">
+    <pad bytes="1" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="window" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+  </event>
+
+  <event name="ResizeRequest" number="25">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+  </event>
+
+  <enum name="Place">
+    <item name="OnTop">   <value>0</value></item>
+    <item name="OnBottom"><value>1</value></item>
+    <doc>
+      <field name="OnTop"><![CDATA[
+The window is now on top of all siblings.
+      ]]></field>
+      <field name="OnBottom"><![CDATA[
+The window is now below all siblings.
+      ]]></field>
+    </doc>
+  </enum>
+
+  <event name="CirculateNotify" number="26">
+    <pad bytes="1" />
+    <field type="WINDOW" name="event" />
+    <field type="WINDOW" name="window" />
+    <pad bytes="4" />
+    <field type="BYTE" name="place" enum="Place" />
+    <pad bytes="3" />
+    <doc>
+      <brief>NOT YET DOCUMENTED</brief>
+      <field name="event"><![CDATA[
+Either the restacked window or its parent, depending on whether
+`StructureNotify` or `SubstructureNotify` was selected.
+      ]]></field>
+      <field name="window"><![CDATA[
+The restacked window.
+      ]]></field>
+      <!-- the enum doc is sufficient -->
+      <field name="place" />
+      <see type="request" name="CirculateWindow" />
+    </doc>
+  </event>
+
+  <eventcopy name="CirculateRequest" number="27" ref="CirculateNotify" />
+
+  <enum name="Property">
+    <item name="NewValue"><value>0</value></item>
+    <item name="Delete">  <value>1</value></item>
+  </enum>
+
+  <event name="PropertyNotify" number="28">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="ATOM" name="atom" />
+    <field type="TIMESTAMP" name="time" />
+    <field type="BYTE" name="state" enum="Property" />
+    <pad bytes="3" />
+    <doc>
+      <brief>a window property changed</brief>
+      <field name="window"><![CDATA[
+The window whose associated property was changed.
+      ]]></field>
+      <field name="atom"><![CDATA[
+The property's atom, to indicate which property was changed.
+      ]]></field>
+      <field name="time"><![CDATA[
+A timestamp of the server time when the property was changed.
+      ]]></field>
+      <!-- enum documentation is sufficient -->
+      <field name="state" />
+      <see type="request" name="ChangeProperty" />
+    </doc>
+  </event>
+
+  <event name="SelectionClear" number="29">
+    <pad bytes="1" />
+    <field type="TIMESTAMP" name="time" />
+    <field type="WINDOW" name="owner" />
+    <field type="ATOM" name="selection" />
+  </event>
+
+  <enum name="Time">
+    <item name="CurrentTime"> <value>0</value> </item>
+  </enum>
+
+  <enum name="Atom">
+    <item name="None"> <value>0</value></item>
+    <item name="Any">  <value>0</value></item>
+    <item name="PRIMARY">              <value>1</value> </item>
+    <item name="SECONDARY">            <value>2</value> </item>
+    <item name="ARC">                  <value>3</value> </item>
+    <item name="ATOM">                 <value>4</value> </item>
+    <item name="BITMAP">               <value>5</value> </item>
+    <item name="CARDINAL">             <value>6</value> </item>
+    <item name="COLORMAP">             <value>7</value> </item>
+    <item name="CURSOR">               <value>8</value> </item>
+    <item name="CUT_BUFFER0">          <value>9</value> </item>
+    <item name="CUT_BUFFER1">          <value>10</value> </item>
+    <item name="CUT_BUFFER2">          <value>11</value> </item>
+    <item name="CUT_BUFFER3">          <value>12</value> </item>
+    <item name="CUT_BUFFER4">          <value>13</value> </item>
+    <item name="CUT_BUFFER5">          <value>14</value> </item>
+    <item name="CUT_BUFFER6">          <value>15</value> </item>
+    <item name="CUT_BUFFER7">          <value>16</value> </item>
+    <item name="DRAWABLE">             <value>17</value> </item>
+    <item name="FONT">                 <value>18</value> </item>
+    <item name="INTEGER">              <value>19</value> </item>
+    <item name="PIXMAP">               <value>20</value> </item>
+    <item name="POINT">                <value>21</value> </item>
+    <item name="RECTANGLE">            <value>22</value> </item>
+    <item name="RESOURCE_MANAGER">     <value>23</value> </item>
+    <item name="RGB_COLOR_MAP">        <value>24</value> </item>
+    <item name="RGB_BEST_MAP">         <value>25</value> </item>
+    <item name="RGB_BLUE_MAP">         <value>26</value> </item>
+    <item name="RGB_DEFAULT_MAP">      <value>27</value> </item>
+    <item name="RGB_GRAY_MAP">         <value>28</value> </item>
+    <item name="RGB_GREEN_MAP">        <value>29</value> </item>
+    <item name="RGB_RED_MAP">          <value>30</value> </item>
+    <item name="STRING">               <value>31</value> </item>
+    <item name="VISUALID">             <value>32</value> </item>
+    <item name="WINDOW">               <value>33</value> </item>
+    <item name="WM_COMMAND">           <value>34</value> </item>
+    <item name="WM_HINTS">             <value>35</value> </item>
+    <item name="WM_CLIENT_MACHINE">    <value>36</value> </item>
+    <item name="WM_ICON_NAME">         <value>37</value> </item>
+    <item name="WM_ICON_SIZE">         <value>38</value> </item>
+    <item name="WM_NAME">              <value>39</value> </item>
+    <item name="WM_NORMAL_HINTS">      <value>40</value> </item>
+    <item name="WM_SIZE_HINTS">        <value>41</value> </item>
+    <item name="WM_ZOOM_HINTS">        <value>42</value> </item>
+    <item name="MIN_SPACE">            <value>43</value> </item>
+    <item name="NORM_SPACE">           <value>44</value> </item>
+    <item name="MAX_SPACE">            <value>45</value> </item>
+    <item name="END_SPACE">            <value>46</value> </item>
+    <item name="SUPERSCRIPT_X">        <value>47</value> </item>
+    <item name="SUPERSCRIPT_Y">        <value>48</value> </item>
+    <item name="SUBSCRIPT_X">          <value>49</value> </item>
+    <item name="SUBSCRIPT_Y">          <value>50</value> </item>
+    <item name="UNDERLINE_POSITION">   <value>51</value> </item>
+    <item name="UNDERLINE_THICKNESS">  <value>52</value> </item>
+    <item name="STRIKEOUT_ASCENT">     <value>53</value> </item>
+    <item name="STRIKEOUT_DESCENT">    <value>54</value> </item>
+    <item name="ITALIC_ANGLE">         <value>55</value> </item>
+    <item name="X_HEIGHT">             <value>56</value> </item>
+    <item name="QUAD_WIDTH">           <value>57</value> </item>
+    <item name="WEIGHT">               <value>58</value> </item>
+    <item name="POINT_SIZE">           <value>59</value> </item>
+    <item name="RESOLUTION">           <value>60</value> </item>
+    <item name="COPYRIGHT">            <value>61</value> </item>
+    <item name="NOTICE">               <value>62</value> </item>
+    <item name="FONT_NAME">            <value>63</value> </item>
+    <item name="FAMILY_NAME">          <value>64</value> </item>
+    <item name="FULL_NAME">            <value>65</value> </item>
+    <item name="CAP_HEIGHT">           <value>66</value> </item>
+    <item name="WM_CLASS">             <value>67</value> </item>
+    <item name="WM_TRANSIENT_FOR">     <value>68</value> </item>
+  </enum>
+
+  <event name="SelectionRequest" number="30">
+    <pad bytes="1" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+    <field type="WINDOW" name="owner" />
+    <field type="WINDOW" name="requestor" />
+    <field type="ATOM" name="selection" />
+    <field type="ATOM" name="target" />
+    <field type="ATOM" name="property" altenum="Atom" />
+  </event>
+
+  <event name="SelectionNotify" number="31">
+    <pad bytes="1" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+    <field type="WINDOW" name="requestor" />
+    <field type="ATOM" name="selection" />
+    <field type="ATOM" name="target" />
+    <field type="ATOM" name="property" altenum="Atom" />
+  </event>
+
+  <enum name="ColormapState">
+    <item name="Uninstalled"><value>0</value></item>
+    <item name="Installed">  <value>1</value></item>
+    <doc>
+      <field name="Uninstalled"><![CDATA[
+The colormap was uninstalled.
+      ]]></field>
+      <field name="Installed"><![CDATA[
+The colormap was installed.
+      ]]></field>
+    </doc>
+  </enum>
+
+  <enum name="Colormap">
+    <item name="None"> <value>0</value></item>
+  </enum>
+
+  <event name="ColormapNotify" number="32">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="COLORMAP" name="colormap" altenum="Colormap" />
+    <field type="BOOL" name="new" />
+    <field type="BYTE" name="state" enum="ColormapState" />
+    <pad bytes="2" />
+    <doc>
+      <brief>the colormap for some window changed</brief>
+      <field name="window"><![CDATA[
+The window whose associated colormap is changed, installed or uninstalled.
+      ]]></field>
+      <field name="colormap"><![CDATA[
+The colormap which is changed, installed or uninstalled. This is `XCB_NONE`
+when the colormap is changed by a call to `FreeColormap`.
+      ]]></field>
+      <field name="_new"><![CDATA[
+Indicates whether the colormap was changed (1) or installed/uninstalled (0).
+      ]]></field>
+      <!-- enum doc is sufficient -->
+      <field name="state" />
+      <see type="request" name="FreeColormap" />
+    </doc>
+  </event>
+
+  <union name="ClientMessageData">
+    <!-- The format member of the ClientMessage event determines which array
+         to use. -->
+    <list type="CARD8"  name="data8" ><value>20</value></list> <!--  8 -->
+    <list type="CARD16" name="data16"><value>10</value></list> <!-- 16 -->
+    <list type="CARD32" name="data32"><value>5</value></list>  <!-- 32 -->
+  </union>
+
+  <event name="ClientMessage" number="33">
+    <field type="CARD8" name="format" /> <!-- 8, 16, or 32. -->
+    <field type="WINDOW" name="window" />
+    <field type="ATOM" name="type" />
+    <field type="ClientMessageData" name="data" />
+    <doc>
+      <brief>NOT YET DOCUMENTED</brief>
+      <description><![CDATA[
+This event represents a ClientMessage, sent by another X11 client. An example
+is a client sending the `_NET_WM_STATE` ClientMessage to the root window
+to indicate the fullscreen window state, effectively requesting that the window
+manager puts it into fullscreen mode.
+      ]]></description>
+      <field name="format"><![CDATA[
+Specifies how to interpret `data`. Can be either 8, 16 or 32.
+      ]]></field>
+      <field name="type"><![CDATA[
+An atom which indicates how the data should be interpreted by the receiving
+client.
+      ]]></field>
+      <field name="data"><![CDATA[
+The data itself (20 bytes max).
+      ]]></field>
+      <see type="request" name="SendEvent" />
+    </doc>
+  </event>
+
+  <enum name="Mapping">
+    <item name="Modifier"><value>0</value></item>
+    <item name="Keyboard"><value>1</value></item>
+    <item name="Pointer"> <value>2</value></item>
+  </enum>
+
+  <event name="MappingNotify" number="34">
+    <pad bytes="1" />
+    <field type="BYTE" name="request" enum="Mapping" />
+    <field type="KEYCODE" name="first_keycode" />
+    <field type="CARD8" name="count" />
+    <pad bytes="1" />
+    <doc>
+      <brief>keyboard mapping changed</brief>
+      <!-- enum documentation is sufficient -->
+      <field name="request" />
+      <field name="first_keycode"><![CDATA[
+The first number in the range of the altered mapping.
+      ]]></field>
+      <field name="count"><![CDATA[
+The number of keycodes altered.
+      ]]></field>
+    </doc>
+  </event>
+
+  <event name="GeGeneric" number="35" xge="true">
+    <pad bytes="22" />
+    <doc>
+      <brief>generic event (with length)</brief>
+      <field name="extension"><![CDATA[
+The major opcode of the extension creating this event
+      ]]></field>
+      <field name="length"><![CDATA[
+The amount (in 4-byte units) of data beyond 32 bytes
+      ]]></field>
+      <field name="evtype"><![CDATA[
+The extension-specific event type
+      ]]></field>
+    </doc>
+  </event>
+
+  <!-- Core error types -->
+
+
+
+  <error name="Request" number="1">
+    <field type="CARD32" name="bad_value" />
+    <field type="CARD16" name="minor_opcode" />
+    <field type="CARD8" name="major_opcode" />
+    <pad bytes="1" />
+  </error>
+
+  <error name="Value" number="2">
+    <field type="CARD32" name="bad_value" />
+    <field type="CARD16" name="minor_opcode" />
+    <field type="CARD8" name="major_opcode" />
+    <pad bytes="1" />
+  </error>
+
+  <errorcopy name="Window" number="3" ref="Value" />
+  <errorcopy name="Pixmap" number="4" ref="Value" />
+  <errorcopy name="Atom" number="5" ref="Value" />
+  <errorcopy name="Cursor" number="6" ref="Value" />
+  <errorcopy name="Font" number="7" ref="Value" />
+  <errorcopy name="Match" number="8" ref="Request" />
+  <errorcopy name="Drawable" number="9" ref="Value" />
+  <errorcopy name="Access" number="10" ref="Request" />
+  <errorcopy name="Alloc" number="11" ref="Request" />
+  <errorcopy name="Colormap" number="12" ref="Value" />
+  <errorcopy name="GContext" number="13" ref="Value" />
+  <errorcopy name="IDChoice" number="14" ref="Value" />
+  <errorcopy name="Name" number="15" ref="Request" />
+  <errorcopy name="Length" number="16" ref="Request" />
+  <errorcopy name="Implementation" number="17" ref="Request" />
+
+
+
+  <!-- The core requests, in major number order. -->
+  <!-- It is the caller's responsibility to free returned XCB*Rep objects. -->
+
+
+
+  <enum name="WindowClass">
+    <item name="CopyFromParent"><value>0</value></item>
+    <item name="InputOutput">   <value>1</value></item>
+    <item name="InputOnly">     <value>2</value></item>
+  </enum>
+
+  <!-- Window attributes for CreateWindow and ChangeWindowAttributes. -->
+  <enum name="CW">
+    <item name="BackPixmap">      <bit>0</bit></item>
+    <item name="BackPixel">       <bit>1</bit></item>
+    <item name="BorderPixmap">    <bit>2</bit></item>
+    <item name="BorderPixel">     <bit>3</bit></item>
+    <item name="BitGravity">      <bit>4</bit></item>
+    <item name="WinGravity">      <bit>5</bit></item>
+    <item name="BackingStore">    <bit>6</bit></item>
+    <item name="BackingPlanes">   <bit>7</bit></item>
+    <item name="BackingPixel">    <bit>8</bit></item>
+    <item name="OverrideRedirect"><bit>9</bit></item>
+    <item name="SaveUnder">       <bit>10</bit></item>
+    <item name="EventMask">       <bit>11</bit></item>
+    <item name="DontPropagate">   <bit>12</bit></item>
+    <item name="Colormap">        <bit>13</bit></item>
+    <item name="Cursor">          <bit>14</bit></item>
+    <doc>
+      <field name="BackPixmap"><![CDATA[
+Overrides the default background-pixmap. The background pixmap and window must
+have the same root and same depth. Any size pixmap can be used, although some
+sizes may be faster than others.
+
+If `XCB_BACK_PIXMAP_NONE` is specified, the window has no defined background.
+The server may fill the contents with the previous screen contents or with
+contents of its own choosing.
+
+If `XCB_BACK_PIXMAP_PARENT_RELATIVE` is specified, the parent's background is
+used, but the window must have the same depth as the parent (or a Match error
+results).   The parent's background is tracked, and the current version is
+used each time the window background is required.
+      ]]></field>
+      <field name="BackPixel"><![CDATA[
+Overrides `BackPixmap`. A pixmap of undefined size filled with the specified
+background pixel is used for the background. Range-checking is not performed,
+the background pixel is truncated to the appropriate number of bits.
+      ]]></field>
+      <field name="BorderPixmap"><![CDATA[
+Overrides the default border-pixmap. The border pixmap and window must have the
+same root and the same depth. Any size pixmap can be used, although some sizes
+may be faster than others.
+
+The special value `XCB_COPY_FROM_PARENT` means the parent's border pixmap is
+copied (subsequent changes to the parent's border attribute do not affect the
+child), but the window must have the same depth as the parent.
+      ]]></field>
+      <field name="BorderPixel"><![CDATA[
+Overrides `BorderPixmap`. A pixmap of undefined size filled with the specified
+border pixel is used for the border. Range checking is not performed on the
+border-pixel value, it is truncated to the appropriate number of bits.
+      ]]></field>
+      <field name="BitGravity"><![CDATA[
+Defines which region of the window should be retained if the window is resized.
+      ]]></field>
+      <field name="WinGravity"><![CDATA[
+Defines how the window should be repositioned if the parent is resized (see
+`ConfigureWindow`).
+      ]]></field>
+      <field name="BackingStore"><![CDATA[
+A backing-store of `WhenMapped` advises the server that maintaining contents of
+obscured regions when the window is mapped would be beneficial. A backing-store
+of `Always` advises the server that maintaining contents even when the window
+is unmapped would be beneficial. In this case, the server may generate an
+exposure event when the window is created. A value of `NotUseful` advises the
+server that maintaining contents is unnecessary, although a server may still
+choose to maintain contents while the window is mapped. Note that if the server
+maintains contents, then the server should maintain complete contents not just
+the region within the parent boundaries, even if the window is larger than its
+parent. While the server maintains contents, exposure events will not normally
+be generated, but the server may stop maintaining contents at any time.
+      ]]></field>
+      <field name="BackingPlanes"><![CDATA[
+The backing-planes indicates (with bits set to 1) which bit planes of the
+window hold dynamic data that must be preserved in backing-stores and during
+save-unders.
+      ]]></field>
+      <field name="BackingPixel"><![CDATA[
+The backing-pixel specifies what value to use in planes not covered by
+backing-planes. The server is free to save only the specified bit planes in the
+backing-store or save-under and regenerate the remaining planes with the
+specified pixel value. Any bits beyond the specified depth of the window in
+these values are simply ignored.
+      ]]></field>
+      <field name="OverrideRedirect"><![CDATA[
+The override-redirect specifies whether map and configure requests on this
+window should override a SubstructureRedirect on the parent, typically to
+inform a window manager not to tamper with the window.
+      ]]></field>
+      <field name="SaveUnder"><![CDATA[
+If 1, the server is advised that when this window is mapped, saving the
+contents of windows it obscures would be beneficial.
+      ]]></field>
+      <field name="EventMask"><![CDATA[
+The event-mask defines which events the client is interested in for this window
+(or for some event types, inferiors of the window).
+      ]]></field>
+      <field name="DontPropagate"><![CDATA[
+The do-not-propagate-mask defines which events should not be propagated to
+ancestor windows when no client has the event type selected in this window.
+      ]]></field>
+      <field name="Colormap"><![CDATA[
+The colormap specifies the colormap that best reflects the true colors of the window. Servers
+capable of supporting multiple hardware colormaps may use this information, and window man-
+agers may use it for InstallColormap requests. The colormap must have the same visual type
+and root as the window (or a Match error results). If CopyFromParent is specified, the parent's
+colormap is copied (subsequent changes to the parent's colormap attribute do not affect the child).
+However, the window must have the same visual type as the parent (or a Match error results),
+and the parent must not have a colormap of None (or a Match error results). For an explanation
+of None, see FreeColormap request. The colormap is copied by sharing the colormap object
+between the child and the parent, not by making a complete copy of the colormap contents.
+      ]]></field>
+      <field name="Cursor"><![CDATA[
+If a cursor is specified, it will be used whenever the pointer is in the window. If None is speci-
+fied, the parent's cursor will be used when the pointer is in the window, and any change in the
+parent's cursor will cause an immediate change in the displayed cursor.
+      ]]></field>
+    </doc>
+  </enum>
+  
+  <enum name="BackPixmap">
+    <item name="None">          <value>0</value></item>
+    <item name="ParentRelative"><value>1</value></item>
+  </enum>
+
+  <enum name="Gravity">
+    <item name="BitForget"><value>0</value></item>
+    <item name="WinUnmap"> <value>0</value></item>
+    <item name="NorthWest"><value>1</value></item>
+    <item name="North">    <value>2</value></item>
+    <item name="NorthEast"><value>3</value></item>
+    <item name="West">     <value>4</value></item>
+    <item name="Center">   <value>5</value></item>
+    <item name="East">     <value>6</value></item>
+    <item name="SouthWest"><value>7</value></item>
+    <item name="South">    <value>8</value></item>
+    <item name="SouthEast"><value>9</value></item>
+    <item name="Static">   <value>10</value></item>
+  </enum>
+
+  <request name="CreateWindow" opcode="1">
+    <field type="CARD8" name="depth" />
+    <field type="WINDOW" name="wid" />
+    <field type="WINDOW" name="parent" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD16" name="border_width" />
+    <field type="CARD16" name="class" enum="WindowClass" />
+    <field type="VISUALID" name="visual" />
+    <field type="CARD32" name="value_mask" mask="CW" />
+    <switch name="value_list">
+        <fieldref>value_mask</fieldref>
+        <bitcase>
+          <enumref ref="CW">BackPixmap</enumref>
+          <field type="PIXMAP" name="background_pixmap" altenum="BackPixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackPixel</enumref>
+          <field type="CARD32" name="background_pixel" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BorderPixmap</enumref>
+          <field type="PIXMAP" name="border_pixmap" altenum="Pixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BorderPixel</enumref>
+          <field type="CARD32" name="border_pixel" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BitGravity</enumref>
+          <field type="CARD32" name="bit_gravity" enum="Gravity"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">WinGravity</enumref>
+          <field type="CARD32" name="win_gravity" enum="Gravity"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackingStore</enumref>
+          <field type="CARD32" name="backing_store" enum="BackingStore"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackingPlanes</enumref>
+          <field type="CARD32" name="backing_planes" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackingPixel</enumref>
+          <field type="CARD32" name="backing_pixel" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">OverrideRedirect</enumref>
+          <field type="BOOL32" name="override_redirect" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">SaveUnder</enumref>
+          <field type="BOOL32" name="save_under" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">EventMask</enumref>
+          <field type="CARD32" name="event_mask" mask="EventMask"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">DontPropagate</enumref>
+          <field type="CARD32" name="do_not_propogate_mask" mask="EventMask"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">Colormap</enumref>
+          <field type="COLORMAP" name="colormap" altenum="Colormap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">Cursor</enumref>
+          <field type="CURSOR" name="cursor" altenum="Cursor"/>
+        </bitcase>
+    </switch>
+
+    <doc>
+      <brief>Creates a window</brief>
+      <description><![CDATA[
+Creates an unmapped window as child of the specified `parent` window. A
+CreateNotify event will be generated. The new window is placed on top in the
+stacking order with respect to siblings.
+
+The coordinate system has the X axis horizontal and the Y axis vertical with
+the origin [0, 0] at the upper-left corner. Coordinates are integral, in terms
+of pixels, and coincide with pixel centers. Each window and pixmap has its own
+coordinate system. For a window, the origin is inside the border at the inside,
+upper-left corner.
+
+The created window is not yet displayed (mapped), call `xcb_map_window` to
+display it.
+
+The created window will initially use the same cursor as its parent.
+      ]]></description>
+      <field name="wid"><![CDATA[
+The ID with which you will refer to the new window, created by
+`xcb_generate_id`.
+      ]]></field>
+      <field name="depth"><![CDATA[
+Specifies the new window's depth (TODO: what unit?).
+
+The special value `XCB_COPY_FROM_PARENT` means the depth is taken from the
+`parent` window.
+      ]]></field>
+      <field name="visual"><![CDATA[
+Specifies the id for the new window's visual.
+
+The special value `XCB_COPY_FROM_PARENT` means the visual is taken from the
+`parent` window.
+      ]]></field>
+      <field name="class"></field>
+      <field name="parent"><![CDATA[
+The parent window of the new window.
+      ]]></field>
+      <field name="border_width"><![CDATA[
+      TODO:
+
+Must be zero if the `class` is `InputOnly` or a `xcb_match_error_t` occurs.
+      ]]></field>
+      <field name="x"><![CDATA[The X coordinate of the new window.]]></field>
+      <field name="y"><![CDATA[The Y coordinate of the new window.]]></field>
+      <field name="width"><![CDATA[The width of the new window.]]></field>
+      <field name="height"><![CDATA[The height of the new window.]]></field>
+      <error type="Colormap"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Match"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Cursor"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Pixmap"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Window"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Alloc"><![CDATA[
+The X server could not allocate the requested resources (no memory?).
+      ]]></error>
+      <see type="function" name="xcb_generate_id" />
+      <see type="request" name="MapWindow" />
+      <see type="event" name="CreateNotify" />
+    </doc>
+
+  </request>
+
+  <request name="ChangeWindowAttributes" opcode="2">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="CARD32" name="value_mask" mask="CW" />
+    <switch name="value_list">
+        <fieldref>value_mask</fieldref>
+        <bitcase>
+          <enumref ref="CW">BackPixmap</enumref>
+          <field type="PIXMAP" name="background_pixmap" altenum="BackPixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackPixel</enumref>
+          <field type="CARD32" name="background_pixel" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BorderPixmap</enumref>
+          <field type="PIXMAP" name="border_pixmap" altenum="Pixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BorderPixel</enumref>
+          <field type="CARD32" name="border_pixel" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BitGravity</enumref>
+          <field type="CARD32" name="bit_gravity" enum="Gravity"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">WinGravity</enumref>
+          <field type="CARD32" name="win_gravity" enum="Gravity"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackingStore</enumref>
+          <field type="CARD32" name="backing_store" enum="BackingStore"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackingPlanes</enumref>
+          <field type="CARD32" name="backing_planes" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">BackingPixel</enumref>
+          <field type="CARD32" name="backing_pixel" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">OverrideRedirect</enumref>
+          <field type="BOOL32" name="override_redirect" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">SaveUnder</enumref>
+          <field type="BOOL32" name="save_under" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">EventMask</enumref>
+          <field type="CARD32" name="event_mask" mask="EventMask"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">DontPropagate</enumref>
+          <field type="CARD32" name="do_not_propogate_mask" mask="EventMask"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">Colormap</enumref>
+          <field type="COLORMAP" name="colormap" altenum="Colormap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="CW">Cursor</enumref>
+          <field type="CURSOR" name="cursor" altenum="Cursor"/>
+        </bitcase>
+    </switch>
+
+    <doc>
+      <brief>change window attributes</brief>
+      <description><![CDATA[
+Changes the attributes specified by `value_mask` for the specified `window`.
+      ]]></description>
+      <field name="window"><![CDATA[
+The window to change.
+      ]]></field>
+      <!-- the enum documentation is good enough. -->
+      <field name="value_mask" />
+      <field name="value_list"><![CDATA[
+Values for each of the attributes specified in the bitmask `value_mask`. The
+order has to correspond to the order of possible `value_mask` bits. See the
+example.
+      ]]></field>
+      <error type="Access"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Colormap"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Cursor"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Match"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Pixmap"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Window"><![CDATA[
+The specified `window` does not exist.
+      ]]></error>
+    </doc>
+  </request>
+  
+  <enum name="MapState">
+    <item name="Unmapped">  <value>0</value></item>
+    <item name="Unviewable"><value>1</value></item>
+    <item name="Viewable">  <value>2</value></item>
+  </enum>
+
+  <request name="GetWindowAttributes" opcode="3">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <reply>
+      <field type="CARD8" name="backing_store" enum="BackingStore" />
+      <field type="VISUALID" name="visual" />
+      <field type="CARD16" name="class" enum="WindowClass" />
+      <field type="CARD8" name="bit_gravity" enum="Gravity" />
+      <field type="CARD8" name="win_gravity" enum="Gravity" />
+      <field type="CARD32" name="backing_planes" />
+      <field type="CARD32" name="backing_pixel" />
+      <field type="BOOL" name="save_under" />
+      <field type="BOOL" name="map_is_installed" />
+      <field type="CARD8" name="map_state" enum="MapState" />
+      <field type="BOOL" name="override_redirect" />
+      <field type="COLORMAP" name="colormap" altenum="Colormap" />
+      <field type="CARD32" name="all_event_masks" mask="EventMask" />
+      <field type="CARD32" name="your_event_mask" mask="EventMask" />
+      <field type="CARD16" name="do_not_propagate_mask" mask="EventMask" />
+      <pad bytes="2" />
+      <doc>
+        <field name="override_redirect"><![CDATA[
+Window managers should ignore this window if `override_redirect` is 1.
+        ]]></field>
+        <field name="visual"><![CDATA[
+The associated visual structure of `window`.
+        ]]></field>
+        <field name="backing_planes"><![CDATA[
+Planes to be preserved if possible.
+        ]]></field>
+        <field name="backing_pixel"><![CDATA[
+Value to be used when restoring planes.
+        ]]></field>
+        <field name="save_under"><![CDATA[
+Boolean, should bits under be saved?
+        ]]></field>
+        <field name="colormap"><![CDATA[
+Color map to be associated with window.
+        ]]></field>
+        <field name="all_event_masks"><![CDATA[
+Set of events all people have interest in.
+        ]]></field>
+        <field name="your_event_mask"><![CDATA[
+My event mask.
+        ]]></field>
+        <field name="do_not_propagate_mask"><![CDATA[
+Set of events that should not propagate.
+        ]]></field>
+        <!-- enum documentation is sufficient for these fields -->
+        <field name="backing_store" />
+        <field name="class" />
+        <field name="bit_gravity" />
+        <field name="win_gravity" />
+        <field name="map_state" />
+      </doc>
+    </reply>
+    <doc>
+      <brief>Gets window attributes</brief>
+      <description><![CDATA[
+Gets the current attributes for the specified `window`.
+      ]]></description>
+      <field name="window"><![CDATA[The window to get the attributes from.]]></field>
+      <error type="Window"><![CDATA[
+The specified `window` does not exist.
+      ]]></error>
+      <error type="Drawable"><![CDATA[
+TODO: reasons?
+      ]]></error>
+    </doc>
+
+  </request>
+
+  <request name="DestroyWindow" opcode="4">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <doc>
+      <brief>Destroys a window</brief>
+      <description><![CDATA[
+Destroys the specified window and all of its subwindows. A DestroyNotify event
+is generated for each destroyed window (a DestroyNotify event is first generated
+for any given window's inferiors). If the window was mapped, it will be
+automatically unmapped before destroying.
+
+Calling DestroyWindow on the root window will do nothing.
+      ]]></description>
+      <field name="window"><![CDATA[The window to destroy.]]></field>
+      <error type="Window"><![CDATA[
+The specified window does not exist.
+      ]]></error>
+      <see type="event" name="DestroyNotify" />
+      <see type="request" name="MapWindow" />
+      <see type="request" name="UnmapWindow" />
+    </doc>
+  </request>
+
+  <request name="DestroySubwindows" opcode="5">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+  </request>
+  
+  <enum name="SetMode">
+    <item name="Insert"><value>0</value></item>
+    <item name="Delete"><value>1</value></item>
+  </enum>
+
+  <request name="ChangeSaveSet" opcode="6">
+    <field type="BYTE" name="mode" enum="SetMode" />
+    <field type="WINDOW" name="window" />
+    <doc>
+      <brief>Changes a client's save set</brief>
+      <description><![CDATA[
+TODO: explain what the save set is for.
+
+This function either adds or removes the specified window to the client's (your
+application's) save set.
+      ]]></description>
+      <field name="mode"><![CDATA[Insert to add the specified window to the save set or Delete to delete it from the save set.]]></field>
+      <field name="window"><![CDATA[The window to add or delete to/from your save set.]]></field>
+      <error type="Match"><![CDATA[
+You created the specified window. This does not make sense, you can only add
+windows created by other clients to your save set.
+      ]]></error>
+      <error type="Value"><![CDATA[
+You specified an invalid mode.
+      ]]></error>
+      <error type="Window"><![CDATA[
+The specified window does not exist.
+      ]]></error>
+      <see type="request" name="ReparentWindow" />
+    </doc>
+  </request>
+
+  <request name="ReparentWindow" opcode="7">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="WINDOW" name="parent" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <doc>
+      <brief>Reparents a window</brief>
+      <description><![CDATA[
+Makes the specified window a child of the specified parent window. If the
+window is mapped, it will automatically be unmapped before reparenting and
+re-mapped after reparenting. The window is placed in the stacking order on top
+with respect to sibling windows.
+
+After reparenting, a ReparentNotify event is generated.
+      ]]></description>
+      <field name="window"><![CDATA[The window to reparent.]]></field>
+      <field name="parent"><![CDATA[The new parent of the window.]]></field>
+      <field name="x"><![CDATA[
+The X position of the window within its new parent.
+      ]]></field>
+      <field name="y"><![CDATA[
+The Y position of the window within its new parent.
+      ]]></field>
+      <error type="Match"><![CDATA[
+The new parent window is not on the same screen as the old parent window.
+
+The new parent window is the specified window or an inferior of the specified window.
+
+The new parent is InputOnly and the window is not.
+
+The specified window has a ParentRelative background and the new parent window is not the same depth as the specified window.
+      ]]></error>
+      <error type="Window"><![CDATA[
+The specified window does not exist.
+      ]]></error>
+      <see type="event" name="ReparentNotify" />
+      <see type="request" name="MapWindow" />
+      <see type="request" name="UnmapWindow" />
+    </doc>
+  </request>
+
+  <request name="MapWindow" opcode="8">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <doc>
+      <brief>Makes a window visible</brief>
+      <description><![CDATA[
+Maps the specified window. This means making the window visible (as long as its
+parent is visible).
+
+This MapWindow request will be translated to a MapRequest request if a window
+manager is running. The window manager then decides to either map the window or
+not. Set the override-redirect window attribute to true if you want to bypass
+this mechanism.
+
+If the window manager decides to map the window (or if no window manager is
+running), a MapNotify event is generated.
+
+If the window becomes viewable and no earlier contents for it are remembered,
+the X server tiles the window with its background. If the window's background
+is undefined, the existing screen contents are not altered, and the X server
+generates zero or more Expose events.
+
+If the window type is InputOutput, an Expose event will be generated when the
+window becomes visible. The normal response to an Expose event should be to
+repaint the window.
+      ]]></description>
+      <field name="window"><![CDATA[
+The window to make visible.
+]]></field>
+      <error type="Match"><![CDATA[
+The specified window does not exist.
+      ]]></error>
+      <see type="event" name="MapNotify" />
+      <see type="event" name="Expose" />
+      <see type="request" name="UnmapWindow" />
+    </doc>
+  </request>
+
+  <request name="MapSubwindows" opcode="9">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+  </request>
+
+  <request name="UnmapWindow" opcode="10">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <doc>
+      <brief>Makes a window invisible</brief>
+      <description><![CDATA[
+Unmaps the specified window. This means making the window invisible (and all
+its child windows).
+
+Unmapping a window leads to the `UnmapNotify` event being generated. Also,
+`Expose` events are generated for formerly obscured windows.
+      ]]></description>
+      <field name="window"><![CDATA[
+The window to make invisible.
+]]></field>
+      <error type="Window"><![CDATA[
+The specified window does not exist.
+      ]]></error>
+      <see type="event" name="UnmapNotify" />
+      <see type="event" name="Expose" />
+      <see type="request" name="MapWindow" />
+    </doc>
+  </request>
+
+  <request name="UnmapSubwindows" opcode="11">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+  </request>
+  
+  <enum name="ConfigWindow">
+    <item name="X">          <bit>0</bit></item>
+    <item name="Y">          <bit>1</bit></item>
+    <item name="Width">      <bit>2</bit></item>
+    <item name="Height">     <bit>3</bit></item>
+    <item name="BorderWidth"><bit>4</bit></item>
+    <item name="Sibling">    <bit>5</bit></item>
+    <item name="StackMode">  <bit>6</bit></item>
+  </enum>
+  
+  <enum name="StackMode">
+    <item name="Above">   <value>0</value></item>
+    <item name="Below">   <value>1</value></item>
+    <item name="TopIf">   <value>2</value></item>
+    <item name="BottomIf"><value>3</value></item>
+    <item name="Opposite"><value>4</value></item>
+  </enum>
+
+  <request name="ConfigureWindow" opcode="12">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="CARD16" name="value_mask" mask="ConfigWindow" />
+    <pad bytes="2" />
+    <switch name="value_list">
+        <fieldref>value_mask</fieldref>
+        <bitcase>
+          <enumref ref="ConfigWindow">X</enumref>
+          <field type="INT32" name="x" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="ConfigWindow">Y</enumref>
+          <field type="INT32" name="y" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="ConfigWindow">Width</enumref>
+          <field type="CARD32" name="width" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="ConfigWindow">Height</enumref>
+          <field type="CARD32" name="height" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="ConfigWindow">BorderWidth</enumref>
+          <field type="CARD32" name="border_width" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="ConfigWindow">Sibling</enumref>
+          <field type="WINDOW" name="sibling" altenum="Window"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="ConfigWindow">StackMode</enumref>
+          <field type="CARD32" name="stack_mode" enum="StackMode"/>
+        </bitcase>
+    </switch>
+   
+    <doc>
+      <brief>Configures window attributes</brief>
+      <description><![CDATA[
+Configures a window's size, position, border width and stacking order.
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Configures the given window to the left upper corner
+ * with a size of 1024x768 pixels.
+ *
+ */
+void my_example(xcb_connection_t *c, xcb_window_t window) {
+    uint16_t mask = 0;
+
+    mask |= XCB_CONFIG_WINDOW_X;
+    mask |= XCB_CONFIG_WINDOW_Y;
+    mask |= XCB_CONFIG_WINDOW_WIDTH;
+    mask |= XCB_CONFIG_WINDOW_HEIGHT;
+
+    const uint32_t values[] = {
+        0,    /* x */
+        0,    /* y */
+        1024, /* width */
+        768   /* height */
+    };
+
+    xcb_configure_window(c, window, mask, values);
+    xcb_flush(c);
+}
+      ]]></example>
+      <field name="window"><![CDATA[The window to configure.]]></field>
+      <field name="value_mask"><![CDATA[Bitmask of attributes to change.]]></field>
+      <field name="value_list"><![CDATA[
+New values, corresponding to the attributes in value_mask. The order has to
+correspond to the order of possible `value_mask` bits. See the example.
+      ]]></field>
+      <error type="Match"><![CDATA[
+You specified a Sibling without also specifying StackMode or the window is not
+actually a Sibling.
+      ]]></error>
+      <error type="Window"><![CDATA[
+The specified window does not exist. TODO: any other reason?
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <see type="event" name="MapNotify" />
+      <see type="event" name="Expose" />
+    </doc>
+  </request>
+
+  <enum name="Circulate">
+    <item name="RaiseLowest"> <value>0</value></item>
+    <item name="LowerHighest"><value>1</value></item>
+  </enum>
+
+  <request name="CirculateWindow" opcode="13">
+    <field type="CARD8" name="direction" enum="Circulate" />
+    <field type="WINDOW" name="window" />
+    <doc>
+      <brief>Change window stacking order</brief>
+      <description><![CDATA[
+If `direction` is `XCB_CIRCULATE_RAISE_LOWEST`, the lowest mapped child (if
+any) will be raised to the top of the stack.
+
+If `direction` is `XCB_CIRCULATE_LOWER_HIGHEST`, the highest mapped child will
+be lowered to the bottom of the stack.
+      ]]></description>
+      <!-- The enums are documented, we have nothing to add. -->
+      <field name="direction" />
+      <field name="window"><![CDATA[
+The window to raise/lower (depending on `direction`).
+      ]]></field>
+      <error type="Window"><![CDATA[
+The specified `window` does not exist.
+      ]]></error>
+      <error type="Value"><![CDATA[
+The specified `direction` is invalid.
+      ]]></error>
+    </doc>
+  </request>
+
+  <request name="GetGeometry" opcode="14">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <reply>
+      <field type="CARD8" name="depth" />
+      <field type="WINDOW" name="root" />
+      <field type="INT16" name="x" />
+      <field type="INT16" name="y" />
+      <field type="CARD16" name="width" />
+      <field type="CARD16" name="height" />
+      <field type="CARD16" name="border_width" />
+      <pad bytes="2" />
+      <doc>
+      <field name="root"><![CDATA[
+Root window of the screen containing `drawable`.
+      ]]></field>
+      <field name="x"><![CDATA[
+The X coordinate of `drawable`. If `drawable` is a window, the coordinate
+specifies the upper-left outer corner relative to its parent's origin. If
+`drawable` is a pixmap, the X coordinate is always 0.
+      ]]></field>
+      <field name="y"><![CDATA[
+The Y coordinate of `drawable`. If `drawable` is a window, the coordinate
+specifies the upper-left outer corner relative to its parent's origin. If
+`drawable` is a pixmap, the Y coordinate is always 0.
+      ]]></field>
+      <field name="width"><![CDATA[
+The width of `drawable`.
+      ]]></field>
+      <field name="height"><![CDATA[
+The height of `drawable`.
+      ]]></field>
+      <field name="border_width"><![CDATA[
+The border width (in pixels).
+      ]]></field>
+      <field name="depth"><![CDATA[
+The depth of the drawable (bits per pixel for the object).
+      ]]></field>
+      </doc>
+    </reply>
+    <doc>
+      <brief>Get current window geometry</brief>
+      <description><![CDATA[
+Gets the current geometry of the specified drawable (either `Window` or `Pixmap`).
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Displays the x and y position of the given window.
+ *
+ */
+void my_example(xcb_connection_t *c, xcb_window_t window) {
+    xcb_get_geometry_cookie_t cookie;
+    xcb_get_geometry_reply_t *reply;
+
+    cookie = xcb_get_geometry(c, window);
+    /* ... do other work here if possible ... */
+    if ((reply = xcb_get_geometry_reply(c, cookie, NULL))) {
+        printf("This window is at %d, %d\\n", reply->x, reply->y);
+    }
+    free(reply);
+}
+      ]]></example>
+      <field name="drawable"><![CDATA[
+The drawable (`Window` or `Pixmap`) of which the geometry will be received.
+      ]]></field>
+      <error type="Drawable"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Window"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <see type="program" name="xwininfo" />
+    </doc>
+  </request>
+
+  <request name="QueryTree" opcode="15">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <reply>
+      <pad bytes="1" />
+      <field type="WINDOW" name="root" />
+      <field type="WINDOW" name="parent" altenum="Window" />
+      <field type="CARD16" name="children_len" />
+      <pad bytes="14" />
+      <list type="WINDOW" name="children">
+        <fieldref>children_len</fieldref>
+      </list>
+      <doc>
+        <field name="root"><![CDATA[
+The root window of `window`.
+        ]]></field>
+        <field name="parent"><![CDATA[
+The parent window of `window`.
+        ]]></field>
+        <field name="children_len"><![CDATA[
+The number of child windows.
+        ]]></field>
+      </doc>
+    </reply>
+    <doc>
+      <brief>query the window tree</brief>
+      <description><![CDATA[
+Gets the root window ID, parent window ID and list of children windows for the
+specified `window`. The children are listed in bottom-to-top stacking order.
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Displays the root, parent and children of the specified window.
+ *
+ */
+void my_example(xcb_connection_t *conn, xcb_window_t window) {
+    xcb_query_tree_cookie_t cookie;
+    xcb_query_tree_reply_t *reply;
+
+    cookie = xcb_query_tree(conn, window);
+    if ((reply = xcb_query_tree_reply(conn, cookie, NULL))) {
+        printf("root = 0x%08x\\n", reply->root);
+        printf("parent = 0x%08x\\n", reply->parent);
+
+        xcb_window_t *children = xcb_query_tree_children(reply);
+        for (int i = 0; i < xcb_query_tree_children_length(reply); i++)
+            printf("child window = 0x%08x\\n", children[i]);
+
+        free(reply);
+    }
+}
+      ]]></example>
+      <field name="window"><![CDATA[
+The `window` to query.
+      ]]></field>
+      <see type="program" name="xwininfo" />
+    </doc>
+  </request>
+
+  <request name="InternAtom" opcode="16">
+    <field type="BOOL" name="only_if_exists" />
+    <field type="CARD16" name="name_len" />
+    <pad bytes="2" />
+    <list type="char" name="name">
+      <fieldref>name_len</fieldref>
+    </list>
+    <reply>
+      <pad bytes="1" />
+      <field type="ATOM" name="atom" altenum="Atom" />
+    </reply>
+    <doc>
+      <brief>Get atom identifier by name</brief>
+      <description><![CDATA[
+Retrieves the identifier (xcb_atom_t TODO) for the atom with the specified
+name. Atoms are used in protocols like EWMH, for example to store window titles
+(`_NET_WM_NAME` atom) as property of a window.
+
+If `only_if_exists` is 0, the atom will be created if it does not already exist.
+If `only_if_exists` is 1, `XCB_ATOM_NONE` will be returned if the atom does
+not yet exist.
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Resolves the _NET_WM_NAME atom.
+ *
+ */
+void my_example(xcb_connection_t *c) {
+    xcb_intern_atom_cookie_t cookie;
+    xcb_intern_atom_reply_t *reply;
+
+    cookie = xcb_intern_atom(c, 0, strlen("_NET_WM_NAME"), "_NET_WM_NAME");
+    /* ... do other work here if possible ... */
+    if ((reply = xcb_intern_atom_reply(c, cookie, NULL))) {
+        printf("The _NET_WM_NAME atom has ID %u\n", reply->atom);
+        free(reply);
+    }
+}
+      ]]></example>
+      <field name="name_len"><![CDATA[
+The length of the following `name`.
+      ]]></field>
+      <field name="name"><![CDATA[
+The name of the atom.
+      ]]></field>
+      <field name="only_if_exists"><![CDATA[
+Return a valid atom id only if the atom already exists.
+      ]]></field>
+      <error type="Alloc"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Value"><![CDATA[
+A value other than 0 or 1 was specified for `only_if_exists`.
+      ]]></error>
+      <see type="program" name="xlsatoms" />
+      <see type="request" name="GetAtomName" />
+    </doc>
+
+  </request>
+
+  <request name="GetAtomName" opcode="17">
+    <pad bytes="1" />
+    <field type="ATOM" name="atom" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="name_len" />
+      <pad bytes="22" />
+      <list type="char" name="name">
+        <fieldref>name_len</fieldref>
+      </list>
+    </reply>
+  </request>
+  
+  <enum name="PropMode">
+    <item name="Replace"><value>0</value></item>
+    <item name="Prepend"><value>1</value></item>
+    <item name="Append"> <value>2</value></item>
+    <doc>
+      <field name="Replace"><![CDATA[
+Discard the previous property value and store the new data.
+      ]]></field>
+      <field name="Prepend"><![CDATA[
+Insert the new data before the beginning of existing data. The `format` must
+match existing property value. If the property is undefined, it is treated as
+defined with the correct type and format with zero-length data.
+      ]]></field>
+      <field name="Append"><![CDATA[
+Insert the new data after the beginning of existing data. The `format` must
+match existing property value. If the property is undefined, it is treated as
+defined with the correct type and format with zero-length data.
+      ]]></field>
+    </doc>
+  </enum>
+
+  <request name="ChangeProperty" opcode="18">
+    <field type="CARD8" name="mode" enum="PropMode" />
+    <field type="WINDOW" name="window" />
+    <field type="ATOM" name="property" />
+    <field type="ATOM" name="type" />
+    <field type="CARD8" name="format" />
+    <pad bytes="3" />
+    <field type="CARD32" name="data_len" />
+    <list type="void" name="data">
+      <op op="/">
+        <op op="*">
+          <fieldref>data_len</fieldref>
+          <fieldref>format</fieldref>
+        </op>
+        <value>8</value>
+      </op>
+    </list>
+    <doc>
+      <brief>Changes a window property</brief>
+      <description><![CDATA[
+Sets or updates a property on the specified `window`. Properties are for
+example the window title (`WM_NAME`) or its minimum size (`WM_NORMAL_HINTS`).
+Protocols such as EWMH also use properties - for example EWMH defines the
+window title, encoded as UTF-8 string, in the `_NET_WM_NAME` property.
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Sets the WM_NAME property of the window to "XCB Example".
+ *
+ */
+void my_example(xcb_connection_t *conn, xcb_window_t window) {
+    xcb_change_property(conn,
+        XCB_PROP_MODE_REPLACE,
+        window,
+        XCB_ATOM_WM_NAME,
+        XCB_ATOM_STRING,
+        8,
+        strlen("XCB Example"),
+        "XCB Example");
+    xcb_flush(conn);
+}
+      ]]></example>
+      <field name="window"><![CDATA[
+The window whose property you want to change.
+      ]]></field>
+      <!-- the enum doc is sufficient. -->
+      <field name="mode" />
+      <field name="property"><![CDATA[
+The property you want to change (an atom).
+      ]]></field>
+      <field name="type"><![CDATA[
+The type of the property you want to change (an atom).
+      ]]></field>
+      <field name="format"><![CDATA[
+Specifies whether the data should be viewed as a list of 8-bit, 16-bit or
+32-bit quantities. Possible values are 8, 16 and 32. This information allows
+the X server to correctly perform byte-swap operations as necessary.
+      ]]></field>
+      <field name="data_len"><![CDATA[
+Specifies the number of elements (see `format`).
+      ]]></field>
+      <field name="data"><![CDATA[
+The property data.
+      ]]></field>
+      <error type="Match"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Window"><![CDATA[
+The specified `window` does not exist.
+      ]]></error>
+      <error type="Atom"><![CDATA[
+`property` or `type` do not refer to a valid atom.
+      ]]></error>
+      <error type="Alloc"><![CDATA[
+The X server could not store the property (no memory?).
+      ]]></error>
+      <see type="request" name="InternAtom" />
+      <see type="program" name="xprop" />
+    </doc>
+  </request>
+
+  <request name="DeleteProperty" opcode="19">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="ATOM" name="property" />
+  </request>
+  
+  <enum name="GetPropertyType">
+    <item name="Any"><value>0</value></item>
+  </enum>
+
+  <request name="GetProperty" opcode="20">
+    <field type="BOOL" name="delete" />
+    <field type="WINDOW" name="window" />
+    <field type="ATOM" name="property" />
+    <field type="ATOM" name="type" altenum="GetPropertyType" />
+    <field type="CARD32" name="long_offset" />
+    <field type="CARD32" name="long_length" />
+    <reply>
+      <field type="CARD8" name="format" />
+      <field type="ATOM" name="type" />
+      <field type="CARD32" name="bytes_after" />
+      <field type="CARD32" name="value_len" />
+      <pad bytes="12" />
+      <list type="void" name="value">
+        <op op="*">
+          <fieldref>value_len</fieldref>
+          <op op="/">
+            <fieldref>format</fieldref>
+            <value>8</value>
+          </op>
+        </op>
+      </list>
+      <doc>
+      <field name="format"><![CDATA[
+Specifies whether the data should be viewed as a list of 8-bit, 16-bit, or
+32-bit quantities. Possible values are 8, 16, and 32. This information allows
+the X server to correctly perform byte-swap operations as necessary.
+      ]]></field>
+      <field name="type"><![CDATA[
+The actual type of the property (an atom).
+      ]]></field>
+      <field name="bytes_after"><![CDATA[
+The number of bytes remaining to be read in the property if a partial read was
+performed.
+      ]]></field>
+      <field name="value_len"><![CDATA[
+The length of value. You should use the corresponding accessor instead of this
+field.
+      ]]></field>
+      </doc>
+    </reply>
+    <doc>
+      <brief>Gets a window property</brief>
+      <description><![CDATA[
+Gets the specified `property` from the specified `window`. Properties are for
+example the window title (`WM_NAME`) or its minimum size (`WM_NORMAL_HINTS`).
+Protocols such as EWMH also use properties - for example EWMH defines the
+window title, encoded as UTF-8 string, in the `_NET_WM_NAME` property.
+
+TODO: talk about `type`
+
+TODO: talk about `delete`
+
+TODO: talk about the offset/length thing. what's a valid use case?
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Prints the WM_NAME property of the window.
+ *
+ */
+void my_example(xcb_connection_t *c, xcb_window_t window) {
+    xcb_get_property_cookie_t cookie;
+    xcb_get_property_reply_t *reply;
+
+    /* These atoms are predefined in the X11 protocol. */
+    xcb_atom_t property = XCB_ATOM_WM_NAME;
+    xcb_atom_t type = XCB_ATOM_STRING;
+
+    // TODO: a reasonable long_length for WM_NAME?
+    cookie = xcb_get_property(c, 0, window, property, type, 0, 0);
+    if ((reply = xcb_get_property_reply(c, cookie, NULL))) {
+        int len = xcb_get_property_value_length(reply);
+        if (len == 0) {
+            printf("TODO\\n");
+            free(reply);
+            return;
+        }
+        printf("WM_NAME is %.*s\\n", len,
+               (char*)xcb_get_property_value(reply));
+    }
+    free(reply);
+}
+      ]]></example>
+      <field name="window"><![CDATA[
+The window whose property you want to get.
+      ]]></field>
+      <field name="delete"><![CDATA[
+Whether the property should actually be deleted. For deleting a property, the
+specified `type` has to match the actual property type.
+      ]]></field>
+      <field name="property"><![CDATA[
+The property you want to get (an atom).
+      ]]></field>
+      <field name="type"><![CDATA[
+The type of the property you want to get (an atom).
+      ]]></field>
+      <field name="long_offset"><![CDATA[
+Specifies the offset (in 32-bit multiples) in the specified property where the
+data is to be retrieved.
+      ]]></field>
+      <field name="long_length"><![CDATA[
+Specifies how many 32-bit multiples of data should be retrieved (e.g. if you
+set `long_length` to 4, you will receive 16 bytes of data).
+      ]]></field>
+      <error type="Window"><![CDATA[
+The specified `window` does not exist.
+      ]]></error>
+      <error type="Atom"><![CDATA[
+`property` or `type` do not refer to a valid atom.
+      ]]></error>
+      <error type="Value"><![CDATA[
+The specified `long_offset` is beyond the actual property length (e.g. the
+property has a length of 3 bytes and you are setting `long_offset` to 1,
+resulting in a byte offset of 4).
+      ]]></error>
+      <see type="request" name="InternAtom" />
+      <see type="program" name="xprop" />
+    </doc>
+  </request>
+
+  <request name="ListProperties" opcode="21">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="atoms_len" />
+      <pad bytes="22" />
+      <list type="ATOM" name="atoms">
+        <fieldref>atoms_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="SetSelectionOwner" opcode="22">
+    <pad bytes="1" />
+    <field type="WINDOW" name="owner" altenum="Window" />
+    <field type="ATOM" name="selection" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+    <doc>
+      <brief>Sets the owner of a selection</brief>
+      <description><![CDATA[
+Makes `window` the owner of the selection `selection` and updates the
+last-change time of the specified selection.
+
+TODO: briefly explain what a selection is.
+      ]]></description>
+      <field name="selection"><![CDATA[
+The selection.
+      ]]></field>
+      <field name="owner"><![CDATA[
+The new owner of the selection.
+
+The special value `XCB_NONE` means that the selection will have no owner.
+      ]]></field>
+      <field name="time"><![CDATA[
+Timestamp to avoid race conditions when running X over the network.
+
+The selection will not be changed if `time` is earlier than the current
+last-change time of the `selection` or is later than the current X server time.
+Otherwise, the last-change time is set to the specified time.
+
+The special value `XCB_CURRENT_TIME` will be replaced with the current server
+time.
+      ]]></field>
+      <error type="Atom"><![CDATA[
+`selection` does not refer to a valid atom.
+      ]]></error>
+      <see type="request" name="SetSelectionOwner" />
+    </doc>
+
+  </request>
+
+  <request name="GetSelectionOwner" opcode="23">
+    <pad bytes="1" />
+    <field type="ATOM" name="selection" />
+    <reply>
+      <pad bytes="1" />
+      <field type="WINDOW" name="owner" altenum="Window" />
+      <doc>
+        <field name="owner"><![CDATA[
+The current selection owner window.
+        ]]></field>
+      </doc>
+    </reply>
+    <doc>
+      <brief>Gets the owner of a selection</brief>
+      <description><![CDATA[
+Gets the owner of the specified selection.
+
+TODO: briefly explain what a selection is.
+      ]]></description>
+      <field name="selection"><![CDATA[
+The selection.
+      ]]></field>
+      <error type="Atom"><![CDATA[
+`selection` does not refer to a valid atom.
+      ]]></error>
+      <see type="request" name="SetSelectionOwner" />
+    </doc>
+  </request>
+
+  <request name="ConvertSelection" opcode="24">
+    <pad bytes="1" />
+    <field type="WINDOW" name="requestor" />
+    <field type="ATOM" name="selection" />
+    <field type="ATOM" name="target" />
+    <field type="ATOM" name="property" altenum="Atom" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+  </request>
+
+  <enum name="SendEventDest">
+    <item name="PointerWindow"><value>0</value></item>
+    <item name="ItemFocus">    <value>1</value></item>
+  </enum>
+
+  <request name="SendEvent" opcode="25">
+    <field type="BOOL" name="propagate" />
+    <field type="WINDOW" name="destination" altenum="SendEventDest" />
+    <field type="CARD32" name="event_mask" mask="EventMask" />
+    <list type="char" name="event"><value>32</value></list>
+    <doc>
+      <brief>send an event</brief>
+      <description><![CDATA[
+Identifies the `destination` window, determines which clients should receive
+the specified event and ignores any active grabs.
+
+The `event` must be one of the core events or an event defined by an extension,
+so that the X server can correctly byte-swap the contents as necessary. The
+contents of `event` are otherwise unaltered and unchecked except for the
+`send_event` field which is forced to 'true'.
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Tell the given window that it was configured to a size of 800x600 pixels.
+ *
+ */
+void my_example(xcb_connection_t *conn, xcb_window_t window) {
+    /* Every X11 event is 32 bytes long. Therefore, XCB will copy 32 bytes.
+     * In order to properly initialize these bytes, we allocate 32 bytes even
+     * though we only need less for an xcb_configure_notify_event_t */
+    xcb_configure_notify_event_t *event = calloc(32, 1);
+
+    event->event = window;
+    event->window = window;
+    event->response_type = XCB_CONFIGURE_NOTIFY;
+
+    event->x = 0;
+    event->y = 0;
+    event->width = 800;
+    event->height = 600;
+
+    event->border_width = 0;
+    event->above_sibling = XCB_NONE;
+    event->override_redirect = false;
+
+    xcb_send_event(conn, false, window, XCB_EVENT_MASK_STRUCTURE_NOTIFY,
+                   (char*)event);
+    xcb_flush(conn);
+    free(event);
+}
+      ]]></example>
+      <field name="destination"><![CDATA[
+The window to send this event to. Every client which selects any event within
+`event_mask` on `destination` will get the event.
+
+The special value `XCB_SEND_EVENT_DEST_POINTER_WINDOW` refers to the window
+that contains the mouse pointer.
+
+The special value `XCB_SEND_EVENT_DEST_ITEM_FOCUS` refers to the window which
+has the keyboard focus.
+      ]]></field>
+      <field name="event_mask"><![CDATA[
+Event_mask for determining which clients should receive the specified event.
+See `destination` and `propagate`.
+      ]]></field>
+      <field name="propagate"><![CDATA[
+If `propagate` is true and no clients have selected any event on `destination`,
+the destination is replaced with the closest ancestor of `destination` for
+which some client has selected a type in `event_mask` and for which no
+intervening window has that type in its do-not-propagate-mask. If no such
+window exists or if the window is an ancestor of the focus window and
+`InputFocus` was originally specified as the destination, the event is not sent
+to any clients. Otherwise, the event is reported to every client selecting on
+the final destination any of the types specified in `event_mask`.
+      ]]></field>
+      <field name="event"><![CDATA[
+The event to send to the specified `destination`.
+      ]]></field>
+      <error type="Window"><![CDATA[
+The specified `destination` window does not exist.
+      ]]></error>
+      <error type="Value"><![CDATA[
+The given `event` is neither a core event nor an event defined by an extension.
+      ]]></error>
+      <see type="event" name="ConfigureNotify" />
+    </doc>
+  </request>
+
+  <enum name="GrabMode">
+    <item name="Sync"> <value>0</value></item>
+    <item name="Async"><value>1</value></item>
+    <doc>
+      <field name="Sync"><![CDATA[
+The state of the keyboard appears to freeze: No further keyboard events are
+generated by the server until the grabbing client issues a releasing
+`AllowEvents` request or until the keyboard grab is released.
+      ]]></field>
+      <field name="Async"><![CDATA[
+Keyboard event processing continues normally.
+      ]]></field>
+    </doc>
+  </enum>
+
+  <enum name="GrabStatus">
+    <item name="Success">       <value>0</value></item>
+    <item name="AlreadyGrabbed"><value>1</value></item>
+    <item name="InvalidTime">   <value>2</value></item>
+    <item name="NotViewable">   <value>3</value></item>
+    <item name="Frozen">        <value>4</value></item>
+  </enum>
+
+  <enum name="Cursor">
+    <item name="None"> <value>0</value></item>
+  </enum>
+
+  <request name="GrabPointer" opcode="26">
+    <field type="BOOL" name="owner_events" />
+    <field type="WINDOW" name="grab_window" />
+    <field type="CARD16" name="event_mask" mask="EventMask" />
+    <field type="BYTE" name="pointer_mode" enum="GrabMode" />
+    <field type="BYTE" name="keyboard_mode" enum="GrabMode" />
+    <field type="WINDOW" name="confine_to" altenum="Window" />
+    <field type="CURSOR" name="cursor" altenum="Cursor" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+    <reply>
+      <field type="BYTE" name="status" enum="GrabStatus" />
+    </reply>
+    <doc>
+      <brief>Grab the pointer</brief>
+      <description><![CDATA[
+Actively grabs control of the pointer. Further pointer events are reported only to the grabbing client. Overrides any active pointer grab by this client.
+
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Grabs the pointer actively
+ *
+ */
+void my_example(xcb_connection_t *conn, xcb_screen_t *screen, xcb_cursor_t cursor) {
+    xcb_grab_pointer_cookie_t cookie;
+    xcb_grab_pointer_reply_t *reply;
+
+    cookie = xcb_grab_pointer(
+        conn,
+        false,               /* get all pointer events specified by the following mask */
+        screen->root,        /* grab the root window */
+        XCB_NONE,            /* which events to let through */
+        XCB_GRAB_MODE_ASYNC, /* pointer events should continue as normal */
+        XCB_GRAB_MODE_ASYNC, /* keyboard mode */
+        XCB_NONE,            /* confine_to = in which window should the cursor stay */
+        cursor,              /* we change the cursor to whatever the user wanted */
+        XCB_CURRENT_TIME
+    );
+
+    if ((reply = xcb_grab_pointer_reply(conn, cookie, NULL))) {
+        if (reply->status == XCB_GRAB_STATUS_SUCCESS)
+            printf("successfully grabbed the pointer\\n");
+        free(preply);
+    }
+}
+      ]]></example>
+      <field name="event_mask"><![CDATA[
+Specifies which pointer events are reported to the client.
+
+TODO: which values?
+      ]]></field>
+      <field name="confine_to"><![CDATA[
+Specifies the window to confine the pointer in (the user will not be able to
+move the pointer out of that window).
+
+The special value `XCB_NONE` means don't confine the pointer.
+      ]]></field>
+      <field name="cursor"><![CDATA[
+Specifies the cursor that should be displayed or `XCB_NONE` to not change the
+cursor.
+      ]]></field>
+      <field name="owner_events"><![CDATA[
+If 1, the `grab_window` will still get the pointer events. If 0, events are not
+reported to the `grab_window`.
+      ]]></field>
+      <field name="grab_window"><![CDATA[
+Specifies the window on which the pointer should be grabbed.
+      ]]></field>
+      <field name="time"><![CDATA[
+The time argument allows you to avoid certain circumstances that come up if
+applications take a long time to respond or if there are long network delays.
+Consider a situation where you have two applications, both of which normally
+grab the pointer when clicked on. If both applications specify the timestamp
+from the event, the second application may wake up faster and successfully grab
+the pointer before the first application. The first application then will get
+an indication that the other application grabbed the pointer before its request
+was processed.
+
+The special value `XCB_CURRENT_TIME` will be replaced with the current server
+time.
+      ]]></field>
+      <!-- the enum doc is sufficient. -->
+      <field name="pointer_mode" />
+      <field name="keyboard_mode" />
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Window"><![CDATA[
+The specified `window` does not exist.
+      ]]></error>
+
+      <see type="request" name="GrabKeyboard" />
+    </doc>
+  </request>
+
+  <request name="UngrabPointer" opcode="27">
+    <pad bytes="1" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+    <doc>
+      <brief>release the pointer</brief>
+      <description><![CDATA[
+Releases the pointer and any queued events if you actively grabbed the pointer
+before using `xcb_grab_pointer`, `xcb_grab_button` or within a normal button
+press.
+
+EnterNotify and LeaveNotify events are generated.
+      ]]></description>
+      <field name="time"><![CDATA[
+Timestamp to avoid race conditions when running X over the network.
+
+The pointer will not be released if `time` is earlier than the
+last-pointer-grab time or later than the current X server time.
+      ]]></field>
+      <field name="name_len"><![CDATA[
+Length (in bytes) of `name`.
+      ]]></field>
+      <field name="name"><![CDATA[
+A pattern describing an X core font.
+      ]]></field>
+      <see type="request" name="GrabPointer" />
+      <see type="request" name="GrabButton" />
+      <see type="event" name="EnterNotify" />
+      <see type="event" name="LeaveNotify" />
+    </doc>
+  </request>
+
+  <enum name="ButtonIndex">
+     <item name="Any"><value>0</value></item>
+     <item name="1">  <value>1</value></item>
+     <item name="2">  <value>2</value></item>
+     <item name="3">  <value>3</value></item>
+     <item name="4">  <value>4</value></item>
+     <item name="5">  <value>5</value></item>
+    <doc>
+      <field name="Any"><![CDATA[
+Any of the following (or none):
+      ]]></field>
+      <field name="1"><![CDATA[
+The left mouse button.
+      ]]></field>
+      <field name="2"><![CDATA[
+The right mouse button.
+      ]]></field>
+      <field name="3"><![CDATA[
+The middle mouse button.
+      ]]></field>
+      <field name="4"><![CDATA[
+Scroll wheel. TODO: direction?
+      ]]></field>
+      <field name="5"><![CDATA[
+Scroll wheel. TODO: direction?
+      ]]></field>
+    </doc>
+  </enum>
+
+  <request name="GrabButton" opcode="28">
+    <field type="BOOL" name="owner_events" />
+    <field type="WINDOW" name="grab_window" />
+    <field type="CARD16" name="event_mask" mask="EventMask" />
+    <field type="CARD8" name="pointer_mode" enum="GrabMode" />
+    <field type="CARD8" name="keyboard_mode" enum="GrabMode" />
+    <field type="WINDOW" name="confine_to" altenum="Window" />
+    <field type="CURSOR" name="cursor" altenum="Cursor" />
+    <field type="CARD8" name="button" enum="ButtonIndex" />
+    <pad bytes="1" />
+    <field type="CARD16" name="modifiers" mask="ModMask" />
+    <doc>
+      <brief>Grab pointer button(s)</brief>
+      <description><![CDATA[
+This request establishes a passive grab. The pointer is actively grabbed as
+described in GrabPointer, the last-pointer-grab time is set to the time at
+which the button was pressed (as transmitted in the ButtonPress event), and the
+ButtonPress event is reported if all of the following conditions are true:
+
+The pointer is not grabbed and the specified button is logically pressed when
+the specified modifier keys are logically down, and no other buttons or
+modifier keys are logically down.
+
+The grab-window contains the pointer.
+
+The confine-to window (if any) is viewable.
+
+A passive grab on the same button/key combination does not exist on any
+ancestor of grab-window.
+
+The interpretation of the remaining arguments is the same as for GrabPointer.
+The active grab is terminated automatically when the logical state of the
+pointer has all buttons released, independent of the logical state of modifier
+keys. Note that the logical state of a device (as seen by means of the
+protocol) may lag the physical state if device event processing is frozen. This
+request overrides all previous passive grabs by the same client on the same
+button/key combinations on the same window. A modifier of AnyModifier is
+equivalent to issuing the request for all possible modifier combinations
+(including the combination of no modifiers). It is not required that all
+specified modifiers have currently assigned keycodes. A button of AnyButton is
+equivalent to issuing the request for all possible buttons. Otherwise, it is
+not required that the button specified currently be assigned to a physical
+button.
+
+An Access error is generated if some other client has already issued a
+GrabButton request with the same button/key combination on the same window.
+When using AnyModifier or AnyButton, the request fails completely (no grabs are
+established), and an Access error is generated if there is a conflicting grab
+for any combination. The request has no effect on an active grab.
+
+      ]]></description>
+      <field name="owner_events"><![CDATA[
+If 1, the `grab_window` will still get the pointer events. If 0, events are not
+reported to the `grab_window`.
+      ]]></field>
+      <field name="grab_window"><![CDATA[
+Specifies the window on which the pointer should be grabbed.
+      ]]></field>
+      <field name="event_mask"><![CDATA[
+Specifies which pointer events are reported to the client.
+
+TODO: which values?
+      ]]></field>
+      <field name="confine_to"><![CDATA[
+Specifies the window to confine the pointer in (the user will not be able to
+move the pointer out of that window).
+
+The special value `XCB_NONE` means don't confine the pointer.
+      ]]></field>
+      <field name="cursor"><![CDATA[
+Specifies the cursor that should be displayed or `XCB_NONE` to not change the
+cursor.
+      ]]></field>
+      <field name="modifiers"><![CDATA[
+The modifiers to grab.
+
+Using the special value `XCB_MOD_MASK_ANY` means grab the pointer with all
+possible modifier combinations.
+      ]]></field>
+      <!-- the enum doc is sufficient. -->
+      <field name="pointer_mode" />
+      <field name="keyboard_mode" />
+      <field name="button" />
+      <error type="Access"><![CDATA[
+Another client has already issued a GrabButton with the same button/key
+combination on the same window.
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Cursor"><![CDATA[
+The specified `cursor` does not exist.
+      ]]></error>
+      <error type="Window"><![CDATA[
+The specified `window` does not exist.
+      ]]></error>
+    </doc>
+  </request>
+
+  <request name="UngrabButton" opcode="29">
+    <field type="CARD8" name="button" enum="ButtonIndex" />
+    <field type="WINDOW" name="grab_window" />
+    <field type="CARD16" name="modifiers" mask="ModMask" />
+    <pad bytes="2" />
+  </request>
+
+  <request name="ChangeActivePointerGrab" opcode="30">
+    <pad bytes="1" />
+    <field type="CURSOR" name="cursor" altenum="Cursor" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+    <field type="CARD16" name="event_mask" mask="EventMask" />
+    <pad bytes="2" />
+  </request>
+
+  <request name="GrabKeyboard" opcode="31">
+    <field type="BOOL" name="owner_events" />
+    <field type="WINDOW" name="grab_window" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+    <field type="BYTE" name="pointer_mode" enum="GrabMode" />
+    <field type="BYTE" name="keyboard_mode" enum="GrabMode" />
+    <pad bytes="2" />
+    <reply>
+      <field type="BYTE" name="status" enum="GrabStatus" />
+    </reply>
+    <doc>
+      <brief>Grab the keyboard</brief>
+      <description><![CDATA[
+Actively grabs control of the keyboard and generates FocusIn and FocusOut
+events. Further key events are reported only to the grabbing client.
+
+Any active keyboard grab by this client is overridden. If the keyboard is
+actively grabbed by some other client, `AlreadyGrabbed` is returned. If
+`grab_window` is not viewable, `GrabNotViewable` is returned. If the keyboard
+is frozen by an active grab of another client, `GrabFrozen` is returned. If the
+specified `time` is earlier than the last-keyboard-grab time or later than the
+current X server time, `GrabInvalidTime` is returned. Otherwise, the
+last-keyboard-grab time is set to the specified time.
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Grabs the keyboard actively
+ *
+ */
+void my_example(xcb_connection_t *conn, xcb_screen_t *screen) {
+    xcb_grab_keyboard_cookie_t cookie;
+    xcb_grab_keyboard_reply_t *reply;
+
+    cookie = xcb_grab_keyboard(
+        conn,
+        true,                /* report events */
+        screen->root,        /* grab the root window */
+        XCB_CURRENT_TIME,
+        XCB_GRAB_MODE_ASYNC, /* process events as normal, do not require sync */
+        XCB_GRAB_MODE_ASYNC
+    );
+
+    if ((reply = xcb_grab_keyboard_reply(conn, cookie, NULL))) {
+        if (reply->status == XCB_GRAB_STATUS_SUCCESS)
+            printf("successfully grabbed the keyboard\\n");
+
+        free(reply);
+    }
+}
+      ]]></example>
+      <field name="owner_events"><![CDATA[
+If 1, the `grab_window` will still get the pointer events. If 0, events are not
+reported to the `grab_window`.
+      ]]></field>
+      <field name="grab_window"><![CDATA[
+Specifies the window on which the pointer should be grabbed.
+      ]]></field>
+      <field name="time"><![CDATA[
+Timestamp to avoid race conditions when running X over the network.
+
+The special value `XCB_CURRENT_TIME` will be replaced with the current server
+time.
+      ]]></field>
+      <!-- the enum doc is sufficient. -->
+      <field name="pointer_mode" />
+      <field name="keyboard_mode" />
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Window"><![CDATA[
+The specified `window` does not exist.
+      ]]></error>
+      <see type="request" name="GrabPointer" />
+    </doc>
+  </request>
+
+  <request name="UngrabKeyboard" opcode="32">
+    <pad bytes="1" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+  </request>
+
+  <!-- Use KEYCODE any = { XCBGrabAny }; to grab any key -->
+  <enum name="Grab">
+    <item name="Any"><value>0</value></item>
+  </enum>
+
+  <request name="GrabKey" opcode="33">
+    <field type="BOOL" name="owner_events" />
+    <field type="WINDOW" name="grab_window" />
+    <field type="CARD16" name="modifiers" mask="ModMask" />
+    <field type="KEYCODE" name="key" altenum="Grab" />
+    <field type="CARD8" name="pointer_mode" enum="GrabMode" />
+    <field type="CARD8" name="keyboard_mode" enum="GrabMode" />
+    <pad bytes="3" />
+    <doc>
+      <brief>Grab keyboard key(s)</brief>
+      <description><![CDATA[
+Establishes a passive grab on the keyboard. In the future, the keyboard is
+actively grabbed (as for `GrabKeyboard`), the last-keyboard-grab time is set to
+the time at which the key was pressed (as transmitted in the KeyPress event),
+and the KeyPress event is reported if all of the following conditions are true:
+
+The keyboard is not grabbed and the specified key (which can itself be a
+modifier key) is logically pressed when the specified modifier keys are
+logically down, and no other modifier keys are logically down.
+
+Either the grab_window is an ancestor of (or is) the focus window, or the
+grab_window is a descendant of the focus window and contains the pointer.
+
+A passive grab on the same key combination does not exist on any ancestor of
+grab_window.
+
+The interpretation of the remaining arguments is as for XGrabKeyboard.  The active grab is terminated
+automatically when the logical state of the keyboard has the specified key released (independent of the
+logical state of the modifier keys), at which point a KeyRelease event is reported to the grabbing window.
+
+Note that the logical state of a device (as seen by client applications) may lag the physical state if
+device event processing is frozen.
+
+A modifiers argument of AnyModifier is equivalent to issuing the request for all possible modifier combinations (including the combination of no modifiers).  It is not required that all modifiers specified
+have currently assigned KeyCodes.  A keycode argument of AnyKey is equivalent to issuing the request for
+all possible KeyCodes.  Otherwise, the specified keycode must be in the range specified by min_keycode
+and max_keycode in the connection setup, or a BadValue error results.
+
+If some other client has issued a XGrabKey with the same key combination on the same window, a BadAccess
+error results.  When using AnyModifier or AnyKey, the request fails completely, and a BadAccess error
+results (no grabs are established) if there is a conflicting grab for any combination.
+
+      ]]></description>
+      <field name="owner_events"><![CDATA[
+If 1, the `grab_window` will still get the pointer events. If 0, events are not
+reported to the `grab_window`.
+      ]]></field>
+      <field name="grab_window"><![CDATA[
+Specifies the window on which the pointer should be grabbed.
+      ]]></field>
+      <field name="key"><![CDATA[
+The keycode of the key to grab.
+
+The special value `XCB_GRAB_ANY` means grab any key.
+      ]]></field>
+      <field name="cursor"><![CDATA[
+Specifies the cursor that should be displayed or `XCB_NONE` to not change the
+cursor.
+      ]]></field>
+      <field name="modifiers"><![CDATA[
+The modifiers to grab.
+
+Using the special value `XCB_MOD_MASK_ANY` means grab the pointer with all
+possible modifier combinations.
+      ]]></field>
+      <!-- the enum doc is sufficient. -->
+      <field name="pointer_mode" />
+      <field name="keyboard_mode" />
+      <error type="Access"><![CDATA[
+Another client has already issued a GrabKey with the same button/key
+combination on the same window.
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Window"><![CDATA[
+The specified `window` does not exist.
+      ]]></error>
+      <see type="request" name="GrabKeyboard" />
+    </doc>
+  </request>
+
+  <request name="UngrabKey" opcode="34">
+    <field type="KEYCODE" name="key" altenum="Grab" />
+    <field type="WINDOW" name="grab_window" />
+    <field type="CARD16" name="modifiers" mask="ModMask" />
+    <pad bytes="2" />
+    <doc>
+      <brief>release a key combination</brief>
+      <description><![CDATA[
+Releases the key combination on `grab_window` if you grabbed it using
+`xcb_grab_key` before.
+      ]]></description>
+      <field name="key"><![CDATA[
+The keycode of the specified key combination.
+
+Using the special value `XCB_GRAB_ANY` means releasing all possible key codes.
+      ]]></field>
+      <field name="grab_window"><![CDATA[
+The window on which the grabbed key combination will be released.
+      ]]></field>
+      <field name="modifiers"><![CDATA[
+The modifiers of the specified key combination.
+
+Using the special value `XCB_MOD_MASK_ANY` means releasing the key combination
+with every possible modifier combination.
+      ]]></field>
+      <error type="Window"><![CDATA[
+The specified `grab_window` does not exist.
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <see type="request" name="GrabKey" />
+      <see type="program" name="xev" />
+    </doc>
+  </request>
+
+  <enum name="Allow">
+    <item name="AsyncPointer">  <value>0</value></item>
+    <item name="SyncPointer">   <value>1</value></item>
+    <item name="ReplayPointer"> <value>2</value></item>
+    <item name="AsyncKeyboard"> <value>3</value></item>
+    <item name="SyncKeyboard">  <value>4</value></item>
+    <item name="ReplayKeyboard"><value>5</value></item>
+    <item name="AsyncBoth">     <value>6</value></item>
+    <item name="SyncBoth">      <value>7</value></item>
+    <doc>
+      <field name="AsyncPointer"><![CDATA[
+For AsyncPointer, if the pointer is frozen by the client, pointer event
+processing continues normally. If the pointer is frozen twice by the client on
+behalf of two separate grabs, AsyncPointer thaws for both. AsyncPointer has no
+effect if the pointer is not frozen by the client, but the pointer need not be
+grabbed by the client.
+
+TODO: rewrite this in more understandable terms.
+      ]]></field>
+      <field name="SyncPointer"><![CDATA[
+For SyncPointer, if the pointer is frozen and actively grabbed by the client,
+pointer event processing continues normally until the next ButtonPress or
+ButtonRelease event is reported to the client, at which time the pointer again
+appears to freeze. However, if the reported event causes the pointer grab to be
+released, then the pointer does not freeze. SyncPointer has no effect if the
+pointer is not frozen by the client or if the pointer is not grabbed by the
+client.
+      ]]></field>
+      <field name="ReplayPointer"><![CDATA[
+For ReplayPointer, if the pointer is actively grabbed by the client and is
+frozen as the result of an event having been sent to the client (either from
+the activation of a GrabButton or from a previous AllowEvents with mode
+SyncPointer but not from a GrabPointer), then the pointer grab is released and
+that event is completely reprocessed, this time ignoring any passive grabs at
+or above (towards the root) the grab-window of the grab just released. The
+request has no effect if the pointer is not grabbed by the client or if the
+pointer is not frozen as the result of an event.
+      ]]></field>
+      <field name="AsyncKeyboard"><![CDATA[
+For AsyncKeyboard, if the keyboard is frozen by the client, keyboard event
+processing continues normally. If the keyboard is frozen twice by the client on
+behalf of two separate grabs, AsyncKeyboard thaws for both. AsyncKeyboard has
+no effect if the keyboard is not frozen by the client, but the keyboard need
+not be grabbed by the client.
+      ]]></field>
+      <field name="SyncKeyboard"><![CDATA[
+For SyncKeyboard, if the keyboard is frozen and actively grabbed by the client,
+keyboard event processing continues normally until the next KeyPress or
+KeyRelease event is reported to the client, at which time the keyboard again
+appears to freeze. However, if the reported event causes the keyboard grab to
+be released, then the keyboard does not freeze. SyncKeyboard has no effect if
+the keyboard is not frozen by the client or if the keyboard is not grabbed by
+the client.
+      ]]></field>
+      <field name="ReplayKeyboard"><![CDATA[
+For ReplayKeyboard, if the keyboard is actively grabbed by the client and is
+frozen as the result of an event having been sent to the client (either from
+the activation of a GrabKey or from a previous AllowEvents with mode
+SyncKeyboard but not from a GrabKeyboard), then the keyboard grab is released
+and that event is completely reprocessed, this time ignoring any passive grabs
+at or above (towards the root) the grab-window of the grab just released. The
+request has no effect if the keyboard is not grabbed by the client or if the
+keyboard is not frozen as the result of an event.
+      ]]></field>
+      <field name="SyncBoth"><![CDATA[
+For SyncBoth, if both pointer and keyboard are frozen by the client, event
+processing (for both devices) continues normally until the next ButtonPress,
+ButtonRelease, KeyPress, or KeyRelease event is reported to the client for a
+grabbed device (button event for the pointer, key event for the keyboard), at
+which time the devices again appear to freeze. However, if the reported event
+causes the grab to be released, then the devices do not freeze (but if the
+other device is still grabbed, then a subsequent event for it will still cause
+both devices to freeze). SyncBoth has no effect unless both pointer and
+keyboard are frozen by the client. If the pointer or keyboard is frozen twice
+by the client on behalf of two separate grabs, SyncBoth thaws for both (but a
+subsequent freeze for SyncBoth will only freeze each device once).
+      ]]></field>
+      <field name="AsyncBoth"><![CDATA[
+For AsyncBoth, if the pointer and the keyboard are frozen by the client, event
+processing for both devices continues normally. If a device is frozen twice by
+the client on behalf of two separate grabs, AsyncBoth thaws for both. AsyncBoth
+has no effect unless both pointer and keyboard are frozen by the client.
+      ]]></field>
+    </doc>
+  </enum>
+
+  <request name="AllowEvents" opcode="35">
+    <field type="CARD8" name="mode" enum="Allow" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+    <doc>
+      <brief>release queued events</brief>
+      <description><![CDATA[
+Releases queued events if the client has caused a device (pointer/keyboard) to
+freeze due to grabbing it actively. This request has no effect if `time` is
+earlier than the last-grab time of the most recent active grab for this client
+or if `time` is later than the current X server time.
+      ]]></description>
+      <!-- the enum doc is sufficient. -->
+      <field name="mode" />
+      <field name="time"><![CDATA[
+Timestamp to avoid race conditions when running X over the network.
+
+The special value `XCB_CURRENT_TIME` will be replaced with the current server
+time.
+      ]]></field>
+      <error type="Value"><![CDATA[
+You specified an invalid `mode`.
+      ]]></error>
+    </doc>
+  </request>
+
+  <request name="GrabServer" opcode="36" />
+
+  <request name="UngrabServer" opcode="37" />
+
+  <request name="QueryPointer" opcode="38">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <reply>
+      <field type="BOOL" name="same_screen" />
+      <field type="WINDOW" name="root" />
+      <field type="WINDOW" name="child" altenum="Window" />
+      <field type="INT16" name="root_x" />
+      <field type="INT16" name="root_y" />
+      <field type="INT16" name="win_x" />
+      <field type="INT16" name="win_y" />
+      <field type="CARD16" name="mask" mask="KeyButMask" />
+      <pad bytes="2" />
+      <doc>
+        <field name="same_screen"><![CDATA[
+If `same_screen` is False, then the pointer is not on the same screen as the
+argument window, `child` is None, and `win_x` and `win_y` are zero. If
+`same_screen` is True, then `win_x` and `win_y` are the pointer coordinates
+relative to the argument window's origin, and child is the child containing the
+pointer, if any.
+        ]]></field>
+        <field name="root"><![CDATA[
+The root window the pointer is logically on.
+        ]]></field>
+        <field name="child"><![CDATA[
+The child window containing the pointer, if any, if `same_screen` is true. If
+`same_screen` is false, `XCB_NONE` is returned.
+        ]]></field>
+        <field name="root_x"><![CDATA[
+The pointer X position, relative to `root`.
+        ]]></field>
+        <field name="root_y"><![CDATA[
+The pointer Y position, relative to `root`.
+        ]]></field>
+        <field name="win_x"><![CDATA[
+The pointer X coordinate, relative to `child`, if `same_screen` is true. Zero
+otherwise.
+        ]]></field>
+        <field name="win_y"><![CDATA[
+The pointer Y coordinate, relative to `child`, if `same_screen` is true. Zero
+otherwise.
+        ]]></field>
+        <field name="mask"><![CDATA[
+The current logical state of the modifier keys and the buttons. Note that the
+logical state of a device (as seen by means of the protocol) may lag the
+physical state if device event processing is frozen.
+        ]]></field>
+      </doc>
+    </reply>
+    <doc>
+      <brief>get pointer coordinates</brief>
+      <description><![CDATA[
+Gets the root window the pointer is logically on and the pointer coordinates
+relative to the root window's origin.
+      ]]></description>
+      <field name="window"><![CDATA[
+A window to check if the pointer is on the same screen as `window` (see the
+`same_screen` field in the reply).
+      ]]></field>
+      <error type="Window"><![CDATA[
+The specified `window` does not exist.
+      ]]></error>
+    </doc>
+  </request>
+
+  <struct name="TIMECOORD">
+    <field type="TIMESTAMP" name="time" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+  </struct>
+
+  <request name="GetMotionEvents" opcode="39">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="TIMESTAMP" name="start" altenum="Time" />
+    <field type="TIMESTAMP" name="stop" altenum="Time" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="events_len" />
+      <pad bytes="20" />
+      <list type="TIMECOORD" name="events">
+        <fieldref>events_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="TranslateCoordinates" opcode="40">
+    <pad bytes="1" />
+    <field type="WINDOW" name="src_window" />
+    <field type="WINDOW" name="dst_window" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <reply>
+      <field type="BOOL" name="same_screen" />
+      <field type="WINDOW" name="child" altenum="Window" />
+      <field type="INT16" name="dst_x" />
+      <field type="INT16" name="dst_y" />
+    </reply>
+  </request>
+
+  <request name="WarpPointer" opcode="41">
+    <pad bytes="1" />
+    <field type="WINDOW" name="src_window" altenum="Window" />
+    <field type="WINDOW" name="dst_window" altenum="Window" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <field type="CARD16" name="src_width" />
+    <field type="CARD16" name="src_height" />
+    <field type="INT16" name="dst_x" />
+    <field type="INT16" name="dst_y" />
+    <doc>
+      <brief>move mouse pointer</brief>
+      <description><![CDATA[
+Moves the mouse pointer to the specified position.
+
+If `src_window` is not `XCB_NONE` (TODO), the move will only take place if the
+pointer is inside `src_window` and within the rectangle specified by (`src_x`,
+`src_y`, `src_width`, `src_height`). The rectangle coordinates are relative to
+`src_window`.
+
+If `dst_window` is not `XCB_NONE` (TODO), the pointer will be moved to the
+offsets (`dst_x`, `dst_y`) relative to `dst_window`. If `dst_window` is
+`XCB_NONE` (TODO), the pointer will be moved by the offsets (`dst_x`, `dst_y`)
+relative to the current position of the pointer.
+      ]]></description>
+      <field name="src_window"><![CDATA[
+If `src_window` is not `XCB_NONE` (TODO), the move will only take place if the
+pointer is inside `src_window` and within the rectangle specified by (`src_x`,
+`src_y`, `src_width`, `src_height`). The rectangle coordinates are relative to
+`src_window`.
+      ]]></field>
+      <field name="dst_window"><![CDATA[
+If `dst_window` is not `XCB_NONE` (TODO), the pointer will be moved to the
+offsets (`dst_x`, `dst_y`) relative to `dst_window`. If `dst_window` is
+`XCB_NONE` (TODO), the pointer will be moved by the offsets (`dst_x`, `dst_y`)
+relative to the current position of the pointer.
+      ]]></field>
+      <error type="Window"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <see type="request" name="SetInputFocus" />
+    </doc>
+  </request>
+
+  <!-- used for revert_to and focus -->
+  <enum name="InputFocus">
+    <item name="None">       <value>0</value></item>
+    <item name="PointerRoot"><value>1</value></item>
+    <item name="Parent">     <value>2</value></item>  <!-- revert_to only -->
+    <item name="FollowKeyboard"><value>3</value></item>  <!-- xinput extension only -->
+    <doc>
+      <field name="None"><![CDATA[
+The focus reverts to `XCB_NONE`, so no window will have the input focus.
+      ]]></field>
+      <field name="PointerRoot"><![CDATA[
+The focus reverts to `XCB_POINTER_ROOT` respectively. When the focus reverts,
+FocusIn and FocusOut events are generated, but the last-focus-change time is
+not changed.
+      ]]></field>
+      <field name="Parent"><![CDATA[
+The focus reverts to the parent (or closest viewable ancestor) and the new
+revert_to value is `XCB_INPUT_FOCUS_NONE`.
+      ]]></field>
+      <field name="FollowKeyboard"><![CDATA[
+NOT YET DOCUMENTED. Only relevant for the xinput extension.
+      ]]></field>
+    </doc>
+  </enum>
+
+  <request name="SetInputFocus" opcode="42">
+    <field type="CARD8" name="revert_to" enum="InputFocus" />
+    <field type="WINDOW" name="focus" altenum="InputFocus" />
+    <field type="TIMESTAMP" name="time" altenum="Time" />
+    <doc>
+      <brief>Sets input focus</brief>
+      <description><![CDATA[
+Changes the input focus and the last-focus-change time. If the specified `time`
+is earlier than the current last-focus-change time, the request is ignored (to
+avoid race conditions when running X over the network).
+
+A FocusIn and FocusOut event is generated when focus is changed.
+      ]]></description>
+      <field name="focus"><![CDATA[
+The window to focus. All keyboard events will be reported to this window. The
+window must be viewable (TODO), or a `xcb_match_error_t` occurs (TODO).
+
+If `focus` is `XCB_NONE` (TODO), all keyboard events are
+discarded until a new focus window is set.
+
+If `focus` is `XCB_POINTER_ROOT` (TODO), focus is on the root window of the
+screen on which the pointer is on currently.
+      ]]></field>
+      <field name="time"><![CDATA[
+Timestamp to avoid race conditions when running X over the network.
+
+The special value `XCB_CURRENT_TIME` will be replaced with the current server
+time.
+      ]]></field>
+      <field name="revert_to"><![CDATA[
+Specifies what happens when the `focus` window becomes unviewable (if `focus`
+is neither `XCB_NONE` nor `XCB_POINTER_ROOT`).
+      ]]></field>
+      <error type="Window"><![CDATA[
+The specified `focus` window does not exist.
+      ]]></error>
+      <error type="Match"><![CDATA[
+The specified `focus` window is not viewable.
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: Reasons?
+      ]]></error>
+      <see type="event" name="FocusIn" />
+      <see type="event" name="FocusOut" />
+    </doc>
+
+  </request>
+
+  <request name="GetInputFocus" opcode="43">
+    <reply>
+      <field type="CARD8" name="revert_to" enum="InputFocus" />
+      <field type="WINDOW" name="focus" altenum="InputFocus" />
+    </reply>
+  </request>
+
+  <request name="QueryKeymap" opcode="44">
+    <reply>
+      <pad bytes="1" />
+      <list type="CARD8" name="keys"><value>32</value></list>
+    </reply>
+  </request>
+
+  <request name="OpenFont" opcode="45">
+    <pad bytes="1" />
+    <field type="FONT" name="fid" />
+    <field type="CARD16" name="name_len" />
+    <pad bytes="2" />
+    <list type="char" name="name">
+      <fieldref>name_len</fieldref>
+    </list>
+    <doc>
+      <brief>opens a font</brief>
+      <description><![CDATA[
+Opens any X core font matching the given `name` (for example "-misc-fixed-*").
+
+Note that X core fonts are deprecated (but still supported) in favor of
+client-side rendering using Xft.
+      ]]></description>
+      <field name="fid"><![CDATA[
+The ID with which you will refer to the font, created by `xcb_generate_id`.
+      ]]></field>
+      <field name="name_len"><![CDATA[
+Length (in bytes) of `name`.
+      ]]></field>
+      <field name="name"><![CDATA[
+A pattern describing an X core font.
+      ]]></field>
+      <error type="Name"><![CDATA[
+No font matches the given `name`.
+      ]]></error>
+      <see type="function" name="xcb_generate_id" />
+    </doc>
+  </request>
+
+  <request name="CloseFont" opcode="46">
+    <pad bytes="1" />
+    <field type="FONT" name="font" />
+  </request>
+
+  <enum name="FontDraw">
+    <item name="LeftToRight"><value>0</value></item>
+    <item name="RightToLeft"><value>1</value></item>
+  </enum>
+
+  <struct name="FONTPROP">
+    <field type="ATOM" name="name" />
+    <field type="CARD32" name="value" />
+  </struct>
+
+  <struct name="CHARINFO">
+    <field type="INT16" name="left_side_bearing" />
+    <field type="INT16" name="right_side_bearing" />
+    <field type="INT16" name="character_width" />
+    <field type="INT16" name="ascent" />
+    <field type="INT16" name="descent" />
+    <field type="CARD16" name="attributes" />
+  </struct>
+
+  <request name="QueryFont" opcode="47">
+    <pad bytes="1" />
+    <field type="FONTABLE" name="font" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CHARINFO" name="min_bounds" />
+      <pad bytes="4" />
+      <field type="CHARINFO" name="max_bounds" />
+      <pad bytes="4" />
+      <field type="CARD16" name="min_char_or_byte2" />
+      <field type="CARD16" name="max_char_or_byte2" />
+      <field type="CARD16" name="default_char" />
+      <field type="CARD16" name="properties_len" />
+      <field type="BYTE" name="draw_direction" enum="FontDraw" />
+      <field type="CARD8" name="min_byte1" />
+      <field type="CARD8" name="max_byte1" />
+      <field type="BOOL" name="all_chars_exist" />
+      <field type="INT16" name="font_ascent" />
+      <field type="INT16" name="font_descent" />
+      <field type="CARD32" name="char_infos_len" />
+      <list type="FONTPROP" name="properties">
+        <fieldref>properties_len</fieldref>
+      </list>
+      <list type="CHARINFO" name="char_infos">
+        <fieldref>char_infos_len</fieldref>
+      </list>
+      <doc>
+        <field name="min_bounds"><![CDATA[
+minimum bounds over all existing char
+        ]]></field>
+        <field name="max_bounds"><![CDATA[
+maximum bounds over all existing char
+        ]]></field>
+        <field name="min_char_or_byte2"><![CDATA[
+first character
+        ]]></field>
+        <field name="max_char_or_byte2"><![CDATA[
+last character
+        ]]></field>
+        <field name="default_char"><![CDATA[
+char to print for undefined character
+        ]]></field>
+        <field name="properties_len"><![CDATA[
+how many properties there are
+        ]]></field>
+        <field name="all_chars_exist"><![CDATA[
+flag if all characters have nonzero size
+        ]]></field>
+        <field name="font_ascent"><![CDATA[
+baseline to top edge of raster
+        ]]></field>
+        <field name="font_descent"><![CDATA[
+baseline to bottom edge of raster
+        ]]></field>
+        <!-- enum doc is sufficient -->
+        <field name="draw_direction" />
+      </doc>
+    </reply>
+    <doc>
+      <brief>query font metrics</brief>
+      <description><![CDATA[
+Queries information associated with the font.
+      ]]></description>
+      <field name="font"><![CDATA[
+The fontable (Font or Graphics Context) to query.
+      ]]></field>
+      <!-- TODO: example -->
+    </doc>
+  </request>
+
+  <request name="QueryTextExtents" opcode="48">
+    <exprfield type="BOOL" name="odd_length">
+      <op op="&amp;"><fieldref>string_len</fieldref><value>1</value></op>
+    </exprfield>
+    <field type="FONTABLE" name="font" />
+    <list type="CHAR2B" name="string" />
+    <reply>
+      <field type="BYTE" name="draw_direction" enum="FontDraw" />
+      <field type="INT16" name="font_ascent" />
+      <field type="INT16" name="font_descent" />
+      <field type="INT16" name="overall_ascent" />
+      <field type="INT16" name="overall_descent" />
+      <field type="INT32" name="overall_width" />
+      <field type="INT32" name="overall_left" />
+      <field type="INT32" name="overall_right" />
+    </reply>
+    <doc>
+      <brief>get text extents</brief>
+      <description><![CDATA[
+Query text extents from the X11 server. This request returns the bounding box
+of the specified 16-bit character string in the specified `font` or the font
+contained in the specified graphics context.
+
+`font_ascent` is set to the maximum of the ascent metrics of all characters in
+the string. `font_descent` is set to the maximum of the descent metrics.
+`overall_width` is set to the sum of the character-width metrics of all
+characters in the string. For each character in the string, let W be the sum of
+the character-width metrics of all characters preceding it in the string. Let L
+be the left-side-bearing metric of the character plus W. Let R be the
+right-side-bearing metric of the character plus W. The lbearing member is set
+to the minimum L of all characters in the string. The rbearing member is set to
+the maximum R.
+
+For fonts defined with linear indexing rather than 2-byte matrix indexing, each
+`xcb_char2b_t` structure is interpreted as a 16-bit number with byte1 as the
+most significant byte. If the font has no defined default character, undefined
+characters in the string are taken to have all zero metrics.
+
+Characters with all zero metrics are ignored. If the font has no defined
+default_char, the undefined characters in the string are also ignored.
+      ]]></description>
+      <field name="font"><![CDATA[
+The `font` to calculate text extents in. You can also pass a graphics context.
+      ]]></field>
+      <field name="string_len"><![CDATA[
+The number of characters in `string`.
+      ]]></field>
+      <field name="string"><![CDATA[
+The text to get text extents for.
+      ]]></field>
+      <error type="GContext"><![CDATA[
+The specified graphics context does not exist.
+      ]]></error>
+      <error type="Font"><![CDATA[
+The specified `font` does not exist.
+      ]]></error>
+    </doc>
+  </request>
+
+  <struct name="STR">
+    <field type="CARD8" name="name_len" />
+    <list type="char" name="name">
+      <fieldref>name_len</fieldref>
+    </list>
+  </struct>
+
+  <request name="ListFonts" opcode="49">
+    <pad bytes="1" />
+    <field type="CARD16" name="max_names" />
+    <field type="CARD16" name="pattern_len" />
+    <list type="char" name="pattern">
+      <fieldref>pattern_len</fieldref>
+    </list>
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="names_len" />
+      <pad bytes="22" />
+      <list type="STR" name="names">
+        <fieldref>names_len</fieldref>
+      </list>
+      <doc>
+        <field name="names_len"><![CDATA[
+The number of font names.
+        ]]></field>
+      </doc>
+    </reply>
+    <doc>
+      <brief>get matching font names</brief>
+      <description><![CDATA[
+Gets a list of available font names which match the given `pattern`.
+      ]]></description>
+      <field name="pattern_len"><![CDATA[
+The length (in bytes) of `pattern`.
+      ]]></field>
+      <field name="pattern"><![CDATA[
+A font pattern, for example "-misc-fixed-*".
+
+The asterisk (*) is a wildcard for any number of characters. The question mark
+(?) is a wildcard for a single character. Use of uppercase or lowercase does
+not matter.
+      ]]></field>
+      <field name="max_names"><![CDATA[
+The maximum number of fonts to be returned.
+      ]]></field>
+    </doc>
+  </request>
+
+  <request name="ListFontsWithInfo" opcode="50">
+    <pad bytes="1" />
+    <field type="CARD16" name="max_names" />
+    <field type="CARD16" name="pattern_len" />
+    <list type="char" name="pattern">
+      <fieldref>pattern_len</fieldref>
+    </list>
+    <reply>
+      <field type="CARD8" name="name_len" />
+      <field type="CHARINFO" name="min_bounds" />
+      <pad bytes="4" />
+      <field type="CHARINFO" name="max_bounds" />
+      <pad bytes="4" />
+      <field type="CARD16" name="min_char_or_byte2" />
+      <field type="CARD16" name="max_char_or_byte2" />
+      <field type="CARD16" name="default_char" />
+      <field type="CARD16" name="properties_len" />
+      <field type="BYTE" name="draw_direction" enum="FontDraw" />
+      <field type="CARD8" name="min_byte1" />
+      <field type="CARD8" name="max_byte1" />
+      <field type="BOOL" name="all_chars_exist" />
+      <field type="INT16" name="font_ascent" />
+      <field type="INT16" name="font_descent" />
+      <field type="CARD32" name="replies_hint" />
+      <list type="FONTPROP" name="properties">
+        <fieldref>properties_len</fieldref>
+      </list>
+      <list type="char" name="name">
+        <fieldref>name_len</fieldref>
+      </list>
+      <doc>
+        <field name="name_len"><![CDATA[
+The number of matched font names.
+        ]]></field>
+        <field name="min_bounds"><![CDATA[
+minimum bounds over all existing char
+        ]]></field>
+        <field name="max_bounds"><![CDATA[
+maximum bounds over all existing char
+        ]]></field>
+        <field name="min_char_or_byte2"><![CDATA[
+first character
+        ]]></field>
+        <field name="max_char_or_byte2"><![CDATA[
+last character
+        ]]></field>
+        <field name="default_char"><![CDATA[
+char to print for undefined character
+        ]]></field>
+        <field name="properties_len"><![CDATA[
+how many properties there are
+        ]]></field>
+        <field name="all_chars_exist"><![CDATA[
+flag if all characters have nonzero size
+        ]]></field>
+        <field name="font_ascent"><![CDATA[
+baseline to top edge of raster
+        ]]></field>
+        <field name="font_descent"><![CDATA[
+baseline to bottom edge of raster
+        ]]></field>
+        <field name="replies_hint"><![CDATA[
+An indication of how many more fonts will be returned. This is only a hint and
+may be larger or smaller than the number of fonts actually returned. A zero
+value does not guarantee that no more fonts will be returned.
+        ]]></field>
+        <!-- enum doc is sufficient -->
+        <field name="draw_direction" />
+      </doc>
+    </reply>
+    <doc>
+      <brief>get matching font names and information</brief>
+      <description><![CDATA[
+Gets a list of available font names which match the given `pattern`.
+      ]]></description>
+      <field name="pattern_len"><![CDATA[
+The length (in bytes) of `pattern`.
+      ]]></field>
+      <field name="pattern"><![CDATA[
+A font pattern, for example "-misc-fixed-*".
+
+The asterisk (*) is a wildcard for any number of characters. The question mark
+(?) is a wildcard for a single character. Use of uppercase or lowercase does
+not matter.
+      ]]></field>
+      <field name="max_names"><![CDATA[
+The maximum number of fonts to be returned.
+      ]]></field>
+    </doc>
+
+  </request>
+
+  <request name="SetFontPath" opcode="51">
+    <pad bytes="1" />
+    <field type="CARD16" name="font_qty" />
+    <pad bytes="2" />
+    <list type="STR" name="font">
+      <fieldref>font_qty</fieldref>
+    </list>
+  </request>
+
+  <request name="GetFontPath" opcode="52">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="path_len" />
+      <pad bytes="22" />
+      <list type="STR" name="path">
+        <fieldref>path_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="CreatePixmap" opcode="53">
+    <field type="CARD8" name="depth" />
+    <field type="PIXMAP" name="pid" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <doc>
+      <brief>Creates a pixmap</brief>
+      <description><![CDATA[
+Creates a pixmap. The pixmap can only be used on the same screen as `drawable`
+is on and only with drawables of the same `depth`.
+      ]]></description>
+      <field name="depth"><![CDATA[
+TODO
+      ]]></field>
+      <field name="pid"><![CDATA[
+The ID with which you will refer to the new pixmap, created by
+`xcb_generate_id`.
+      ]]></field>
+      <field name="drawable"><![CDATA[
+Drawable to get the screen from.
+      ]]></field>
+      <field name="width"><![CDATA[
+The width of the new pixmap.
+      ]]></field>
+      <field name="height"><![CDATA[
+The height of the new pixmap.
+      ]]></field>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Drawable"><![CDATA[
+The specified `drawable` (Window or Pixmap) does not exist.
+      ]]></error>
+      <error type="Alloc"><![CDATA[
+The X server could not allocate the requested resources (no memory?).
+      ]]></error>
+      <see type="function" name="xcb_generate_id" />
+    </doc>
+  </request>
+
+  <request name="FreePixmap" opcode="54">
+    <pad bytes="1" />
+    <field type="PIXMAP" name="pixmap" />
+    <doc>
+      <brief>Destroys a pixmap</brief>
+      <description><![CDATA[
+Deletes the association between the pixmap ID and the pixmap. The pixmap
+storage will be freed when there are no more references to it.
+      ]]></description>
+      <field name="pixmap"><![CDATA[The pixmap to destroy.]]></field>
+      <error type="Pixmap"><![CDATA[
+The specified pixmap does not exist.
+      ]]></error>
+    </doc>
+  </request>
+  
+  <enum name="GC">
+    <item name="Function">          <bit>0</bit></item>
+    <item name="PlaneMask">         <bit>1</bit></item>
+    <item name="Foreground">        <bit>2</bit></item>
+    <item name="Background">        <bit>3</bit></item>
+    <item name="LineWidth">         <bit>4</bit></item>
+    <item name="LineStyle">         <bit>5</bit></item>
+    <item name="CapStyle">          <bit>6</bit></item>
+    <item name="JoinStyle">         <bit>7</bit></item>
+    <item name="FillStyle">         <bit>8</bit></item>
+    <item name="FillRule">          <bit>9</bit></item>
+    <item name="Tile">              <bit>10</bit></item>
+    <item name="Stipple">           <bit>11</bit></item>
+    <item name="TileStippleOriginX"><bit>12</bit></item>
+    <item name="TileStippleOriginY"><bit>13</bit></item>
+    <item name="Font">              <bit>14</bit></item>
+    <item name="SubwindowMode">     <bit>15</bit></item>
+    <item name="GraphicsExposures"> <bit>16</bit></item>
+    <item name="ClipOriginX">       <bit>17</bit></item>
+    <item name="ClipOriginY">       <bit>18</bit></item>
+    <item name="ClipMask">          <bit>19</bit></item>
+    <item name="DashOffset">        <bit>20</bit></item>
+    <item name="DashList">          <bit>21</bit></item>
+    <item name="ArcMode">           <bit>22</bit></item>
+    <doc>
+      <field name="Function"><![CDATA[
+TODO: Refer to GX
+      ]]></field>
+      <field name="PlaneMask"><![CDATA[
+In graphics operations, given a source and destination pixel, the result is
+computed bitwise on corresponding bits of the pixels; that is, a Boolean
+operation is performed in each bit plane. The plane-mask restricts the
+operation to a subset of planes, so the result is:
+
+        ((src FUNC dst) AND plane-mask) OR (dst AND (NOT plane-mask))
+      ]]></field>
+      <field name="Foreground"><![CDATA[
+Foreground colorpixel.
+      ]]></field>
+      <field name="Background"><![CDATA[
+Background colorpixel.
+      ]]></field>
+      <field name="LineWidth"><![CDATA[
+The line-width is measured in pixels and can be greater than or equal to one, a wide line, or the
+special value zero, a thin line.
+      ]]></field>
+      <field name="LineStyle"><![CDATA[
+The line-style defines which sections of a line are drawn:
+Solid                The full path of the line is drawn.
+DoubleDash           The full path of the line is drawn, but the even dashes are filled differently
+                     than the odd dashes (see fill-style), with Butt cap-style used where even and
+                     odd dashes meet.
+OnOffDash            Only the even dashes are drawn, and cap-style applies to all internal ends of
+                     the individual dashes (except NotLast is treated as Butt).
+      ]]></field>
+      <field name="CapStyle"><![CDATA[
+The cap-style defines how the endpoints of a path are drawn:
+NotLast    The result is equivalent to Butt, except that for a line-width of zero the final
+           endpoint is not drawn.
+Butt       The result is square at the endpoint (perpendicular to the slope of the line)
+           with no projection beyond.
+Round      The result is a circular arc with its diameter equal to the line-width, centered
+           on the endpoint; it is equivalent to Butt for line-width zero.
+Projecting The result is square at the end, but the path continues beyond the endpoint for
+           a distance equal to half the line-width; it is equivalent to Butt for line-width
+           zero.
+      ]]></field>
+      <field name="JoinStyle"><![CDATA[
+The join-style defines how corners are drawn for wide lines:
+Miter               The outer edges of the two lines extend to meet at an angle. However, if the
+                    angle is less than 11 degrees, a Bevel join-style is used instead.
+Round               The result is a circular arc with a diameter equal to the line-width, centered
+                    on the joinpoint.
+Bevel               The result is Butt endpoint styles, and then the triangular notch is filled.
+      ]]></field>
+      <field name="FillStyle"><![CDATA[
+The fill-style defines the contents of the source for line, text, and fill requests. For all text and fill
+requests (for example, PolyText8, PolyText16, PolyFillRectangle, FillPoly, and PolyFillArc)
+as well as for line requests with line-style Solid, (for example, PolyLine, PolySegment,
+PolyRectangle, PolyArc) and for the even dashes for line requests with line-style OnOffDash
+or DoubleDash:
+Solid                     Foreground
+Tiled                     Tile
+OpaqueStippled            A tile with the same width and height as stipple but with background
+                          everywhere stipple has a zero and with foreground everywhere stipple
+                          has a one
+Stippled                  Foreground masked by stipple
+For the odd dashes for line requests with line-style DoubleDash:
+Solid                     Background
+Tiled                     Same as for even dashes
+OpaqueStippled            Same as for even dashes
+Stippled                  Background masked by stipple
+      ]]></field>
+      <field name="FillRule"><![CDATA[
+      ]]></field>
+      <field name="Tile"><![CDATA[
+The tile/stipple represents an infinite two-dimensional plane with the tile/stipple replicated in all
+dimensions. When that plane is superimposed on the drawable for use in a graphics operation,
+the upper-left corner of some instance of the tile/stipple is at the coordinates within the drawable
+specified by the tile/stipple origin. The tile/stipple and clip origins are interpreted relative to the
+origin of whatever destination drawable is specified in a graphics request.
+The tile pixmap must have the same root and depth as the gcontext (or a Match error results).
+The stipple pixmap must have depth one and must have the same root as the gcontext (or a
+Match error results). For fill-style Stippled (but not fill-style
+OpaqueStippled), the stipple pattern is tiled in a single plane and acts as an
+additional clip mask to be ANDed with the clip-mask.
+Any size pixmap can be used for tiling or stippling, although some sizes may be faster to use than
+others.
+      ]]></field>
+      <field name="Stipple"><![CDATA[
+The tile/stipple represents an infinite two-dimensional plane with the tile/stipple replicated in all
+dimensions. When that plane is superimposed on the drawable for use in a graphics operation,
+the upper-left corner of some instance of the tile/stipple is at the coordinates within the drawable
+specified by the tile/stipple origin. The tile/stipple and clip origins are interpreted relative to the
+origin of whatever destination drawable is specified in a graphics request.
+The tile pixmap must have the same root and depth as the gcontext (or a Match error results).
+The stipple pixmap must have depth one and must have the same root as the gcontext (or a
+Match error results). For fill-style Stippled (but not fill-style
+OpaqueStippled), the stipple pattern is tiled in a single plane and acts as an
+additional clip mask to be ANDed with the clip-mask.
+Any size pixmap can be used for tiling or stippling, although some sizes may be faster to use than
+others.
+      ]]></field>
+      <field name="TileStippleOriginX"><![CDATA[
+TODO
+      ]]></field>
+      <field name="TileStippleOriginY"><![CDATA[
+TODO
+      ]]></field>
+      <field name="Font"><![CDATA[
+Which font to use for the `ImageText8` and `ImageText16` requests.
+      ]]></field>
+      <field name="SubwindowMode"><![CDATA[
+For ClipByChildren, both source and destination windows are additionally
+clipped by all viewable InputOutput children. For IncludeInferiors, neither
+source nor destination window is
+clipped by inferiors. This will result in including subwindow contents in the source and drawing
+through subwindow boundaries of the destination. The use of IncludeInferiors with a source or
+destination window of one depth with mapped inferiors of differing depth is not illegal, but the
+semantics is undefined by the core protocol.
+      ]]></field>
+      <field name="GraphicsExposures"><![CDATA[
+Whether ExposureEvents should be generated (1) or not (0).
+
+The default is 1.
+      ]]></field>
+      <field name="ClipOriginX"><![CDATA[
+TODO
+      ]]></field>
+      <field name="ClipOriginY"><![CDATA[
+TODO
+      ]]></field>
+      <field name="ClipMask"><![CDATA[
+The clip-mask restricts writes to the destination drawable. Only pixels where the clip-mask has
+bits set to 1 are drawn. Pixels are not drawn outside the area covered by the clip-mask or where
+the clip-mask has bits set to 0. The clip-mask affects all graphics requests, but it does not clip
+sources. The clip-mask origin is interpreted relative to the origin of whatever destination drawable is specified in a graphics request. If a pixmap is specified as the clip-mask, it must have
+depth 1 and have the same root as the gcontext (or a Match error results). If clip-mask is None,
+then pixels are always drawn, regardless of the clip origin. The clip-mask can also be set with the
+SetClipRectangles request.
+      ]]></field>
+      <field name="DashOffset"><![CDATA[
+TODO
+      ]]></field>
+      <field name="DashList"><![CDATA[
+TODO
+      ]]></field>
+      <field name="ArcMode"><![CDATA[
+TODO
+      ]]></field>
+    </doc>
+
+  </enum>
+
+  <!-- GC Function values -->
+  <enum name="GX">
+    <item name="clear">       <value>0</value></item>
+    <item name="and">         <value>1</value></item>
+    <item name="andReverse">  <value>2</value></item>
+    <item name="copy">        <value>3</value></item>
+    <item name="andInverted"> <value>4</value></item>
+    <item name="noop">        <value>5</value></item>
+    <item name="xor">         <value>6</value></item>
+    <item name="or">          <value>7</value></item>
+    <item name="nor">         <value>8</value></item>
+    <item name="equiv">       <value>9</value></item>
+    <item name="invert">      <value>10</value></item>
+    <item name="orReverse">   <value>11</value></item>
+    <item name="copyInverted"><value>12</value></item>
+    <item name="orInverted">  <value>13</value></item>
+    <item name="nand">        <value>14</value></item>
+    <item name="set">         <value>15</value></item>
+  </enum>
+
+  <enum name="LineStyle">
+    <item name="Solid">     <value>0</value></item>
+    <item name="OnOffDash"> <value>1</value></item>
+    <item name="DoubleDash"><value>2</value></item>
+  </enum>
+
+  <enum name="CapStyle">
+    <item name="NotLast">   <value>0</value></item>
+    <item name="Butt">      <value>1</value></item>
+    <item name="Round">     <value>2</value></item>
+    <item name="Projecting"><value>3</value></item>
+  </enum>
+
+  <enum name="JoinStyle">
+    <item name="Miter">     <value>0</value></item>
+    <item name="Round">     <value>1</value></item>
+    <item name="Bevel">     <value>2</value></item>
+  </enum>
+
+  <enum name="FillStyle">
+    <item name="Solid">         <value>0</value></item>
+    <item name="Tiled">         <value>1</value></item>
+    <item name="Stippled">      <value>2</value></item>
+    <item name="OpaqueStippled"><value>3</value></item>
+  </enum>
+
+  <enum name="FillRule">
+    <item name="EvenOdd"><value>0</value></item>
+    <item name="Winding"><value>1</value></item>
+  </enum>
+
+  <enum name="SubwindowMode">
+    <item name="ClipByChildren">  <value>0</value></item>
+    <item name="IncludeInferiors"><value>1</value></item>
+  </enum>
+
+  <enum name="ArcMode">
+    <item name="Chord">   <value>0</value></item>
+    <item name="PieSlice"><value>1</value></item>
+  </enum>
+
+  <request name="CreateGC" opcode="55">
+    <pad bytes="1" />
+    <field type="GCONTEXT" name="cid" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="value_mask" mask="GC" />
+    <switch name="value_list">
+        <fieldref>value_mask</fieldref>
+        <bitcase>
+          <enumref ref="GC">Function</enumref>
+          <field type="CARD32" name="function" enum="GX"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">PlaneMask</enumref>
+          <field type="CARD32" name="plane_mask" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">Foreground</enumref>
+          <field type="CARD32" name="foreground" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">Background</enumref>
+          <field type="CARD32" name="background" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">LineWidth</enumref>
+          <field type="CARD32" name="line_width" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">LineStyle</enumref>
+          <field type="CARD32" name="line_style" enum="LineStyle"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">CapStyle</enumref>
+          <field type="CARD32" name="cap_style" enum="CapStyle"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">JoinStyle</enumref>
+          <field type="CARD32" name="join_style" enum="JoinStyle"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">FillStyle</enumref>
+          <field type="CARD32" name="fill_style" enum="FillStyle"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">FillRule</enumref>
+          <field type="CARD32" name="fill_rule" enum="FillRule"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">Tile</enumref>
+          <field type="PIXMAP" name="tile" altenum="Pixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">Stipple</enumref>
+          <field type="PIXMAP" name="stipple" altenum="Pixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">TileStippleOriginX</enumref>
+          <field type="INT32" name="tile_stipple_x_origin" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">TileStippleOriginY</enumref>
+          <field type="INT32" name="tile_stipple_y_origin" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">Font</enumref>
+          <field type="FONT" name="font" altenum="Font"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">SubwindowMode</enumref>
+          <field type="CARD32" name="subwindow_mode" enum="SubwindowMode"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">GraphicsExposures</enumref>
+          <field type="BOOL32" name="graphics_exposures" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">ClipOriginX</enumref>
+          <field type="INT32" name="clip_x_origin" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">ClipOriginY</enumref>
+          <field type="INT32" name="clip_y_origin" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">ClipMask</enumref>
+          <field type="PIXMAP" name="clip_mask" altenum="Pixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">DashOffset</enumref>
+          <field type="CARD32" name="dash_offset" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">DashList</enumref>
+          <field type="CARD32" name="dashes" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">ArcMode</enumref>
+          <field type="CARD32" name="arc_mode" enum="ArcMode"/>
+        </bitcase>
+    </switch>
+    <doc>
+      <brief>Creates a graphics context</brief>
+      <description><![CDATA[
+Creates a graphics context. The graphics context can be used with any drawable
+that has the same root and depth as the specified drawable.
+      ]]></description>
+      <field name="cid"><![CDATA[
+The ID with which you will refer to the graphics context, created by
+`xcb_generate_id`.
+      ]]></field>
+      <field name="drawable"><![CDATA[
+Drawable to get the root/depth from.
+      ]]></field>
+      <error type="Drawable"><![CDATA[
+The specified `drawable` (Window or Pixmap) does not exist.
+      ]]></error>
+      <error type="Match"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Font"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Pixmap"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Alloc"><![CDATA[
+The X server could not allocate the requested resources (no memory?).
+      ]]></error>
+      <see type="function" name="xcb_generate_id" />
+    </doc>
+  </request>
+
+  <request name="ChangeGC" opcode="56">
+    <pad bytes="1" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="CARD32" name="value_mask" mask="GC" />
+    <switch name="value_list">
+        <fieldref>value_mask</fieldref>
+        <bitcase>
+          <enumref ref="GC">Function</enumref>
+          <field type="CARD32" name="function" enum="GX"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">PlaneMask</enumref>
+          <field type="CARD32" name="plane_mask" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">Foreground</enumref>
+          <field type="CARD32" name="foreground" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">Background</enumref>
+          <field type="CARD32" name="background" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">LineWidth</enumref>
+          <field type="CARD32" name="line_width" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">LineStyle</enumref>
+          <field type="CARD32" name="line_style" enum="LineStyle"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">CapStyle</enumref>
+          <field type="CARD32" name="cap_style" enum="CapStyle"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">JoinStyle</enumref>
+          <field type="CARD32" name="join_style" enum="JoinStyle"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">FillStyle</enumref>
+          <field type="CARD32" name="fill_style" enum="FillStyle"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">FillRule</enumref>
+          <field type="CARD32" name="fill_rule" enum="FillRule"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">Tile</enumref>
+          <field type="PIXMAP" name="tile" altenum="Pixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">Stipple</enumref>
+          <field type="PIXMAP" name="stipple" altenum="Pixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">TileStippleOriginX</enumref>
+          <field type="INT32" name="tile_stipple_x_origin" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">TileStippleOriginY</enumref>
+          <field type="INT32" name="tile_stipple_y_origin" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">Font</enumref>
+          <field type="FONT" name="font" altenum="Font"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">SubwindowMode</enumref>
+          <field type="CARD32" name="subwindow_mode" enum="SubwindowMode"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">GraphicsExposures</enumref>
+          <field type="BOOL32" name="graphics_exposures" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">ClipOriginX</enumref>
+          <field type="INT32" name="clip_x_origin" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">ClipOriginY</enumref>
+          <field type="INT32" name="clip_y_origin" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">ClipMask</enumref>
+          <field type="PIXMAP" name="clip_mask" altenum="Pixmap"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">DashOffset</enumref>
+          <field type="CARD32" name="dash_offset" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">DashList</enumref>
+          <field type="CARD32" name="dashes" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="GC">ArcMode</enumref>
+          <field type="CARD32" name="arc_mode" enum="ArcMode"/>
+        </bitcase>
+    </switch>
+    <doc>
+      <brief>change graphics context components</brief>
+      <description><![CDATA[
+Changes the components specified by `value_mask` for the specified graphics context.
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Changes the foreground color component of the specified graphics context.
+ *
+ */
+void my_example(xcb_connection_t *conn, xcb_gcontext_t gc, uint32_t fg, uint32_t bg) {
+    /* C99 allows us to use a compact way of changing a single component: */
+    xcb_change_gc(conn, gc, XCB_GC_FOREGROUND, (uint32_t[]){ fg });
+
+    /* The more explicit way. Beware that the order of values is important! */
+    uint32_t mask = 0;
+    mask |= XCB_GC_FOREGROUND;
+    mask |= XCB_GC_BACKGROUND;
+
+    uint32_t values[] = {
+        fg,
+        bg
+    };
+    xcb_change_gc(conn, gc, mask, values);
+    xcb_flush(conn);
+}
+      ]]></example>
+      <field name="gc"><![CDATA[
+The graphics context to change.
+      ]]></field>
+      <!-- the enum documentation is good enough. -->
+      <field name="value_mask" />
+      <field name="value_list"><![CDATA[
+Values for each of the components specified in the bitmask `value_mask`. The
+order has to correspond to the order of possible `value_mask` bits. See the
+example.
+      ]]></field>
+      <error type="Font"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="GContext"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Match"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Pixmap"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Alloc"><![CDATA[
+The X server could not allocate the requested resources (no memory?).
+      ]]></error>
+    </doc>
+  </request>
+
+  <request name="CopyGC" opcode="57">
+    <pad bytes="1" />
+    <field type="GCONTEXT" name="src_gc" />
+    <field type="GCONTEXT" name="dst_gc" />
+    <field type="CARD32" name="value_mask" mask="GC" />
+  </request>
+
+  <request name="SetDashes" opcode="58">
+    <pad bytes="1" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="CARD16" name="dash_offset" />
+    <field type="CARD16" name="dashes_len" />
+    <list type="CARD8" name="dashes">
+      <fieldref>dashes_len</fieldref>
+    </list>
+  </request>
+
+  <enum name="ClipOrdering">
+    <item name="Unsorted"><value>0</value></item>
+    <item name="YSorted"> <value>1</value></item>
+    <item name="YXSorted"><value>2</value></item>
+    <item name="YXBanded"><value>3</value></item>
+  </enum>
+
+  <request name="SetClipRectangles" opcode="59">
+    <field type="BYTE" name="ordering" enum="ClipOrdering" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="INT16" name="clip_x_origin" />
+    <field type="INT16" name="clip_y_origin" />
+    <list type="RECTANGLE" name="rectangles" />
+  </request>
+
+  <request name="FreeGC" opcode="60">
+    <pad bytes="1" />
+    <field type="GCONTEXT" name="gc" />
+    <doc>
+      <brief>Destroys a graphics context</brief>
+      <description><![CDATA[
+Destroys the specified `gc` and all associated storage.
+      ]]></description>
+      <field name="gc"><![CDATA[The graphics context to destroy.]]></field>
+      <error type="GContext"><![CDATA[
+The specified graphics context does not exist.
+      ]]></error>
+    </doc>
+  </request>
+
+  <request name="ClearArea" opcode="61">
+    <field type="BOOL" name="exposures" />
+    <field type="WINDOW" name="window" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+  </request>
+
+  <request name="CopyArea" opcode="62">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="src_drawable" />
+    <field type="DRAWABLE" name="dst_drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <field type="INT16" name="dst_x" />
+    <field type="INT16" name="dst_y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <doc>
+      <brief>copy areas</brief>
+      <description><![CDATA[
+Copies the specified rectangle from `src_drawable` to `dst_drawable`.
+      ]]></description>
+      <field name="dst_drawable"><![CDATA[
+The destination drawable (Window or Pixmap).
+      ]]></field>
+      <field name="src_drawable"><![CDATA[
+The source drawable (Window or Pixmap).
+      ]]></field>
+      <field name="gc"><![CDATA[
+The graphics context to use.
+      ]]></field>
+      <field name="src_x"><![CDATA[
+The source X coordinate.
+      ]]></field>
+      <field name="src_y"><![CDATA[
+The source Y coordinate.
+      ]]></field>
+      <field name="dst_x"><![CDATA[
+The destination X coordinate.
+      ]]></field>
+      <field name="dst_y"><![CDATA[
+The destination Y coordinate.
+      ]]></field>
+      <field name="width"><![CDATA[
+The width of the area to copy (in pixels).
+      ]]></field>
+      <field name="height"><![CDATA[
+The height of the area to copy (in pixels).
+      ]]></field>
+      <error type="Drawable"><![CDATA[
+The specified `drawable` (Window or Pixmap) does not exist.
+      ]]></error>
+      <error type="GContext"><![CDATA[
+The specified graphics context does not exist.
+      ]]></error>
+      <error type="Match"><![CDATA[
+`src_drawable` has a different root or depth than `dst_drawable`.
+      ]]></error>
+    </doc>
+  </request>
+
+  <request name="CopyPlane" opcode="63">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="src_drawable" />
+    <field type="DRAWABLE" name="dst_drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="INT16" name="src_x" />
+    <field type="INT16" name="src_y" />
+    <field type="INT16" name="dst_x" />
+    <field type="INT16" name="dst_y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD32" name="bit_plane" />
+  </request>
+  
+  <enum name="CoordMode">
+    <item name="Origin">  <value>0</value></item>
+    <item name="Previous"><value>1</value></item>
+    <doc>
+      <field name="Origin"><![CDATA[
+Treats all coordinates as relative to the origin.
+      ]]></field>
+      <field name="Previous"><![CDATA[
+Treats all coordinates after the first as relative to the previous coordinate.
+      ]]></field>
+    </doc>
+  </enum>
+
+  <!-- combine-adjacent doesn't work for mode==Relative -->
+  <request name="PolyPoint" opcode="64">
+    <field type="BYTE" name="coordinate_mode" enum="CoordMode" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <list type="POINT" name="points" />
+  </request>
+
+  <request name="PolyLine" opcode="65" combine-adjacent="true">
+    <field type="BYTE" name="coordinate_mode" enum="CoordMode" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <list type="POINT" name="points" />
+    <doc>
+      <brief>draw lines</brief>
+      <description><![CDATA[
+Draws `points_len`-1 lines between each pair of points (point[i], point[i+1])
+in the `points` array. The lines are drawn in the order listed in the array.
+They join correctly at all intermediate points, and if the first and last
+points coincide, the first and last lines also join correctly. For any given
+line, a pixel is not drawn more than once. If thin (zero line-width) lines
+intersect, the intersecting pixels are drawn multiple times. If wide lines
+intersect, the intersecting pixels are drawn only once, as though the entire
+request were a single, filled shape.
+      ]]></description>
+      <example><![CDATA[
+/*
+ * Draw a straight line.
+ *
+ */
+void my_example(xcb_connection_t *conn, xcb_drawable_t drawable, xcb_gcontext_t gc) {
+    xcb_poly_line(conn, XCB_COORD_MODE_ORIGIN, drawable, gc, 2,
+                  (xcb_point_t[]) { {10, 10}, {100, 10} });
+    xcb_flush(conn);
+}
+      ]]></example>
+      <field name="drawable"><![CDATA[
+The drawable to draw the line(s) on.
+      ]]></field>
+      <field name="gc"><![CDATA[
+The graphics context to use.
+      ]]></field>
+      <field name="points_len"><![CDATA[
+The number of `xcb_point_t` structures in `points`.
+      ]]></field>
+      <field name="points"><![CDATA[
+An array of points.
+      ]]></field>
+      <!-- the enum doc is sufficient. -->
+      <field name="coordinate_mode" />
+      <error type="Drawable"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="GContext"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Match"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <error type="Value"><![CDATA[
+TODO: reasons?
+      ]]></error>
+    </doc>
+  </request>
+
+  <struct name="SEGMENT">
+    <field type="INT16" name="x1" />
+    <field type="INT16" name="y1" />
+    <field type="INT16" name="x2" />
+    <field type="INT16" name="y2" />
+  </struct>
+
+  <request name="PolySegment" opcode="66" combine-adjacent="true">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <list type="SEGMENT" name="segments" />
+    <doc>
+      <brief>draw lines</brief>
+      <description><![CDATA[
+Draws multiple, unconnected lines. For each segment, a line is drawn between
+(x1, y1) and (x2, y2). The lines are drawn in the order listed in the array of
+`xcb_segment_t` structures and does not perform joining at coincident
+endpoints. For any given line, a pixel is not drawn more than once. If lines
+intersect, the intersecting pixels are drawn multiple times.
+
+TODO: include the xcb_segment_t data structure
+
+TODO: an example
+      ]]></description>
+      <field name="drawable"><![CDATA[
+A drawable (Window or Pixmap) to draw on.
+      ]]></field>
+      <field name="gc"><![CDATA[
+The graphics context to use.
+
+TODO: document which attributes of a gc are used
+      ]]></field>
+      <field name="segments_len"><![CDATA[
+The number of `xcb_segment_t` structures in `segments`.
+      ]]></field>
+      <field name="segments"><![CDATA[
+An array of `xcb_segment_t` structures.
+      ]]></field>
+      <error type="Drawable"><![CDATA[
+The specified `drawable` does not exist.
+      ]]></error>
+      <error type="GContext"><![CDATA[
+The specified `gc` does not exist.
+      ]]></error>
+      <error type="Match"><![CDATA[
+TODO: reasons?
+      ]]></error>
+    </doc>
+  </request>
+
+  <request name="PolyRectangle" opcode="67" combine-adjacent="true">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <list type="RECTANGLE" name="rectangles" />
+  </request>
+
+  <!--
+    The semantics of PolyArc change after the first arc: the GC's
+    join style may be applied to successive arcs under some circumstances.
+    So using combine-adjacent here is bad.
+  -->
+  <request name="PolyArc" opcode="68">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <list type="ARC" name="arcs" />
+  </request>
+
+  <enum name="PolyShape">
+    <item name="Complex">  <value>0</value></item>
+    <item name="Nonconvex"><value>1</value></item>
+    <item name="Convex">   <value>2</value></item>
+  </enum>
+
+  <request name="FillPoly" opcode="69">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="CARD8" name="shape" enum="PolyShape" />
+    <field type="CARD8" name="coordinate_mode" enum="CoordMode" />
+    <pad bytes="2" />
+    <list type="POINT" name="points" />
+  </request>
+
+  <request name="PolyFillRectangle" opcode="70" combine-adjacent="true">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <list type="RECTANGLE" name="rectangles" />
+    <doc>
+      <brief>Fills rectangles</brief>
+      <description><![CDATA[
+Fills the specified rectangle(s) in the order listed in the array. For any
+given rectangle, each pixel is not drawn more than once. If rectangles
+intersect, the intersecting pixels are drawn multiple times.
+      ]]></description>
+      <field name="drawable"><![CDATA[
+The drawable (Window or Pixmap) to draw on.
+      ]]></field>
+      <field name="gc"><![CDATA[
+The graphics context to use.
+
+The following graphics context components are used: function, plane-mask,
+fill-style, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+
+The following graphics context mode-dependent components are used:
+foreground, background, tile, stipple, tile-stipple-x-origin, and
+tile-stipple-y-origin.
+      ]]></field>
+      <field name="rectangles_len"><![CDATA[
+The number of `xcb_rectangle_t` structures in `rectangles`.
+      ]]></field>
+      <field name="rectangles"><![CDATA[
+The rectangles to fill.
+      ]]></field>
+      <error type="Drawable"><![CDATA[
+The specified `drawable` (Window or Pixmap) does not exist.
+      ]]></error>
+      <error type="GContext"><![CDATA[
+The specified graphics context does not exist.
+      ]]></error>
+      <error type="Match"><![CDATA[
+TODO: reasons?
+      ]]></error>
+    </doc>
+  </request>
+
+  <request name="PolyFillArc" opcode="71" combine-adjacent="true">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <list type="ARC" name="arcs" />
+  </request>
+  
+  <enum name="ImageFormat">
+    <item name="XYBitmap"><value>0</value></item>
+    <item name="XYPixmap"><value>1</value></item>
+    <item name="ZPixmap"> <value>2</value></item>
+  </enum>
+
+  <request name="PutImage" opcode="72">
+    <field type="CARD8" name="format" enum="ImageFormat" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="INT16" name="dst_x" />
+    <field type="INT16" name="dst_y" />
+    <field type="CARD8" name="left_pad" />
+    <field type="CARD8" name="depth" />
+    <pad bytes="2" />
+    <list type="BYTE" name="data" />
+  </request>
+
+  <!-- FIXME: data array in reply will include padding, but ought not to. -->
+  <request name="GetImage" opcode="73">
+    <field type="CARD8" name="format" enum="ImageFormat" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <field type="CARD32" name="plane_mask" />
+    <reply>
+      <field type="CARD8" name="depth" />
+      <field type="VISUALID" name="visual" />
+      <pad bytes="20" />
+      <list type="BYTE" name="data">
+        <op op="*">
+          <fieldref>length</fieldref>
+          <value>4</value>
+        </op>
+      </list>
+    </reply>
+  </request>
+
+  <request name="PolyText8" opcode="74">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <list type="BYTE" name="items" />
+  </request>
+
+  <request name="PolyText16" opcode="75">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <list type="BYTE" name="items" />
+  </request>
+
+  <request name="ImageText8" opcode="76">
+    <field type="BYTE" name="string_len" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <list type="char" name="string">
+      <fieldref>string_len</fieldref>
+    </list>
+    <doc>
+      <brief>Draws text</brief>
+      <description><![CDATA[
+Fills the destination rectangle with the background pixel from `gc`, then
+paints the text with the foreground pixel from `gc`. The upper-left corner of
+the filled rectangle is at [x, y - font-ascent]. The width is overall-width,
+the height is font-ascent + font-descent. The overall-width, font-ascent and
+font-descent are as returned by `xcb_query_text_extents` (TODO).
+
+Note that using X core fonts is deprecated (but still supported) in favor of
+client-side rendering using Xft.
+      ]]></description>
+      <field name="drawable"><![CDATA[
+The drawable (Window or Pixmap) to draw text on.
+      ]]></field>
+      <field name="string_len"><![CDATA[
+The length of the `string`. Note that this parameter limited by 255 due to
+using 8 bits!
+      ]]></field>
+      <field name="string"><![CDATA[
+The string to draw. Only the first 255 characters are relevant due to the data
+type of `string_len`.
+      ]]></field>
+      <field name="x"><![CDATA[
+The x coordinate of the first character, relative to the origin of `drawable`.
+      ]]></field>
+      <field name="y"><![CDATA[
+The y coordinate of the first character, relative to the origin of `drawable`.
+      ]]></field>
+      <field name="gc"><![CDATA[
+The graphics context to use.
+
+The following graphics context components are used: plane-mask, foreground,
+background, font, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+      ]]></field>
+      <error type="Drawable"><![CDATA[
+The specified `drawable` (Window or Pixmap) does not exist.
+      ]]></error>
+      <error type="GContext"><![CDATA[
+The specified graphics context does not exist.
+      ]]></error>
+      <error type="Match"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <see type="request" name="ImageText16" />
+    </doc>
+  </request>
+
+  <request name="ImageText16" opcode="77">
+    <field type="BYTE" name="string_len" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="GCONTEXT" name="gc" />
+    <field type="INT16" name="x" />
+    <field type="INT16" name="y" />
+    <list type="CHAR2B" name="string">
+      <fieldref>string_len</fieldref>
+    </list>
+    <doc>
+      <brief>Draws text</brief>
+      <description><![CDATA[
+Fills the destination rectangle with the background pixel from `gc`, then
+paints the text with the foreground pixel from `gc`. The upper-left corner of
+the filled rectangle is at [x, y - font-ascent]. The width is overall-width,
+the height is font-ascent + font-descent. The overall-width, font-ascent and
+font-descent are as returned by `xcb_query_text_extents` (TODO).
+
+Note that using X core fonts is deprecated (but still supported) in favor of
+client-side rendering using Xft.
+      ]]></description>
+      <field name="drawable"><![CDATA[
+The drawable (Window or Pixmap) to draw text on.
+      ]]></field>
+      <field name="string_len"><![CDATA[
+The length of the `string` in characters. Note that this parameter limited by
+255 due to using 8 bits!
+      ]]></field>
+      <field name="string"><![CDATA[
+The string to draw. Only the first 255 characters are relevant due to the data
+type of `string_len`. Every character uses 2 bytes (hence the 16 in this
+request's name).
+      ]]></field>
+      <field name="x"><![CDATA[
+The x coordinate of the first character, relative to the origin of `drawable`.
+      ]]></field>
+      <field name="y"><![CDATA[
+The y coordinate of the first character, relative to the origin of `drawable`.
+      ]]></field>
+      <field name="gc"><![CDATA[
+The graphics context to use.
+
+The following graphics context components are used: plane-mask, foreground,
+background, font, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+      ]]></field>
+      <error type="Drawable"><![CDATA[
+The specified `drawable` (Window or Pixmap) does not exist.
+      ]]></error>
+      <error type="GContext"><![CDATA[
+The specified graphics context does not exist.
+      ]]></error>
+      <error type="Match"><![CDATA[
+TODO: reasons?
+      ]]></error>
+      <see type="request" name="ImageText8" />
+    </doc>
+  </request>
+
+  <enum name= "ColormapAlloc">
+    <item name="None"><value>0</value></item>
+    <item name="All"> <value>1</value></item>
+  </enum>
+
+  <request name="CreateColormap" opcode="78">
+    <field type="BYTE" name="alloc" enum="ColormapAlloc" />
+    <field type="COLORMAP" name="mid" />
+    <field type="WINDOW" name="window" />
+    <field type="VISUALID" name="visual" />
+  </request>
+
+  <request name="FreeColormap" opcode="79">
+    <pad bytes="1" />
+    <field type="COLORMAP" name="cmap" />
+  </request>
+
+  <request name="CopyColormapAndFree" opcode="80">
+    <pad bytes="1" />
+    <field type="COLORMAP" name="mid" />
+    <field type="COLORMAP" name="src_cmap" />
+  </request>
+
+  <request name="InstallColormap" opcode="81">
+    <pad bytes="1" />
+    <field type="COLORMAP" name="cmap" />
+  </request>
+
+  <request name="UninstallColormap" opcode="82">
+    <pad bytes="1" />
+    <field type="COLORMAP" name="cmap" />
+  </request>
+
+  <request name="ListInstalledColormaps" opcode="83">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="cmaps_len" />
+      <pad bytes="22" />
+      <list type="COLORMAP" name="cmaps">
+        <fieldref>cmaps_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="AllocColor" opcode="84">
+    <pad bytes="1" />
+    <field type="COLORMAP" name="cmap" />
+    <field type="CARD16" name="red" />
+    <field type="CARD16" name="green" />
+    <field type="CARD16" name="blue" />
+    <pad bytes="2" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="red" />
+      <field type="CARD16" name="green" />
+      <field type="CARD16" name="blue" />
+      <pad bytes="2" />
+      <field type="CARD32" name="pixel" />
+    </reply>
+    <doc>
+      <brief>Allocate a color</brief>
+      <description><![CDATA[
+Allocates a read-only colormap entry corresponding to the closest RGB value
+supported by the hardware. If you are using TrueColor, you can take a shortcut
+and directly calculate the color pixel value to avoid the round trip. But, for
+example, on 16-bit color setups (VNC), you can easily get the closest supported
+RGB value to the RGB value you are specifying.
+      ]]></description>
+      <field name="cmap"><![CDATA[
+TODO
+      ]]></field>
+      <field name="red"><![CDATA[
+The red value of your color.
+      ]]></field>
+      <field name="green"><![CDATA[
+The green value of your color.
+      ]]></field>
+      <field name="blue"><![CDATA[
+The blue value of your color.
+      ]]></field>
+      <error type="Colormap"><![CDATA[
+The specified colormap `cmap` does not exist.
+      ]]></error>
+    </doc>
+  </request>
+
+  <request name="AllocNamedColor" opcode="85">
+    <pad bytes="1" />
+    <field type="COLORMAP" name="cmap" />
+    <field type="CARD16" name="name_len" />
+    <pad bytes="2" />
+    <list type="char" name="name">
+      <fieldref>name_len</fieldref>
+    </list>
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="pixel" />
+      <field type="CARD16" name="exact_red" />
+      <field type="CARD16" name="exact_green" />
+      <field type="CARD16" name="exact_blue" />
+      <field type="CARD16" name="visual_red" />
+      <field type="CARD16" name="visual_green" />
+      <field type="CARD16" name="visual_blue" />
+    </reply>
+  </request>
+
+  <request name="AllocColorCells" opcode="86">
+    <field type="BOOL" name="contiguous" />
+    <field type="COLORMAP" name="cmap" />
+    <field type="CARD16" name="colors" />
+    <field type="CARD16" name="planes" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="pixels_len" />
+      <field type="CARD16" name="masks_len" />
+      <pad bytes="20" />
+      <list type="CARD32" name="pixels">
+        <fieldref>pixels_len</fieldref>
+      </list>
+      <list type="CARD32" name="masks">
+        <fieldref>masks_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="AllocColorPlanes" opcode="87">
+    <field type="BOOL" name="contiguous" />
+    <field type="COLORMAP" name="cmap" />
+    <field type="CARD16" name="colors" />
+    <field type="CARD16" name="reds" />
+    <field type="CARD16" name="greens" />
+    <field type="CARD16" name="blues" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="pixels_len" />
+      <pad bytes="2" />
+      <field type="CARD32" name="red_mask" />
+      <field type="CARD32" name="green_mask" />
+      <field type="CARD32" name="blue_mask" />
+      <pad bytes="8" />
+      <list type="CARD32" name="pixels">
+        <fieldref>pixels_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="FreeColors" opcode="88">
+    <pad bytes="1" />
+    <field type="COLORMAP" name="cmap" />
+    <field type="CARD32" name="plane_mask" />
+    <list type="CARD32" name="pixels" />
+  </request>
+
+  <enum name="ColorFlag">
+    <item name="Red">  <bit>0</bit></item>
+    <item name="Green"><bit>1</bit></item>
+    <item name="Blue"> <bit>2</bit></item>
+  </enum>
+
+  <struct name="COLORITEM">
+    <field type="CARD32" name="pixel" />
+    <field type="CARD16" name="red" />
+    <field type="CARD16" name="green" />
+    <field type="CARD16" name="blue" />
+    <field type="BYTE" name="flags" mask="ColorFlag" />
+    <pad bytes="1" />
+  </struct>
+  
+  <request name="StoreColors" opcode="89" combine-adjacent="true">
+    <pad bytes="1" />
+    <field type="COLORMAP" name="cmap" />
+    <list type="COLORITEM" name="items" />
+  </request>
+
+  <request name="StoreNamedColor" opcode="90">
+    <field type="CARD8" name="flags" mask="ColorFlag" />
+    <field type="COLORMAP" name="cmap" />
+    <field type="CARD32" name="pixel" />
+    <field type="CARD16" name="name_len" />
+    <pad bytes="2" />
+    <list type="char" name="name">
+      <fieldref>name_len</fieldref>
+    </list>
+  </request>
+
+  <struct name="RGB">
+    <field type="CARD16" name="red" />
+    <field type="CARD16" name="green" />
+    <field type="CARD16" name="blue" />
+    <pad bytes="2" />
+  </struct>
+
+  <request name="QueryColors" opcode="91">
+    <pad bytes="1" />
+    <field type="COLORMAP" name="cmap" />
+    <list type="CARD32" name="pixels" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="colors_len" />
+      <pad bytes="22" />
+      <list type="RGB" name="colors">
+        <fieldref>colors_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="LookupColor" opcode="92">
+    <pad bytes="1" />
+    <field type="COLORMAP" name="cmap" />
+    <field type="CARD16" name="name_len" />
+    <pad bytes="2" />
+    <list type="char" name="name">
+      <fieldref>name_len</fieldref>
+    </list>
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="exact_red" />
+      <field type="CARD16" name="exact_green" />
+      <field type="CARD16" name="exact_blue" />
+      <field type="CARD16" name="visual_red" />
+      <field type="CARD16" name="visual_green" />
+      <field type="CARD16" name="visual_blue" />
+    </reply>
+  </request>
+
+  <enum name="Pixmap">
+    <item name="None"> <value>0</value></item>
+  </enum>
+
+  <request name="CreateCursor" opcode="93">
+    <pad bytes="1" />
+    <field type="CURSOR" name="cid" />
+    <field type="PIXMAP" name="source" />
+    <field type="PIXMAP" name="mask" altenum="Pixmap" />
+    <field type="CARD16" name="fore_red" />
+    <field type="CARD16" name="fore_green" />
+    <field type="CARD16" name="fore_blue" />
+    <field type="CARD16" name="back_red" />
+    <field type="CARD16" name="back_green" />
+    <field type="CARD16" name="back_blue" />
+    <field type="CARD16" name="x" />
+    <field type="CARD16" name="y" />
+  </request>
+
+  <enum name="Font">
+    <item name="None"> <value>0</value></item>
+  </enum>
+
+  <request name="CreateGlyphCursor" opcode="94">
+    <pad bytes="1" />
+    <field type="CURSOR" name="cid" />
+    <field type="FONT" name="source_font" />
+    <field type="FONT" name="mask_font" altenum="Font" />
+    <field type="CARD16" name="source_char" />
+    <field type="CARD16" name="mask_char" />
+    <field type="CARD16" name="fore_red" />
+    <field type="CARD16" name="fore_green" />
+    <field type="CARD16" name="fore_blue" />
+    <field type="CARD16" name="back_red" />
+    <field type="CARD16" name="back_green" />
+    <field type="CARD16" name="back_blue" />
+    <doc>
+      <brief>create cursor</brief>
+      <description><![CDATA[
+Creates a cursor from a font glyph. X provides a set of standard cursor shapes
+in a special font named cursor. Applications are encouraged to use this
+interface for their cursors because the font can be customized for the
+individual display type.
+
+All pixels which are set to 1 in the source will use the foreground color (as
+specified by `fore_red`, `fore_green` and `fore_blue`). All pixels set to 0
+will use the background color (as specified by `back_red`, `back_green` and
+`back_blue`).
+      ]]></description>
+      <field name="cid"><![CDATA[
+The ID with which you will refer to the cursor, created by `xcb_generate_id`.
+      ]]></field>
+      <field name="source_font"><![CDATA[
+In which font to look for the cursor glyph.
+      ]]></field>
+      <field name="mask_font"><![CDATA[
+In which font to look for the mask glyph.
+      ]]></field>
+      <field name="source_char"><![CDATA[
+The glyph of `source_font` to use.
+      ]]></field>
+      <field name="mask_char"><![CDATA[
+The glyph of `mask_font` to use as a mask: Pixels which are set to 1 define
+which source pixels are displayed. All pixels which are set to 0 are not
+displayed.
+      ]]></field>
+      <field name="fore_red"><![CDATA[
+The red value of the foreground color.
+      ]]></field>
+      <field name="fore_green"><![CDATA[
+The green value of the foreground color.
+      ]]></field>
+      <field name="fore_blue"><![CDATA[
+The blue value of the foreground color.
+      ]]></field>
+      <field name="back_red"><![CDATA[
+The red value of the background color.
+      ]]></field>
+      <field name="back_green"><![CDATA[
+The green value of the background color.
+      ]]></field>
+      <field name="back_blue"><![CDATA[
+The blue value of the background color.
+      ]]></field>
+      <error type="Alloc"><![CDATA[
+The X server could not allocate the requested resources (no memory?).
+      ]]></error>
+      <error type="Font"><![CDATA[
+The specified `source_font` or `mask_font` does not exist.
+      ]]></error>
+      <error type="Value"><![CDATA[
+Either `source_char` or `mask_char` are not defined in `source_font` or `mask_font`, respectively.
+      ]]></error>
+      <!-- TODO: example -->
+    </doc>
+  </request>
+
+  <request name="FreeCursor" opcode="95">
+    <pad bytes="1" />
+    <field type="CURSOR" name="cursor" />
+    <doc>
+      <brief>Deletes a cursor</brief>
+      <description><![CDATA[
+Deletes the association between the cursor resource ID and the specified
+cursor. The cursor is freed when no other resource references it.
+      ]]></description>
+      <field name="cursor"><![CDATA[The cursor to destroy.]]></field>
+      <error type="Cursor"><![CDATA[
+The specified cursor does not exist.
+      ]]></error>
+    </doc>
+
+  </request>
+
+  <request name="RecolorCursor" opcode="96">
+    <pad bytes="1" />
+    <field type="CURSOR" name="cursor" />
+    <field type="CARD16" name="fore_red" />
+    <field type="CARD16" name="fore_green" />
+    <field type="CARD16" name="fore_blue" />
+    <field type="CARD16" name="back_red" />
+    <field type="CARD16" name="back_green" />
+    <field type="CARD16" name="back_blue" />
+  </request>
+
+  <enum name="QueryShapeOf">
+    <item name="LargestCursor"> <value>0</value></item>
+    <item name="FastestTile">   <value>1</value></item>
+    <item name="FastestStipple"><value>2</value></item>    
+  </enum>
+
+  <request name="QueryBestSize" opcode="97">
+    <field type="CARD8" name="class" enum="QueryShapeOf" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD16" name="width" />
+    <field type="CARD16" name="height" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="width" />
+      <field type="CARD16" name="height" />
+    </reply>
+  </request>
+
+  <request name="QueryExtension" opcode="98">
+    <pad bytes="1" />
+    <field type="CARD16" name="name_len" />
+    <pad bytes="2" />
+    <list type="char" name="name">
+      <fieldref>name_len</fieldref>
+    </list>
+    <reply>
+      <pad bytes="1" />
+      <field type="BOOL" name="present" />
+      <field type="CARD8" name="major_opcode" />
+      <field type="CARD8" name="first_event" />
+      <field type="CARD8" name="first_error" />
+      <doc>
+        <field name="present"><![CDATA[
+Whether the extension is present on this X11 server.
+        ]]></field>
+        <field name="major_opcode"><![CDATA[
+The major opcode for requests.
+        ]]></field>
+        <field name="first_event"><![CDATA[
+The first event code, if any.
+        ]]></field>
+        <field name="first_error"><![CDATA[
+The first error code, if any.
+        ]]></field>
+      </doc>
+    </reply>
+    <doc>
+      <brief>check if extension is present</brief>
+      <description><![CDATA[
+Determines if the specified extension is present on this X11 server.
+
+Every extension has a unique `major_opcode` to identify requests, the minor
+opcodes and request formats are extension-specific. If the extension provides
+events and errors, the `first_event` and `first_error` fields in the reply are
+set accordingly.
+
+There should rarely be a need to use this request directly, XCB provides the
+`xcb_get_extension_data` function instead.
+      ]]></description>
+      <field name="name_len"><![CDATA[
+The length of `name` in bytes.
+      ]]></field>
+      <field name="name"><![CDATA[
+The name of the extension to query, for example "RANDR". This is case
+sensitive!
+      ]]></field>
+      <see type="program" name="xdpyinfo" />
+      <see type="function" name="xcb_get_extension_data" />
+    </doc>
+  </request>
+
+  <request name="ListExtensions" opcode="99">
+    <reply>
+      <field type="CARD8" name="names_len" />
+      <pad bytes="24" />
+      <list type="STR" name="names">
+        <fieldref>names_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="ChangeKeyboardMapping" opcode="100">
+    <field type="CARD8" name="keycode_count" />
+    <field type="KEYCODE" name="first_keycode" />
+    <field type="CARD8" name="keysyms_per_keycode" />
+    <pad bytes="2" />
+    <list type="KEYSYM" name="keysyms">
+      <op op="*">
+        <fieldref>keycode_count</fieldref>
+        <fieldref>keysyms_per_keycode</fieldref>
+      </op>
+    </list>
+  </request>
+
+  <request name="GetKeyboardMapping" opcode="101">
+    <pad bytes="1" />
+    <field type="KEYCODE" name="first_keycode" />
+    <field type="CARD8" name="count" />
+    <reply>
+      <field type="BYTE" name="keysyms_per_keycode" />
+      <pad bytes="24" />
+      <list type="KEYSYM" name="keysyms">
+        <fieldref>length</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <enum name="KB">
+    <item name="KeyClickPercent"><bit>0</bit></item>
+    <item name="BellPercent">    <bit>1</bit></item>
+    <item name="BellPitch">      <bit>2</bit></item>
+    <item name="BellDuration">   <bit>3</bit></item>
+    <item name="Led">            <bit>4</bit></item>
+    <item name="LedMode">        <bit>5</bit></item>
+    <item name="Key">            <bit>6</bit></item>
+    <item name="AutoRepeatMode"> <bit>7</bit></item>
+  </enum>
+
+  <enum name="LedMode">
+    <item name="Off"><value>0</value></item>
+    <item name="On"> <value>1</value></item>
+  </enum>
+
+  <enum name="AutoRepeatMode">
+    <item name="Off">    <value>0</value></item>
+    <item name="On">     <value>1</value></item>
+    <item name="Default"><value>2</value></item>
+  </enum>
+
+  <request name="ChangeKeyboardControl" opcode="102">
+    <pad bytes="1" />
+    <field type="CARD32" name="value_mask" mask="KB" />
+    <switch name="value_list">
+        <fieldref>value_mask</fieldref>
+        <bitcase>
+          <enumref ref="KB">KeyClickPercent</enumref>
+          <field type="INT32" name="key_click_percent" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="KB">BellPercent</enumref>
+          <field type="INT32" name="bell_percent" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="KB">BellPitch</enumref>
+          <field type="INT32" name="bell_pitch" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="KB">BellDuration</enumref>
+          <field type="INT32" name="bell_duration" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="KB">Led</enumref>
+          <field type="CARD32" name="led" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="KB">LedMode</enumref>
+          <field type="CARD32" name="led_mode" enum="LedMode"/>
+        </bitcase>
+        <bitcase>
+          <enumref ref="KB">Key</enumref>
+          <field type="KEYCODE32" name="key" />
+        </bitcase>
+        <bitcase>
+          <enumref ref="KB">AutoRepeatMode</enumref>
+          <field type="CARD32" name="auto_repeat_mode" enum="AutoRepeatMode"/>
+        </bitcase>
+    </switch>
+
+  </request>
+
+  <request name="GetKeyboardControl" opcode="103">
+    <reply>
+      <field type="BYTE" name="global_auto_repeat" enum="AutoRepeatMode" />
+      <field type="CARD32" name="led_mask" />
+      <field type="CARD8" name="key_click_percent" />
+      <field type="CARD8" name="bell_percent" />
+      <field type="CARD16" name="bell_pitch" />
+      <field type="CARD16" name="bell_duration" />
+      <pad bytes="2" />
+      <list type="CARD8" name="auto_repeats"><value>32</value></list>
+    </reply>
+  </request>
+
+  <request name="Bell" opcode="104">
+    <field type="INT8" name="percent" />
+  </request>
+
+  <request name="ChangePointerControl" opcode="105">
+    <pad bytes="1" />
+    <field type="INT16" name="acceleration_numerator" />
+    <field type="INT16" name="acceleration_denominator" />
+    <field type="INT16" name="threshold" />
+    <field type="BOOL" name="do_acceleration" />
+    <field type="BOOL" name="do_threshold" />
+  </request>
+
+  <request name="GetPointerControl" opcode="106">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="acceleration_numerator" />
+      <field type="CARD16" name="acceleration_denominator" />
+      <field type="CARD16" name="threshold" />
+      <pad bytes="18" />
+    </reply>
+  </request>
+
+  <!-- Screen saver timeout and interval can be set to -1 to restore defaults
+       and set to 0 to disable the screen saver. -->
+
+  <enum name="Blanking">
+    <item name="NotPreferred"><value>0</value></item>
+    <item name="Preferred">   <value>1</value></item>
+    <item name="Default">     <value>2</value></item>
+  </enum>
+
+  <enum name="Exposures">
+    <item name="NotAllowed"><value>0</value></item>
+    <item name="Allowed">   <value>1</value></item>
+    <item name="Default">   <value>2</value></item>
+  </enum>
+
+  <request name="SetScreenSaver" opcode="107">
+    <pad bytes="1" />
+    <field type="INT16" name="timeout" />
+    <field type="INT16" name="interval" />
+    <field type="CARD8" name="prefer_blanking" enum="Blanking" />
+    <field type="CARD8" name="allow_exposures" enum="Exposures" />
+  </request>
+
+  <request name="GetScreenSaver" opcode="108">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="timeout" />
+      <field type="CARD16" name="interval" />
+      <field type="BYTE" name="prefer_blanking" enum="Blanking" />
+      <field type="BYTE" name="allow_exposures" enum="Exposures" />
+      <pad bytes="18" />
+    </reply>
+  </request>
+
+  <enum name="HostMode">
+    <item name="Insert"><value>0</value></item>
+    <item name="Delete"><value>1</value></item>
+  </enum>
+
+  <!-- also used and extended for Xau authentication -->
+  <enum name="Family">
+    <item name="Internet">         <value>0</value></item>
+    <item name="DECnet">           <value>1</value></item>
+    <item name="Chaos">            <value>2</value></item>
+    <item name="ServerInterpreted"><value>5</value></item>
+    <item name="Internet6">        <value>6</value></item>
+  </enum>
+
+  <request name="ChangeHosts" opcode="109">
+    <field type="CARD8" name="mode" enum="HostMode" />
+    <field type="CARD8" name="family" enum="Family" />
+    <pad bytes="1" />
+    <field type="CARD16" name="address_len" />
+    <list type="BYTE" name="address">
+      <fieldref>address_len</fieldref>
+    </list>
+  </request>
+
+  <struct name="HOST">
+    <field type="CARD8" name="family" enum="Family" />
+    <pad bytes="1" />
+    <field type="CARD16" name="address_len" />
+    <list type="BYTE" name="address">
+      <fieldref>address_len</fieldref>
+    </list>
+    <pad align="4" />
+  </struct>
+
+  <request name="ListHosts" opcode="110">
+    <reply>
+      <field type="BYTE" name="mode" enum="AccessControl" />
+      <field type="CARD16" name="hosts_len" />
+      <pad bytes="22" />
+      <list type="HOST" name="hosts">
+        <fieldref>hosts_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <enum name="AccessControl">
+    <item name="Disable"><value>0</value></item>
+    <item name="Enable"> <value>1</value></item>
+  </enum>
+
+  <request name="SetAccessControl" opcode="111">
+    <field type="CARD8" name="mode" enum="AccessControl" />
+  </request>
+
+  <enum name="CloseDown">
+    <item name="DestroyAll">     <value>0</value></item>
+    <item name="RetainPermanent"><value>1</value></item>
+    <item name="RetainTemporary"><value>2</value></item>
+  </enum>
+
+  <request name="SetCloseDownMode" opcode="112">
+    <field type="CARD8" name="mode" enum="CloseDown" />
+  </request>
+
+  <enum name="Kill">
+    <item name="AllTemporary"><value>0</value></item>
+  </enum>
+
+  <request name="KillClient" opcode="113">
+    <pad bytes="1" />
+    <field type="CARD32" name="resource" altenum="Kill" />
+    <doc>
+      <brief>kills a client</brief>
+      <description><![CDATA[
+Forces a close down of the client that created the specified `resource`.
+      ]]></description>
+      <field name="resource"><![CDATA[
+Any resource belonging to the client (for example a Window), used to identify
+the client connection.
+
+The special value of `XCB_KILL_ALL_TEMPORARY`, the resources of all clients
+that have terminated in `RetainTemporary` (TODO) are destroyed.
+      ]]></field>
+      <error type="Value"><![CDATA[
+The specified `resource` does not exist.
+      ]]></error>
+      <see type="program" name="xkill" />
+    </doc>
+
+  </request>
+
+  <request name="RotateProperties" opcode="114">
+    <pad bytes="1" />
+    <field type="WINDOW" name="window" />
+    <field type="CARD16" name="atoms_len" />
+    <field type="INT16" name="delta" />
+    <list type="ATOM" name="atoms">
+      <fieldref>atoms_len</fieldref>
+    </list>
+  </request>
+
+  <enum name="ScreenSaver">
+    <item name="Reset"> <value>0</value></item>
+    <item name="Active"><value>1</value></item>
+  </enum>
+
+  <request name="ForceScreenSaver" opcode="115">
+    <field type="CARD8" name="mode" enum="ScreenSaver" />
+  </request>
+
+  <!-- Reply from SetPointerMapping or SetModifierMapping -->
+  <enum name="MappingStatus">
+    <item name="Success"><value>0</value></item>
+    <item name="Busy">   <value>1</value></item>
+    <item name="Failure"><value>2</value></item>
+  </enum>
+
+  <request name="SetPointerMapping" opcode="116">
+    <field type="CARD8" name="map_len" />
+    <list type="CARD8" name="map">
+      <fieldref>map_len</fieldref>
+    </list>
+    <reply>
+      <field type="BYTE" name="status" enum="MappingStatus" />
+    </reply>
+  </request>
+
+  <request name="GetPointerMapping" opcode="117">
+    <reply>
+      <field type="CARD8" name="map_len" />
+      <pad bytes="24" />
+      <list type="CARD8" name="map">
+        <fieldref>map_len</fieldref>
+      </list>
+    </reply>
+  </request>
+  
+  <enum name="MapIndex">
+    <item name="Shift">  <value>0</value></item>
+    <item name="Lock">   <value>1</value></item>
+    <item name="Control"><value>2</value></item>
+    <item name="1">      <value>3</value></item>
+    <item name="2">      <value>4</value></item>
+    <item name="3">      <value>5</value></item>
+    <item name="4">      <value>6</value></item>
+    <item name="5">      <value>7</value></item>
+  </enum>
+
+  <request name="SetModifierMapping" opcode="118">
+    <field type="CARD8" name="keycodes_per_modifier" />
+    <list type="KEYCODE" name="keycodes">
+      <op op="*">
+        <fieldref>keycodes_per_modifier</fieldref>
+        <value>8</value>
+      </op>
+    </list>
+    <reply>
+      <field type="BYTE" name="status" enum="MappingStatus" />
+    </reply>
+  </request>
+
+  <request name="GetModifierMapping" opcode="119">
+    <reply>
+      <field type="CARD8" name="keycodes_per_modifier" />
+      <pad bytes="24" />
+      <list type="KEYCODE" name="keycodes">
+        <op op="*">
+          <fieldref>keycodes_per_modifier</fieldref>
+          <value>8</value>
+        </op>
+      </list>
+    </reply>
+  </request>
+
+  <!--
+    FIXME: NoOperation should allow specifying payload length
+    but geez, malloc()ing a 262140 byte buffer just so I have something
+    to hand to write(2) seems silly...!
+  -->
+  <request name="NoOperation" opcode="127" />
+
+</xcb>
diff --git a/third_party/xcbproto/src/src/xselinux.xml b/third_party/xcbproto/src/src/xselinux.xml
new file mode 100644
index 000000000000..a97a146847d1
--- /dev/null
+++ b/third_party/xcbproto/src/src/xselinux.xml
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+<xcb header="xselinux" extension-xname="SELinux" extension-name="SELinux"
+     extension-multiword="false" major-version="1" minor-version="0">
+  <import>xproto</import>
+
+  <request name="QueryVersion" opcode="0">
+    <field type="CARD8" name="client_major" />
+    <field type="CARD8" name="client_minor" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD16" name="server_major" />
+      <field type="CARD16" name="server_minor" />
+    </reply>
+  </request>
+
+  <request name="SetDeviceCreateContext" opcode="1">
+    <field type="CARD32" name="context_len" />
+    <list type="char" name="context">
+      <fieldref>context_len</fieldref>
+    </list>
+  </request>
+
+  <request name="GetDeviceCreateContext" opcode="2">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="SetDeviceContext" opcode="3">
+    <field type="CARD32" name="device" />
+    <field type="CARD32" name="context_len" />
+    <list type="char" name="context">
+      <fieldref>context_len</fieldref>
+    </list>
+  </request>
+
+  <request name="GetDeviceContext" opcode="4">
+    <field type="CARD32" name="device" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="SetWindowCreateContext" opcode="5">
+    <field type="CARD32" name="context_len" />
+    <list type="char" name="context">
+      <fieldref>context_len</fieldref>
+    </list>
+  </request>
+
+  <request name="GetWindowCreateContext" opcode="6">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="GetWindowContext" opcode="7">
+    <field type="WINDOW" name="window" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <struct name="ListItem">
+    <field type="ATOM" name="name" />
+    <field type="CARD32" name="object_context_len" />
+    <field type="CARD32" name="data_context_len" />
+    <list type="char" name="object_context">
+      <fieldref>object_context_len</fieldref>
+    </list>
+    <pad align="4" />
+    <list type="char" name="data_context">
+      <fieldref>data_context_len</fieldref>
+    </list>
+    <pad align="4" />
+  </struct>
+
+  <request name="SetPropertyCreateContext" opcode="8">
+    <field type="CARD32" name="context_len" />
+    <list type="char" name="context">
+      <fieldref>context_len</fieldref>
+    </list>
+  </request>
+
+  <request name="GetPropertyCreateContext" opcode="9">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="SetPropertyUseContext" opcode="10">
+    <field type="CARD32" name="context_len" />
+    <list type="char" name="context">
+      <fieldref>context_len</fieldref>
+    </list>
+  </request>
+
+  <request name="GetPropertyUseContext" opcode="11">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="GetPropertyContext" opcode="12">
+    <field type="WINDOW" name="window" />
+    <field type="ATOM" name="property" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="GetPropertyDataContext" opcode="13">
+    <field type="WINDOW" name="window" />
+    <field type="ATOM" name="property" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="ListProperties" opcode="14">
+    <field type="WINDOW" name="window" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="properties_len" />
+      <pad bytes="20" />
+      <list type="ListItem" name="properties">
+	<fieldref>properties_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="SetSelectionCreateContext" opcode="15">
+    <field type="CARD32" name="context_len" />
+    <list type="char" name="context">
+      <fieldref>context_len</fieldref>
+    </list>
+  </request>
+
+  <request name="GetSelectionCreateContext" opcode="16">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="SetSelectionUseContext" opcode="17">
+    <field type="CARD32" name="context_len" />
+    <list type="char" name="context">
+      <fieldref>context_len</fieldref>
+    </list>
+  </request>
+
+  <request name="GetSelectionUseContext" opcode="18">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="GetSelectionContext" opcode="19">
+    <field type="ATOM" name="selection" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="GetSelectionDataContext" opcode="20">
+    <field type="ATOM" name="selection" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="ListSelections" opcode="21">
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="selections_len" />
+      <pad bytes="20" />
+      <list type="ListItem" name="selections">
+	<fieldref>selections_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+  <request name="GetClientContext" opcode="22">
+    <field type="CARD32" name="resource" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="context_len" />
+      <pad bytes="20" />
+      <list type="char" name="context">
+	<fieldref>context_len</fieldref>
+      </list>
+    </reply>
+  </request>
+
+</xcb>
diff --git a/third_party/xcbproto/src/src/xtest.xml b/third_party/xcbproto/src/src/xtest.xml
new file mode 100644
index 000000000000..085d3a3dc4f2
--- /dev/null
+++ b/third_party/xcbproto/src/src/xtest.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2006 Ian Osgood
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person ob/Sintaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<xcb header="xtest" extension-xname="XTEST" extension-name="Test"
+    major-version="2" minor-version="2">
+
+    <import>xproto</import>
+    
+    <!-- Requests -->
+    <request name="GetVersion" opcode="0">
+        <field type="CARD8"  name="major_version" />
+        <pad bytes="1" />
+        <field type="CARD16" name="minor_version" />
+        <reply>
+            <field type="CARD8"  name="major_version" />
+            <field type="CARD16" name="minor_version" />
+        </reply>
+    </request>
+
+    <enum name="Cursor">
+        <item name="None">   <value>0</value></item>
+        <item name="Current"><value>1</value></item>
+    </enum>
+
+    <request name="CompareCursor" opcode="1">
+        <field type="WINDOW" name="window" />
+        <field type="CURSOR" name="cursor" />
+        <reply>
+            <field type="BOOL" name="same" />
+        </reply>
+    </request>
+    
+    <!-- There are several ways to use the FakeInput request:
+            1. Simulate a keypress:
+                type   = XCBKeyPress or XCBKeyRelease
+                detail = keycode
+            2. Simulate a button:
+                type   = XCBButtonPress or XCBButtonRelease
+                detail = enum XCBButton (1..5)
+            3. Simulate mouse motion:
+                type   = XCBMotionNotify
+                detail = 0 or 1
+                root = XCBNone or a root window id
+                rootX,
+                rootY  = position (relative if detail==1)
+
+        Version 2.2 adds support for the XInput extension:
+            4. Simulate a device keypress
+            5. Simulate a device button
+            6. Simulate a proximity event
+            7. Simulate a device motion event
+                [These are not yet supported, since we would also need to
+                 send the variable-length state of the axes.]
+
+        In each case, time is set to a delay in milliseconds.
+    -->
+
+    <request name="FakeInput" opcode="2">
+        <field type="BYTE"   name="type" />
+        <field type="BYTE"   name="detail" />
+        <pad bytes="2" />
+        <field type="CARD32" name="time" />
+        <field type="WINDOW" name="root" />
+        <pad bytes="8" />
+        <field type="INT16" name="rootX" />
+        <field type="INT16" name="rootY" />
+        <pad bytes="7" />
+        <!-- Version 2.2: XInput device -->
+        <field type="CARD8"  name="deviceid" />
+        <!-- Version 2.2: optional axes state here -->
+    </request>
+
+    <request name="GrabControl" opcode="3">
+        <field type="BOOL" name="impervious" />
+        <pad bytes="3" />
+    </request>
+    
+    <!-- No events or errors -->
+
+</xcb>
diff --git a/third_party/xcbproto/src/src/xv.xml b/third_party/xcbproto/src/src/xv.xml
new file mode 100644
index 000000000000..6db133fa6c04
--- /dev/null
+++ b/third_party/xcbproto/src/src/xv.xml
@@ -0,0 +1,445 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2006 Jeremy Kolb.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<xcb header="xv" extension-xname="XVideo" extension-name="Xv" major-version="2" minor-version="2">
+    <import>xproto</import>
+    <import>shm</import>
+    <!-- Implements version 2.2 of XV -->
+
+    <!-- XIDs -->
+    <xidtype name="PORT" />
+    <xidtype name="ENCODING" />
+
+    <enum name="Type">
+        <item name="InputMask"><bit>0</bit></item>
+        <item name="OutputMask"><bit>1</bit></item>
+        <item name="VideoMask"><bit>2</bit></item>
+        <item name="StillMask"><bit>3</bit></item>
+        <item name="ImageMask"><bit>4</bit></item>
+    </enum>
+
+    <enum name="ImageFormatInfoType">
+        <item name="RGB"> <value>0</value> </item>
+        <item name="YUV"> <value>1</value> </item>
+    </enum>
+
+    <enum name="ImageFormatInfoFormat">
+        <item name="Packed"> <value>0</value> </item>
+        <item name="Planar"> <value>1</value> </item>
+    </enum>
+
+    <enum name="AttributeFlag">
+        <item name="Gettable"><bit>0</bit></item>
+        <item name="Settable"><bit>1</bit></item>
+    </enum>
+    
+    <enum name="VideoNotifyReason">
+	<item name="Started">   <value>0</value> </item>
+	<item name="Stopped">   <value>1</value> </item>
+	<item name="Busy">      <value>2</value> </item>
+	<item name="Preempted"> <value>3</value> </item>
+	<item name="HardError"> <value>4</value> </item>
+    </enum>
+
+    <enum name="ScanlineOrder">
+        <item name="TopToBottom"> <value>0</value> </item>
+        <item name="BottomToTop"> <value>1</value> </item>
+    </enum>
+
+    <enum name="GrabPortStatus">
+        <item name="Success">        <value>0</value> </item>
+        <item name="BadExtension">   <value>1</value> </item>
+        <item name="AlreadyGrabbed"> <value>2</value> </item>
+        <item name="InvalidTime">    <value>3</value> </item>
+        <item name="BadReply">       <value>4</value> </item>
+        <item name="BadAlloc">       <value>5</value> </item>
+    </enum>
+
+    <struct name="Rational">
+        <field type="INT32" name="numerator" />
+        <field type="INT32" name="denominator" />
+    </struct>
+
+    <struct name="Format">
+        <field type="VISUALID" name="visual" />
+        <field type="CARD8" name="depth" />
+        <pad bytes="3" />
+    </struct>
+
+    <struct name="AdaptorInfo">
+        <field type="PORT" name="base_id" />
+        <field type="CARD16" name="name_size" />
+        <field type="CARD16" name="num_ports" />
+        <field type="CARD16" name="num_formats" />
+        <field type="CARD8" name="type" mask="Type" />
+        <pad bytes="1" />
+        <list type="char" name="name">
+            <fieldref>name_size</fieldref>
+        </list>
+        <pad align="4" />
+        <list type="Format" name="formats">
+            <fieldref>num_formats</fieldref>
+        </list>
+
+    </struct>
+
+    <struct name="EncodingInfo">
+        <field type="ENCODING" name="encoding" />
+        <field type="CARD16" name="name_size" />
+        <field type="CARD16" name="width" />
+        <field type="CARD16" name="height" />
+        <pad bytes="2" />
+        <field type="Rational" name="rate" />
+        <list type="char" name="name">
+            <fieldref>name_size</fieldref>
+        </list>
+        <pad align="4" />
+    </struct>
+
+    <struct name="Image">
+        <field type="CARD32" name="id" />
+        <field type="CARD16" name="width" />
+        <field type="CARD16" name="height" />
+        <field type="CARD32" name="data_size" />
+        <field type="CARD32" name="num_planes" />
+        <list type="CARD32" name="pitches">
+            <fieldref>num_planes</fieldref>
+        </list>
+        <list type="CARD32" name="offsets">
+            <fieldref>num_planes</fieldref>
+        </list>
+        <list type="CARD8" name="data">
+            <fieldref>data_size</fieldref>
+        </list>
+        <!-- Some XPointer "obdata" for SHM use-->
+    </struct>
+    
+    <struct name="AttributeInfo">
+        <field type="CARD32" name="flags" mask="AttributeFlag" />
+        <field type="INT32" name="min" />
+        <field type="INT32" name="max" />
+        <field type="CARD32" name="size" />
+        <list type="char" name="name">
+            <fieldref>size</fieldref>
+        </list>
+        <pad align="4" />
+    </struct>
+
+    <struct name="ImageFormatInfo">
+        <field type="CARD32" name="id" />
+        <field type="CARD8" name="type" enum="ImageFormatInfoType" />
+        <field type="CARD8" name="byte_order" enum="ImageOrder" />
+        <pad bytes="2" />
+        <list type="CARD8" name="guid">
+            <value>16</value>
+        </list>
+        <field type="CARD8" name="bpp" />
+        <field type="CARD8" name="num_planes" />
+        <pad bytes="2" />
+        <field type="CARD8" name="depth" />
+        <pad bytes="3" />
+        <field type="CARD32" name="red_mask" />
+        <field type="CARD32" name="green_mask" />
+        <field type="CARD32" name="blue_mask" />
+        <field type="CARD8" name="format" enum="ImageFormatInfoFormat" />
+        <pad bytes="3" />
+        <field type="CARD32" name="y_sample_bits" />
+        <field type="CARD32" name="u_sample_bits" />
+        <field type="CARD32" name="v_sample_bits" />
+        <field type="CARD32" name="vhorz_y_period" />
+        <field type="CARD32" name="vhorz_u_period" />
+        <field type="CARD32" name="vhorz_v_period" />
+        <field type="CARD32" name="vvert_y_period" />
+        <field type="CARD32" name="vvert_u_period" />
+        <field type="CARD32" name="vvert_v_period" />
+        <list type="CARD8" name="vcomp_order">
+            <value>32</value>
+        </list>
+        <field type="CARD8" name="vscanline_order" enum="ScanlineOrder" />
+        <pad bytes="11" />
+    </struct>
+
+
+    <!-- Errors -->
+    <error name="BadPort" number="0"/>
+    <error name="BadEncoding" number="1"/>
+    <error name="BadControl" number="2"/>
+
+    <!-- Events -->
+    <event name="VideoNotify" number="0">
+        <field type="BYTE" name="reason" enum="VideoNotifyReason" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="DRAWABLE" name="drawable" />
+        <field type="PORT" name="port" />
+    </event>
+
+    <event name="PortNotify" number="1">
+        <pad bytes="1" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="PORT" name="port" />
+        <field type="ATOM" name="attribute" />
+        <field type="INT32" name="value" />
+    </event>
+    
+    
+    <!-- Requests -->
+    <request name="QueryExtension" opcode="0">
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="major" />
+            <field type="CARD16" name="minor" />
+        </reply>
+    </request>
+
+    <request name="QueryAdaptors" opcode="1">
+        <field type="WINDOW" name="window" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="num_adaptors" />
+            <pad bytes="22" />
+            <list type="AdaptorInfo" name="info">
+                <fieldref>num_adaptors</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="QueryEncodings" opcode="2">
+        <field type="PORT" name="port" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="num_encodings" />
+            <pad bytes="22" />
+            <list type="EncodingInfo" name="info">
+                <fieldref>num_encodings</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="GrabPort" opcode="3">
+        <field type="PORT" name="port" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <reply>
+            <field type="BYTE" name="result" enum="GrabPortStatus" />
+        </reply>
+    </request>
+
+    <request name="UngrabPort" opcode="4">
+        <field type="PORT" name="port" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+    </request>
+
+    <request name="PutVideo" opcode="5">
+        <field type="PORT" name="port" />
+        <field type="DRAWABLE" name="drawable" />
+        <field type="GCONTEXT" name="gc" />
+        <field type="INT16" name="vid_x" />
+        <field type="INT16" name="vid_y" />
+        <field type="CARD16" name="vid_w" />
+        <field type="CARD16" name="vid_h" />
+        <field type="INT16" name="drw_x" />
+        <field type="INT16" name="drw_y" />
+        <field type="CARD16" name="drw_w" />
+        <field type="CARD16" name="drw_h" />
+    </request>
+
+    <request name="PutStill" opcode="6">
+        <field type="PORT" name="port" />
+        <field type="DRAWABLE" name="drawable" />
+        <field type="GCONTEXT" name="gc" />
+        <field type="INT16" name="vid_x" />
+        <field type="INT16" name="vid_y" />
+        <field type="CARD16" name="vid_w" />
+        <field type="CARD16" name="vid_h" />
+        <field type="INT16" name="drw_x" />
+        <field type="INT16" name="drw_y" />
+        <field type="CARD16" name="drw_w" />
+        <field type="CARD16" name="drw_h" />
+    </request>
+
+    <request name="GetVideo" opcode="7">
+        <field type="PORT" name="port" />
+        <field type="DRAWABLE" name="drawable" />
+        <field type="GCONTEXT" name="gc" />
+        <field type="INT16" name="vid_x" />
+        <field type="INT16" name="vid_y" />
+        <field type="CARD16" name="vid_w" />
+        <field type="CARD16" name="vid_h" />
+        <field type="INT16" name="drw_x" />
+        <field type="INT16" name="drw_y" />
+        <field type="CARD16" name="drw_w" />
+        <field type="CARD16" name="drw_h" />
+    </request>
+
+    <request name="GetStill" opcode="8">
+        <field type="PORT" name="port" />
+        <field type="DRAWABLE" name="drawable" />
+        <field type="GCONTEXT" name="gc" />
+        <field type="INT16" name="vid_x" />
+        <field type="INT16" name="vid_y" />
+        <field type="CARD16" name="vid_w" />
+        <field type="CARD16" name="vid_h" />
+        <field type="INT16" name="drw_x" />
+        <field type="INT16" name="drw_y" />
+        <field type="CARD16" name="drw_w" />
+        <field type="CARD16" name="drw_h" />
+    </request>
+
+    <request name="StopVideo" opcode="9">
+        <field type="PORT" name="port" />
+        <field type="DRAWABLE" name="drawable" />
+    </request>
+
+    <request name="SelectVideoNotify" opcode="10">
+        <field type="DRAWABLE" name="drawable" />
+        <field type="BOOL" name="onoff" />
+        <pad bytes="3" />
+    </request>
+
+    <request name="SelectPortNotify" opcode="11">
+        <field type="PORT" name="port" />
+        <field type="BOOL" name="onoff" />
+        <pad bytes="3" />
+    </request>
+
+    <request name="QueryBestSize" opcode="12">
+        <field type="PORT" name="port" />
+        <field type="CARD16" name="vid_w" />
+        <field type="CARD16" name="vid_h" />
+        <field type="CARD16" name="drw_w" />
+        <field type="CARD16" name="drw_h" />
+        <field type="BOOL" name="motion" />
+        <pad bytes="3" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="actual_width" />
+            <field type="CARD16" name="actual_height" />
+        </reply>
+    </request>
+
+    <request name="SetPortAttribute" opcode="13">
+        <field type="PORT" name="port" />
+        <field type="ATOM" name="attribute" />
+        <field type="INT32" name="value" />
+    </request>
+
+    <request name="GetPortAttribute" opcode="14">
+        <field type="PORT" name="port" />
+        <field type="ATOM" name="attribute" />
+        <reply>
+            <pad bytes="1" />
+            <field type="INT32" name="value" />
+        </reply>
+    </request>
+
+    <!-- Not in the docs beyond this point :( -->
+
+    <request name="QueryPortAttributes" opcode="15">
+        <field type="PORT" name="port" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="num_attributes" />
+            <field type="CARD32" name="text_size" />
+            <pad bytes="16" />
+            <list type="AttributeInfo" name="attributes">
+                <fieldref>num_attributes</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="ListImageFormats" opcode="16">
+        <field type="PORT" name="port" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="num_formats" />
+            <pad bytes="20" />
+            <list type="ImageFormatInfo" name="format">
+                <fieldref>num_formats</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="QueryImageAttributes" opcode="17">
+        <field type="PORT" name="port" />
+        <field type="CARD32" name="id" />
+        <field type="CARD16" name="width" />
+        <field type="CARD16" name="height" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="num_planes" />
+            <field type="CARD32" name="data_size" />
+            <field type="CARD16" name="width" />
+            <field type="CARD16" name="height" />
+            <pad bytes="12" />
+            <list type="CARD32" name="pitches">
+                <fieldref>num_planes</fieldref>
+            </list>
+            <list type="CARD32" name="offsets">
+                <fieldref>num_planes</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="PutImage" opcode="18">
+        <field type="PORT" name="port" />
+        <field type="DRAWABLE" name="drawable" />
+        <field type="GCONTEXT" name="gc" />
+        <field type="CARD32" name="id" />
+        <field type="INT16" name="src_x" />
+        <field type="INT16" name="src_y" />
+        <field type="CARD16" name="src_w" />
+        <field type="CARD16" name="src_h" />
+        <field type="INT16" name="drw_x" />
+        <field type="INT16" name="drw_y" />
+        <field type="CARD16" name="drw_w" />
+        <field type="CARD16" name="drw_h" />
+        <field type="CARD16" name="width" />
+        <field type="CARD16" name="height" />
+	<list type="CARD8" name="data" />
+    </request>
+
+    <request name="ShmPutImage" opcode="19">
+        <field type="PORT" name="port" />
+        <field type="DRAWABLE" name="drawable" />
+        <field type="GCONTEXT" name="gc" />
+        <field type="SEG" name="shmseg" />
+        <field type="CARD32" name="id" />
+        <field type="CARD32" name="offset" />
+        <field type="INT16" name="src_x" />
+        <field type="INT16" name="src_y" />
+        <field type="CARD16" name="src_w" />
+        <field type="CARD16" name="src_h" />
+        <field type="INT16" name="drw_x" />
+        <field type="INT16" name="drw_y" />
+        <field type="CARD16" name="drw_w" />
+        <field type="CARD16" name="drw_h" />
+        <field type="CARD16" name="width" />
+        <field type="CARD16" name="height" />
+        <field type="CARD8" name="send_event" />
+        <pad bytes="3" />
+    </request>
+</xcb>
diff --git a/third_party/xcbproto/src/src/xvmc.xml b/third_party/xcbproto/src/src/xvmc.xml
new file mode 100644
index 000000000000..ac80003f91ac
--- /dev/null
+++ b/third_party/xcbproto/src/src/xvmc.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2006 Jeremy Kolb.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the names of the authors or their
+institutions shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from the authors.
+-->
+
+<xcb header="xvmc" extension-xname="XVideo-MotionCompensation" extension-name="XvMC" major-version="1" minor-version="1">
+    <import>xv</import>
+
+    <xidtype name="CONTEXT" />
+    <xidtype name="SURFACE" />
+    <xidtype name="SUBPICTURE" />
+
+    <struct name="SurfaceInfo">
+        <field type="SURFACE" name="id" />
+        <field type="CARD16" name="chroma_format" />
+        <field type="CARD16" name="pad0" />
+        <field type="CARD16" name="max_width" />
+        <field type="CARD16" name="max_height" />
+        <field type="CARD16" name="subpicture_max_width" />
+        <field type="CARD16" name="subpicture_max_height" />
+        <field type="CARD32" name="mc_type" />
+        <field type="CARD32" name="flags" />
+    </struct>
+    
+    <request name="QueryVersion" opcode="0"> 
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="major" />
+            <field type="CARD32" name="minor" />
+        </reply>
+    </request> 
+
+    <request name="ListSurfaceTypes" opcode="1">
+        <field type="PORT" name="port_id" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="num" />
+            <pad bytes="20" />
+            <list type="SurfaceInfo" name="surfaces">
+                <fieldref>num</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <request name="CreateContext" opcode="2">
+        <field type="CONTEXT" name="context_id" />
+        <field type="PORT" name="port_id" />
+        <field type="SURFACE" name="surface_id" />
+        <field type="CARD16" name="width" />
+        <field type="CARD16" name="height" />
+        <field type="CARD32" name="flags" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="width_actual" />
+            <field type="CARD16" name="height_actual" />
+            <field type="CARD32" name="flags_return" />
+            <pad bytes="20" />
+            <list type="CARD32" name="priv_data">
+		<fieldref>length</fieldref>
+	    </list>
+        </reply>
+    </request>
+
+    <request name="DestroyContext" opcode="3">
+        <field type="CONTEXT" name="context_id" />
+    </request>
+    
+    <request name="CreateSurface" opcode="4">
+        <field type="SURFACE" name="surface_id" />
+        <field type="CONTEXT" name="context_id" />
+        <reply>
+            <pad bytes="1" />
+            <pad bytes="24" />
+            <list type="CARD32" name="priv_data">
+		<fieldref>length</fieldref>
+	    </list>
+        </reply>
+    </request>
+
+    <request name="DestroySurface" opcode="5">
+        <field type="SURFACE" name="surface_id" />
+    </request>
+
+    <request name="CreateSubpicture" opcode="6">
+        <field type="SUBPICTURE" name="subpicture_id" />
+        <field type="CONTEXT" name="context" />
+        <field type="CARD32" name="xvimage_id" />
+        <field type="CARD16" name="width" />
+        <field type="CARD16" name="height" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="width_actual" />
+            <field type="CARD16" name="height_actual" />
+            <field type="CARD16" name="num_palette_entries" />
+            <field type="CARD16" name="entry_bytes" />
+            <list type="CARD8" name="component_order">
+                <value>4</value>
+            </list>
+            <pad bytes="12" />
+            <list type="CARD32" name="priv_data">
+		<fieldref>length</fieldref>
+	    </list>
+        </reply>
+    </request>
+
+    <request name="DestroySubpicture" opcode="7">
+        <field type="SUBPICTURE" name="subpicture_id" />
+    </request>
+
+    <request name="ListSubpictureTypes" opcode="8">
+        <field type="PORT" name="port_id" />
+        <field type="SURFACE" name="surface_id" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD32" name="num" />
+            <pad bytes="20" />
+            <list type="ImageFormatInfo" name="types">
+                <fieldref>num</fieldref>
+            </list>
+        </reply>    
+    </request>
+
+</xcb> 
diff --git a/third_party/xcbproto/src/xcb-proto.pc.in b/third_party/xcbproto/src/xcb-proto.pc.in
new file mode 100644
index 000000000000..a35f0bd0399b
--- /dev/null
+++ b/third_party/xcbproto/src/xcb-proto.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+datarootdir=@datarootdir@
+datadir=@datadir@
+libdir=@libdir@
+xcbincludedir=${pc_sysrootdir}@xcbincludedir@
+pythondir=${pc_sysrootdir}@pythondir@
+
+Name: XCB Proto
+Description: X protocol descriptions for XCB
+Version: @PACKAGE_VERSION@
diff --git a/third_party/xcbproto/src/xcbgen/Makefile.am b/third_party/xcbproto/src/xcbgen/Makefile.am
new file mode 100644
index 000000000000..d6c7adc7dba9
--- /dev/null
+++ b/third_party/xcbproto/src/xcbgen/Makefile.am
@@ -0,0 +1,3 @@
+pkgpythondir = $(pythondir)/xcbgen
+
+pkgpython_PYTHON = __init__.py error.py expr.py align.py matcher.py state.py xtypes.py
diff --git a/third_party/xcbproto/src/xcbgen/__init__.py b/third_party/xcbproto/src/xcbgen/__init__.py
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/xcbproto/src/xcbgen/__init__.py
@@ -0,0 +1 @@
+
diff --git a/third_party/xcbproto/src/xcbgen/align.py b/third_party/xcbproto/src/xcbgen/align.py
new file mode 100644
index 000000000000..5c4f5177dcb1
--- /dev/null
+++ b/third_party/xcbproto/src/xcbgen/align.py
@@ -0,0 +1,182 @@
+'''
+This module contains helper classes for alignment arithmetic and checks
+'''
+
+from sys import version_info
+
+if version_info[:2] >= (3, 5):
+    from math import gcd
+else:
+    from fractions import gcd
+
+class Alignment(object):
+
+    def __init__(self, align=4, offset=0):
+        self.align = align
+        # normalize the offset (just in case)
+        self.offset = offset % align
+
+
+    def __eq__(self, other):
+        return self.align == other.align and self.offset == other.offset
+
+    def __str__(self):
+        return "(align=%d, offset=%d)" % (self.align, self.offset)
+
+    @staticmethod
+    def for_primitive_type(size):
+        # compute the required start_alignment based on the size of the type
+        if size % 8 == 0:
+            # do 8-byte primitives require 8-byte alignment in X11?
+            return Alignment(8,0)
+        elif size % 4 == 0:
+            return Alignment(4,0)
+        elif size % 2 == 0:
+            return Alignment(2,0)
+        else:
+            return Alignment(1,0)
+
+
+    def align_after_fixed_size(self, size):
+        new_offset = (self.offset + size) % self.align
+        return Alignment(self.align, new_offset)
+
+
+    def is_guaranteed_at(self, external_align):
+        '''
+        Assuming the given external_align, checks whether
+        self is fulfilled for all cases.
+        Returns True if yes, False otherwise.
+        '''
+        if self.align == 1 and self.offset == 0:
+            # alignment 1 with offset 0 is always fulfilled
+            return True
+
+        if external_align is None:
+            # there is no external align -> fail
+            return False
+
+        if external_align.align < self.align:
+            # the external align guarantees less alignment -> not guaranteed
+            return False
+
+        if external_align.align % self.align != 0:
+            # the external align cannot be divided by our align
+            # -> not guaranteed
+            # (this can only happen if there are alignments that are not
+            # a power of 2, which is highly discouraged. But better be
+            # safe and check for it)
+            return False
+
+        if external_align.offset % self.align != self.offset:
+            # offsets do not match
+            return False
+
+        return True
+
+
+    def combine_with(self, other):
+        # returns the alignment that is guaranteed when
+        # both, self or other, can happen
+        new_align = gcd(self.align, other.align)
+        new_offset_candidate1 = self.offset % new_align
+        new_offset_candidate2 = other.offset % new_align
+        if new_offset_candidate1 == new_offset_candidate2:
+            new_offset = new_offset_candidate1
+        else:
+            offset_diff = abs(new_offset_candidate2 - new_offset_candidate1)
+            new_align = gcd(new_align, offset_diff)
+            new_offset_candidate1 = self.offset % new_align
+            new_offset_candidate2 = other.offset % new_align
+            assert new_offset_candidate1 == new_offset_candidate2
+            new_offset = new_offset_candidate1
+        # return the result
+        return Alignment(new_align, new_offset)
+
+
+class AlignmentLog(object):
+
+    def __init__(self):
+        self.ok_list = []
+        self.fail_list = []
+        self.verbosity = 1
+
+    def __str__(self):
+        result = ""
+
+        # output the OK-list
+        for (align_before, field_name, type_obj, callstack, align_after) in self.ok_list:
+            stacksize = len(callstack)
+            indent = '  ' * stacksize
+            if self.ok_callstack_is_relevant(callstack):
+                if field_name is None or field_name == "":
+                    result += ("    %sok: %s:\n\t%sbefore: %s, after: %s\n"
+                        % (indent, str(type_obj), indent, str(align_before), str(align_after)))
+                else:
+                    result += ("    %sok: field \"%s\" in %s:\n\t%sbefore: %s, after: %s\n"
+                        % (indent, str(field_name), str(type_obj),
+                           indent, str(align_before), str(align_after)))
+                if self.verbosity >= 1:
+                    result += self.callstack_to_str(indent, callstack)
+
+        # output the fail-list
+        for (align_before, field_name, type_obj, callstack, reason) in self.fail_list:
+            stacksize = len(callstack)
+            indent = '  ' * stacksize
+            if field_name is None or field_name == "":
+                result += ("    %sfail: align %s is incompatible with\n\t%s%s\n\t%sReason: %s\n"
+                    % (indent, str(align_before), indent, str(type_obj), indent, reason))
+            else:
+                result += ("    %sfail: align %s is incompatible with\n\t%sfield \"%s\" in %s\n\t%sReason: %s\n"
+                    % (indent, str(align_before), indent, str(field_name), str(type_obj), indent, reason))
+
+            if self.verbosity >= 1:
+                result += self.callstack_to_str(indent, callstack)
+
+
+        return result
+
+
+    def callstack_to_str(self, indent, callstack):
+        result = "\t%scallstack: [\n" % indent
+        for stack_elem in callstack:
+            result += "\t  %s%s\n" % (indent, str(stack_elem))
+        result += "\t%s]\n" % indent
+        return result
+
+
+    def ok_callstack_is_relevant(self, ok_callstack):
+        # determine whether an ok callstack is relevant for logging
+        if self.verbosity >= 2:
+            return True
+
+        # empty callstacks are always relevant
+        if len(ok_callstack) == 0:
+            return True
+
+        # check whether the ok_callstack is a subset or equal to a fail_callstack
+        for (align_before, field_name, type_obj, fail_callstack, reason) in self.fail_list:
+            if len(ok_callstack) <= len(fail_callstack):
+                zipped = zip(ok_callstack, fail_callstack[:len(ok_callstack)])
+                is_subset = all([i == j for i, j in zipped])
+                if is_subset:
+                    return True
+
+        return False
+
+
+    def ok(self, align_before, field_name, type_obj, callstack, align_after):
+        self.ok_list.append((align_before, field_name, type_obj, callstack, align_after))
+
+    def fail(self, align_before, field_name, type_obj, callstack, reason):
+        self.fail_list.append((align_before, field_name, type_obj, callstack, reason))
+
+    def append(self, other):
+        self.ok_list.extend(other.ok_list)
+        self.fail_list.extend(other.fail_list)
+
+    def ok_count(self):
+        return len(self.ok_list)
+
+
+
diff --git a/third_party/xcbproto/src/xcbgen/error.py b/third_party/xcbproto/src/xcbgen/error.py
new file mode 100644
index 000000000000..bbcd5013db97
--- /dev/null
+++ b/third_party/xcbproto/src/xcbgen/error.py
@@ -0,0 +1,5 @@
+class ResolveException(Exception):
+    '''
+    Gets thrown when a type doesn't resolve in the XML.
+    '''
+    pass
diff --git a/third_party/xcbproto/src/xcbgen/expr.py b/third_party/xcbproto/src/xcbgen/expr.py
new file mode 100644
index 000000000000..bf46c636090d
--- /dev/null
+++ b/third_party/xcbproto/src/xcbgen/expr.py
@@ -0,0 +1,176 @@
+'''
+This module contains helper classes for structure fields and length expressions.
+'''
+class Field(object):
+    '''
+    Represents a field of a structure.
+
+    type is the datatype object for the field.
+    field_type is the name of the type (string tuple)
+    field_name is the name of the structure field.
+    visible is true iff the field should be in the request API.
+    wire is true iff the field should be in the request structure.
+    auto is true iff the field is on the wire but not in the request API (e.g. opcode)
+    enum is the enum name this field refers to, if any.
+    '''
+    def __init__(self, type, field_type, field_name, visible, wire, auto, enum=None, isfd=False):
+        self.type = type
+        self.field_type = field_type
+        self.field_name = field_name
+        self.enum = enum
+        self.visible = visible
+        self.wire = wire
+        self.auto = auto
+        self.isfd = isfd
+        self.parent = None
+
+    def __str__(self):
+        field_string = "Field"
+        if self.field_name is None:
+            if self.field_type is not None:
+                field_string += " with type " + str(self.type)
+        else:
+            field_string += " \"" + self.field_name + "\""
+        if self.parent is not None:
+            field_string += " in " + str(self.parent)
+
+        return field_string
+
+class Expression(object):
+    '''
+    Represents a mathematical expression for a list length or exprfield.
+
+    Public fields:
+    op is the operation (text +,*,/,<<,~) or None.
+    lhs and rhs are the sub-Expressions if op is set.
+    lenfield_name is the name of the length field, or None for request lists.
+    lenfield is the Field object for the length field, or None.
+    bitfield is True if the length field is a bitmask instead of a number.
+    nmemb is the fixed size (value)of the expression, or None
+    '''
+    def __init__(self, elt, parent):
+        self.parent = parent
+
+        self.nmemb = None
+
+        self.lenfield_name = None
+        self.lenfield_type = None
+        self.lenfield_parent = None
+        self.lenfield = None
+        self.lenwire = False
+        self.bitfield = False
+
+        self.op = None
+        self.lhs = None
+        self.rhs = None
+
+        self.contains_listelement_ref = False
+
+        if elt.tag == 'list':
+            # List going into a request, which has no length field (inferred by server)
+            self.lenfield_name = elt.get('name') + '_len'
+            self.lenfield_type = 'CARD32'
+
+        elif elt.tag == 'fieldref':
+            # Standard list with a fieldref
+            self.lenfield_name = elt.text
+
+        elif elt.tag == 'paramref':
+            self.lenfield_name = elt.text
+            self.lenfield_type = elt.get('type')
+
+        elif elt.tag == 'op':
+            # Op field.  Need to recurse.
+            self.op = elt.get('op')
+            self.lhs = Expression(list(elt)[0], parent)
+            self.rhs = Expression(list(elt)[1], parent)
+
+            # Hopefully we don't have two separate length fields...
+            self.lenfield_name = self.lhs.lenfield_name
+            if self.lenfield_name == None:
+                self.lenfield_name = self.rhs.lenfield_name
+
+        elif elt.tag == 'unop':
+            # Op field.  Need to recurse.
+            self.op = elt.get('op')
+            self.rhs = Expression(list(elt)[0], parent)
+
+            self.lenfield_name = self.rhs.lenfield_name
+            
+        elif elt.tag == 'value':
+            # Constant expression
+            self.nmemb = int(elt.text, 0)
+
+        elif elt.tag == 'popcount':
+            self.op = 'popcount'
+            self.rhs = Expression(list(elt)[0], parent)
+            self.lenfield_name = self.rhs.lenfield_name
+            # xcb_popcount returns 'int' - handle the type in the language-specific part
+
+        elif elt.tag == 'enumref':
+            self.op = 'enumref'
+            self.lenfield_name = (elt.get('ref'), elt.text)
+            
+        elif elt.tag == 'sumof':
+            self.op = 'sumof'
+            self.lenfield_name = elt.get('ref')
+            subexpressions = list(elt)
+            if len(subexpressions) > 0:
+                # sumof with a nested expression which is to be evaluated
+                # for each list-element in the context of that list-element.
+                # sumof then returns the sum of the results of these evaluations
+                self.rhs = Expression(subexpressions[0], parent)
+
+        elif elt.tag == 'listelement-ref':
+            # current list element inside iterating expressions such as sumof
+            self.op = 'listelement-ref'
+            self.contains_listelement_ref = True
+
+        else:
+            # Notreached
+            raise Exception("undefined tag '%s'" % elt.tag)
+
+    def fixed_size(self):
+        return self.nmemb != None
+
+    def get_value(self):
+        return self.nmemb
+
+    # if the value of the expression is a guaranteed multiple of a number
+    # return this number, else return 1 (which is trivially guaranteed for integers)
+    def get_multiple(self):
+        multiple = 1
+        if self.op == '*':
+            if self.lhs.fixed_size():
+                multiple *= self.lhs.get_value()
+            if self.rhs.fixed_size():
+                multiple *= self.rhs.get_value()
+
+        return multiple
+
+    def recursive_resolve_tasks(self, module, parents):
+        for subexpr in (self.lhs, self.rhs):
+            if subexpr != None:
+                subexpr.recursive_resolve_tasks(module, parents)
+                self.contains_listelement_ref |= subexpr.contains_listelement_ref
+
+    def resolve(self, module, parents):
+        if self.op == 'enumref':
+            self.lenfield_type = module.get_type(self.lenfield_name[0])
+            self.lenfield_name = self.lenfield_name[1]
+        elif self.op == 'sumof':
+            # need to find the field with lenfield_name
+            for p in reversed(parents): 
+                fields = dict([(f.field_name, f) for f in p.fields])
+                if self.lenfield_name in fields.keys():
+                    if p.is_case_or_bitcase:
+                        # switch is the anchestor 
+                        self.lenfield_parent = p.parents[-1]
+                    else:
+                        self.lenfield_parent = p
+                    self.lenfield_type = fields[self.lenfield_name].field_type
+                    self.lenfield = fields[self.lenfield_name]
+                    break
+
+        self.recursive_resolve_tasks(module, parents)
+                    
diff --git a/third_party/xcbproto/src/xcbgen/matcher.py b/third_party/xcbproto/src/xcbgen/matcher.py
new file mode 100644
index 000000000000..a13ef2846fda
--- /dev/null
+++ b/third_party/xcbproto/src/xcbgen/matcher.py
@@ -0,0 +1,127 @@
+'''
+XML parser.  One function for each top-level element in the schema.
+
+Most functions just declare a new object and add it to the module.
+For typedefs, eventcopies, xidtypes, and other aliases though,
+we do not create a new type object, we just record the existing one under a new name.
+'''
+
+from os.path import join
+from sys import version_info
+
+if version_info[:2] >= (3, 9):
+    from xml.etree.ElementTree import parse
+else:
+    from xml.etree.cElementTree import parse
+
+from xcbgen.xtypes import *
+
+def import_(node, module, namespace):
+    '''
+    For imports, we load the file, create a new namespace object,
+    execute recursively, then record the import (for header files, etc.)
+    '''
+    # To avoid circular import error
+    from xcbgen import state
+    module.import_level = module.import_level + 1
+    new_file = join(namespace.dir, '%s.xml' % node.text)
+    new_root = parse(new_file).getroot()
+    new_namespace = state.Namespace(new_file)
+    execute(module, new_namespace)
+    module.import_level = module.import_level - 1
+    if not module.has_import(node.text):
+        module.add_import(node.text, new_namespace)
+
+def typedef(node, module, namespace):
+    id = node.get('newname')
+    name = namespace.prefix + (id,)
+    type = module.get_type(node.get('oldname'))
+    module.add_type(id, namespace.ns, name, type)
+
+def xidtype(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    type = module.get_type('CARD32')
+    module.add_type(id, namespace.ns, name, type)
+
+def xidunion(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    type = module.get_type('CARD32')
+    module.add_type(id, namespace.ns, name, type)
+
+def enum(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    type = Enum(name, node)
+    module.add_type(id, namespace.ns, name, type)
+
+def struct(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    type = Struct(name, node)
+    module.add_type(id, namespace.ns, name, type)
+
+def eventstruct(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    type = EventStruct(name, node)
+    module.add_type(id, namespace.ns, name, type)
+
+def union(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    type = Union(name, node)
+    module.add_type(id, namespace.ns, name, type)
+
+def request(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    type = Request(name, node)
+    module.add_request(id, name, type)
+
+def event(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    event = Event(name, node)
+    event.add_opcode(node.get('number'), name, True)
+    module.add_event(id, name, event)
+
+def eventcopy(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    event = module.get_event(node.get('ref'))
+    event.add_opcode(node.get('number'), name, False)
+    module.add_event(id, name, event)
+
+def error(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    error = Error(name, node)
+    error.add_opcode(node.get('number'), name, True)
+    module.add_error(id, name, error)
+
+def errorcopy(node, module, namespace):
+    id = node.get('name')
+    name = namespace.prefix + (id,)
+    error = module.get_error(node.get('ref'))
+    error.add_opcode(node.get('number'), name, False)
+    module.add_error(id, name, error)
+
+funcs = {'import' : import_,
+         'typedef' : typedef,
+         'xidtype' : xidtype,
+         'xidunion' : xidunion,
+         'enum' : enum,
+         'struct' : struct,
+         'eventstruct' : eventstruct,
+         'union' : union,
+         'request' : request,
+         'event' : event,
+         'eventcopy' : eventcopy,
+         'error' : error,
+         'errorcopy' : errorcopy}
+
+def execute(module, namespace):
+    for elt in list(namespace.root):
+        funcs[elt.tag](elt, module, namespace)
diff --git a/third_party/xcbproto/src/xcbgen/state.py b/third_party/xcbproto/src/xcbgen/state.py
new file mode 100644
index 000000000000..3b7eeb42bec1
--- /dev/null
+++ b/third_party/xcbproto/src/xcbgen/state.py
@@ -0,0 +1,219 @@
+'''
+This module contains the namespace class and the singleton module class.
+'''
+from os.path import dirname, basename
+from sys import version_info
+
+if version_info[:2] >= (3, 9):
+    from xml.etree.ElementTree import parse
+else:
+    from xml.etree.cElementTree import parse
+
+from xcbgen import matcher
+from xcbgen.error import *
+from xcbgen.xtypes import *
+
+import __main__
+
+class Namespace(object):
+    '''
+    Contains the naming information for an extension.
+
+    Public fields:
+
+    header is the header attribute ("header file" name).
+    is_ext is true for extensions, false for xproto.
+    major_version and minor_version are extension version info.
+    ext_xname is the X extension name string.
+    ext_name is the XCB extension name prefix.
+    '''
+    def __init__(self, filename):
+        # Path info
+        self.path = filename
+        self.dir = dirname(filename)
+        self.file = basename(filename)
+
+        # Parse XML
+        self.root = parse(filename).getroot()
+        self.header = self.root.get('header')
+        self.ns = self.header + ':'
+
+        # Events
+        self.events = {}
+        
+        # Get root element attributes
+        if self.root.get('extension-xname', False): 
+            self.is_ext = True
+            self.major_version = self.root.get('major-version')
+            self.minor_version = self.root.get('minor-version')
+            self.ext_xname = self.root.get('extension-xname')
+            self.ext_name = self.root.get('extension-name')
+            self.prefix = ('xcb', self.ext_name)
+        else:
+            self.is_ext = False
+            self.ext_name = ''
+            self.prefix = ('xcb',)
+
+    def add_event(self, id, name, item):
+        self.events[id] = (name, item)
+
+    def get_event_by_opcode(self, opcode, is_ge_event):
+        for id, (name, event) in self.events.items():
+            if event.is_ge_event == is_ge_event:
+                opcode_specific_name = event.get_name_for_opcode( opcode )
+                if opcode_specific_name is not None:
+                    return (opcode_specific_name, event)
+        return None
+
+
+class Module(object):
+    '''
+    This is the grand, encompassing class that represents an entire XCB specification.
+    Only gets instantiated once, in the main() routine.
+
+    Don't need to worry about this much except to declare it and to get the namespace.
+
+    Public fields:
+    namespace contains the namespace info for the spec.
+    '''
+    open = __main__.output['open']
+    close = __main__.output['close']
+
+    def __init__(self, filename, output):
+        self.namespace = Namespace(filename)
+        self.output = output
+
+        self.imports = []
+        self.direct_imports = []
+        self.import_level = 0
+        self.types = {}
+        self.events = {}
+        self.errors = {}
+        self.all = []
+
+        # dict of namespaces by ext_name
+        self.namespaces = {}
+        # enter the main namespace here
+        self.namespaces[self.namespace.ext_name] = self.namespace
+
+        # Register some common types
+        self.add_type('CARD8', '', ('uint8_t',), tcard8)
+        self.add_type('CARD16', '', ('uint16_t',), tcard16)
+        self.add_type('CARD32', '', ('uint32_t',), tcard32)
+        self.add_type('CARD64', '', ('uint64_t',), tcard64)
+        self.add_type('INT8', '', ('int8_t',), tint8)
+        self.add_type('INT16', '', ('int16_t',), tint16)
+        self.add_type('INT32', '', ('int32_t',), tint32)
+        self.add_type('INT64', '', ('int64_t',), tint64)
+        self.add_type('BYTE', '', ('uint8_t',), tbyte)
+        self.add_type('BOOL', '', ('uint8_t',), tbool)
+        self.add_type('char', '', ('char',), tchar)
+        self.add_type('float', '', ('float',), tfloat)
+        self.add_type('double', '', ('double',), tdouble)
+        self.add_type('void', '', ('void',), tvoid)
+
+    # This goes out and parses the rest of the XML
+    def register(self):
+        matcher.execute(self, self.namespace)
+
+    # Recursively resolve all types
+    def resolve(self):
+        self.add_events_to_namespaces()
+        for (name, item) in self.all:
+            self.pads = 0
+            item.resolve(self)
+
+    # Call all the output methods
+    def generate(self):
+        self.open()
+
+        for (name, item) in self.all:
+            item.out(name)
+
+        self.close()
+
+    # Keeps track of what's been imported so far.
+    def add_import(self, name, namespace):
+        if self.import_level == 0:
+            self.direct_imports.append((name, namespace.header))
+        self.imports.append((name, namespace.header))
+        self.namespaces[namespace.ext_name] = namespace
+
+    def has_import(self, name):
+        for (name_, header) in self.imports:
+            if name_ == name:
+                return True
+        return False
+
+    # Keeps track of non-request/event/error datatypes
+    def add_type(self, id, ns, name, item):
+        key = ns + id
+        if key in self.types:
+            return
+        self.types[key] = (name, item)
+        if name[:-1] == self.namespace.prefix:
+            self.all.append((name, item))
+
+    def get_type_impl(self, id, idx):
+        key = id
+        if key in self.types:
+            return self.types[key][idx]
+
+        key = self.namespace.ns + id
+        if key in self.types:
+            return self.types[key][idx]
+
+        for key in self.types.keys():
+            if key.rpartition(':')[2] == id:
+                return self.types[key][idx]
+
+        raise ResolveException('Type %s not found' % id)
+
+    def get_type(self, id):
+        return self.get_type_impl(id, 1)
+
+    def get_type_name(self, id):
+        return self.get_type_impl(id, 0)
+
+    def get_namespace(self, ext_name):
+        return self.namespaces[ext_name]
+
+    # Keeps track of request datatypes
+    def add_request(self, id, name, item):
+        if name[:-1] == self.namespace.prefix:
+            self.all.append((name, item))
+
+    # Keeps track of event datatypes
+    def add_event(self, id, name, item):
+        self.events[id] = (name, item)
+        if name[:-1] == self.namespace.prefix:
+            self.all.append((name, item))
+
+
+    def add_events_to_namespaces(self):
+        # add to its namespace object
+        for id, (name,item) in self.events.items():
+            if name[:-1] == ('xcb',):
+                # core event
+                namespace_name = ''
+            else:
+                # extension event
+                namespace_name = name[-2]
+
+            namespace = self.namespaces[namespace_name]
+
+            if namespace is not None:
+                namespace.add_event(id, name, item)
+
+
+    def get_event(self, id):
+        return self.events[id][1]
+
+    # Keeps track of error datatypes
+    def add_error(self, id, name, item):
+        self.errors[id] = (name, item)
+        if name[:-1] == self.namespace.prefix:
+            self.all.append((name, item))
+
+    def get_error(self, id):
+        return self.errors[id][1]
diff --git a/third_party/xcbproto/src/xcbgen/xtypes.py b/third_party/xcbproto/src/xcbgen/xtypes.py
new file mode 100644
index 000000000000..e47189d17f9d
--- /dev/null
+++ b/third_party/xcbproto/src/xcbgen/xtypes.py
@@ -0,0 +1,1397 @@
+'''
+This module contains the classes which represent XCB data types.
+'''
+from xcbgen.expr import Field, Expression
+from xcbgen.align import Alignment, AlignmentLog
+import __main__
+
+verbose_align_log = False
+true_values = ['true', '1', 'yes']
+
+class Type(object):
+    '''
+    Abstract base class for all XCB data types.
+    Contains default fields, and some abstract methods.
+    '''
+    def __init__(self, name):
+        '''
+        Default structure initializer.  Sets up default fields.
+
+        Public fields:
+        name is a tuple of strings specifying the full type name.
+        size is the size of the datatype in bytes, or None if variable-sized.
+        nmemb is 1 for non-list types, None for variable-sized lists, otherwise number of elts.
+        booleans for identifying subclasses, because I can't figure out isinstance().
+        '''
+        self.name = name
+        self.size = None
+        self.nmemb = None
+        self.resolved = False
+
+        # Screw isinstance().
+        self.is_simple = False
+        self.is_list = False
+        self.is_expr = False
+        self.is_container = False
+        self.is_reply = False
+        self.is_union = False
+        self.is_pad = False
+        self.is_eventstruct = False
+        self.is_event = False
+        self.is_switch = False
+        self.is_case_or_bitcase = False
+        self.is_bitcase = False
+        self.is_case = False
+        self.is_fd = False
+        self.required_start_align = Alignment()
+
+        # the biggest align value of an align-pad contained in this type
+        self.max_align_pad = 1
+
+    def resolve(self, module):
+        '''
+        Abstract method for resolving a type.
+        This should make sure any referenced types are already declared.
+        '''
+        raise Exception('abstract resolve method not overridden!')
+
+    def out(self, name):
+        '''
+        Abstract method for outputting code.
+        These are declared in the language-specific modules, and
+        there must be a dictionary containing them declared when this module is imported!
+        '''
+        raise Exception('abstract out method not overridden!')
+
+    def fixed_size(self):
+        '''
+        Abstract method for determining if the data type is fixed-size.
+        '''
+        raise Exception('abstract fixed_size method not overridden!')
+
+    def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto, enum=None, is_fd=False):
+        '''
+        Default method for making a data type a member of a structure.
+        Extend this if the data type needs to add an additional length field or something.
+
+        module is the global module object.
+        complex_type is the structure object.
+        see Field for the meaning of the other parameters.
+        '''
+        new_field = Field(self, field_type, field_name, visible, wire, auto, enum, is_fd)
+
+        # We dump the _placeholder_byte if any fields are added.
+        for (idx, field) in enumerate(complex_type.fields):
+            if field == _placeholder_byte:
+                complex_type.fields[idx] = new_field
+                return
+
+        complex_type.fields.append(new_field)
+        new_field.parent = complex_type
+
+    def make_fd_of(self, module, complex_type, fd_name):
+        '''
+        Method for making a fd member of a structure.
+        '''
+        new_fd = Field(self, module.get_type_name('INT32'), fd_name, True, False, False, None, True)
+        # We dump the _placeholder_byte if any fields are added.
+        for (idx, field) in enumerate(complex_type.fields):
+            if field == _placeholder_byte:
+                complex_type.fields[idx] = new_fd
+                return
+
+        complex_type.fields.append(new_fd)
+
+
+    def get_total_size(self):
+        '''
+        get the total size of this type if it is fixed-size, otherwise None
+        '''
+        if self.fixed_size():
+            if self.nmemb is None:
+                return self.size
+            else:
+                return self.size * self.nmemb
+        else:
+            return None
+
+    def get_align_offset(self):
+        if self.required_start_align is None:
+            return 0
+        else:
+            return self.required_start_align.offset
+
+    def is_acceptable_start_align(self, start_align, callstack, log):
+        return self.get_alignment_after(start_align, callstack, log) is not None
+
+    def get_alignment_after(self, start_align, callstack, log):
+        '''
+        get the alignment after this type based on the given start_align.
+        the start_align is checked for compatibility with the
+        internal start align. If it is not compatible, then None is returned
+        '''
+        if self.required_start_align is None or self.required_start_align.is_guaranteed_at(start_align):
+            return self.unchecked_get_alignment_after(start_align, callstack, log)
+        else:
+            if log is not None:
+                log.fail(start_align, "", self, callstack + [self],
+                    "start_align is incompatible with required_start_align %s"
+                    % (str(self.required_start_align)))
+            return None
+
+    def unchecked_get_alignment_after(self, start_align, callstack, log):
+        '''
+        Abstract method for geting the alignment after this type
+        when the alignment at the start is given, and when this type
+        has variable size.
+        '''
+        raise Exception('abstract unchecked_get_alignment_after method not overridden!')
+
+
+    @staticmethod
+    def type_name_to_str(type_name):
+        if isinstance(type_name, str):
+            #already a string
+            return type_name
+        else:
+            return ".".join(type_name)
+
+
+    def __str__(self):
+        return type(self).__name__ + " \"" + Type.type_name_to_str(self.name) + "\""
+
+class PrimitiveType(Type):
+
+    def __init__(self, name, size):
+        Type.__init__(self, name)
+        self.size = size
+        self.nmemb = 1
+
+        # compute the required start_alignment based on the size of the type
+        self.required_start_align = Alignment.for_primitive_type(self.size)
+
+    def unchecked_get_alignment_after(self, start_align, callstack, log):
+        my_callstack = callstack + [self];
+        after_align = start_align.align_after_fixed_size(self.size)
+
+        if log is not None:
+            if after_align is None:
+                log.fail(start_align, "", self, my_callstack,
+                "align after fixed size %d failed" % self.size)
+            else:
+                log.ok(start_align, "", self, my_callstack, after_align)
+
+        return after_align
+
+    def fixed_size(self):
+        return True
+
+class SimpleType(PrimitiveType):
+    '''
+    Derived class which represents a cardinal type like CARD32 or char.
+    Any type which is typedef'ed to cardinal will be one of these.
+
+    Public fields added:
+    xml_type is the original string describing the type in the XML
+    '''
+    def __init__(self, name, size, xml_type=None):
+        PrimitiveType.__init__(self, name, size)
+        self.is_simple = True
+        self.xml_type = xml_type
+
+    def resolve(self, module):
+        self.resolved = True
+
+    out = __main__.output['simple']
+
+
+# Cardinal datatype globals.  See module __init__ method.
+tcard8 = SimpleType(('uint8_t',), 1, 'CARD8')
+tcard16 = SimpleType(('uint16_t',), 2, 'CARD16')
+tcard32 = SimpleType(('uint32_t',), 4, 'CARD32')
+tcard64 = SimpleType(('uint64_t',), 8, 'CARD64')
+tint8 =  SimpleType(('int8_t',), 1, 'INT8')
+tint16 = SimpleType(('int16_t',), 2, 'INT16')
+tint32 = SimpleType(('int32_t',), 4, 'INT32')
+tint64 = SimpleType(('int64_t',), 8, 'INT64')
+tchar =  SimpleType(('char',), 1, 'char')
+tfloat = SimpleType(('float',), 4, 'float')
+tdouble = SimpleType(('double',), 8, 'double')
+tbyte = SimpleType(('uint8_t',), 1, 'BYTE')
+tbool = SimpleType(('uint8_t',), 1, 'BOOL')
+tvoid = SimpleType(('uint8_t',), 1, 'void')
+
+class FileDescriptor(SimpleType):
+    '''
+    Derived class which represents a file descriptor.
+    '''
+    def __init__(self):
+        SimpleType.__init__(self, ('int'), 4, 'fd')
+        self.is_fd = True
+
+    def fixed_size(self):
+        return True
+
+    out = __main__.output['simple']
+
+class Enum(SimpleType):
+    '''
+    Derived class which represents an enum.  Fixed-size.
+
+    Public fields added:
+    values contains a list of (name, value) tuples.  value is empty, or a number.
+    bits contains a list of (name, bitnum) tuples.  items only appear if specified as a bit. bitnum is a number.
+    '''
+    def __init__(self, name, elt):
+        SimpleType.__init__(self, name, 4, 'enum')
+        self.values = []
+        self.bits = []
+        self.doc = None
+        for item in list(elt):
+            if item.tag == 'doc':
+                self.doc = Doc(name, item)
+
+            # First check if we're using a default value
+            if len(list(item)) == 0:
+                self.values.append((item.get('name'), ''))
+                continue
+
+            # An explicit value or bit was specified.
+            value = list(item)[0]
+            if value.tag == 'value':
+                self.values.append((item.get('name'), value.text))
+            elif value.tag == 'bit':
+                self.values.append((item.get('name'), '%u' % (1 << int(value.text, 0))))
+                self.bits.append((item.get('name'), value.text))
+
+    def resolve(self, module):
+        self.resolved = True
+
+    def fixed_size(self):
+        return True
+
+    out = __main__.output['enum']
+
+
+class ListType(Type):
+    '''
+    Derived class which represents a list of some other datatype.  Fixed- or variable-sized.
+
+    Public fields added:
+    member is the datatype of the list elements.
+    parent is the structure type containing the list.
+    expr is an Expression object containing the length information, for variable-sized lists.
+    '''
+    def __init__(self, elt, member, *parent):
+        Type.__init__(self, member.name)
+        self.is_list = True
+        self.member = member
+        self.parents = list(parent)
+        lenfield_name = False
+
+        if elt.tag == 'list':
+            elts = list(elt)
+            self.expr = Expression(elts[0] if len(elts) else elt, self)
+            is_list_in_parent = self.parents[0].elt.tag in ('request', 'event', 'reply', 'error')
+            if not len(elts) and is_list_in_parent:
+                self.expr = Expression(elt,self)
+                self.expr.op = 'calculate_len'
+            else:
+                self.expr = Expression(elts[0] if len(elts) else elt, self)
+
+        self.size = member.size if member.fixed_size() else None
+        self.nmemb = self.expr.nmemb if self.expr.fixed_size() else None
+
+        self.required_start_align = self.member.required_start_align
+
+    def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto, enum=None):
+        if not self.fixed_size():
+            # We need a length field.
+            # Ask our Expression object for it's name, type, and whether it's on the wire.
+            lenfid = self.expr.lenfield_type
+            lenfield_name = self.expr.lenfield_name
+            lenwire = self.expr.lenwire
+            needlen = True
+
+            # See if the length field is already in the structure.
+            for parent in self.parents:
+                for field in parent.fields:
+                    if field.field_name == lenfield_name:
+                        needlen = False
+
+            # It isn't, so we need to add it to the structure ourself.
+            if needlen:
+                type = module.get_type(lenfid)
+                lenfield_type = module.get_type_name(lenfid)
+                type.make_member_of(module, complex_type, lenfield_type, lenfield_name, True, lenwire, False, enum)
+
+        # Add ourself to the structure by calling our original method.
+        if self.member.is_fd:
+            wire = False
+        Type.make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto, enum, self.member.is_fd)
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+        self.member.resolve(module)
+        self.expr.resolve(module, self.parents)
+
+        # resolve() could have changed the size (ComplexType starts with size 0)
+        self.size = self.member.size if self.member.fixed_size() else None
+
+        self.required_start_align = self.member.required_start_align
+
+        # Find my length field again.  We need the actual Field object in the expr.
+        # This is needed because we might have added it ourself above.
+        if not self.fixed_size():
+            for parent in self.parents:
+                for field in parent.fields:
+                    if field.field_name == self.expr.lenfield_name and field.wire:
+                        self.expr.lenfield = field
+                        break
+
+        self.resolved = True
+
+    def fixed_size(self):
+        return self.member.fixed_size() and self.expr.fixed_size()
+
+    def unchecked_get_alignment_after(self, start_align, callstack, log):
+        my_callstack = callstack[:]
+        my_callstack.append(self)
+        if start_align is None:
+            log.fail(start_align, "", self, my_callstack, "start_align is None")
+            return None
+        if self.expr.fixed_size():
+            # fixed number of elements
+            num_elements = self.nmemb
+            prev_alignment = None
+            alignment = start_align
+            while num_elements > 0:
+                if alignment is None:
+                    if log is not None:
+                        log.fail(start_align, "", self, my_callstack,
+                            ("fixed size list with size %d after %d iterations"
+                            + ", at transition from alignment \"%s\"")
+                            % (self.nmemb,
+                               (self.nmemb - num_elements),
+                               str(prev_alignment)))
+                    return None
+                prev_alignment = alignment
+                alignment = self.member.get_alignment_after(prev_alignment, my_callstack, log)
+                num_elements -= 1
+            if log is not None:
+                log.ok(start_align, "", self, my_callstack, alignment)
+            return alignment
+        else:
+            # variable number of elements
+            # check whether the number of elements is a multiple
+            multiple = self.expr.get_multiple()
+            assert multiple > 0
+
+            # iterate until the combined alignment does not change anymore
+            alignment = start_align
+            while True:
+                prev_multiple_alignment = alignment
+                # apply "multiple" amount of changes sequentially
+                prev_alignment = alignment
+                for multiple_count in range(0, multiple):
+
+                    after_alignment = self.member.get_alignment_after(prev_alignment, my_callstack, log)
+                    if after_alignment is None:
+                        if log is not None:
+                            log.fail(start_align, "", self, my_callstack,
+                                ("variable size list "
+                                + "at transition from alignment \"%s\"")
+                                % (str(prev_alignment)))
+                        return None
+
+                    prev_alignment = after_alignment
+
+                # combine with the cumulatively combined alignment
+                # (to model the variable number of entries)
+                alignment = prev_multiple_alignment.combine_with(after_alignment)
+
+                if alignment == prev_multiple_alignment:
+                    # does not change anymore by adding more potential elements
+                    # -> finished
+                    if log is not None:
+                        log.ok(start_align, "", self, my_callstack, alignment)
+                    return alignment
+
+class ExprType(PrimitiveType):
+    '''
+    Derived class which represents an exprfield.  Fixed size.
+
+    Public fields added:
+    expr is an Expression object containing the value of the field.
+    '''
+    def __init__(self, elt, member, *parents):
+        PrimitiveType.__init__(self, member.name, member.size)
+        self.is_expr = True
+        self.member = member
+        self.parents = parents
+
+        self.expr = Expression(list(elt)[0], self)
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+        self.member.resolve(module)
+        self.resolved = True
+
+
+class PadType(Type):
+    '''
+    Derived class which represents a padding field.
+    '''
+    def __init__(self, elt):
+        Type.__init__(self, tcard8.name)
+        self.is_pad = True
+        self.size = 1
+        self.nmemb = 1
+        self.align = 1
+        if elt != None:
+            self.nmemb = int(elt.get('bytes', "1"), 0)
+            self.align = int(elt.get('align', "1"), 0)
+            self.serialize = elt.get('serialize', "false").lower() in true_values
+
+        # pads don't require any alignment at their start
+        self.required_start_align = Alignment(1,0)
+
+    def resolve(self, module):
+        self.resolved = True
+
+    def fixed_size(self):
+        return self.align <= 1
+
+    def unchecked_get_alignment_after(self, start_align, callstack, log):
+        if self.align <= 1:
+            # fixed size pad
+            after_align = start_align.align_after_fixed_size(self.get_total_size())
+            if log is not None:
+                if after_align is None:
+                    log.fail(start_align, "", self, callstack,
+                    "align after fixed size pad of size %d failed" % self.size)
+                else:
+                    log.ok(start_align, "", self, callstack, after_align)
+
+            return after_align
+
+        # align-pad
+        assert self.align > 1
+        assert self.size == 1
+        assert self.nmemb == 1
+        if (start_align.offset == 0
+           and self.align <= start_align.align
+           and start_align.align % self.align == 0):
+            # the alignment pad is size 0 because the start_align
+            # is already sufficiently aligned -> return the start_align
+            after_align = start_align
+        else:
+            # the alignment pad has nonzero size -> return the alignment
+            # that is guaranteed by it, independently of the start_align
+            after_align = Alignment(self.align, 0)
+
+        if log is not None:
+            log.ok(start_align, "", self, callstack, after_align)
+
+        return after_align
+    
+class ComplexType(Type):
+    '''
+    Derived class which represents a structure.  Base type for all structure types.
+
+    Public fields added:
+    fields is an array of Field objects describing the structure fields.
+    '''
+    def __init__(self, name, elt):
+        Type.__init__(self, name)
+        self.is_container = True
+        self.elt = elt
+        self.fields = []
+        self.nmemb = 1
+        self.size = 0
+        self.lenfield_parent = [self]
+
+        # get required_start_alignment
+        required_start_align_element = elt.find("required_start_align")
+        if required_start_align_element is None:
+            # unknown -> mark for autocompute
+            self.required_start_align = None
+        else:
+            self.required_start_align = Alignment(
+                int(required_start_align_element.get('align', "4"), 0),
+                int(required_start_align_element.get('offset', "0"), 0))
+            if verbose_align_log:
+                print ("Explicit start-align for %s: %s\n" % (self, self.required_start_align))
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+
+        # Resolve all of our field datatypes.
+        for child in list(self.elt):
+            enum = None
+            if child.tag == 'pad':
+                field_name = 'pad' + str(module.pads)
+                fkey = 'CARD8'
+                type = PadType(child)
+                module.pads = module.pads + 1
+                visible = False
+            elif child.tag == 'field':
+                field_name = child.get('name')
+                enum = child.get('enum')
+                fkey = child.get('type')
+                type = module.get_type(fkey)
+                visible = True
+            elif child.tag == 'exprfield':
+                field_name = child.get('name')
+                fkey = child.get('type')
+                type = ExprType(child, module.get_type(fkey), *self.lenfield_parent)
+                visible = False
+            elif child.tag == 'list':
+                field_name = child.get('name')
+                fkey = child.get('type')
+                if fkey == 'fd':
+                    ftype = FileDescriptor()
+                    fkey = 'INT32'
+                else:
+                    ftype = module.get_type(fkey)
+                type = ListType(child, ftype, *self.lenfield_parent)
+                visible = True
+            elif child.tag == 'switch':
+                field_name = child.get('name')
+                # construct the switch type name from the parent type and the field name
+                field_type = self.name + (field_name,)
+                type = SwitchType(field_type, child, *self.lenfield_parent)
+                visible = True
+                type.make_member_of(module, self, field_type, field_name, visible, True, False)
+                type.resolve(module)
+                continue
+            elif child.tag == 'fd':
+                fd_name = child.get('name')
+                type = module.get_type('INT32')
+                type.make_fd_of(module, self, fd_name)
+                continue
+            else:
+                # Hit this on Reply
+                continue
+
+            # Get the full type name for the field
+            field_type = module.get_type_name(fkey)
+            # Add the field to ourself
+            type.make_member_of(module, self, field_type, field_name, visible, True, False, enum)
+            # Recursively resolve the type (could be another structure, list)
+            type.resolve(module)
+
+            # Compute the size of the maximally contain align-pad
+            if type.max_align_pad > self.max_align_pad:
+                self.max_align_pad = type.max_align_pad
+
+        self.check_implicit_fixed_size_part_aligns();
+
+        self.calc_size() # Figure out how big we are
+        self.calc_or_check_required_start_align()
+
+        self.resolved = True
+
+    def calc_size(self):
+        self.size = 0
+        for m in self.fields:
+            if not m.wire:
+                continue
+            if m.type.fixed_size():
+                self.size = self.size + m.type.get_total_size()
+            else:
+                self.size = None
+                break
+
+    def calc_or_check_required_start_align(self):
+        if self.required_start_align is None:
+            # no required-start-align configured -> calculate it
+            log = AlignmentLog()
+            callstack = []
+            self.required_start_align = self.calc_minimally_required_start_align(callstack, log)
+            if self.required_start_align is None:
+                print ("ERROR: could not calc required_start_align of %s\nDetails:\n%s"
+                    % (str(self), str(log)))
+            else:
+                if verbose_align_log:
+                    print ("calc_required_start_align: %s has start-align %s"
+                        % (str(self), str(self.required_start_align)))
+                    print ("Details:\n" + str(log))
+                if self.required_start_align.offset != 0:
+                    print (("WARNING: %s\n\thas start-align with non-zero offset: %s"
+                        + "\n\tsuggest to add explicit definition with:"
+                        + "\n\t\t<required_start_align align=\"%d\" offset=\"%d\" />"
+                        + "\n\tor to fix the xml so that zero offset is ok\n")
+                        % (str(self), self.required_start_align,
+                           self.required_start_align.align,
+                           self.required_start_align.offset))
+        else:
+            # required-start-align configured -> check it
+            log = AlignmentLog()
+            callstack = []
+            if not self.is_possible_start_align(self.required_start_align, callstack, log):
+                print ("ERROR: required_start_align %s of %s causes problems\nDetails:\n%s"
+                    % (str(self.required_start_align), str(self), str(log)))
+
+
+    def calc_minimally_required_start_align(self, callstack, log):
+        # calculate the minimally required start_align that causes no
+        # align errors
+        best_log = None
+        best_failed_align = None
+        for align in [1,2,4,8]:
+            for offset in range(0,align):
+                align_candidate = Alignment(align, offset)
+                if verbose_align_log:
+                    print ("trying %s for %s" % (str(align_candidate), str(self)))
+                my_log = AlignmentLog()
+                if self.is_possible_start_align(align_candidate, callstack, my_log):
+                    log.append(my_log)
+                    if verbose_align_log:
+                        print ("found start-align %s for %s" % (str(align_candidate), str(self)))
+                    return align_candidate
+                else:
+                    my_ok_count = my_log.ok_count()
+                    if (best_log is None
+                       or my_ok_count > best_log.ok_count()
+                       or (my_ok_count == best_log.ok_count()
+                          and align_candidate.align > best_failed_align.align)
+                          and align_candidate.align != 8):
+                        best_log = my_log
+                        best_failed_align = align_candidate
+
+
+
+        # none of the candidates applies
+        # this type has illegal internal aligns for all possible start_aligns
+        if verbose_align_log:
+            print ("didn't find start-align for %s" % str(self))
+        log.append(best_log)
+        return None
+
+    def is_possible_start_align(self, align, callstack, log):
+        if align is None:
+            return False
+        if (self.max_align_pad > align.align
+           or align.align % self.max_align_pad != 0):
+            # our align pad implementation depends on known alignment
+            # at the start of our type
+            return False
+
+        return self.get_alignment_after(align, callstack, log) is not None
+
+    def fixed_size(self):
+        for m in self.fields:
+            if not m.type.fixed_size():
+                return False
+        return True
+
+
+    # default impls of polymorphic methods which assume sequential layout of fields
+    # (like Struct or CaseOrBitcaseType)
+    def check_implicit_fixed_size_part_aligns(self):
+        # find places where the implementation of the C-binding would
+        # create code that makes the compiler add implicit alignment.
+        # make these places explicit, so we have
+        # consistent behaviour for all bindings
+        size = 0
+        for field in self.fields:
+            if not field.wire:
+                continue
+            if not field.type.fixed_size():
+                # end of fixed-size part
+                break
+            required_field_align = field.type.required_start_align
+            if required_field_align is None:
+                raise Exception(
+                    "field \"%s\" in \"%s\" has not required_start_align"
+                    % (field.field_name, self.name)
+                )
+            mis_align = (size + required_field_align.offset) % required_field_align.align
+            if mis_align != 0:
+                # implicit align pad is required
+                padsize = required_field_align.align - mis_align
+                raise Exception(
+                    "C-compiler would insert implicit alignpad of size %d before field \"%s\" in \"%s\""
+                    % (padsize, field.field_name, self.name)
+                )
+
+    def unchecked_get_alignment_after(self, start_align, callstack, log):
+        # default impl assumes sequential layout of fields
+        # (like Struct or CaseOrBitcaseType)
+        my_align = start_align
+        if my_align is None:
+            return None
+
+        for field in self.fields:
+            if not field.wire:
+                continue
+            my_callstack = callstack[:]
+            my_callstack.extend([self, field])
+
+            prev_align = my_align
+            my_align = field.type.get_alignment_after(my_align, my_callstack, log)
+            if my_align is None:
+                if log is not None:
+                    log.fail(prev_align, field.field_name, self, my_callstack,
+                        "alignment is incompatible with this field")
+                return None
+            else:
+                if log is not None:
+                    log.ok(prev_align, field.field_name, self, my_callstack, my_align)
+
+        if log is not None:
+            my_callstack = callstack[:]
+            my_callstack.append(self)
+            log.ok(start_align, "", self, my_callstack, my_align)
+        return my_align
+
+
+class SwitchType(ComplexType):
+    '''
+    Derived class which represents a List of Items.  
+
+    Public fields added:
+    bitcases is an array of Bitcase objects describing the list items
+    '''
+
+    def __init__(self, name, elt, *parents):
+        ComplexType.__init__(self, name, elt)
+        self.parents = parents
+        # FIXME: switch cannot store lenfields, so it should just delegate the parents
+        self.lenfield_parent = list(parents) + [self]
+        # self.fields contains all possible fields collected from the Bitcase objects, 
+        # whereas self.items contains the Bitcase objects themselves
+        self.bitcases = []
+
+        self.is_switch = True
+        elts = list(elt)
+        self.expr = Expression(elts[0] if len(elts) else elt, self)
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+
+        parents = list(self.parents) + [self]
+
+        # Resolve all of our field datatypes.
+        for index, child in enumerate(list(self.elt)):
+            if child.tag == 'bitcase' or child.tag == 'case':
+                field_name = child.get('name')
+                if field_name is None:
+                    field_type = self.name + ('%s%d' % ( child.tag, index ),)
+                else:
+                    field_type = self.name + (field_name,)
+
+                # use self.parent to indicate anchestor, 
+                # as switch does not contain named fields itself
+                if child.tag == 'bitcase':
+                    type = BitcaseType(index, field_type, child, *parents)
+                else:
+                    type = CaseType(index, field_type, child, *parents)
+
+                # construct the switch type name from the parent type and the field name
+                if field_name is None:
+                    type.has_name = False
+                    # Get the full type name for the field
+                    field_type = type.name               
+                visible = True
+
+                # add the field to ourself
+                type.make_member_of(module, self, field_type, field_name, visible, True, False)
+
+                # recursively resolve the type (could be another structure, list)
+                type.resolve(module)
+                inserted = False
+                for new_field in type.fields:
+                    # We dump the _placeholder_byte if any fields are added.
+                    for (idx, field) in enumerate(self.fields):
+                        if field == _placeholder_byte:
+                            self.fields[idx] = new_field
+                            inserted = True
+                            break
+                    if False == inserted:
+                        self.fields.append(new_field)
+
+        self.calc_size() # Figure out how big we are
+        self.calc_or_check_required_start_align()
+        self.resolved = True
+
+    def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto, enum=None):
+        if not self.fixed_size():
+            # We need a length field.
+            # Ask our Expression object for it's name, type, and whether it's on the wire.
+            lenfid = self.expr.lenfield_type
+            lenfield_name = self.expr.lenfield_name
+            lenwire = self.expr.lenwire
+            needlen = True
+
+            # See if the length field is already in the structure.
+            for parent in self.parents:
+                for field in parent.fields:
+                    if field.field_name == lenfield_name:
+                        needlen = False
+
+            # It isn't, so we need to add it to the structure ourself.
+            if needlen:
+                type = module.get_type(lenfid)
+                lenfield_type = module.get_type_name(lenfid)
+                type.make_member_of(module, complex_type, lenfield_type, lenfield_name, True, lenwire, False, enum)
+
+        # Add ourself to the structure by calling our original method.
+        Type.make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto, enum)
+
+    # size for switch can only be calculated at runtime
+    def calc_size(self):
+        pass
+
+    # note: switch is _always_ of variable size, but we indicate here wether 
+    # it contains elements that are variable-sized themselves
+    def fixed_size(self):
+        return False
+#        for m in self.fields:
+#            if not m.type.fixed_size():
+#                return False
+#        return True
+
+
+
+    def check_implicit_fixed_size_part_aligns(self):
+        # this is done for the CaseType or BitCaseType
+        return
+
+    def unchecked_get_alignment_after(self, start_align, callstack, log):
+        # we assume that BitCases can appear in any combination,
+        # and that at most one Case can appear
+        # (assuming that Cases are mutually exclusive)
+
+        # get all Cases (we assume that at least one case is selected if there are cases)
+        case_fields = []
+        for field in self.bitcases:
+            if field.type.is_case:
+                case_fields.append(field)
+
+        if not case_fields:
+            # there are no case-fields -> check without case-fields
+            case_fields = [None]
+
+        my_callstack = callstack[:]
+        my_callstack.append(self)
+        #
+        total_align = None
+        first = True
+        for case_field in case_fields:
+            my2_callstack = my_callstack[:]
+            if case_field is not None:
+                my2_callstack.append(case_field)
+
+            case_align = self.get_align_for_selected_case_field(
+                             case_field, start_align, my2_callstack, log)
+
+
+            if case_align is None:
+                if log is not None:
+                    if case_field is None:
+                        log.fail(start_align, "", self, my2_callstack,
+                            "alignment without cases (only bitcases) failed")
+                    else:
+                        log.fail(start_align, "", self, my2_callstack + [case_field],
+                            "alignment for selected case %s failed"
+                            % case_field.field_name)
+                return None
+            if first:
+                total_align = case_align
+            else:
+                total_align = total_align.combine_with(case_align)
+
+            if log is not None:
+                if case_field is None:
+                    log.ok(
+                        start_align,
+                        "without cases (only arbitrary bitcases)",
+                        self, my2_callstack, case_align)
+                else:
+                    log.ok(
+                        start_align,
+                        "case %s and arbitrary bitcases" % case_field.field_name,
+                        self, my2_callstack, case_align)
+
+
+        if log is not None:
+            log.ok(start_align, "", self, my_callstack, total_align)
+        return total_align
+
+    # aux function for unchecked_get_alignment_after
+    def get_align_for_selected_case_field(self, case_field, start_align, callstack, log):
+        if verbose_align_log:
+            print ("get_align_for_selected_case_field: %s, case_field = %s" % (str(self), str(case_field)))
+        total_align = start_align
+        for field in self.bitcases:
+            my_callstack = callstack[:]
+            my_callstack.append(field)
+
+            if not field.wire:
+                continue
+            if field is case_field:
+                # assume that this field is active -> no combine_with to emulate optional
+                after_field_align = field.type.get_alignment_after(total_align, my_callstack, log)
+
+                if log is not None:
+                    if after_field_align is None:
+                        log.fail(total_align, field.field_name, field.type, my_callstack,
+                            "invalid aligment for this case branch")
+                    else:
+                        log.ok(total_align, field.field_name, field.type, my_callstack,
+                            after_field_align)
+
+                total_align = after_field_align
+            elif field.type.is_bitcase:
+                after_field_align = field.type.get_alignment_after(total_align, my_callstack, log)
+                # we assume that this field is optional, therefore combine
+                # alignment after the field with the alignment before the field.
+                if after_field_align is None:
+                    if log is not None:
+                        log.fail(total_align, field.field_name, field.type, my_callstack,
+                            "invalid aligment for this bitcase branch")
+                    total_align = None
+                else:
+                    if log is not None:
+                        log.ok(total_align, field.field_name, field.type, my_callstack,
+                            after_field_align)
+
+                    # combine with the align before the field because
+                    # the field is optional
+                    total_align = total_align.combine_with(after_field_align)
+            else:
+                # ignore other fields as they are irrelevant for alignment
+                continue
+
+            if total_align is None:
+                break
+
+        return total_align
+
+
+class Struct(ComplexType):
+    '''
+    Derived class representing a struct data type.
+    '''
+    out = __main__.output['struct']
+
+
+class Union(ComplexType):
+    '''
+    Derived class representing a union data type.
+    '''
+    def __init__(self, name, elt):
+        ComplexType.__init__(self, name, elt)
+        self.is_union = True
+
+    out = __main__.output['union']
+
+
+    def calc_size(self):
+        self.size = 0
+        for m in self.fields:
+            if not m.wire:
+                continue
+            if m.type.fixed_size():
+                self.size = max(self.size, m.type.get_total_size())
+            else:
+                self.size = None
+                break
+
+
+    def check_implicit_fixed_size_part_aligns(self):
+        # a union does not have implicit aligns because all fields start
+        # at the start of the union
+        return
+
+
+    def unchecked_get_alignment_after(self, start_align, callstack, log):
+        my_callstack = callstack[:]
+        my_callstack.append(self)
+
+        after_align = None
+        if self.fixed_size():
+
+            #check proper alignment for all members
+            start_align_ok = all(
+                [field.type.is_acceptable_start_align(start_align, my_callstack + [field], log)
+                for field in self.fields])
+
+            if start_align_ok:
+                #compute the after align from the start_align
+                after_align = start_align.align_after_fixed_size(self.get_total_size())
+            else:
+                after_align = None
+
+            if log is not None and after_align is not None:
+                log.ok(start_align, "fixed sized union", self, my_callstack, after_align)
+
+        else:
+            if start_align is None:
+                if log is not None:
+                    log.fail(start_align, "", self, my_callstack,
+                        "missing start_align for union")
+                return None
+
+            after_align = reduce(
+                lambda x, y: None if x is None or y is None else x.combine_with(y),
+                [field.type.get_alignment_after(start_align, my_callstack + [field], log)
+                 for field in self.fields])
+
+            if log is not None and after_align is not None:
+                log.ok(start_align, "var sized union", self, my_callstack, after_align)
+
+
+        if after_align is None and log is not None:
+            log.fail(start_align, "", self, my_callstack, "start_align is not ok for all members")
+
+        return after_align
+
+class CaseOrBitcaseType(ComplexType):
+    '''
+    Derived class representing a case or bitcase.
+    '''
+    def __init__(self, index, name, elt, *parent):
+        elts = list(elt)
+        self.expr = []
+        for sub_elt in elts:
+            if sub_elt.tag == 'enumref':
+                self.expr.append(Expression(sub_elt, self))
+                elt.remove(sub_elt)
+        ComplexType.__init__(self, name, elt)
+        self.has_name = True
+        self.index = 1
+        self.lenfield_parent = list(parent) + [self]
+        self.parents = list(parent)
+        self.is_case_or_bitcase = True
+
+    def make_member_of(self, module, switch_type, field_type, field_name, visible, wire, auto, enum=None):
+        '''
+        register BitcaseType with the corresponding SwitchType
+
+        module is the global module object.
+        complex_type is the structure object.
+        see Field for the meaning of the other parameters.
+        '''
+        new_field = Field(self, field_type, field_name, visible, wire, auto, enum)
+
+        # We dump the _placeholder_byte if any bitcases are added.
+        for (idx, field) in enumerate(switch_type.bitcases):
+            if field == _placeholder_byte:
+                switch_type.bitcases[idx] = new_field
+                return
+
+        switch_type.bitcases.append(new_field)
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+
+        for e in self.expr:
+            e.resolve(module, self.parents+[self])
+
+        # Resolve the bitcase expression
+        ComplexType.resolve(self, module)
+
+        #calculate alignment
+        self.calc_or_check_required_start_align()
+
+
+class BitcaseType(CaseOrBitcaseType):
+    '''
+    Derived class representing a bitcase.
+    '''
+    def __init__(self, index, name, elt, *parent):
+        CaseOrBitcaseType.__init__(self, index, name, elt, *parent)
+        self.is_bitcase = True
+
+class CaseType(CaseOrBitcaseType):
+    '''
+    Derived class representing a case.
+    '''
+    def __init__(self, index, name, elt, *parent):
+        CaseOrBitcaseType.__init__(self, index, name, elt, *parent)
+        self.is_case = True
+
+
+class Reply(ComplexType):
+    '''
+    Derived class representing a reply.  Only found as a field of Request.
+    '''
+    def __init__(self, name, elt):
+        ComplexType.__init__(self, name, elt)
+        self.is_reply = True
+        self.doc = None
+        if self.required_start_align is None:
+            self.required_start_align = Alignment(4,0)
+
+        for child in list(elt):
+            if child.tag == 'doc':
+                self.doc = Doc(name, child)
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+        # Reset pads count
+        module.pads = 0
+        # Add the automatic protocol fields
+        self.fields.append(Field(tcard8, tcard8.name, 'response_type', False, True, True))
+        self.fields.append(_placeholder_byte)
+        self.fields.append(Field(tcard16, tcard16.name, 'sequence', False, True, True))
+        self.fields.append(Field(tcard32, tcard32.name, 'length', False, True, True))
+        ComplexType.resolve(self, module)
+        
+
+class Request(ComplexType):
+    '''
+    Derived class representing a request.
+
+    Public fields added:
+    reply contains the reply datatype or None for void requests.
+    opcode contains the request number.
+    '''
+    def __init__(self, name, elt):
+        ComplexType.__init__(self, name, elt)
+        self.reply = None
+        self.doc = None
+        self.opcode = elt.get('opcode')
+        if self.required_start_align is None:
+            self.required_start_align = Alignment(4,0)
+
+        for child in list(elt):
+            if child.tag == 'reply':
+                self.reply = Reply(name, child)
+            if child.tag == 'doc':
+                self.doc = Doc(name, child)
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+        # Add the automatic protocol fields
+        if module.namespace.is_ext:
+            self.fields.append(Field(tcard8, tcard8.name, 'major_opcode', False, True, True))
+            self.fields.append(Field(tcard8, tcard8.name, 'minor_opcode', False, True, True))
+            self.fields.append(Field(tcard16, tcard16.name, 'length', False, True, True))
+            ComplexType.resolve(self, module)
+        else:
+            self.fields.append(Field(tcard8, tcard8.name, 'major_opcode', False, True, True))
+            self.fields.append(_placeholder_byte)
+            self.fields.append(Field(tcard16, tcard16.name, 'length', False, True, True))
+            ComplexType.resolve(self, module)
+
+        if self.reply:
+            self.reply.resolve(module)
+
+    out = __main__.output['request']
+
+
+class EventStructAllowedRule:
+
+    def __init__(self, parent, elt):
+        self.elt = elt
+        self.extension = elt.get('extension')
+        self.ge_events = elt.get('xge') == "true"
+        self.min_opcode = int( elt.get('opcode-min') )
+        self.max_opcode = int( elt.get('opcode-max') )
+
+    def resolve(self, parent, module):
+        # get the namespace of the specified extension
+        extension_namespace = module.get_namespace( self.extension )
+        if extension_namespace is None:
+            raise Exception( "EventStructAllowedRule.resolve: cannot find extension \"" + self.extension + "\"" )
+            return
+
+        # find and add the selected events
+        for opcode in range(self.min_opcode, self.max_opcode):
+            name_and_event = extension_namespace.get_event_by_opcode( opcode, self.ge_events )
+            if name_and_event is None:
+                # could not find event -> error handling
+                if self.ge_events:
+                    raise Exception("EventStructAllowedRule.resolve: cannot find xge-event with opcode " + str(opcode) + " in extension " + self.extension )
+                else:
+                    raise Exception("EventStructAllowedRule.resolve: cannot find oldstyle-event with opcode " + str(opcode) + " in extension " + self.extension )
+                return
+
+            ( name, event ) = name_and_event
+            # add event to EventStruct
+            parent.add_event( module, self.extension, opcode, name, event )
+
+
+class EventStruct(Union):
+    '''
+    Derived class representing an event-use-as-struct data type.
+    '''
+
+    def __init__(self, name, elt):
+        Union.__init__(self, name, elt)
+        self.is_eventstruct = True
+        self.events = []
+        self.allowedRules = []
+        self.contains_ge_events = False
+        for item in list(elt):
+            if item.tag == 'allowed':
+                allowedRule = EventStructAllowedRule(self, item)
+                self.allowedRules.append( allowedRule )
+                if allowedRule.ge_events:
+                    self.contains_ge_events = True
+
+    out = __main__.output['eventstruct']
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+        for allowedRule in self.allowedRules:
+            allowedRule.resolve(self, module)
+        Union.resolve(self,module)
+        self.resolved = True
+
+    # add event. called by resolve
+    def add_event(self, module, extension, opcode, name, event_type ):
+        self.events.append( (extension, opcode, name, event_type) )
+        # Add the field to ourself
+        event_type.make_member_of(module, self, name, name[-1], True, True, False)
+        # Recursively resolve the event (could be another structure, list)
+        event_type.resolve(module)
+
+    def fixed_size(self):
+        is_fixed_size = True
+        for extension, opcode, name, event in self.events:
+            if not event.fixed_size():
+                is_fixed_size = False
+        return is_fixed_size
+
+
+class Event(ComplexType):
+    '''
+    Derived class representing an event data type.
+
+    Public fields added:
+    opcodes is a dictionary of name -> opcode number, for eventcopies.
+    '''
+    def __init__(self, name, elt):
+        ComplexType.__init__(self, name, elt)
+
+        if self.required_start_align is None:
+            self.required_start_align = Alignment(4,0)
+
+        self.opcodes = {}
+
+        self.has_seq = not bool(elt.get('no-sequence-number'))
+
+        self.is_ge_event = bool(elt.get('xge'))
+
+        self.is_event = True
+
+        self.doc = None
+        for item in list(elt):
+            if item.tag == 'doc':
+                self.doc = Doc(name, item)
+
+    def add_opcode(self, opcode, name, main):
+        self.opcodes[name] = opcode
+        if main:
+            self.name = name
+
+    def get_name_for_opcode(self, opcode):
+        for name, my_opcode in self.opcodes.items():
+            if int(my_opcode) == opcode:
+                return name
+        else:
+            return None
+
+    def resolve(self, module):
+        def add_event_header():
+            self.fields.append(Field(tcard8, tcard8.name, 'response_type', False, True, True))
+            if self.has_seq:
+                self.fields.append(_placeholder_byte)
+                self.fields.append(Field(tcard16, tcard16.name, 'sequence', False, True, True))
+
+        def add_ge_event_header():
+            self.fields.append(Field(tcard8,  tcard8.name,  'response_type', False, True, True))
+            self.fields.append(Field(tcard8,  tcard8.name,  'extension', False, True, True))
+            self.fields.append(Field(tcard16, tcard16.name, 'sequence', False, True, True))
+            self.fields.append(Field(tcard32, tcard32.name, 'length', False, True, True))
+            self.fields.append(Field(tcard16, tcard16.name, 'event_type', False, True, True))
+
+        if self.resolved:
+            return
+
+        # Add the automatic protocol fields
+        if self.is_ge_event:
+            add_ge_event_header()
+        else:
+            add_event_header()
+
+        ComplexType.resolve(self, module)
+
+    out = __main__.output['event']
+
+
+class Error(ComplexType):
+    '''
+    Derived class representing an error data type.
+
+    Public fields added:
+    opcodes is a dictionary of name -> opcode number, for errorcopies.
+    '''
+    def __init__(self, name, elt):
+        ComplexType.__init__(self, name, elt)
+        self.opcodes = {}
+        if self.required_start_align is None:
+            self.required_start_align = Alignment(4,0)
+
+    def add_opcode(self, opcode, name, main):
+        self.opcodes[name] = opcode
+        if main:
+            self.name = name
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+
+        # Add the automatic protocol fields
+        self.fields.append(Field(tcard8, tcard8.name, 'response_type', False, True, True))
+        self.fields.append(Field(tcard8, tcard8.name, 'error_code', False, True, True))
+        self.fields.append(Field(tcard16, tcard16.name, 'sequence', False, True, True))
+        ComplexType.resolve(self, module)
+
+    out = __main__.output['error']
+
+
+class Doc(object):
+    '''
+    Class representing a <doc> tag.
+    '''
+    def __init__(self, name, elt):
+        self.name = name
+        self.description = None
+        self.brief = 'BRIEF DESCRIPTION MISSING'
+        self.fields = {}
+        self.errors = {}
+        self.see = {}
+        self.example = None
+
+        for child in list(elt):
+            text = child.text if child.text else ''
+            if child.tag == 'description':
+                self.description = text.strip()
+            if child.tag == 'brief':
+                self.brief = text.strip()
+            if child.tag == 'field':
+                self.fields[child.get('name')] = text.strip()
+            if child.tag == 'error':
+                self.errors[child.get('type')] = text.strip()
+            if child.tag == 'see':
+                self.see[child.get('name')] = child.get('type')
+            if child.tag == 'example':
+                self.example = text.strip()
+
+
+
+_placeholder_byte = Field(PadType(None), tcard8.name, 'pad0', False, True, False)
diff --git a/third_party/xcbproto/update.sh b/third_party/xcbproto/update.sh
new file mode 100755
index 000000000000..3a3358f7339c
--- /dev/null
+++ b/third_party/xcbproto/update.sh
@@ -0,0 +1,37 @@
+#! /usr/bin/env bash
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+set -o nounset
+set -o errexit
+set -o xtrace
+
+# Enter third_party/xcbproto
+cd "$( dirname "${BASH_SOURCE[0]}" )"
+
+git clone https://gitlab.freedesktop.org/xorg/proto/xcbproto.git
+
+# Generate the patch file.
+git -C xcbproto checkout $(cat VERSION)
+mv xcbproto/.git xcbproto_git
+# diff returns exit code 1, so unset errexit.
+set +o errexit
+diff -ru xcbproto src > patch.diff
+set -o errexit
+
+# Apply the patch file on master.
+mv xcbproto_git xcbproto/.git
+pushd xcbproto
+git checkout -b OldRevision
+git apply ../patch.diff
+git commit -am 'Apply Chromium patches'
+git branch --set-upstream-to=master
+git pull --rebase
+git rev-parse HEAD~ > ../VERSION
+rm -rf .git
+popd
+
+# Clean up and move the udpated directory into place.
+rm -rf src
+mv xcbproto src
-- 
2.25.1

