From c6539c9f45372fb6518bff17a781effd654bd3f0 Mon Sep 17 00:00:00 2001
From: marha <marha@users.sourceforge.net>
Date: Fri, 24 Dec 2010 12:41:29 +0000
Subject: xorg-server libx11 libxcb git update 24/12/2010

---
 libX11/src/ChkTypEv.c             |    1 +
 libX11/src/ChkTypWEv.c            |    1 +
 libxcb/Makefile.am                |  167 +-
 libxcb/configure.ac               |    2 +
 libxcb/doc/xkb_internals          |   49 +
 libxcb/doc/xkb_issues             |   38 +
 libxcb/src/Makefile.am            |  450 +--
 libxcb/src/c_client.py            | 1487 +++++++++-
 libxcb/src/xcb_util.c             |   10 +
 libxcb/src/xcbext.h               |    1 +
 libxcb/xcb-proto/src/xcb.xsd      |  627 ++---
 libxcb/xcb-proto/src/xkb.xml      | 5533 +++++++++++++++++++------------------
 libxcb/xcb-proto/xcbgen/expr.py   |   38 +-
 libxcb/xcb-proto/xcbgen/xtypes.py |  189 +-
 libxcb/xcb-xkb.pc.in              |   11 +
 xorg-server/exa/exa_accel.c       |    2 +
 xorg-server/exa/exa_unaccel.c     |    2 +
 17 files changed, 5106 insertions(+), 3502 deletions(-)
 create mode 100644 libxcb/doc/xkb_internals
 create mode 100644 libxcb/doc/xkb_issues
 create mode 100644 libxcb/xcb-xkb.pc.in

diff --git a/libX11/src/ChkTypEv.c b/libX11/src/ChkTypEv.c
index ccc05edc0..498b29e19 100644
--- a/libX11/src/ChkTypEv.c
+++ b/libX11/src/ChkTypEv.c
@@ -57,6 +57,7 @@ Bool XCheckTypedEvent (
 		if (qelt->event.type == type) {
 		    *event = qelt->event;
 		    _XDeq(dpy, prev, qelt);
+		    _XStoreEventCookie(dpy, event);
 		    UnlockDisplay(dpy);
 		    return True;
 		}
diff --git a/libX11/src/ChkTypWEv.c b/libX11/src/ChkTypWEv.c
index 84abd6dcc..b0429f084 100644
--- a/libX11/src/ChkTypWEv.c
+++ b/libX11/src/ChkTypWEv.c
@@ -59,6 +59,7 @@ Bool XCheckTypedWindowEvent (
 		    (qelt->event.type == type)) {
 		    *event = qelt->event;
 		    _XDeq(dpy, prev, qelt);
+		    _XStoreEventCookie(dpy, event);
 		    UnlockDisplay(dpy);
 		    return True;
 		}
diff --git a/libxcb/Makefile.am b/libxcb/Makefile.am
index ff9dea1cc..6c43c5bd4 100644
--- a/libxcb/Makefile.am
+++ b/libxcb/Makefile.am
@@ -1,82 +1,85 @@
-SUBDIRS=src tests doc
-
-pkgconfigdir = $(libdir)/pkgconfig
-
-pkgconfig_DATA = xcb.pc
-
-if BUILD_COMPOSITE
-pkgconfig_DATA += xcb-composite.pc
-endif
-if BUILD_DAMAGE
-pkgconfig_DATA += xcb-damage.pc
-endif
-if BUILD_DPMS
-pkgconfig_DATA += xcb-dpms.pc
-endif
-if BUILD_DRI2
-pkgconfig_DATA += xcb-dri2.pc
-endif
-if BUILD_GLX
-pkgconfig_DATA += xcb-glx.pc
-endif
-if BUILD_RANDR
-pkgconfig_DATA += xcb-randr.pc
-endif
-if BUILD_RECORD
-pkgconfig_DATA += xcb-record.pc
-endif
-if BUILD_RENDER
-pkgconfig_DATA += xcb-render.pc
-endif
-if BUILD_RESOURCE
-pkgconfig_DATA += xcb-res.pc
-endif
-if BUILD_SCREENSAVER
-pkgconfig_DATA += xcb-screensaver.pc
-endif
-if BUILD_SHAPE
-pkgconfig_DATA += xcb-shape.pc
-endif
-if BUILD_SHM
-pkgconfig_DATA += xcb-shm.pc
-endif
-if BUILD_SYNC
-pkgconfig_DATA += xcb-sync.pc
-endif
-if BUILD_XEVIE
-pkgconfig_DATA += xcb-xevie.pc
-endif
-if BUILD_XFREE86_DRI
-pkgconfig_DATA += xcb-xf86dri.pc
-endif
-if BUILD_XFIXES
-pkgconfig_DATA += xcb-xfixes.pc
-endif
-if BUILD_XINERAMA
-pkgconfig_DATA += xcb-xinerama.pc
-endif
-if BUILD_XINPUT
-pkgconfig_DATA += xcb-xinput.pc
-endif
-if BUILD_XPRINT
-pkgconfig_DATA += xcb-xprint.pc
-endif
-if BUILD_SELINUX
-pkgconfig_DATA += xcb-xselinux.pc
-endif
-if BUILD_XTEST
-pkgconfig_DATA += xcb-xtest.pc
-endif
-if BUILD_XV
-pkgconfig_DATA += xcb-xv.pc
-endif
-if BUILD_XVMC
-pkgconfig_DATA += xcb-xvmc.pc
-endif
-
-
-EXTRA_DIST = \
-tools/README \
-tools/api_conv.pl \
-tools/constants \
-autogen.sh
+SUBDIRS=src tests doc
+
+pkgconfigdir = $(libdir)/pkgconfig
+
+pkgconfig_DATA = xcb.pc
+
+if BUILD_COMPOSITE
+pkgconfig_DATA += xcb-composite.pc
+endif
+if BUILD_DAMAGE
+pkgconfig_DATA += xcb-damage.pc
+endif
+if BUILD_DPMS
+pkgconfig_DATA += xcb-dpms.pc
+endif
+if BUILD_DRI2
+pkgconfig_DATA += xcb-dri2.pc
+endif
+if BUILD_GLX
+pkgconfig_DATA += xcb-glx.pc
+endif
+if BUILD_RANDR
+pkgconfig_DATA += xcb-randr.pc
+endif
+if BUILD_RECORD
+pkgconfig_DATA += xcb-record.pc
+endif
+if BUILD_RENDER
+pkgconfig_DATA += xcb-render.pc
+endif
+if BUILD_RESOURCE
+pkgconfig_DATA += xcb-res.pc
+endif
+if BUILD_SCREENSAVER
+pkgconfig_DATA += xcb-screensaver.pc
+endif
+if BUILD_SHAPE
+pkgconfig_DATA += xcb-shape.pc
+endif
+if BUILD_SHM
+pkgconfig_DATA += xcb-shm.pc
+endif
+if BUILD_SYNC
+pkgconfig_DATA += xcb-sync.pc
+endif
+if BUILD_XEVIE
+pkgconfig_DATA += xcb-xevie.pc
+endif
+if BUILD_XFREE86_DRI
+pkgconfig_DATA += xcb-xf86dri.pc
+endif
+if BUILD_XFIXES
+pkgconfig_DATA += xcb-xfixes.pc
+endif
+if BUILD_XINERAMA
+pkgconfig_DATA += xcb-xinerama.pc
+endif
+if BUILD_XINPUT
+pkgconfig_DATA += xcb-xinput.pc
+endif
+if BUILD_XKB
+pkgconfig_DATA += xcb-xkb.pc
+endif
+if BUILD_XPRINT
+pkgconfig_DATA += xcb-xprint.pc
+endif
+if BUILD_SELINUX
+pkgconfig_DATA += xcb-xselinux.pc
+endif
+if BUILD_XTEST
+pkgconfig_DATA += xcb-xtest.pc
+endif
+if BUILD_XV
+pkgconfig_DATA += xcb-xv.pc
+endif
+if BUILD_XVMC
+pkgconfig_DATA += xcb-xvmc.pc
+endif
+
+
+EXTRA_DIST = \
+tools/README \
+tools/api_conv.pl \
+tools/constants \
+autogen.sh
diff --git a/libxcb/configure.ac b/libxcb/configure.ac
index 173755c2a..f8ff9bc57 100644
--- a/libxcb/configure.ac
+++ b/libxcb/configure.ac
@@ -146,6 +146,7 @@ XCB_EXTENSION(XFixes, "yes")
 XCB_EXTENSION(XFree86-DRI, "yes")
 XCB_EXTENSION(Xinerama, "yes")
 XCB_EXTENSION(XInput, "no")
+XCB_EXTENSION(XKB, "no")
 XCB_EXTENSION(Xprint, "yes")
 XCB_EXTENSION(SELinux, "no")
 XCB_EXTENSION(XTest, "yes")
@@ -189,6 +190,7 @@ xcb-xf86dri.pc
 xcb-xfixes.pc
 xcb-xinerama.pc
 xcb-xinput.pc
+xcb-xkb.pc
 xcb-xprint.pc
 xcb-xselinux.pc
 xcb-xtest.pc
diff --git a/libxcb/doc/xkb_internals b/libxcb/doc/xkb_internals
new file mode 100644
index 000000000..3e103910c
--- /dev/null
+++ b/libxcb/doc/xkb_internals
@@ -0,0 +1,49 @@
+
+XKB introduces several uncommon data structures:
+ - switch allows conditional inclusion of fields
+ - several complex objects intermix variable and fixed size fields
+ - lists with a variable number of variable size objects
+
+To handle these objects, a number of new functions is generated:
+ - _serialize() turns a structured object into a byte stream, 
+   (re)ordering or including fields according to the protocol
+ - _unserialize() rewrites data from a buffer into a structured object
+ - _unpack() expands a buffer representing a switch object into 
+   a special structured type, all flags needed to resolve the switch
+   expression have to given as parameters
+ - _sizeof() calculates the size of a serialized object, often by calling
+   _unserialize()/_unpack() internally
+
+The new structured data type for switch is special as it contains fixed 
+and variable size fields. Variable size fields can be accessed via pointers. 
+
+If switch appears in a request, an additional set of request helpers is 
+generated with the suffix _aux or _aux_(un)checked. While the 'common'
+request functions require that switch has been serialized before, the _aux
+variants take the structured data type. They are especially designed to 
+replace certain functions in xcb-util/aux. 
+
+Accessors for switch members need two parameters, where the first is usually
+a pointer to the respective request or reply structure, while the second 
+is a pointer to the unpacked switch data structure. 
+
+Functions from the serialize family that take a double pointer can allocate 
+memory on their own, which is useful if the size of a buffer has to be 
+calculated depending on the data within. These functions call malloc() when 
+the double pointer is given as the address of a pointer that has been 
+initialized to 0. It is the responsibility of the user to free any allocated
+memory. 
+
+Intermixed variable and fixed size fields are an important special case in XKB. 
+The current implementation resolves the issue by reordering the fields before
+sending them on the wire as well as before returning a reply. That means that 
+these objects look like 'common' XCB data types and they can be accessed as such 
+(i.e. fixed size fields directly via the structured type and variable size fields
+via accessors/iterators).  
+
+In case a list with variable size elements needs to be accessed, it is necessary 
+to use iterators. The iterator functions take care of determining the actual 
+object size for each element automatically. 
+
+A small and preliminary set of auxiliary functions is available in xkb_util.c 
+in the check_xkb module.  
diff --git a/libxcb/doc/xkb_issues b/libxcb/doc/xkb_issues
new file mode 100644
index 000000000..f10c015e5
--- /dev/null
+++ b/libxcb/doc/xkb_issues
@@ -0,0 +1,38 @@
+
+There are a number of problematic special cases in XKB. The issues 
+mentioned here are at most partly resolved.
+ 
+1. The are several XxxDoodad structures defined in xkb.xml. They are used
+   in a few lists, but in a rather special way: 
+   The struct "CommonDoodad" is supposed to be a rather generic data type, 
+   combining the most basic Doodad fields that are common in all these structures. 
+   All Doodads are encapsulated in a union type simply called "Doodad". 
+   Now this union is used in subsequent list definitions, aiming at a kind of 
+   'polymorphism': From inspection of the protocol and Xlib, the Doodads are to 
+   be discriminated based on their type field.
+   However the special meaning of the type field is not encoded in the protocol. 
+   Furthermore the TextDoodad and the LogoDoodad are variable size types due to
+   some fields of type CountedString16, thereby turning the union into a 
+   possibly variable size type as well. 
+   However, for lists with variable size elements, special sizeof functions are 
+   required. These cannot be autogenerated as it cannot be referred which 
+   Doodad type to use for the union. 
+   Therefore, the Doodad type structures are unsupported at the moment. 
+
+2. There are still some bugs in xkb.xml: Either certain fields are missing
+   that are required by the protocol, or Xlib simply has another understanding
+   of the protocol. 
+
+3. The interface for accessors should be reviewed. 
+
+4. Currently some bitcases carry 'name' attributes. These could be avoided if 
+   the data within would consist of a singe struct field only. 
+
+5. switch could get a 'fixed_size' attribute, so when rewriting valueparam to switch, 
+   an uint32_t * pointer could be used instead of void *. 
+
+6. The automatic inclusion of padding requires some complicated coding in the 
+   generator. This is errorprone and could be avoided if all padding is explicitly
+   given in the protocol definition. For variable size fields that require padding, 
+   the pad tag could get a 'fieldref' attribute. That way padding could be handled
+   a lot easier in the autogenerator. 
\ No newline at end of file
diff --git a/libxcb/src/Makefile.am b/libxcb/src/Makefile.am
index f0bdeaa46..207c26fdf 100644
--- a/libxcb/src/Makefile.am
+++ b/libxcb/src/Makefile.am
@@ -1,221 +1,229 @@
-lib_LTLIBRARIES = libxcb.la
-
-EXTSOURCES =	xproto.c \
-		bigreq.c \
-		xc_misc.c
-
-AM_CFLAGS = $(CWARNFLAGS) $(NEEDED_CFLAGS) $(XDMCP_CFLAGS)
-libxcb_la_LIBADD = $(NEEDED_LIBS) $(XDMCP_LIBS)
-libxcb_la_SOURCES = \
-		xcb_conn.c xcb_out.c xcb_in.c xcb_ext.c xcb_xid.c \
-		xcb_list.c xcb_util.c xcb_auth.c c_client.py
-nodist_libxcb_la_SOURCES = xproto.c bigreq.c xc_misc.c
-
-# Explanation for -version-info:
-# -version-info current:revision:age
-# The library supports interface (current-age) to interface current.
-# * If you changed the source code at all, increment revision.
-# * If you add an interface, increment current and age and set revision to 0.
-# * If you change or remove an interface, increment current and set revision
-#   and age to 0.
-libxcb_la_LDFLAGS = -version-info 2:0:1 -no-undefined
-
-XCB_LIBS = libxcb.la
-
-# FIXME: find a way to autogenerate this from the XML files.
-
-EXTSOURCES += composite.c
-if BUILD_COMPOSITE
-lib_LTLIBRARIES += libxcb-composite.la
-libxcb_composite_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_composite_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_composite_la_SOURCES = composite.c composite.h
-endif
-
-EXTSOURCES += damage.c
-if BUILD_DAMAGE
-lib_LTLIBRARIES += libxcb-damage.la
-libxcb_damage_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_damage_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_damage_la_SOURCES = damage.c damage.h
-endif
-
-EXTSOURCES += dpms.c
-if BUILD_DPMS
-lib_LTLIBRARIES += libxcb-dpms.la
-libxcb_dpms_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_dpms_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_dpms_la_SOURCES = dpms.c dpms.h
-endif
-
-EXTSOURCES += dri2.c
-if BUILD_DRI2
-lib_LTLIBRARIES += libxcb-dri2.la
-libxcb_dri2_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_dri2_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_dri2_la_SOURCES = dri2.c dri2.h
-endif
-
-EXTSOURCES += glx.c
-if BUILD_GLX
-lib_LTLIBRARIES += libxcb-glx.la
-libxcb_glx_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_glx_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_glx_la_SOURCES = glx.c glx.h
-endif
-
-EXTSOURCES += randr.c
-if BUILD_RANDR
-lib_LTLIBRARIES += libxcb-randr.la
-libxcb_randr_la_LDFLAGS = -version-info 1:0:1 -no-undefined
-libxcb_randr_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_randr_la_SOURCES = randr.c randr.h
-endif
-
-EXTSOURCES += record.c
-if BUILD_RECORD
-lib_LTLIBRARIES += libxcb-record.la
-libxcb_record_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_record_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_record_la_SOURCES = record.c record.h
-endif
-
-EXTSOURCES += render.c
-if BUILD_RENDER
-lib_LTLIBRARIES += libxcb-render.la
-libxcb_render_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_render_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_render_la_SOURCES = render.c render.h
-endif
-
-EXTSOURCES += res.c
-if BUILD_RESOURCE
-lib_LTLIBRARIES += libxcb-res.la
-libxcb_res_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_res_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_res_la_SOURCES = res.c res.h
-endif
-
-EXTSOURCES += screensaver.c
-if BUILD_SCREENSAVER
-lib_LTLIBRARIES += libxcb-screensaver.la
-libxcb_screensaver_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_screensaver_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_screensaver_la_SOURCES = screensaver.c screensaver.h
-endif
-
-EXTSOURCES += shape.c
-if BUILD_SHAPE
-lib_LTLIBRARIES += libxcb-shape.la
-libxcb_shape_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_shape_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_shape_la_SOURCES = shape.c shape.h
-endif
-
-EXTSOURCES += shm.c
-if BUILD_SHM
-lib_LTLIBRARIES += libxcb-shm.la
-libxcb_shm_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_shm_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_shm_la_SOURCES = shm.c shm.h
-endif
-
-EXTSOURCES += sync.c
-if BUILD_SYNC
-lib_LTLIBRARIES += libxcb-sync.la
-libxcb_sync_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_sync_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_sync_la_SOURCES = sync.c sync.h
-endif
-
-EXTSOURCES += xevie.c
-if BUILD_XEVIE
-lib_LTLIBRARIES += libxcb-xevie.la
-libxcb_xevie_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_xevie_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_xevie_la_SOURCES = xevie.c xevie.h
-endif
-
-EXTSOURCES += xf86dri.c
-if BUILD_XFREE86_DRI
-lib_LTLIBRARIES += libxcb-xf86dri.la
-libxcb_xf86dri_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_xf86dri_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_xf86dri_la_SOURCES = xf86dri.c xf86dri.h
-endif
-
-EXTSOURCES += xfixes.c
-if BUILD_XFIXES
-lib_LTLIBRARIES += libxcb-xfixes.la
-libxcb_xfixes_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_xfixes_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_xfixes_la_SOURCES = xfixes.c xfixes.h
-endif
-
-EXTSOURCES += xinerama.c
-if BUILD_XINERAMA
-lib_LTLIBRARIES += libxcb-xinerama.la
-libxcb_xinerama_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_xinerama_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_xinerama_la_SOURCES = xinerama.c xinerama.h
-endif
-
-EXTSOURCES += xinput.c
-if BUILD_XINPUT
-lib_LTLIBRARIES += libxcb-xinput.la
-libxcb_xinput_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_xinput_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_xinput_la_SOURCES = xinput.c xinput.h
-endif
-
-EXTSOURCES += xprint.c
-if BUILD_XPRINT
-lib_LTLIBRARIES += libxcb-xprint.la
-libxcb_xprint_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_xprint_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_xprint_la_SOURCES = xprint.c xprint.h
-endif
-
-EXTSOURCES += xselinux.c
-if BUILD_SELINUX
-lib_LTLIBRARIES += libxcb-xselinux.la
-libxcb_xselinux_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_xselinux_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_xselinux_la_SOURCES = xselinux.c xselinux.h
-endif
-
-EXTSOURCES += xtest.c
-if BUILD_XTEST
-lib_LTLIBRARIES += libxcb-xtest.la
-libxcb_xtest_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_xtest_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_xtest_la_SOURCES = xtest.c xtest.h
-endif
-
-EXTSOURCES += xv.c
-if BUILD_XV
-lib_LTLIBRARIES += libxcb-xv.la
-libxcb_xv_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_xv_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_xv_la_SOURCES = xv.c xv.h
-endif
-
-EXTSOURCES += xvmc.c
-if BUILD_XVMC
-lib_LTLIBRARIES += libxcb-xvmc.la
-libxcb_xvmc_la_LDFLAGS = -version-info 0:0:0 -no-undefined
-libxcb_xvmc_la_LIBADD = $(XCB_LIBS)
-nodist_libxcb_xvmc_la_SOURCES = xvmc.c xvmc.h
-endif
-
-
-EXTHEADERS=$(EXTSOURCES:.c=.h)
-xcbinclude_HEADERS = xcb.h xcbext.h
-nodist_xcbinclude_HEADERS = $(EXTHEADERS)
-noinst_HEADERS = xcbint.h
-
-BUILT_SOURCES = $(EXTSOURCES)
-CLEANFILES = $(EXTSOURCES) $(EXTHEADERS)
-
-$(EXTSOURCES): c_client.py
-	$(PYTHON) $(srcdir)/c_client.py -p $(XCBPROTO_XCBPYTHONDIR) $(XCBPROTO_XCBINCLUDEDIR)/$(@:.c=.xml)
+lib_LTLIBRARIES = libxcb.la
+
+EXTSOURCES =	xproto.c \
+		bigreq.c \
+		xc_misc.c
+
+AM_CFLAGS = $(CWARNFLAGS) $(NEEDED_CFLAGS) $(XDMCP_CFLAGS)
+libxcb_la_LIBADD = $(NEEDED_LIBS) $(XDMCP_LIBS)
+libxcb_la_SOURCES = \
+		xcb_conn.c xcb_out.c xcb_in.c xcb_ext.c xcb_xid.c \
+		xcb_list.c xcb_util.c xcb_auth.c c_client.py
+nodist_libxcb_la_SOURCES = xproto.c bigreq.c xc_misc.c
+
+# Explanation for -version-info:
+# -version-info current:revision:age
+# The library supports interface (current-age) to interface current.
+# * If you changed the source code at all, increment revision.
+# * If you add an interface, increment current and age and set revision to 0.
+# * If you change or remove an interface, increment current and set revision
+#   and age to 0.
+libxcb_la_LDFLAGS = -version-info 2:0:1 -no-undefined
+
+XCB_LIBS = libxcb.la
+
+# FIXME: find a way to autogenerate this from the XML files.
+
+EXTSOURCES += composite.c
+if BUILD_COMPOSITE
+lib_LTLIBRARIES += libxcb-composite.la
+libxcb_composite_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_composite_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_composite_la_SOURCES = composite.c composite.h
+endif
+
+EXTSOURCES += damage.c
+if BUILD_DAMAGE
+lib_LTLIBRARIES += libxcb-damage.la
+libxcb_damage_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_damage_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_damage_la_SOURCES = damage.c damage.h
+endif
+
+EXTSOURCES += dpms.c
+if BUILD_DPMS
+lib_LTLIBRARIES += libxcb-dpms.la
+libxcb_dpms_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_dpms_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_dpms_la_SOURCES = dpms.c dpms.h
+endif
+
+EXTSOURCES += dri2.c
+if BUILD_DRI2
+lib_LTLIBRARIES += libxcb-dri2.la
+libxcb_dri2_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_dri2_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_dri2_la_SOURCES = dri2.c dri2.h
+endif
+
+EXTSOURCES += glx.c
+if BUILD_GLX
+lib_LTLIBRARIES += libxcb-glx.la
+libxcb_glx_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_glx_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_glx_la_SOURCES = glx.c glx.h
+endif
+
+EXTSOURCES += randr.c
+if BUILD_RANDR
+lib_LTLIBRARIES += libxcb-randr.la
+libxcb_randr_la_LDFLAGS = -version-info 1:0:1 -no-undefined
+libxcb_randr_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_randr_la_SOURCES = randr.c randr.h
+endif
+
+EXTSOURCES += record.c
+if BUILD_RECORD
+lib_LTLIBRARIES += libxcb-record.la
+libxcb_record_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_record_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_record_la_SOURCES = record.c record.h
+endif
+
+EXTSOURCES += render.c
+if BUILD_RENDER
+lib_LTLIBRARIES += libxcb-render.la
+libxcb_render_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_render_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_render_la_SOURCES = render.c render.h
+endif
+
+EXTSOURCES += res.c
+if BUILD_RESOURCE
+lib_LTLIBRARIES += libxcb-res.la
+libxcb_res_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_res_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_res_la_SOURCES = res.c res.h
+endif
+
+EXTSOURCES += screensaver.c
+if BUILD_SCREENSAVER
+lib_LTLIBRARIES += libxcb-screensaver.la
+libxcb_screensaver_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_screensaver_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_screensaver_la_SOURCES = screensaver.c screensaver.h
+endif
+
+EXTSOURCES += shape.c
+if BUILD_SHAPE
+lib_LTLIBRARIES += libxcb-shape.la
+libxcb_shape_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_shape_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_shape_la_SOURCES = shape.c shape.h
+endif
+
+EXTSOURCES += shm.c
+if BUILD_SHM
+lib_LTLIBRARIES += libxcb-shm.la
+libxcb_shm_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_shm_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_shm_la_SOURCES = shm.c shm.h
+endif
+
+EXTSOURCES += sync.c
+if BUILD_SYNC
+lib_LTLIBRARIES += libxcb-sync.la
+libxcb_sync_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_sync_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_sync_la_SOURCES = sync.c sync.h
+endif
+
+EXTSOURCES += xevie.c
+if BUILD_XEVIE
+lib_LTLIBRARIES += libxcb-xevie.la
+libxcb_xevie_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xevie_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xevie_la_SOURCES = xevie.c xevie.h
+endif
+
+EXTSOURCES += xf86dri.c
+if BUILD_XFREE86_DRI
+lib_LTLIBRARIES += libxcb-xf86dri.la
+libxcb_xf86dri_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xf86dri_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xf86dri_la_SOURCES = xf86dri.c xf86dri.h
+endif
+
+EXTSOURCES += xfixes.c
+if BUILD_XFIXES
+lib_LTLIBRARIES += libxcb-xfixes.la
+libxcb_xfixes_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xfixes_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xfixes_la_SOURCES = xfixes.c xfixes.h
+endif
+
+EXTSOURCES += xinerama.c
+if BUILD_XINERAMA
+lib_LTLIBRARIES += libxcb-xinerama.la
+libxcb_xinerama_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xinerama_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xinerama_la_SOURCES = xinerama.c xinerama.h
+endif
+
+EXTSOURCES += xinput.c
+if BUILD_XINPUT
+lib_LTLIBRARIES += libxcb-xinput.la
+libxcb_xinput_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xinput_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xinput_la_SOURCES = xinput.c xinput.h
+endif
+
+EXTSOURCES += xkb.c
+if BUILD_XKB
+lib_LTLIBRARIES += libxcb-xkb.la
+libxcb_xkb_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xkb_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xkb_la_SOURCES = xkb.c xkb.h
+endif
+
+EXTSOURCES += xprint.c
+if BUILD_XPRINT
+lib_LTLIBRARIES += libxcb-xprint.la
+libxcb_xprint_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xprint_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xprint_la_SOURCES = xprint.c xprint.h
+endif
+
+EXTSOURCES += xselinux.c
+if BUILD_SELINUX
+lib_LTLIBRARIES += libxcb-xselinux.la
+libxcb_xselinux_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xselinux_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xselinux_la_SOURCES = xselinux.c xselinux.h
+endif
+
+EXTSOURCES += xtest.c
+if BUILD_XTEST
+lib_LTLIBRARIES += libxcb-xtest.la
+libxcb_xtest_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xtest_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xtest_la_SOURCES = xtest.c xtest.h
+endif
+
+EXTSOURCES += xv.c
+if BUILD_XV
+lib_LTLIBRARIES += libxcb-xv.la
+libxcb_xv_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xv_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xv_la_SOURCES = xv.c xv.h
+endif
+
+EXTSOURCES += xvmc.c
+if BUILD_XVMC
+lib_LTLIBRARIES += libxcb-xvmc.la
+libxcb_xvmc_la_LDFLAGS = -version-info 0:0:0 -no-undefined
+libxcb_xvmc_la_LIBADD = $(XCB_LIBS)
+nodist_libxcb_xvmc_la_SOURCES = xvmc.c xvmc.h
+endif
+
+
+EXTHEADERS=$(EXTSOURCES:.c=.h)
+xcbinclude_HEADERS = xcb.h xcbext.h
+nodist_xcbinclude_HEADERS = $(EXTHEADERS)
+noinst_HEADERS = xcbint.h
+
+BUILT_SOURCES = $(EXTSOURCES)
+CLEANFILES = $(EXTSOURCES) $(EXTHEADERS)
+
+$(EXTSOURCES): c_client.py
+	$(PYTHON) $(srcdir)/c_client.py -p $(XCBPROTO_XCBPYTHONDIR) $(XCBPROTO_XCBINCLUDEDIR)/$(@:.c=.xml)
diff --git a/libxcb/src/c_client.py b/libxcb/src/c_client.py
index 2d3d78a0b..fa65c1baa 100644
--- a/libxcb/src/c_client.py
+++ b/libxcb/src/c_client.py
@@ -16,6 +16,7 @@ _extension_special_cases = ['XPrint', 'XCMisc', 'BigRequests']
 _cplusplus_annoyances = {'class' : '_class',
                          'new'   : '_new',
                          'delete': '_delete'}
+_c_keywords = {'default' : '_default'}
 
 _hlines = []
 _hlevel = 0
@@ -23,6 +24,12 @@ _clines = []
 _clevel = 0
 _ns = None
 
+# global variable to keep track of serializers and 
+# switch data types due to weird dependencies
+finished_serializers = []
+finished_sizeof = []
+finished_switch = []
+
 def _h(fmt, *args):
     '''
     Writes the given line to the header file.
@@ -81,6 +88,8 @@ def _cpp(str):
     '''
     if str in _cplusplus_annoyances:
         return _cplusplus_annoyances[str]
+    elif str in _c_keywords:
+        return  _c_keywords[str]
     else:
         return str
 
@@ -158,6 +167,7 @@ def c_open(self):
     _h('')
     _h('#include "xcb.h"')
 
+    _c('#include <stdlib.h>')
     _c('#include <string.h>')
     _c('#include <assert.h>')
     _c('#include "xcbext.h"')
@@ -273,7 +283,30 @@ def _c_type_setup(self, name, postfix):
     self.c_reply_type = _t(name + ('reply',))
     self.c_cookie_type = _t(name + ('cookie',))
 
-    if self.is_container:
+    self.need_aux = False
+    self.need_serialize = False
+    self.need_sizeof = False
+
+    self.c_aux_name = _n(name + ('aux',))
+    self.c_aux_checked_name = _n(name + ('aux', 'checked'))
+    self.c_aux_unchecked_name = _n(name + ('aux', 'unchecked'))
+    self.c_serialize_name = _n(name + ('serialize',))
+    self.c_unserialize_name = _n(name + ('unserialize',))
+    self.c_unpack_name = _n(name + ('unpack',))
+    self.c_sizeof_name = _n(name + ('sizeof',))
+
+    # special case: structs where variable size fields are followed by fixed size fields
+    self.var_followed_by_fixed_fields = False
+
+    if self.is_switch:
+        self.need_serialize = True
+        self.c_container = 'struct'
+        for bitcase in self.bitcases:
+            bitcase.c_field_name = _cpp(bitcase.field_name)
+            bitcase_name = bitcase.field_type if bitcase.type.has_name else name
+            _c_type_setup(bitcase.type, bitcase_name, ())
+
+    elif self.is_container:
 
         self.c_container = 'union' if self.is_union else 'struct'
         prev_varsized_field = None
@@ -284,6 +317,8 @@ def _c_type_setup(self, name, postfix):
             _c_type_setup(field.type, field.field_type, ())
             if field.type.is_list:
                 _c_type_setup(field.type.member, field.field_type, ())
+                if (field.type.nmemb is None): 
+                    self.need_sizeof = True
 
             field.c_field_type = _t(field.field_type)
             field.c_field_const_type = ('' if field.type.nmemb == 1 else 'const ') + field.c_field_type
@@ -291,6 +326,19 @@ def _c_type_setup(self, name, postfix):
             field.c_subscript = '[%d]' % field.type.nmemb if (field.type.nmemb > 1) else ''
             field.c_pointer = ' ' if field.type.nmemb == 1 else '*'
 
+            # correct the c_pointer field for variable size non-list types
+            if not field.type.fixed_size() and field.c_pointer == ' ':
+                field.c_pointer = '*'
+            if field.type.is_list and not field.type.member.fixed_size():
+                field.c_pointer = '*'
+
+            if field.type.is_switch:
+                field.c_pointer = '*'
+                field.c_field_const_type = 'const ' + field.c_field_type
+                self.need_aux = True
+            elif not field.type.fixed_size() and not field.type.is_bitcase:
+                self.need_sizeof = True
+
             field.c_iterator_type = _t(field.field_type + ('iterator',))      # xcb_fieldtype_iterator_t
             field.c_iterator_name = _n(name + (field.field_name, 'iterator')) # xcb_container_field_iterator
             field.c_accessor_name = _n(name + (field.field_name,))            # xcb_container_field
@@ -306,10 +354,883 @@ def _c_type_setup(self, name, postfix):
 
             if field.type.fixed_size():
                 prev_varsized_offset += field.type.size
+                # special case: intermixed fixed and variable size fields
+                if prev_varsized_field is not None and not field.type.is_pad and field.wire:
+                    if not self.is_union:
+                        self.need_serialize = True
+                        self.var_followed_by_fixed_fields = True
             else:
                 self.last_varsized_field = field
                 prev_varsized_field = field
-                prev_varsized_offset = 0
+                prev_varsized_offset = 0                    
+
+            if self.var_followed_by_fixed_fields:
+                if field.type.fixed_size():
+                    field.prev_varsized_field = None
+                            
+    if self.need_serialize:
+        # when _unserialize() is wanted, create _sizeof() as well for consistency reasons 
+        self.need_sizeof = True
+
+    # as switch does never appear at toplevel, 
+    # continue here with type construction
+    if self.is_switch:
+        if self.c_type not in finished_switch:
+            finished_switch.append(self.c_type)
+            # special: switch C structs get pointer fields for variable-sized members
+            _c_complex(self)
+            for bitcase in self.bitcases:
+                bitcase_name = bitcase.type.name if bitcase.type.has_name else name
+                _c_accessors(bitcase.type, bitcase_name, bitcase_name)
+                # no list with switch as element, so no call to 
+                # _c_iterator(field.type, field_name) necessary
+
+    if not self.is_bitcase:
+        if self.need_serialize:
+            if self.c_serialize_name not in finished_serializers:
+                finished_serializers.append(self.c_serialize_name)
+                _c_serialize('serialize', self)
+
+                # _unpack() and _unserialize() are only needed for special cases:
+                #   switch -> unpack
+                #   special cases -> unserialize
+                if self.is_switch or self.var_followed_by_fixed_fields:
+                    _c_serialize('unserialize', self)
+                    
+        if self.need_sizeof:
+            if self.c_sizeof_name not in finished_sizeof:
+                if not module.namespace.is_ext or self.name[:2] == module.namespace.prefix:
+                    finished_sizeof.append(self.c_sizeof_name)
+                    _c_serialize('sizeof', self)
+# _c_type_setup()
+
+def _c_helper_absolute_name(prefix, field=None):
+    """
+    turn prefix, which is a list of tuples (name, separator, Type obj) into a string
+    representing a valid name in C (based on the context)
+    if field is not None, append the field name as well
+    """
+    prefix_str = ''
+    for name, sep, obj in prefix:
+        prefix_str += name
+        if '' == sep:
+            sep = '->'
+            if ((obj.is_bitcase and obj.has_name) or     # named bitcase
+                (obj.is_switch and len(obj.parents)>1)):
+                sep = '.'
+        prefix_str += sep
+    if field is not None:
+        prefix_str += _cpp(field.field_name)
+    return prefix_str
+# _c_absolute_name
+    
+def _c_helper_field_mapping(complex_type, prefix, flat=False):
+    """
+    generate absolute names, based on prefix, for all fields starting from complex_type
+    if flat == True, nested complex types are not taken into account
+    """
+    all_fields = {}
+    if complex_type.is_switch:
+        for b in complex_type.bitcases:
+            if b.type.has_name:
+                switch_name, switch_sep, switch_type = prefix[-1]
+                bitcase_prefix = prefix + [(b.type.name[-1], '.', b.type)]
+            else:
+                bitcase_prefix = prefix 
+
+            if (True==flat and not b.type.has_name) or False==flat:
+                all_fields.update(_c_helper_field_mapping(b.type, bitcase_prefix, flat))
+    else:
+        for f in complex_type.fields:
+            fname = _c_helper_absolute_name(prefix, f)
+            if all_fields.has_key(f.field_name):
+                raise Exception("field name %s has been registered before" % f.field_name)
+
+            all_fields[f.field_name] = (fname, f)
+            if f.type.is_container and flat==False:
+                if f.type.is_bitcase and not f.type.has_name:
+                    new_prefix = prefix
+                elif f.type.is_switch and len(f.type.parents)>1:
+                    # nested switch gets another separator
+                    new_prefix = prefix+[(f.c_field_name, '.', f.type)]
+                else:
+                    new_prefix = prefix+[(f.c_field_name, '->', f.type)]
+                all_fields.update(_c_helper_field_mapping(f.type, new_prefix, flat))
+
+    return all_fields
+# _c_field_mapping()
+
+def _c_helper_resolve_field_names (prefix):
+    """
+    get field names for all objects in the prefix array
+    """
+    all_fields = {}
+    tmp_prefix = []
+    # look for fields in the remaining containers
+    for idx, p in enumerate(prefix):
+        name, sep, obj = p
+        if ''==sep:
+            # sep can be preset in prefix, if not, make a sensible guess
+            sep = '.' if (obj.is_switch or obj.is_bitcase) else '->'
+            # exception: 'toplevel' object (switch as well!) always have sep '->'
+            sep = '->' if idx<1 else sep
+        if not obj.is_bitcase or (obj.is_bitcase and obj.has_name):
+            tmp_prefix.append((name, sep, obj))
+        all_fields.update(_c_helper_field_mapping(obj, tmp_prefix, flat=True))
+
+    return all_fields
+# _c_helper_resolve_field_names
+
+def get_expr_fields(self):
+    """
+    get the Fields referenced by switch or list expression 
+    """
+    def get_expr_field_names(expr):
+        if expr.op is None:
+            if expr.lenfield_name is not None:
+                return [expr.lenfield_name]
+            else:
+                # constant value expr
+                return []
+        else:
+            if expr.op == '~':
+                return get_expr_field_names(expr.rhs)
+            elif expr.op == 'popcount':
+                return get_expr_field_names(expr.rhs)
+            elif expr.op == 'sumof':
+                # sumof expr references another list, 
+                # we need that list's length field here
+                field = None
+                for f in expr.lenfield_parent.fields:
+                    if f.field_name == expr.lenfield_name:
+                        field = f
+                        break
+                if field is None:
+                    raise Exception("list field '%s' referenced by sumof not found" % expr.lenfield_name)
+                # referenced list + its length field
+                return [expr.lenfield_name] + get_expr_field_names(field.type.expr)
+            elif expr.op == 'enumref':
+                return []
+            else:
+                return get_expr_field_names(expr.lhs) + get_expr_field_names(expr.rhs)
+    # get_expr_field_names()
+    
+    # resolve the field names with the parent structure(s)
+    unresolved_fields_names = get_expr_field_names(self.expr)
+
+    # construct prefix from self
+    prefix = [('', '', p) for p in self.parents]
+    if self.is_container:
+        prefix.append(('', '', self))
+
+    all_fields = _c_helper_resolve_field_names (prefix)
+    resolved_fields_names = filter(lambda x: x in all_fields.keys(), unresolved_fields_names)
+    if len(unresolved_fields_names) != len(resolved_fields_names):
+        raise Exception("could not resolve all fields for %s" % self.name)
+    
+    resolved_fields = [all_fields[n][1] for n in resolved_fields_names]
+    return resolved_fields
+# get_expr_fields()
+
+def resolve_expr_fields(complex_obj):
+    """
+    find expr fields appearing in complex_obj and descendents that cannot be resolved within complex_obj
+    these are normally fields that need to be given as function parameters
+    """
+    all_fields = []
+    expr_fields = []
+    unresolved = []
+
+    for field in complex_obj.fields:
+        all_fields.append(field)
+        if field.type.is_switch or field.type.is_list:
+            expr_fields += get_expr_fields(field.type)
+        if field.type.is_container:
+            expr_fields += resolve_expr_fields(field.type)
+
+    # try to resolve expr fields
+    for e in expr_fields:
+        if e not in all_fields and e not in unresolved:
+            unresolved.append(e)
+    return unresolved
+# resolve_expr_fields()
+            
+def get_serialize_params(context, self, buffer_var='_buffer', aux_var='_aux'):
+    """
+    functions like _serialize(), _unserialize(), and _unpack() sometimes need additional parameters:
+    E.g. in order to unpack switch, extra parameters might be needed to evaluate the switch 
+    expression. This function tries to resolve all fields within a structure, and returns the 
+    unresolved fields as the list of external parameters. 
+    """
+    def add_param(params, param):
+        if param not in params:
+            params.append(param)
+
+    # collect all fields into param_fields
+    param_fields = []
+    wire_fields = []
+
+    for field in self.fields:
+        if field.visible:
+            # the field should appear as a parameter in the function call
+            param_fields.append(field)
+        if field.wire and not field.auto:
+            if field.type.fixed_size() and not self.is_switch:
+                # field in the xcb_out structure
+                wire_fields.append(field)
+        # fields like 'pad0' are skipped!
+               
+    # in case of switch, parameters always contain any fields referenced in the switch expr
+    # we do not need any variable size fields here, as the switch data type contains both 
+    # fixed and variable size fields
+    if self.is_switch:
+        param_fields = get_expr_fields(self)
+
+    # _serialize()/_unserialize()/_unpack() function parameters
+    # note: don't use set() for params, it is unsorted
+    params = []
+    
+    # 1. the parameter for the void * buffer
+    if  'serialize' == context:
+        params.append(('void', '**', buffer_var))
+    elif context in ('unserialize', 'unpack', 'sizeof'):
+        params.append(('const void', '*', buffer_var))
+
+    # 2. any expr fields that cannot be resolved within self and descendants
+    unresolved_fields = resolve_expr_fields(self)
+    for f in unresolved_fields:
+        add_param(params, (f.c_field_type, '', f.c_field_name))
+
+    # 3. param_fields contain the fields necessary to evaluate the switch expr or any other fields
+    #    that do not appear in the data type struct
+    for p in param_fields:
+        if self.is_switch:
+            typespec = p.c_field_const_type
+            pointerspec = p.c_pointer 
+            add_param(params, (typespec, pointerspec, p.c_field_name))
+        else:
+            if p.visible and not p.wire and not p.auto:
+                typespec = p.c_field_type
+                pointerspec = ''
+                add_param(params, (typespec, pointerspec, p.c_field_name))
+  
+    # 4. aux argument
+    if 'serialize' == context:
+        add_param(params, ('const %s' % self.c_type, '*', aux_var))
+    elif 'unserialize' == context: 
+        add_param(params, ('%s' % self.c_type, '**', aux_var))
+    elif 'unpack' == context:
+        add_param(params, ('%s' % self.c_type, '*', aux_var))
+
+    # 5. switch contains all variable size fields as struct members
+    #    for other data types though, these have to be supplied separately
+    #    this is important for the special case of intermixed fixed and 
+    #    variable size fields
+    if not self.is_switch and 'serialize' == context:
+        for p in param_fields:
+            if not p.type.fixed_size():
+                add_param(params, (p.c_field_const_type, '*', p.c_field_name))
+
+    return (param_fields, wire_fields, params)
+# get_serialize_params()
+
+def _c_serialize_helper_insert_padding(context, code_lines, space, postpone):
+    code_lines.append('%s    /* insert padding */' % space)
+    code_lines.append('%s    xcb_pad = -xcb_block_len & 3;' % space)
+#    code_lines.append('%s    printf("automatically inserting padding: %%%%d\\n", xcb_pad);' % space)
+    code_lines.append('%s    xcb_buffer_len += xcb_block_len + xcb_pad;' % space)
+
+    if not postpone:
+        code_lines.append('%s    if (0 != xcb_pad) {' % space)
+
+        if 'serialize' == context:
+            code_lines.append('%s        xcb_parts[xcb_parts_idx].iov_base = xcb_pad0;' % space)
+            code_lines.append('%s        xcb_parts[xcb_parts_idx].iov_len = xcb_pad;' % space)
+            code_lines.append('%s        xcb_parts_idx++;' % space)
+        elif context in ('unserialize', 'unpack', 'sizeof'):
+            code_lines.append('%s        xcb_tmp += xcb_pad;' % space)
+
+        code_lines.append('%s        xcb_pad = 0;' % space)
+        code_lines.append('%s    }' % space)
+        
+    code_lines.append('%s    xcb_block_len = 0;' % space)
+
+    # keep tracking of xcb_parts entries for serialize
+    return 1
+# _c_serialize_helper_insert_padding()
+
+def _c_serialize_helper_switch(context, self, complex_name, 
+                               code_lines, temp_vars, 
+                               space, prefix):
+    count = 0
+    switch_expr = _c_accessor_get_expr(self.expr, None)
+
+    for b in self.bitcases:            
+        bitcase_expr = _c_accessor_get_expr(b.type.expr, None)
+        code_lines.append('    if(%s & %s) {' % (switch_expr, bitcase_expr))
+#        code_lines.append('        printf("switch %s: entering bitcase section %s (mask=%%%%d)...\\n", %s);' % 
+#                          (self.name[-1], b.type.name[-1], bitcase_expr))
+        b_prefix = prefix
+        if b.type.has_name:
+            b_prefix = prefix + [(b.c_field_name, '.', b.type)]
+            
+        count += _c_serialize_helper_fields(context, b.type, 
+                                            code_lines, temp_vars, 
+                                            "%s    " % space, 
+                                            b_prefix, 
+                                            is_bitcase = True)
+        code_lines.append('    }')
+
+#    if 'serialize' == context:
+#        count += _c_serialize_helper_insert_padding(context, code_lines, space, False)
+#    elif context in ('unserialize', 'unpack', 'sizeof'):
+#        # padding
+#        code_lines.append('%s    xcb_pad = -xcb_block_len & 3;' % space)
+#        code_lines.append('%s    xcb_buffer_len += xcb_block_len + xcb_pad;' % space)
+   
+    return count
+# _c_serialize_helper_switch
+
+def _c_serialize_helper_switch_field(context, self, field, c_switch_variable, prefix):
+    """
+    handle switch by calling _serialize() or _unpack(), depending on context
+    """
+    # switch is handled by this function as a special case
+    param_fields, wire_fields, params = get_serialize_params(context, self)
+    field_mapping = _c_helper_field_mapping(self, prefix)
+    prefix_str = _c_helper_absolute_name(prefix)
+
+    # find the parameters that need to be passed to _serialize()/_unpack():
+    # all switch expr fields must be given as parameters
+    args = get_expr_fields(field.type)
+    # length fields for variable size types in switch, normally only some of need 
+    # need to be passed as parameters
+    switch_len_fields = resolve_expr_fields(field.type)
+
+    # a switch field at this point _must_ be a bitcase field
+    # we require that bitcases are "self-contiguous"
+    bitcase_unresolved = resolve_expr_fields(self)
+    if len(bitcase_unresolved) != 0:
+        raise Exception('unresolved fields within bitcase is not supported at this point')
+
+    # get the C names for the parameters  
+    c_field_names = ''
+    for a in switch_len_fields:
+        c_field_names += "%s, " % field_mapping[a.c_field_name][0]
+    for a in args:
+        c_field_names += "%s, " % field_mapping[a.c_field_name][0]
+
+    # call _serialize()/_unpack() to determine the actual size
+    if 'serialize' == context:
+        length = "%s(&%s, %s&%s%s)" % (field.type.c_serialize_name, c_switch_variable,
+                                       c_field_names, prefix_str, field.c_field_name) 
+    elif context in ('unserialize', 'unpack'):
+        length = "%s(xcb_tmp, %s&%s%s)" % (field.type.c_unpack_name, 
+                                           c_field_names, prefix_str, field.c_field_name)
+
+    return length
+# _c_serialize_helper_switch_field()
+
+def _c_serialize_helper_list_field(context, self, field, 
+                                   code_lines, temp_vars, 
+                                   space, prefix):
+    """
+    helper function to cope with lists of variable length
+    """
+    expr = field.type.expr
+    prefix_str = _c_helper_absolute_name(prefix)
+    param_fields, wire_fields, params = get_serialize_params('sizeof', self)
+    param_names = [p[2] for p in params]
+    
+    expr_fields_names = [f.field_name for f in get_expr_fields(field.type)]
+    resolved = filter(lambda x: x in param_names, expr_fields_names)
+    unresolved = filter(lambda x: x not in param_names, expr_fields_names)
+    
+    field_mapping = {}
+    for r in resolved:
+        field_mapping[r] = (r, None)
+    
+    if len(unresolved)>0:
+        tmp_prefix = prefix
+        if len(tmp_prefix)==0:
+            raise Exception("found an empty prefix while resolving expr field names for list %s", 
+                            field.c_field_name)        
+        
+        field_mapping.update(_c_helper_resolve_field_names(prefix))
+        resolved += filter(lambda x: x in field_mapping, unresolved)
+        unresolved = filter(lambda x: x not in field_mapping, unresolved)
+        if len(unresolved)>0:
+            raise Exception('could not resolve the length fields required for list %s' % field.c_field_name)
+
+    list_length = _c_accessor_get_expr(expr, field_mapping)
+
+    # default: list with fixed size elements
+    length = '%s * sizeof(%s)' % (list_length, field.type.member.c_wiretype)
+
+    # list with variable-sized elements 
+    if not field.type.member.fixed_size():
+        length = ''
+        if context in ('unserialize', 'sizeof', 'unpack'):
+            int_i = '    unsigned int i;'
+            xcb_tmp_len = '    unsigned int xcb_tmp_len;'
+            if int_i not in temp_vars:
+                temp_vars.append(int_i)
+            if xcb_tmp_len not in temp_vars:
+                temp_vars.append(xcb_tmp_len)
+            # loop over all list elements and call sizeof repeatedly
+            # this should be a bit faster than using the iterators
+            code_lines.append("%s    for(i=0; i<%s; i++) {" % (space, list_length))
+            code_lines.append("%s        xcb_tmp_len = %s(xcb_tmp);" % 
+                              (space, field.type.c_sizeof_name))
+            code_lines.append("%s        xcb_block_len += xcb_tmp_len;" % space)
+            code_lines.append("%s        xcb_tmp += xcb_tmp_len;" % space)
+            code_lines.append("%s    }" % space)                  
+      
+        elif 'serialize' == context:
+            code_lines.append('%s    xcb_parts[xcb_parts_idx].iov_len = 0;' % space)
+            code_lines.append('%s    xcb_tmp = (char *) %s%s;' % (space, prefix_str, field.c_field_name))
+            code_lines.append('%s    for(i=0; i<%s; i++) { ' % (space, list_length))
+            code_lines.append('%s        xcb_block_len = %s(xcb_tmp);' % (space, field.type.c_sizeof_name))
+            code_lines.append('%s        xcb_parts[xcb_parts_idx].iov_len += xcb_block_len;' % space)
+            code_lines.append('%s    }' % space)
+            code_lines.append('%s    xcb_block_len = xcb_parts[xcb_parts_idx].iov_len;' % space)
+            
+    return length
+# _c_serialize_helper_list_field()
+
+def _c_serialize_helper_fields_fixed_size(context, self, field, 
+                                          code_lines, temp_vars, 
+                                          space, prefix):
+    # keep the C code a bit more readable by giving the field name
+    if not self.is_bitcase:
+        code_lines.append('%s    /* %s.%s */' % (space, self.c_type, field.c_field_name))
+    else:
+        scoped_name = [p[2].c_type if idx==0 else p[0] for idx, p in enumerate(prefix)]
+        typename = reduce(lambda x,y: "%s.%s" % (x, y), scoped_name)
+        code_lines.append('%s    /* %s.%s */' % (space, typename, field.c_field_name))
+
+    abs_field_name = _c_helper_absolute_name(prefix, field)
+    # default for simple cases: call sizeof()
+    length = "sizeof(%s)" % field.c_field_type
+
+    if context in ('unserialize', 'unpack', 'sizeof'):
+        # default: simple cast
+        value = '    %s = *(%s *)xcb_tmp;' % (abs_field_name, field.c_field_type) 
+        
+        # padding - we could probably just ignore it
+        if field.type.is_pad and field.type.nmemb > 1:
+            value = ''
+            for i in range(field.type.nmemb):
+                code_lines.append('%s    %s[%d] = *(%s *)xcb_tmp;' % 
+                                  (space, abs_field_name, i, field.c_field_type)) 
+            # total padding = sizeof(pad0) * nmemb
+            length += " * %d" % field.type.nmemb
+
+        if field.type.is_list:
+            # no such case in the protocol, cannot be tested and therefore ignored for now
+            raise Exception('list with fixed number of elemens unhandled in _unserialize()')
+
+    elif 'serialize' == context:
+        value = '    xcb_parts[xcb_parts_idx].iov_base = (char *) ' 
+
+        if field.type.is_expr:
+            # need to register a temporary variable for the expression in case we know its type
+            if field.type.c_type is None:
+                raise Exception("type for field '%s' (expression '%s') unkown" % 
+                                (field.field_name, _c_accessor_get_expr(field.type.expr)))
+            
+            temp_vars.append('    %s xcb_expr_%s = %s;' % (field.type.c_type, _cpp(field.field_name), 
+                                                           _c_accessor_get_expr(field.type.expr, prefix)))
+            value += "&xcb_expr_%s;" % _cpp(field.field_name)
+
+        elif field.type.is_pad:
+            if field.type.nmemb == 1:
+                value += "&xcb_pad;"
+            else:
+                # we could also set it to 0, see definition of xcb_send_request()
+                value = '    xcb_parts[xcb_parts_idx].iov_base = xcb_pad0;'
+                length += "*%d" % field.type.nmemb
+
+        else:
+            # non-list type with fixed size
+            if field.type.nmemb == 1:
+                value += "&%s;" % (abs_field_name)
+
+            # list with nmemb (fixed size) elements
+            else:
+                value += '%s;' % (abs_field_name)
+                length = '%d' % field.type.nmemb
+
+    return (value, length)
+# _c_serialize_helper_fields_fixed_size()
+
+def _c_serialize_helper_fields_variable_size(context, self, field, 
+                                             code_lines, temp_vars, 
+                                             space, prefix):
+    prefix_str = _c_helper_absolute_name(prefix)
+
+    if context in ('unserialize', 'unpack', 'sizeof'):
+        value = ''
+        var_field_name = 'xcb_tmp'
+        
+        # special case: intermixed fixed and variable size fields
+        if self.var_followed_by_fixed_fields and 'unserialize' == context:
+            value = '    %s = (%s *)xcb_tmp;' % (field.c_field_name, field.c_field_type)
+            temp_vars.append('    %s *%s;' % (field.type.c_type, field.c_field_name))
+        # special case: switch
+        if 'unpack' == context:
+            value = '    %s%s = (%s *)xcb_tmp;' % (prefix_str, field.c_field_name, field.c_field_type)
+            
+    elif 'serialize' == context:
+        # variable size fields appear as parameters to _serialize() if the 
+        # 'toplevel' container is not a switch
+        prefix_string = prefix_str if prefix[0][2].is_switch else ''
+        var_field_name = "%s%s" % (prefix_string, field.c_field_name)
+        value = '    xcb_parts[xcb_parts_idx].iov_base = (char *) %s;' % var_field_name
+
+    length = ''
+
+    code_lines.append('%s    /* %s */' % (space, field.c_field_name))
+
+    if field.type.is_list:
+        if value != '':
+            # in any context, list is already a pointer, so the default assignment is ok
+            code_lines.append("%s%s" % (space, value))
+            value = ''
+        length = _c_serialize_helper_list_field(context, self, field, 
+                                                code_lines, temp_vars, 
+                                                space, prefix)
+        
+    elif field.type.is_switch:
+        value = ''
+        if context == 'serialize':
+            # the _serialize() function allocates the correct amount memory if given a NULL pointer
+            value = '    xcb_parts[xcb_parts_idx].iov_base = (char *)0;'
+        length = _c_serialize_helper_switch_field(context, self, field, 
+                                                  'xcb_parts[xcb_parts_idx].iov_base', 
+                                                  prefix)
+        
+    else:
+        # in all remaining special cases - call _sizeof()
+        length = "%s(%s)" % (field.type.c_sizeof_name, var_field_name)
+
+    return (value, length)
+# _c_serialize_helper_fields_variable_size
+
+def _c_serialize_helper_fields(context, self, 
+                               code_lines, temp_vars, 
+                               space, prefix, is_bitcase):
+    count = 0
+    need_padding = False
+    prev_field_was_variable = False
+
+    for field in self.fields:
+        if not field.visible:
+            if not ((field.wire and not field.auto) or 'unserialize' == context):
+                continue
+
+        # switch/bitcase: fixed size fields must be considered explicitly 
+        if field.type.fixed_size():
+            if self.is_bitcase or self.var_followed_by_fixed_fields:
+                if prev_field_was_variable and need_padding:
+                    # insert padding
+#                    count += _c_serialize_helper_insert_padding(context, code_lines, space, 
+#                                                                self.var_followed_by_fixed_fields)
+                    prev_field_was_variable = False
+
+                # prefix for fixed size fields
+                fixed_prefix = prefix
+
+                value, length = _c_serialize_helper_fields_fixed_size(context, self, field, 
+                                                                      code_lines, temp_vars, 
+                                                                      space, fixed_prefix)
+            else:
+                continue
+
+        # fields with variable size
+        else:
+            # switch/bitcase: always calculate padding before and after variable sized fields
+            if need_padding or is_bitcase:
+                count += _c_serialize_helper_insert_padding(context, code_lines, space, 
+                                                            self.var_followed_by_fixed_fields)
+
+            value, length = _c_serialize_helper_fields_variable_size(context, self, field, 
+                                                                     code_lines, temp_vars, 
+                                                                     space, prefix)
+            prev_field_was_variable = True
+        
+        # save (un)serialization C code
+        if '' != value:
+            code_lines.append('%s%s' % (space, value))    
+        
+        if field.type.fixed_size():
+            if is_bitcase or self.var_followed_by_fixed_fields:
+                # keep track of (un)serialized object's size
+                code_lines.append('%s    xcb_block_len += %s;' % (space, length))
+                if context in ('unserialize', 'unpack', 'sizeof'):
+                    code_lines.append('%s    xcb_tmp += %s;' % (space, length))
+        else: 
+            # variable size objects or bitcase:
+            #   value & length might have been inserted earlier for special cases
+            if '' != length:
+                # special case: intermixed fixed and variable size fields
+                if (not field.type.fixed_size() and 
+                    self.var_followed_by_fixed_fields and 'unserialize' == context):
+                    temp_vars.append('    int %s_len;' % field.c_field_name)
+                    code_lines.append('%s    %s_len = %s;' % (space, field.c_field_name, length))
+                    code_lines.append('%s    xcb_block_len += %s_len;' % (space, field.c_field_name))
+                    code_lines.append('%s    xcb_tmp += %s_len;' % (space, field.c_field_name))
+                else:
+                    code_lines.append('%s    xcb_block_len += %s;' % (space, length))
+                    # increase pointer into the byte stream accordingly
+                    if context in ('unserialize', 'sizeof', 'unpack'):
+                        code_lines.append('%s    xcb_tmp += xcb_block_len;' % space)
+                        
+        if 'serialize' == context:
+            if '' != length:
+                code_lines.append('%s    xcb_parts[xcb_parts_idx].iov_len = %s;' % (space, length))
+            code_lines.append('%s    xcb_parts_idx++;' % space)
+            count += 1
+
+        need_padding = True
+        if self.var_followed_by_fixed_fields:
+            need_padding = False
+        
+    return count
+# _c_serialize_helper_fields()    
+
+def _c_serialize_helper(context, complex_type, 
+                        code_lines, temp_vars, 
+                        space='', prefix=[]):
+    # count tracks the number of fields to serialize
+    count = 0
+
+    if hasattr(complex_type, 'type'):
+        self = complex_type.type
+        complex_name = complex_type.name
+    else:
+        self = complex_type
+        if self.var_followed_by_fixed_fields and 'unserialize' == context:
+            complex_name = 'xcb_out'
+        else:
+            complex_name = '_aux'
+    
+    # special case: switch is serialized by evaluating each bitcase separately
+    if self.is_switch:
+        count += _c_serialize_helper_switch(context, self, complex_name, 
+                                            code_lines, temp_vars, 
+                                            space, prefix)
+
+    # all other data types can be evaluated one field a time
+    else: 
+        # unserialize & fixed size fields: simply cast the buffer to the respective xcb_out type
+        if context in ('unserialize', 'unpack', 'sizeof') and not self.var_followed_by_fixed_fields:
+            code_lines.append('%s    xcb_block_len += sizeof(%s);' % (space, self.c_type))
+            code_lines.append('%s    xcb_tmp += xcb_block_len;' % space)
+            # probably not needed
+            #_c_serialize_helper_insert_padding(context, code_lines, space, False)
+
+        count += _c_serialize_helper_fields(context, self, 
+                                            code_lines, temp_vars, 
+                                            space, prefix, False)
+    # "final padding"
+    count += _c_serialize_helper_insert_padding(context, code_lines, space, False)
+
+    return count    
+# _c_serialize_helper()
+
+def _c_serialize(context, self):
+    """
+    depending on the context variable, generate _serialize(), _unserialize(), _unpack(), or _sizeof() 
+    for the ComplexType variable self
+    """
+    _h_setlevel(1)
+    _c_setlevel(1)
+
+    _hc('')
+    # _serialize() returns the buffer size
+    _hc('int')
+
+    if self.is_switch and 'unserialize' == context:
+        context = 'unpack'
+
+    cases = { 'serialize'   : self.c_serialize_name, 
+              'unserialize' : self.c_unserialize_name, 
+              'unpack'      : self.c_unpack_name, 
+              'sizeof'      : self.c_sizeof_name }
+    func_name = cases[context]
+            
+    param_fields, wire_fields, params = get_serialize_params(context, self)
+    variable_size_fields = 0
+    # maximum space required for type definition of function arguments
+    maxtypelen = 0
+
+    # determine N(variable_fields) 
+    for field in param_fields:
+        # if self.is_switch, treat all fields as if they are variable sized
+        if not field.type.fixed_size() or self.is_switch:
+            variable_size_fields += 1
+    # determine maxtypelen
+    for p in params:
+        maxtypelen = max(maxtypelen, len(p[0]) + len(p[1]))    
+
+    # write to .c/.h
+    indent = ' '*(len(func_name)+2)
+    param_str = []
+    for p in params:
+        typespec, pointerspec, field_name = p
+        spacing = ' '*(maxtypelen-len(typespec)-len(pointerspec))
+        param_str.append("%s%s%s  %s%s  /**< */" % (indent, typespec, spacing, pointerspec, field_name))
+    # insert function name
+    param_str[0] = "%s (%s" % (func_name, param_str[0].strip())
+    param_str = map(lambda x: "%s," % x, param_str)
+    for s in param_str[:-1]:
+        _hc(s)
+    _h("%s);" % param_str[-1].rstrip(','))
+    _c("%s)" % param_str[-1].rstrip(','))
+    _c('{')
+
+    code_lines = []
+    temp_vars = []
+    prefix = []
+
+    if 'serialize' == context:
+        if not self.is_switch and not self.var_followed_by_fixed_fields:
+            _c('    %s *xcb_out = *_buffer;', self.c_type)
+            _c('    unsigned int xcb_out_pad = -sizeof(%s) & 3;', self.c_type)
+            _c('    unsigned int xcb_buffer_len = sizeof(%s) + xcb_out_pad;', self.c_type)
+        else:
+            _c('    char *xcb_out = *_buffer;')
+            _c('    unsigned int xcb_buffer_len = 0;')
+        prefix = [('_aux', '->', self)]
+        aux_ptr = 'xcb_out'
+
+    elif context in ('unserialize', 'unpack'):
+        _c('    char *xcb_tmp = (char *)_buffer;')
+        if not self.is_switch:
+            if not self.var_followed_by_fixed_fields:
+                _c('    const %s *_aux = (%s *)_buffer;', self.c_type, self.c_type)
+                prefix = [('_aux', '->', self)]
+            else:
+                _c('    %s xcb_out;', self.c_type)
+                prefix = [('xcb_out', '.', self)]
+        else:
+            aux_var = '_aux' # default for unpack: single pointer
+            # note: unserialize not generated for switch
+            if 'unserialize' == context:
+                aux_var = '(*_aux)' # unserialize: double pointer (!)
+            prefix = [(aux_var, '->', self)]
+        aux_ptr = '*_aux'
+        _c('    unsigned int xcb_buffer_len = 0;')
+        _c('    unsigned int xcb_block_len = 0;')
+        _c('    unsigned int xcb_pad = 0;')
+
+    elif 'sizeof' == context:
+        param_names = [p[2] for p in params]
+        if self.is_switch:
+            # switch: call _unpack()
+            _c('    %s _aux;', self.c_type)
+            _c('    return %s(%s, &_aux);', self.c_unpack_name, reduce(lambda x,y: "%s, %s" % (x, y), param_names))
+            _c('}')
+            return
+        elif self.var_followed_by_fixed_fields:
+            # special case: call _unserialize()
+            _c('    return %s(%s, NULL);', self.c_unserialize_name, reduce(lambda x,y: "%s, %s" % (x, y), param_names))
+            _c('}')
+            return
+        else:
+            _c('    char *xcb_tmp = (char *)_buffer;')
+            prefix = [('_aux', '->', self)]
+
+    count = _c_serialize_helper(context, self, code_lines, temp_vars, prefix=prefix)
+    # update variable size fields (only important for context=='serialize'
+    variable_size_fields = count
+    if 'serialize' == context:
+        temp_vars.append('    unsigned int xcb_pad = 0;')
+        temp_vars.append('    char xcb_pad0[3] = {0, 0, 0};') 
+        temp_vars.append('    struct iovec xcb_parts[%d];' % count)
+        temp_vars.append('    unsigned int xcb_parts_idx = 0;')
+        temp_vars.append('    unsigned int xcb_block_len = 0;')
+        temp_vars.append('    unsigned int i;')
+        temp_vars.append('    char *xcb_tmp;')
+    elif 'sizeof' == context:
+        # neither switch nor intermixed fixed and variable size fields:
+        # evaluate parameters directly
+        if not (self.is_switch or self.var_followed_by_fixed_fields):
+
+            # look if we have to declare an '_aux' variable at all
+            if len(filter(lambda x: x.find('_aux')!=-1, code_lines))>0: 
+                if not self.var_followed_by_fixed_fields:
+                    _c('    const %s *_aux = (%s *)_buffer;', self.c_type, self.c_type)
+                else:
+                    _c('    %s *_aux = malloc(sizeof(%s));', self.c_type, self.c_type)
+
+            _c('    unsigned int xcb_buffer_len = 0;')
+            _c('    unsigned int xcb_block_len = 0;')
+            _c('    unsigned int xcb_pad = 0;')        
+
+    _c('')
+    for t in temp_vars:
+        _c(t)
+    _c('')
+    for l in code_lines:
+        _c(l)
+
+    # variable sized fields have been collected, now
+    # allocate memory and copy everything into a continuous memory area 
+    # note: this is not necessary in case of unpack
+    if context in ('serialize', 'unserialize'):
+        # unserialize: check for sizeof-only invocation
+        if 'unserialize' == context:
+            _c('')
+            _c('    if (NULL == _aux)')
+            _c('        return xcb_buffer_len;')
+
+        _c('')
+        _c('    if (NULL == %s) {', aux_ptr)
+        _c('        /* allocate memory */')
+        _c('        %s = malloc(xcb_buffer_len);', aux_ptr)
+        if 'serialize' == context:
+            _c('        *_buffer = xcb_out;')
+        _c('    }')
+        _c('')
+
+        # serialize: handle variable size fields in a loop
+        if 'serialize' == context:
+            if not self.is_switch and not self.var_followed_by_fixed_fields:
+                if len(wire_fields)>0:
+                    _c('    *xcb_out = *_aux;')
+            # copy variable size fields into the buffer
+            if variable_size_fields > 0:
+                # xcb_out padding
+                if not self.is_switch and not self.var_followed_by_fixed_fields:
+                    _c('    xcb_tmp = (char*)++xcb_out;')
+                    _c('    xcb_tmp += xcb_out_pad;')
+                else:
+                    _c('    xcb_tmp = xcb_out;')
+
+                # variable sized fields
+                _c('    for(i=0; i<xcb_parts_idx; i++) {')
+                _c('        if (0 != xcb_parts[i].iov_base && 0 != xcb_parts[i].iov_len)')
+                _c('            memcpy(xcb_tmp, xcb_parts[i].iov_base, xcb_parts[i].iov_len);')
+                _c('        if (0 != xcb_parts[i].iov_len)')
+                _c('            xcb_tmp += xcb_parts[i].iov_len;')
+                _c('    }')
+            
+        # unserialize: assign variable size fields individually
+        if 'unserialize' == context:
+            _c('    xcb_tmp = ((char *)*_aux)+xcb_buffer_len;')
+            param_fields.reverse()
+            for field in param_fields:
+                if not field.type.fixed_size():
+                    _c('    xcb_tmp -= %s_len;', field.c_field_name)
+                    _c('    memmove(xcb_tmp, %s, %s_len);', field.c_field_name, field.c_field_name)
+            _c('    *%s = xcb_out;', aux_ptr)
+ 
+    _c('')
+    _c('    return xcb_buffer_len;')
+    _c('}')
+# _c_serialize()
 
 def _c_iterator_get_end(field, accum):
     '''
@@ -319,7 +1240,6 @@ def _c_iterator_get_end(field, accum):
     '''
     if field.type.is_container:
         accum = field.c_accessor_name + '(' + accum + ')'
-        # XXX there could be fixed-length fields at the end
         return _c_iterator_get_end(field.type.last_varsized_field, accum)
     if field.type.is_list:
         # XXX we can always use the first way
@@ -372,10 +1292,22 @@ def _c_iterator(self, name):
 
     if not self.fixed_size():
         _c('    %s *R = i->data;', self.c_type)
-        _c('    xcb_generic_iterator_t child = %s;', _c_iterator_get_end(self.last_varsized_field, 'R'))
-        _c('    --i->rem;')
-        _c('    i->data = (%s *) child.data;', self.c_type)
-        _c('    i->index = child.index;')
+
+        if self.is_union:
+            # FIXME - how to determine the size of a variable size union??
+            _c('    /* FIXME - determine the size of the union %s */', self.c_type)            
+        else:
+            if self.need_sizeof:
+                _c('    xcb_generic_iterator_t child;')
+                _c('    child.data = (%s *)(((char *)R) + %s(R));', 
+                   self.c_type, self.c_sizeof_name)
+                _c('    i->index = (char *) child.data - (char *) i->data;')
+            else:
+                _c('    xcb_generic_iterator_t child = %s;', _c_iterator_get_end(self.last_varsized_field, 'R'))
+                _c('    i->index = child.index;')
+            _c('    --i->rem;')
+            _c('    i->data = (%s *) child.data;', self.c_type)
+
     else:
         _c('    --i->rem;')
         _c('    ++i->data;')
@@ -424,34 +1356,68 @@ def _c_iterator(self, name):
     _c('    return ret;')
     _c('}')
 
-def _c_accessor_get_length(expr, prefix=''):
+def _c_accessor_get_length(expr, field_mapping=None):
     '''
     Figures out what C code is needed to get a length field.
+    The field_mapping parameter can be used to change the absolute name of a length field. 
     For fields that follow a variable-length field, use the accessor.
     Otherwise, just reference the structure field directly.
     '''
-    prefarrow = '' if prefix == '' else prefix + '->'
 
-    if expr.lenfield != None and expr.lenfield.prev_varsized_field != None:
-        return expr.lenfield.c_accessor_name + '(' + prefix + ')'
-    elif expr.lenfield_name != None:
-        return prefarrow + expr.lenfield_name
+    lenfield_name = expr.lenfield_name
+    if lenfield_name is not None:
+        if field_mapping is not None:
+            lenfield_name = field_mapping[lenfield_name][0]
+ 
+    if expr.lenfield is not None and expr.lenfield.prev_varsized_field is not None:
+        # special case: variable and fixed size fields are intermixed
+        # if the lenfield is among the fixed size fields, there is no need
+        # to call a special accessor function like <expr.lenfield.c_accessor_name + '(' + prefix + ')'>
+        return field_mapping(expr.lenfield_name)
+    elif expr.lenfield_name is not None:
+        return lenfield_name
     else:
         return str(expr.nmemb)
 
-def _c_accessor_get_expr(expr, prefix=''):
+def _c_accessor_get_expr(expr, field_mapping):
     '''
     Figures out what C code is needed to get the length of a list field.
+    The field_mapping parameter can be used to change the absolute name of a length field. 
     Recurses for math operations.
     Returns bitcount for value-mask fields.
     Otherwise, uses the value of the length field.
     '''
-    lenexp = _c_accessor_get_length(expr, prefix)
+    lenexp = _c_accessor_get_length(expr, field_mapping)
 
     if expr.op == '~':
-        return '(' + '~' + _c_accessor_get_expr(expr.rhs, prefix) + ')'
+        return '(' + '~' + _c_accessor_get_expr(expr.rhs, field_mapping) + ')'
+    elif expr.op == 'popcount':
+        return 'xcb_popcount(' + _c_accessor_get_expr(expr.rhs, field_mapping) + ')'
+    elif expr.op == 'enumref':
+        enum_name = expr.lenfield_type.name
+        constant_name = expr.lenfield_name
+        c_name = _n(enum_name + (constant_name,)).upper()
+        return c_name
+    elif expr.op == 'sumof':
+        # locate the referenced list object
+        list_obj = expr.lenfield_type
+        field = None
+        for f in expr.lenfield_parent.fields:
+            if f.field_name == expr.lenfield_name:
+                field = f
+                break
+
+        if field is None:
+            raise Exception("list field '%s' referenced by sumof not found" % expr.lenfield_name)
+        list_name = field_mapping[field.c_field_name][0]
+        c_length_func = "%s(%s)" % (field.c_length_name, list_name)
+        # note: xcb_sumof() has only been defined for integers
+        c_length_func = _c_accessor_get_expr(field.type.expr, field_mapping)
+        return 'xcb_sumof(%s, %s)' % (list_name, c_length_func)
     elif expr.op != None:
-        return '(' + _c_accessor_get_expr(expr.lhs, prefix) + ' ' + expr.op + ' ' + _c_accessor_get_expr(expr.rhs, prefix) + ')'
+        return ('(' + _c_accessor_get_expr(expr.lhs, field_mapping) + 
+                ' ' + expr.op + ' ' + 
+                _c_accessor_get_expr(expr.rhs, field_mapping) + ')')
     elif expr.bitfield:
         return 'xcb_popcount(' + lenexp + ')'
     else:
@@ -461,24 +1427,37 @@ def _c_accessors_field(self, field):
     '''
     Declares the accessor functions for a non-list field that follows a variable-length field.
     '''
+    c_type = self.c_type
+
+    # special case: switch
+    switch_obj = self if self.is_switch else None
+    if self.is_bitcase:
+        switch_obj = self.parents[-1]
+    if switch_obj is not None:
+        c_type = switch_obj.c_type
+
     if field.type.is_simple:
         _hc('')
         _hc('')
         _hc('/*****************************************************************************')
-        _hc(' **')
+        _hc(' ** ')
         _hc(' ** %s %s', field.c_field_type, field.c_accessor_name)
         _hc(' ** ')
-        _hc(' ** @param const %s *R', self.c_type)
+        _hc(' ** @param const %s *R', c_type)
         _hc(' ** @returns %s', field.c_field_type)
         _hc(' **')
         _hc(' *****************************************************************************/')
         _hc(' ')
         _hc('%s', field.c_field_type)
-        _h('%s (const %s *R  /**< */);', field.c_accessor_name, self.c_type)
-        _c('%s (const %s *R  /**< */)', field.c_accessor_name, self.c_type)
+        _h('%s (const %s *R  /**< */);', field.c_accessor_name, c_type)
+        _c('%s (const %s *R  /**< */)', field.c_accessor_name, c_type)
         _c('{')
-        _c('    xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
-        _c('    return * (%s *) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index) + %d);', field.c_field_type, field.first_field_after_varsized.type.c_type, field.prev_varsized_offset)
+        if field.prev_varsized_field is None:
+            _c('    return (%s *) (R + 1);', field.c_field_type)
+        else:
+            _c('    xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
+            _c('    return * (%s *) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index) + %d);', 
+               field.c_field_type, field.first_field_after_varsized.type.c_type, field.prev_varsized_offset)
         _c('}')
     else:
         _hc('')
@@ -487,18 +1466,31 @@ def _c_accessors_field(self, field):
         _hc(' **')
         _hc(' ** %s * %s', field.c_field_type, field.c_accessor_name)
         _hc(' ** ')
-        _hc(' ** @param const %s *R', self.c_type)
+        _hc(' ** @param const %s *R', c_type)
         _hc(' ** @returns %s *', field.c_field_type)
         _hc(' **')
         _hc(' *****************************************************************************/')
         _hc(' ')
-        _hc('%s *', field.c_field_type)
-        _h('%s (const %s *R  /**< */);', field.c_accessor_name, self.c_type)
-        _c('%s (const %s *R  /**< */)', field.c_accessor_name, self.c_type)
+        if field.type.is_switch and switch_obj is None:
+            return_type = 'void *'
+        else:
+            return_type = '%s *' % field.c_field_type
+
+        _hc(return_type)
+        _h('%s (const %s *R  /**< */);', field.c_accessor_name, c_type)
+        _c('%s (const %s *R  /**< */)', field.c_accessor_name, c_type)
         _c('{')
-        _c('    xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
-        _c('    return (%s *) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index) + %d);', field.c_field_type, field.first_field_after_varsized.type.c_type, field.prev_varsized_offset)
+        if field.prev_varsized_field is None:
+            _c('    return (%s) (R + 1);', return_type)
+            # note: the special case 'variable fields followed by fixed size fields'
+            #       is not of any consequence here, since the ordering gets 
+            #       'corrected' in the reply function
+        else:
+            _c('    xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
+            _c('    return (%s) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index) + %d);', 
+               return_type, field.first_field_after_varsized.type.c_type, field.prev_varsized_offset)
         _c('}')
+
     
 def _c_accessors_list(self, field):
     '''
@@ -507,32 +1499,83 @@ def _c_accessors_list(self, field):
     Declares length and get-iterator functions always.
     '''
     list = field.type
+    c_type = self.c_type
+
+    # special case: switch
+    # in case of switch, 2 params have to be supplied to certain accessor functions:
+    #   1. the anchestor object (request or reply)
+    #   2. the (anchestor) switch object
+    # the reason is that switch is either a child of a request/reply or nested in another switch, 
+    # so whenever we need to access a length field, we might need to refer to some anchestor type
+    switch_obj = self if self.is_switch else None
+    if self.is_bitcase:
+        switch_obj = self.parents[-1]
+    if switch_obj is not None:
+        c_type = switch_obj.c_type
+
+    params = []
+    fields = {}
+    parents = self.parents if hasattr(self, 'parents') else [self]
+    # 'R': parents[0] is always the 'toplevel' container type 
+    params.append(('const %s *R' % parents[0].c_type, parents[0]))
+    fields.update(_c_helper_field_mapping(parents[0], [('R', '->', parents[0])], flat=True))
+    # auxiliary object for 'R' parameters
+    R_obj = parents[0]
+
+    if switch_obj is not None:
+        # now look where the fields are defined that are needed to evaluate 
+        # the switch expr, and store the parent objects in accessor_params and
+        # the fields in switch_fields
+
+        # 'S': name for the 'toplevel' switch
+        toplevel_switch = parents[1]
+        params.append(('const %s *S' % toplevel_switch.c_type, toplevel_switch))
+        fields.update(_c_helper_field_mapping(toplevel_switch, [('S', '->', toplevel_switch)], flat=True))
+
+        # initialize prefix for everything "below" S
+        prefix_str = '/* %s */ S' % toplevel_switch.name[-1]
+        prefix = [(prefix_str, '->', toplevel_switch)]
+
+        # look for fields in the remaining containers
+        for p in parents[2:] + [self]:
+            # the separator between parent and child is always '.' here, 
+            # because of nested switch statements
+            if not p.is_bitcase or (p.is_bitcase and p.has_name):
+                prefix.append((p.name[-1], '.', p))
+            fields.update(_c_helper_field_mapping(p, prefix, flat=True))
+
+        # auxiliary object for 'S' parameter
+        S_obj = parents[1]
 
     _h_setlevel(1)
     _c_setlevel(1)
     if list.member.fixed_size():
+        idx = 1 if switch_obj is not None else 0
         _hc('')
         _hc('')
         _hc('/*****************************************************************************')
         _hc(' **')
         _hc(' ** %s * %s', field.c_field_type, field.c_accessor_name)
         _hc(' ** ')
-        _hc(' ** @param const %s *R', self.c_type)
+        _hc(' ** @param %s', params[idx][0])
         _hc(' ** @returns %s *', field.c_field_type)
         _hc(' **')
         _hc(' *****************************************************************************/')
         _hc(' ')
         _hc('%s *', field.c_field_type)
-        _h('%s (const %s *R  /**< */);', field.c_accessor_name, self.c_type)
-        _c('%s (const %s *R  /**< */)', field.c_accessor_name, self.c_type)
-        _c('{')
 
-        if field.prev_varsized_field == None:
+        _h('%s (%s  /**< */);', field.c_accessor_name, params[idx][0])
+        _c('%s (%s  /**< */)', field.c_accessor_name, params[idx][0])
+
+        _c('{')
+        if switch_obj is not None:
+            _c('    return %s;', fields[field.c_field_name][0])
+        elif field.prev_varsized_field is None:
             _c('    return (%s *) (R + 1);', field.c_field_type)
         else:
             _c('    xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
-            _c('    return (%s *) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index) + %d);', field.c_field_type, field.first_field_after_varsized.type.c_type, field.prev_varsized_offset)
-
+            _c('    return (%s *) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index) + %d);', 
+               field.c_field_type, field.first_field_after_varsized.type.c_type, field.prev_varsized_offset)
         _c('}')
 
     _hc('')
@@ -541,16 +1584,24 @@ def _c_accessors_list(self, field):
     _hc(' **')
     _hc(' ** int %s', field.c_length_name)
     _hc(' ** ')
-    _hc(' ** @param const %s *R', self.c_type)
+    _hc(' ** @param const %s *R', c_type)
     _hc(' ** @returns int')
     _hc(' **')
     _hc(' *****************************************************************************/')
     _hc(' ')
     _hc('int')
-    _h('%s (const %s *R  /**< */);', field.c_length_name, self.c_type)
-    _c('%s (const %s *R  /**< */)', field.c_length_name, self.c_type)
+    if switch_obj is not None:
+        _hc('%s (const %s *R  /**< */,', field.c_length_name, R_obj.c_type)
+        spacing = ' '*(len(field.c_length_name)+2)
+        _h('%sconst %s *S /**< */);', spacing, S_obj.c_type)
+        _c('%sconst %s *S  /**< */)', spacing, S_obj.c_type)
+        length = _c_accessor_get_expr(field.type.expr, fields)
+    else:
+        _h('%s (const %s *R  /**< */);', field.c_length_name, c_type)
+        _c('%s (const %s *R  /**< */)', field.c_length_name, c_type)
+        length = _c_accessor_get_expr(field.type.expr, fields)
     _c('{')
-    _c('    return %s;', _c_accessor_get_expr(field.type.expr, 'R'))
+    _c('    return %s;', length)
     _c('}')
 
     if field.type.member.is_simple:
@@ -560,25 +1611,38 @@ def _c_accessors_list(self, field):
         _hc(' **')
         _hc(' ** xcb_generic_iterator_t %s', field.c_end_name)
         _hc(' ** ')
-        _hc(' ** @param const %s *R', self.c_type)
+        _hc(' ** @param const %s *R', c_type)
         _hc(' ** @returns xcb_generic_iterator_t')
         _hc(' **')
         _hc(' *****************************************************************************/')
         _hc(' ')
         _hc('xcb_generic_iterator_t')
-        _h('%s (const %s *R  /**< */);', field.c_end_name, self.c_type)
-        _c('%s (const %s *R  /**< */)', field.c_end_name, self.c_type)
+        if switch_obj is not None:
+            _hc('%s (const %s *R  /**< */,', field.c_end_name, R_obj.c_type)
+            spacing = ' '*(len(field.c_end_name)+2)
+            _h('%sconst %s *S /**< */);', spacing, S_obj.c_type)
+            _c('%sconst %s *S  /**< */)', spacing, S_obj.c_type)
+        else:
+            _h('%s (const %s *R  /**< */);', field.c_end_name, c_type)
+            _c('%s (const %s *R  /**< */)', field.c_end_name, c_type)
         _c('{')
         _c('    xcb_generic_iterator_t i;')
-
-        if field.prev_varsized_field == None:
-            _c('    i.data = ((%s *) (R + 1)) + (%s);', field.type.c_wiretype, _c_accessor_get_expr(field.type.expr, 'R'))
+        
+        param = 'R' if switch_obj is None else 'S'
+        if switch_obj is not None:
+            _c('    i.data = %s + %s;', fields[field.c_field_name][0], 
+               _c_accessor_get_expr(field.type.expr, fields))
+        elif field.prev_varsized_field == None:
+            _c('    i.data = ((%s *) (R + 1)) + (%s);', field.type.c_wiretype, 
+               _c_accessor_get_expr(field.type.expr, fields))
         else:
-            _c('    xcb_generic_iterator_t child = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
-            _c('    i.data = ((%s *) child.data) + (%s);', field.type.c_wiretype, _c_accessor_get_expr(field.type.expr, 'R'))
+            _c('    xcb_generic_iterator_t child = %s;', 
+               _c_iterator_get_end(field.prev_varsized_field, 'R'))
+            _c('    i.data = ((%s *) child.data) + (%s);', field.type.c_wiretype, 
+               _c_accessor_get_expr(field.type.expr, fields))
 
         _c('    i.rem = 0;')
-        _c('    i.index = (char *) i.data - (char *) R;')
+        _c('    i.index = (char *) i.data - (char *) %s;', param)
         _c('    return i;')
         _c('}')
 
@@ -589,25 +1653,36 @@ def _c_accessors_list(self, field):
         _hc(' **')
         _hc(' ** %s %s', field.c_iterator_type, field.c_iterator_name)
         _hc(' ** ')
-        _hc(' ** @param const %s *R', self.c_type)
+        _hc(' ** @param const %s *R', c_type)
         _hc(' ** @returns %s', field.c_iterator_type)
         _hc(' **')
         _hc(' *****************************************************************************/')
         _hc(' ')
+
         _hc('%s', field.c_iterator_type)
-        _h('%s (const %s *R  /**< */);', field.c_iterator_name, self.c_type)
-        _c('%s (const %s *R  /**< */)', field.c_iterator_name, self.c_type)
+        if switch_obj is not None:
+            _hc('%s (const %s *R  /**< */,', field.c_iterator_name, R_obj.c_type)
+            spacing = ' '*(len(field.c_iterator_name)+2)
+            _h('%sconst %s *S /**< */);', spacing, S_obj.c_type)
+            _c('%sconst %s *S  /**< */)', spacing, S_obj.c_type)
+        else:
+            _h('%s (const %s *R  /**< */);', field.c_iterator_name, c_type)
+            _c('%s (const %s *R  /**< */)', field.c_iterator_name, c_type)
         _c('{')
         _c('    %s i;', field.c_iterator_type)
 
-        if field.prev_varsized_field == None:
+        if switch_obj is not None:
+            _c('    i.data = %s;', fields[field.c_field_name][0])
+            _c('    i.rem = %s;', _c_accessor_get_expr(field.type.expr, fields))
+        elif field.prev_varsized_field == None:
             _c('    i.data = (%s *) (R + 1);', field.c_field_type)
         else:
             _c('    xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
-            _c('    i.data = (%s *) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index));', field.c_field_type, field.c_field_type)
-
-        _c('    i.rem = %s;', _c_accessor_get_expr(field.type.expr, 'R'))
-        _c('    i.index = (char *) i.data - (char *) R;')
+            _c('    i.data = (%s *) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index));', 
+               field.c_field_type, field.c_field_type)
+        if switch_obj is None:
+            _c('    i.rem = %s;', _c_accessor_get_expr(field.type.expr, fields))
+        _c('    i.index = (char *) i.data - (char *) %s;', 'R' if switch_obj is None else 'S' )
         _c('    return i;')
         _c('}')
 
@@ -615,11 +1690,17 @@ def _c_accessors(self, name, base):
     '''
     Declares the accessor functions for the fields of a structure.
     '''
-    for field in self.fields:
-        if field.type.is_list and not field.type.fixed_size():
-            _c_accessors_list(self, field)
-        elif field.prev_varsized_field != None:
-            _c_accessors_field(self, field)
+    # no accessors for switch itself - 
+    # switch always needs to be unpacked explicitly
+#    if self.is_switch:
+#        pass
+#    else:
+    if True:
+        for field in self.fields:
+            if field.type.is_list and not field.type.fixed_size():
+                _c_accessors_list(self, field)
+            elif field.prev_varsized_field is not None or not field.type.fixed_size():
+                _c_accessors_field(self, field)
 
 def c_simple(self, name):
     '''
@@ -655,23 +1736,43 @@ def _c_complex(self):
 
     varfield = None
     for field in self.fields:
-        if not field.type.fixed_size():
+        if not field.type.fixed_size() and not self.is_switch and not self.is_union:
             varfield = field.c_field_name
             continue
-        if varfield != None and not field.type.is_pad and field.wire:
-            errmsg = '%s: warning: variable field %s followed by fixed field %s\n' % (self.c_type, varfield, field.c_field_name)
-            sys.stderr.write(errmsg)
-            # sys.exit(1)
         if field.wire:
             struct_fields.append(field)
-        
+    
     for field in struct_fields:
-        if len(field.c_field_type) > maxtypelen:
-            maxtypelen = len(field.c_field_type)
+        length = len(field.c_field_type)
+        # account for '*' pointer_spec
+        if not field.type.fixed_size():
+            length += 1
+        maxtypelen = max(maxtypelen, length)
+
+    def _c_complex_field(self, field, space=''):
+        if (field.type.fixed_size() or 
+            # in case of switch with switch children, don't make the field a pointer
+            # necessary for unserialize to work
+            (self.is_switch and field.type.is_switch)):
+            spacing = ' ' * (maxtypelen - len(field.c_field_type))
+            _h('%s    %s%s %s%s; /**<  */', space, field.c_field_type, spacing, field.c_field_name, field.c_subscript)
+        else:
+            spacing = ' ' * (maxtypelen - (len(field.c_field_type) + 1))
+            _h('%s    %s%s *%s%s; /**<  */', space, field.c_field_type, spacing, field.c_field_name, field.c_subscript)
 
-    for field in struct_fields:
-        spacing = ' ' * (maxtypelen - len(field.c_field_type))
-        _h('    %s%s %s%s; /**<  */', field.c_field_type, spacing, field.c_field_name, field.c_subscript)
+    if not self.is_switch:
+        for field in struct_fields:
+            _c_complex_field(self, field)
+    else:
+        for b in self.bitcases:
+            space = ''
+            if b.type.has_name:
+                _h('    struct _%s {', b.c_field_name)
+                space = '    '
+            for field in b.type.fields:
+                _c_complex_field(self, field, space)
+            if b.type.has_name:
+                _h('    } %s;', b.c_field_name)
 
     _h('} %s;', self.c_type)
 
@@ -692,7 +1793,7 @@ def c_union(self, name):
     _c_complex(self)
     _c_iterator(self, name)
 
-def _c_request_helper(self, name, cookie_type, void, regular):
+def _c_request_helper(self, name, cookie_type, void, regular, aux=False):
     '''
     Declares a request function.
     '''
@@ -725,15 +1826,18 @@ def _c_request_helper(self, name, cookie_type, void, regular):
     func_ext_global = '&' + _ns.c_ext_global_name if _ns.is_ext else '0'
 
     # What our function name is
-    func_name = self.c_request_name
+    func_name = self.c_request_name if not aux else self.c_aux_name
     if checked:
-        func_name = self.c_checked_name
+        func_name = self.c_checked_name if not aux else self.c_aux_checked_name
     if unchecked:
-        func_name = self.c_unchecked_name
+        func_name = self.c_unchecked_name if not aux else self.c_aux_unchecked_name
 
     param_fields = []
     wire_fields = []
     maxtypelen = len('xcb_connection_t')
+    serial_fields = []
+    # special case: list with variable size elements
+    list_with_var_size_elems = False
 
     for field in self.fields:
         if field.visible:
@@ -742,10 +1846,17 @@ def _c_request_helper(self, name, cookie_type, void, regular):
         if field.wire and not field.auto:
             # We need to set the field up in the structure
             wire_fields.append(field)
+        if field.type.need_serialize or field.type.need_sizeof:
+            serial_fields.append(field)
         
     for field in param_fields:
-        if len(field.c_field_const_type) > maxtypelen:
-            maxtypelen = len(field.c_field_const_type)
+        c_field_const_type = field.c_field_const_type 
+        if field.type.need_serialize and not aux:
+            c_field_const_type = "const void"
+        if len(c_field_const_type) > maxtypelen:
+            maxtypelen = len(c_field_const_type)
+        if field.type.is_list and not field.type.member.fixed_size():
+            list_with_var_size_elems = True
 
     _h_setlevel(1)
     _c_setlevel(1)
@@ -777,8 +1888,11 @@ def _c_request_helper(self, name, cookie_type, void, regular):
     _hc(' ** @param xcb_connection_t%s *c', spacing)
 
     for field in param_fields:
-        spacing = ' ' * (maxtypelen - len(field.c_field_const_type))
-        _hc(' ** @param %s%s %s%s', field.c_field_const_type, spacing, field.c_pointer, field.c_field_name)
+        c_field_const_type = field.c_field_const_type 
+        if field.type.need_serialize and not aux:
+            c_field_const_type = "const void"
+        spacing = ' ' * (maxtypelen - len(c_field_const_type))
+        _hc(' ** @param %s%s %s%s', c_field_const_type, spacing, field.c_pointer, field.c_field_name)
 
     _hc(' ** @returns %s', cookie_type)
     _hc(' **')
@@ -796,16 +1910,28 @@ def _c_request_helper(self, name, cookie_type, void, regular):
     count = len(param_fields)
     for field in param_fields:
         count = count - 1
-        spacing = ' ' * (maxtypelen - len(field.c_field_const_type))
+        c_field_const_type = field.c_field_const_type 
+        c_pointer = field.c_pointer
+        if field.type.need_serialize and not aux:
+            c_field_const_type = "const void"
+            c_pointer = '*'
+        spacing = ' ' * (maxtypelen - len(c_field_const_type))
         comma = ',' if count else ');'
-        _h('%s%s%s %s%s  /**< */%s', func_spacing, field.c_field_const_type, spacing, field.c_pointer, field.c_field_name, comma)
+        _h('%s%s%s %s%s  /**< */%s', func_spacing, c_field_const_type, 
+           spacing, c_pointer, field.c_field_name, comma)
         comma = ',' if count else ')'
-        _c('%s%s%s %s%s  /**< */%s', func_spacing, field.c_field_const_type, spacing, field.c_pointer, field.c_field_name, comma)
+        _c('%s%s%s %s%s  /**< */%s', func_spacing, c_field_const_type, 
+           spacing, c_pointer, field.c_field_name, comma)
 
     count = 2
-    for field in param_fields:
-        if not field.type.fixed_size():
-            count = count + 2
+    if not self.var_followed_by_fixed_fields:
+        for field in param_fields:
+            if not field.type.fixed_size():
+                count = count + 2
+                if field.type.need_serialize:
+                    # _serialize() keeps track of padding automatically
+                    count -= 1
+    dimension = count + 2
 
     _c('{')
     _c('    static const xcb_protocol_request_t xcb_req = {')
@@ -815,16 +1941,31 @@ def _c_request_helper(self, name, cookie_type, void, regular):
     _c('        /* isvoid */ %d', 1 if void else 0)
     _c('    };')
     _c('    ')
-    _c('    struct iovec xcb_parts[%d];', count + 2)
+
+    _c('    struct iovec xcb_parts[%d];', dimension)
     _c('    %s xcb_ret;', func_cookie)
     _c('    %s xcb_out;', self.c_type)
-    _c('    ')
+    if self.var_followed_by_fixed_fields:
+        _c('    /* in the protocol description, variable size fields are followed by fixed size fields */')
+        _c('    void *xcb_aux = 0;')
+        
 
+    for idx, f in enumerate(serial_fields):
+        if aux:
+            _c('    void *xcb_aux%d = 0;' % (idx))
+    if list_with_var_size_elems:
+        _c('    unsigned int i;')
+        _c('    unsigned int xcb_tmp_len;')
+        _c('    char *xcb_tmp;')
+    _c('    ')
+    # simple request call tracing
+#    _c('    printf("in function %s\\n");' % func_name)     
+ 
+    # fixed size fields
     for field in wire_fields:
         if field.type.fixed_size():
             if field.type.is_expr:
-                _c('    xcb_out.%s = %s;', field.c_field_name, _c_accessor_get_expr(field.type.expr))
-
+                _c('    xcb_out.%s = %s;', field.c_field_name, _c_accessor_get_expr(field.type.expr, None))
             elif field.type.is_pad:
                 if field.type.nmemb == 1:
                     _c('    xcb_out.%s = 0;', field.c_field_name)
@@ -836,25 +1977,94 @@ def _c_request_helper(self, name, cookie_type, void, regular):
                 else:
                     _c('    memcpy(xcb_out.%s, %s, %d);', field.c_field_name, field.c_field_name, field.type.nmemb)
 
-    _c('    ')
-    _c('    xcb_parts[2].iov_base = (char *) &xcb_out;')
-    _c('    xcb_parts[2].iov_len = sizeof(xcb_out);')
-    _c('    xcb_parts[3].iov_base = 0;')
-    _c('    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;')
+    def get_serialize_args(type_obj, c_field_name, aux_var, context='serialize'):
+        serialize_args = get_serialize_params(context, type_obj, 
+                                              c_field_name, 
+                                              aux_var)[2]
+        return reduce(lambda x,y: "%s, %s" % (x,y), [a[2] for a in serialize_args])
 
-    count = 4
-    for field in param_fields:
-        if not field.type.fixed_size():
-            _c('    xcb_parts[%d].iov_base = (char *) %s;', count, field.c_field_name)
-            if field.type.is_list:
-                _c('    xcb_parts[%d].iov_len = %s * sizeof(%s);', count, _c_accessor_get_expr(field.type.expr), field.type.member.c_wiretype)
-            else:
-                _c('    xcb_parts[%d].iov_len = %s * sizeof(%s);', count, 'Uh oh', field.type.c_wiretype)
-            _c('    xcb_parts[%d].iov_base = 0;', count + 1)
-            _c('    xcb_parts[%d].iov_len = -xcb_parts[%d].iov_len & 3;', count + 1, count)
-            count = count + 2
+    # calls in order to free dyn. all. memory
+    free_calls = []
+
+    _c('    ')
+    if not self.var_followed_by_fixed_fields:
+        _c('    xcb_parts[2].iov_base = (char *) &xcb_out;')
+        _c('    xcb_parts[2].iov_len = sizeof(xcb_out);')
+        _c('    xcb_parts[3].iov_base = 0;')
+        _c('    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;')
+
+        count = 4
+
+        for field in param_fields:
+            if not field.type.fixed_size():
+                _c('    /* %s %s */', field.type.c_type, field.c_field_name)
+                # default: simple cast to char *
+                if not field.type.need_serialize and not field.type.need_sizeof:
+                    _c('    xcb_parts[%d].iov_base = (char *) %s;', count, field.c_field_name)
+                    if field.type.is_list:
+                        if field.type.member.fixed_size():
+                            _c('    xcb_parts[%d].iov_len = %s * sizeof(%s);', count, 
+                               _c_accessor_get_expr(field.type.expr, None), 
+                               field.type.member.c_wiretype)
+                        else:
+                            list_length = _c_accessor_get_expr(field.type.expr, None)
+    
+                            length = ''
+                            _c("    xcb_parts[%d].iov_len = 0;" % count)
+                            _c("    xcb_tmp = (char *)%s;", field.c_field_name)
+                            _c("    for(i=0; i<%s; i++) {" % list_length)
+                            _c("        xcb_tmp_len = %s(xcb_tmp);" % 
+                                              (field.type.c_sizeof_name))
+                            _c("        xcb_parts[%d].iov_len += xcb_tmp_len;" % count)
+                            _c("        xcb_tmp += xcb_tmp_len;")
+                            _c("    }")                        
+                    else:
+                        # not supposed to happen
+                        raise Exception("unhandled variable size field %s" % field.c_field_name)
+                else:
+                    if not aux:
+                        _c('    xcb_parts[%d].iov_base = (char *) %s;', count, field.c_field_name)
+                    idx = serial_fields.index(field)
+                    aux_var = '&xcb_aux%d' % idx
+                    context = 'serialize' if aux else 'sizeof'
+                    _c('    xcb_parts[%d].iov_len = ', count)
+                    if aux:
+                        serialize_args = get_serialize_args(field.type, aux_var, field.c_field_name, context)
+                        _c('      %s (%s);', field.type.c_serialize_name, serialize_args)
+                        _c('    xcb_parts[%d].iov_base = xcb_aux%d;' % (count, idx))
+                        free_calls.append('    free(xcb_aux%d);' % idx)
+                    else:
+                        serialize_args = get_serialize_args(field.type, field.c_field_name, aux_var, context)
+                        func_name = field.type.c_sizeof_name
+                        _c('      %s (%s);', func_name, serialize_args)
+
+                count += 1
+                if not (field.type.need_serialize or field.type.need_sizeof):
+                    # the _serialize() function keeps track of padding automatically
+                    _c('    xcb_parts[%d].iov_base = 0;', count)
+                    _c('    xcb_parts[%d].iov_len = -xcb_parts[%d].iov_len & 3;', count, count-1)
+                    count += 1
+
+    # elif self.var_followed_by_fixed_fields:
+    else:
+        _c('    xcb_parts[2].iov_base = (char *) &xcb_out;')
+        # request header: opcodes + length
+        _c('    xcb_parts[2].iov_len = 2*sizeof(uint8_t) + sizeof(uint16_t);') 
+        count += 1
+        # call _serialize()
+        buffer_var = '&xcb_aux'
+        serialize_args = get_serialize_args(self, buffer_var, '&xcb_out', 'serialize')
+        _c('    xcb_parts[%d].iov_len = %s (%s);', count, self.c_serialize_name, serialize_args)
+        _c('    xcb_parts[%d].iov_base = (char *) xcb_aux;', count)
+        free_calls.append('    free(xcb_aux);')
+        # no padding necessary - _serialize() keeps track of padding automatically
 
+    _c('    ')
     _c('    xcb_ret.sequence = xcb_send_request(c, %s, xcb_parts + 2, &xcb_req);', func_flags)
+    
+    # free dyn. all. data, if any
+    for f in free_calls:
+        _c(f)
     _c('    return xcb_ret;')
     _c('}')
 
@@ -865,7 +2075,29 @@ def _c_reply(self, name):
     spacing1 = ' ' * (len(self.c_cookie_type) - len('xcb_connection_t'))
     spacing2 = ' ' * (len(self.c_cookie_type) - len('xcb_generic_error_t'))
     spacing3 = ' ' * (len(self.c_reply_name) + 2)
-
+    
+    # check if _unserialize() has to be called for any field
+    def look_for_special_cases(complex_obj):
+        unserialize_fields = []
+        # no unserialize call in case of switch
+        if not complex_obj.is_switch:
+            for field in complex_obj.fields:
+                # three cases: 1. field with special case
+                #              2. container that contains special case field
+                #              3. list with special case elements
+                if field.type.var_followed_by_fixed_fields:
+                    unserialize_fields.append(field)
+                elif field.type.is_container:
+                    unserialize_fields += look_for_special_cases(field.type)
+                elif field.type.is_list:
+                    if field.type.member.var_followed_by_fixed_fields:
+                        unserialize_fields.append(field)
+                    if field.type.member.is_container:
+                        unserialize_fields += look_for_special_cases(field.type.member)
+        return unserialize_fields
+    
+    unserialize_fields = look_for_special_cases(self.reply)
+    
     _h('')
     _h('/**')
     _h(' * Return the reply')
@@ -900,7 +2132,35 @@ def _c_reply(self, name):
     _h('%sxcb_generic_error_t%s **e  /**< */);', spacing3, spacing2)
     _c('%sxcb_generic_error_t%s **e  /**< */)', spacing3, spacing2)
     _c('{')
-    _c('    return (%s *) xcb_wait_for_reply(c, cookie.sequence, e);', self.c_reply_type)
+    
+    if len(unserialize_fields)>0:
+        # certain variable size fields need to be unserialized explicitly
+        _c('    %s *reply = (%s *) xcb_wait_for_reply(c, cookie.sequence, e);', 
+           self.c_reply_type, self.c_reply_type)
+        _c('    int i;')
+        for field in unserialize_fields:
+            if field.type.is_list:
+                _c('    %s %s_iter = %s(reply);', field.c_iterator_type, field.c_field_name, field.c_iterator_name)
+                _c('    int %s_len = %s(reply);', field.c_field_name, field.c_length_name)
+                _c('    %s *%s_data;', field.c_field_type, field.c_field_name)
+            else:
+                raise Exception('not implemented: call _unserialize() in reply for non-list type %s', field.c_field_type)
+        # call _unserialize(), using the reply as source and target buffer
+        _c('    /* special cases: transform parts of the reply to match XCB data structures */')
+        for field in unserialize_fields:
+            if field.type.is_list:
+                _c('    for(i=0; i<%s_len; i++) {', field.c_field_name)
+                _c('        %s_data = %s_iter.data;', field.c_field_name, field.c_field_name)
+                _c('        %s((const void *)%s_data, &%s_data);', field.type.c_unserialize_name, 
+                   field.c_field_name, field.c_field_name)
+                _c('        %s(&%s_iter);', field.type.c_next_name, field.c_field_name)
+                _c('    }')
+        # return the transformed reply
+        _c('    return reply;')
+    
+    else:
+        _c('    return (%s *) xcb_wait_for_reply(c, cookie.sequence, e);', self.c_reply_type)
+
     _c('}')
 
 def _c_opcode(name, opcode):
@@ -948,6 +2208,9 @@ def c_request(self, name):
         # Request prototypes
         _c_request_helper(self, name, self.c_cookie_type, False, True)
         _c_request_helper(self, name, self.c_cookie_type, False, False)
+        if self.need_aux:
+            _c_request_helper(self, name, self.c_cookie_type, False, True, True)
+            _c_request_helper(self, name, self.c_cookie_type, False, False, True)
         # Reply accessors
         _c_accessors(self.reply, name + ('reply',), name)
         _c_reply(self, name)
@@ -955,6 +2218,10 @@ def c_request(self, name):
         # Request prototypes
         _c_request_helper(self, name, 'xcb_void_cookie_t', True, False)
         _c_request_helper(self, name, 'xcb_void_cookie_t', True, True)
+        if self.need_aux:
+            _c_request_helper(self, name, 'xcb_void_cookie_t', True, False, True)
+            _c_request_helper(self, name, 'xcb_void_cookie_t', True, True, True)
+
 
 def c_event(self, name):
     '''
@@ -1002,7 +2269,7 @@ output = {'open'    : c_open,
           'union'   : c_union,
           'request' : c_request,
           'event'   : c_event,
-          'error'   : c_error
+          'error'   : c_error, 
           }
 
 # Boilerplate below this point
diff --git a/libxcb/src/xcb_util.c b/libxcb/src/xcb_util.c
index 87de34226..6e635f931 100644
--- a/libxcb/src/xcb_util.c
+++ b/libxcb/src/xcb_util.c
@@ -62,6 +62,16 @@ int xcb_popcount(uint32_t mask)
     return ((y + (y >> 3)) & 030707070707) % 077;
 }
 
+int xcb_sumof(uint8_t *list, int len)
+{
+  int i, s = 0;
+  for(i=0; i<len; i++) {
+    s += *list;
+    list++;
+  }
+  return s;
+}
+
 static int _xcb_parse_display(const char *name, char **host, char **protocol,
                       int *displayp, int *screenp)
 {
diff --git a/libxcb/src/xcbext.h b/libxcb/src/xcbext.h
index 8c3e39cb7..1c2ab2236 100644
--- a/libxcb/src/xcbext.h
+++ b/libxcb/src/xcbext.h
@@ -93,6 +93,7 @@ int xcb_poll_for_reply(xcb_connection_t *c, unsigned int request, void **reply,
 /* xcb_util.c */
 
 int xcb_popcount(uint32_t mask);
+int xcb_sumof(uint8_t *list, int len);
 
 #ifdef __cplusplus
 }
diff --git a/libxcb/xcb-proto/src/xcb.xsd b/libxcb/xcb-proto/src/xcb.xsd
index 5169b4809..89e27846f 100644
--- a/libxcb/xcb-proto/src/xcb.xsd
+++ b/libxcb/xcb-proto/src/xcb.xsd
@@ -1,313 +1,314 @@
-<?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="required" />
-    </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:complexType>
-
-  <!-- case expression -->
-  <xsd:complexType name="caseexpr">
-    <xsd:sequence>
-      <!-- case expression: -->
-      <xsd:group ref="expression" minOccurs="1" maxOccurs="1" />
-      <!-- match -->
-      <xsd:group ref="fields" minOccurs="1" maxOccurs="unbounded" />
-      <xsd:choice>
-        <xsd:element ref="switch" minOccurs="0" maxOccurs="unbounded" />
-      </xsd:choice>
-    </xsd:sequence>
-  </xsd:complexType>
-
-  <!-- switch expression -->
-  <xsd:complexType name="switchexpr">
-    <xsd:sequence>
-      <!-- switch(expression) -->
-      <xsd:group ref="expression" minOccurs="1" maxOccurs="1" />
-      <xsd:choice>
-        <!-- bitcase expression - bit test -->
-        <xsd:element name="bitcase" type="caseexpr" minOccurs="1" maxOccurs="unbounded" />
-      </xsd:choice>
-      <!-- default: -->
-      <xsd:group ref="fields" minOccurs="0" maxOccurs="1" />
-    </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" />
-
-  <!-- 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="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:attribute name="ref" use="required" type="xsd:string" />
-        </xsd:complexType>
-      </xsd:element>
-      <xsd:element name="value" type="dec-or-hex-integer" />
-      <xsd:element name="bit" type="xsd:integer" />
-    </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>
-
-  <!-- BITMASK/LISTofVALUE parameter pairs. -->
-  <xsd:element name="valueparam">
-    <xsd:complexType>
-      <xsd:attribute name="value-mask-type" type="xsd:string" use="required" />
-      <xsd:attribute name="value-mask-name" type="xsd:string" use="required" />
-      <xsd:attribute name="value-list-name" type="xsd:string" use="required" />
-    </xsd:complexType>
-  </xsd:element>
-
-  <xsd:group name="fields">
-    <xsd:choice>
-      <xsd:element ref="pad" />
-      <xsd:element ref="field" />
-      <xsd:element ref="list" />
-    </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:group ref="fields" minOccurs="0" maxOccurs="unbounded" />
-    <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 hex integers -->
-  <xsd:simpleType name="hex-integer">
-    <xsd:restriction base="xsd:string">
-      <xsd:pattern value="0x[0-9a-fA-F]+" />
-    </xsd:restriction>
-  </xsd:simpleType>
-
-  <!-- Type for integers in either decimal or hex -->
-  <xsd:simpleType name="dec-or-hex-integer">
-    <xsd:union memberTypes="xsd:integer hex-integer" />
-  </xsd:simpleType>
-
-  <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:element ref="valueparam" />
-            </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:element ref="valueparam" />
-                  </xsd:choice>
-                  <xsd:choice minOccurs="0" maxOccurs="1">
-                    <xsd:element ref="switch" />
-                  </xsd:choice>
-                </xsd:sequence>
-              </xsd:complexType>
-            </xsd:element>
-          </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"/>
-        </xsd:complexType>
-      </xsd:element>
-      <xsd:element name="event">
-        <xsd:complexType>
-          <xsd:complexContent>
-            <xsd:extension base="packet-struct">
-              <xsd:attribute name="no-sequence-number" type="xsd:boolean"
-                             use="optional" />
-            </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="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:group ref="expression" minOccurs="0" maxOccurs="1" />
-                <xsd:attribute name="name" type="xsd:string" use="required" />
-              </xsd:complexType>
-            </xsd:element>
-          </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>
+<?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="required" />
+    </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:complexType>
+
+  <!-- case expression -->
+  <xsd:complexType name="caseexpr">
+    <xsd:sequence>
+      <!-- case expression: -->
+      <xsd:group ref="expression" minOccurs="1" maxOccurs="1" />
+      <!-- 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:choice>
+        <!-- bitcase expression - bit test -->
+        <xsd:element name="bitcase" type="caseexpr" minOccurs="1" maxOccurs="unbounded" />
+      </xsd:choice>
+      <!-- default: -->
+      <xsd:group ref="fields" minOccurs="0" maxOccurs="1" />
+    </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" />
+
+  <!-- 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="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:attribute name="ref" use="required" type="xsd:string" />
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="value" type="dec-or-hex-integer" />
+      <xsd:element name="bit" type="xsd:integer" />
+    </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>
+
+  <!-- BITMASK/LISTofVALUE parameter pairs. -->
+  <xsd:element name="valueparam">
+    <xsd:complexType>
+      <xsd:attribute name="value-mask-type" type="xsd:string" use="required" />
+      <xsd:attribute name="value-mask-name" type="xsd:string" use="required" />
+      <xsd:attribute name="value-list-name" type="xsd:string" use="required" />
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:group name="fields">
+    <xsd:choice>
+      <xsd:element ref="pad" />
+      <xsd:element ref="field" />
+      <xsd:element ref="list" />
+    </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:group ref="fields" minOccurs="0" maxOccurs="unbounded" />
+    <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 hex integers -->
+  <xsd:simpleType name="hex-integer">
+    <xsd:restriction base="xsd:string">
+      <xsd:pattern value="0x[0-9a-fA-F]+" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- Type for integers in either decimal or hex -->
+  <xsd:simpleType name="dec-or-hex-integer">
+    <xsd:union memberTypes="xsd:integer hex-integer" />
+  </xsd:simpleType>
+
+  <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:element ref="valueparam" />
+            </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:element ref="valueparam" />
+                  </xsd:choice>
+                  <xsd:choice minOccurs="0" maxOccurs="1">
+                    <xsd:element ref="switch" />
+                  </xsd:choice>
+                </xsd:sequence>
+              </xsd:complexType>
+            </xsd:element>
+          </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"/>
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="event">
+        <xsd:complexType>
+          <xsd:complexContent>
+            <xsd:extension base="packet-struct">
+              <xsd:attribute name="no-sequence-number" type="xsd:boolean"
+                             use="optional" />
+            </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="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:group ref="expression" minOccurs="0" maxOccurs="1" />
+                <xsd:attribute name="name" type="xsd:string" use="required" />
+              </xsd:complexType>
+            </xsd:element>
+          </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/libxcb/xcb-proto/src/xkb.xml b/libxcb/xcb-proto/src/xkb.xml
index 33d3ea354..f738378f5 100644
--- a/libxcb/xcb-proto/src/xkb.xml
+++ b/libxcb/xcb-proto/src/xkb.xml
@@ -1,2759 +1,2774 @@
-<?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="AXFBOpt">
-		<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="SKReleaseFB">   <bit>6</bit> </item>
-		<item name="SKRejectFB">    <bit>7</bit> </item>
-		<item name="BKRejectFB">    <bit>8</bit> </item>
-		<item name="DumbBell">      <bit>9</bit> </item>
-	</enum>
-
-	<enum name="AXSKOpt">
-		<item name="TwoKeys">     <bit>6</bit> </item>
-		<item name="LatchToLock"> <bit>7</bit> </item>
-	</enum>
-
-	<union name="AXOption">
-		<field name="fbopt" type="CARD16" enum="AXFBOpt" />
-		<field name="skopt" type="CARD16" enum="AXSKOpt" />
-	</union>
-
-	<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="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="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="SymInterpret">
-		<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" enum="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="CARD8">
-			<value>4</value>
-		</list>
-	</struct>
-
-	<struct name="KeyAlias">
-		<list name="real" type="CARD8">
-			<value>4</value>
-		</list>
-		<list name="alias" type="CARD8">
-			<value>4</value>
-		</list>
-	</struct>
-
-	<struct name="CountedString8">
-		<field name="length" type="CARD8" />
-		<list name="string" type="CARD8">
-			<fieldref>length</fieldref>
-		</list>
-	</struct>
-
-	<struct name="CountedString16">
-		<field name="length" type="CARD16" />
-		<list name="string" type="CARD8">
-			<fieldref>length</fieldref>
-		</list>
-		<pad bytes="1" />
-	</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="Overlay1Behavior">
-		<field name="type" type="CARD8" />
-		<field name="key" type="KEYCODE" />
-	</struct>
-
-	<struct name="Overlay2Behavior">
-		<field name="type" type="CARD8" />
-		<field name="key" type="CARD8" />
-	</struct>
-
-	<typedef oldname="LockBehavior" newname="PermamentLockBehavior" />
-	<typedef oldname="RadioGroupBehavior" newname="PermamentRadioGroupBehavior" />
-	<typedef oldname="Overlay1Behavior" newname="PermamentOverlay1Behavior" />
-	<typedef oldname="Overlay2Behavior" newname="PermamentOverlay2Behavior" />
-
-	<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="Overlay1Behavior" />
-		<field name="overlay2" type="Overlay2Behavior" />
-		<field name="permamentLock" type="PermamentLockBehavior" />
-		<field name="permamentRadioGroup" type="PermamentRadioGroupBehavior" />
-		<field name="permamentOverlay1" type="PermamentOverlay1Behavior" />
-		<field name="permamentOverlay2" type="PermamentOverlay2Behavior" />
-		<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" />
-
-	<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>
-
-	<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>
-
-	<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" />
-	</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>
-	</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">
-		<item name="DfltBtnAbsolute">  <bit>1</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" />
-	</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>
-
-	<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" enum="EventType" />
-		<field name="clear" type="CARD16" enum="EventType" />
-		<field name="selectAll" type="CARD16" enum="EventType" />
-		<field name="affectMap" type="CARD16" enum="MapPart" />
-		<field name="map" type="CARD16" enum="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="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" />
-		<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="AXOption" />
-			<field name="accessXTimeout" type="CARD16" />
-			<field name="accessXTimeoutOptionsMask" type="AXOption" />
-			<field name="accessXTimeoutOptionsValues" type="AXOption" />
-			<pad bytes="2" />
-			<field name="accessXTimeoutMask" type="CARD32" enum="BoolCtrl" />
-			<field name="accessXTimeoutValues" type="CARD32" enum="BoolCtrl" />
-			<field name="enabledControls" type="CARD32" enum="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="interanlRealMods" 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="affectInternalLockVirtualMods" type="CARD16" mask="VMod" />
-		<field name="internalLockVirtualMods" type="CARD16" mask="VMod" />
-		<field name="mouseKeysDfltBtn" type="CARD8" />
-		<field name="groupsWrap" type="CARD8" />
-		<field name="accessXOptions" type="AXOption" />
-		<pad bytes="2" />
-		<field name="affectEnabledControls" type="CARD32" enum="BoolCtrl" />
-		<field name="enabledControls" type="CARD32" enum="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" enum="BoolCtrl" />
-		<field name="accessXTimeoutValues" type="CARD32" enum="BoolCtrl" />
-		<field name="accessXTimeoutOptionsMask" type="AXOption" />
-		<field name="accessXTimeoutOptionsValues" type="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" enum="MapPart" />
-		<field name="partial" type="CARD16" enum="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" enum="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>
-					<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">
-						<fieldref>nVModMapKeys</fieldref>
-					</list>
-				</bitcase>
-				<bitcase>
-					<enumref ref="MapPart">ExplicitComponents</enumref>
-					<list name="explicit_rtrn" type="SetExplicit">
-						<fieldref>totalKeyExplicit</fieldref>
-					</list>
-				</bitcase>
-				<bitcase>
-					<enumref ref="MapPart">ModifierMap</enumref>
-					<list name="modmap_rtrn" type="KeyModMap">
-						<fieldref>totalModMapKeys</fieldref>
-					</list>
-				</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" enum="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>
-				<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">
-					<fieldref>nVModMapKeys</fieldref>
-				</list>
-			</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="CARD8" mask="SymInterpret">
-				<op op="*">
-					<value>16</value>
-					<fieldref>nSIRtrn</fieldref>
-				</op>
-			</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="CARD8" mask="SymInterpret">
-			<op op="*">
-				<value>16</value>
-				<fieldref>nSI</fieldref>
-			</op>
-		</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">
-				<fieldref>nIndicators</fieldref>
-			</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" />
-			<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">
-						<fieldref>nKTLevels</fieldref>
-					</list>
-					<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>nKTLevels</fieldref>
-				</list>
-				<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>
-
-	<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>
-
-	<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" />
-		<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" />
-		<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>
-					<enumref ref="GBNDetail">Types</enumref>
-					<field name="typeDeviceID" type="CARD8" />
-					<pad bytes="2" />
-					<field name="typeMinKeyCode" type="KEYCODE" />
-					<field name="typeMaxKeyCode" type="KEYCODE" />
-					<field name="present" type="CARD16" enum="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>
-							<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">
-								<fieldref>nVModMapKeys</fieldref>
-							</list>
-						</bitcase>
-						<bitcase>
-							<enumref ref="MapPart">ExplicitComponents</enumref>
-							<list name="explicit_rtrn" type="SetExplicit">
-								<fieldref>totalKeyExplicit</fieldref>
-							</list>
-						</bitcase>
-						<bitcase>
-							<enumref ref="MapPart">ModifierMap</enumref>
-							<list name="modmap_rtrn" type="KeyModMap">
-								<fieldref>totalModMapKeys</fieldref>
-							</list>
-						</bitcase>
-						<bitcase>
-							<enumref ref="MapPart">VirtualModMap</enumref>
-							<list name="vmodmap_rtrn" type="KeyVModMap">
-								<fieldref>totalVModMapKeys</fieldref>
-							</list>
-						</bitcase>
-					</switch>
-				</bitcase>
-				<bitcase>
-					<enumref ref="GBNDetail">CompatMap</enumref>
-					<field name="compatDeviceID" 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="CARD8" mask="SymInterpret">
-						<op op="*">
-							<value>16</value>
-							<fieldref>nSIRtrn</fieldref>
-						</op>
-					</list>
-					<list name="group_rtrn" type="ModDef">
-						<popcount>
-							<fieldref>groupsRtrn</fieldref>
-						</popcount>
-					</list>
-				</bitcase>
-				<bitcase>
-					<enumref ref="GBNDetail">ClientSymbols</enumref>
-					<field name="clientDeviceID" type="CARD8" />
-					<pad bytes="2" />
-					<field name="clientMinKeyCode" type="KEYCODE" />
-					<field name="clientMaxKeyCode" type="KEYCODE" />
-					<field name="present" type="CARD16" enum="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>
-							<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">
-								<fieldref>nVModMapKeys</fieldref>
-							</list>
-						</bitcase>
-						<bitcase>
-							<enumref ref="MapPart">ExplicitComponents</enumref>
-							<list name="explicit_rtrn" type="SetExplicit">
-								<fieldref>totalKeyExplicit</fieldref>
-							</list>
-						</bitcase>
-						<bitcase>
-							<enumref ref="MapPart">ModifierMap</enumref>
-							<list name="modmap_rtrn" type="KeyModMap">
-								<fieldref>totalModMapKeys</fieldref>
-							</list>
-						</bitcase>
-						<bitcase>
-							<enumref ref="MapPart">VirtualModMap</enumref>
-							<list name="vmodmap_rtrn" type="KeyVModMap">
-								<fieldref>totalVModMapKeys</fieldref>
-							</list>
-						</bitcase>
-					</switch>
-				</bitcase>
-				<bitcase>
-					<enumref ref="GBNDetail">ServerSymbols</enumref>
-					<field name="serverDeviceID" type="CARD8" />
-					<pad bytes="2" />
-					<field name="serverMinKeyCode" type="KEYCODE" />
-					<field name="serverMaxKeyCode" type="KEYCODE" />
-					<field name="present" type="CARD16" enum="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>
-							<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">
-								<fieldref>nVModMapKeys</fieldref>
-							</list>
-						</bitcase>
-						<bitcase>
-							<enumref ref="MapPart">ExplicitComponents</enumref>
-							<list name="explicit_rtrn" type="SetExplicit">
-								<fieldref>totalKeyExplicit</fieldref>
-							</list>
-						</bitcase>
-						<bitcase>
-							<enumref ref="MapPart">ModifierMap</enumref>
-							<list name="modmap_rtrn" type="KeyModMap">
-								<fieldref>totalModMapKeys</fieldref>
-							</list>
-						</bitcase>
-						<bitcase>
-							<enumref ref="MapPart">VirtualModMap</enumref>
-							<list name="vmodmap_rtrn" type="KeyVModMap">
-								<fieldref>totalVModMapKeys</fieldref>
-							</list>
-						</bitcase>
-					</switch>
-				</bitcase>
-				<bitcase>
-					<enumref ref="GBNDetail">IndicatorMaps</enumref>
-					<field name="indicatorDeviceID" 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">
-						<fieldref>nIndicators</fieldref>
-					</list>
-				</bitcase>
-				<bitcase>
-					<enumref ref="GBNDetail">KeyNames</enumref>
-					<field name="keyDeviceID" type="CARD8" />
-					<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>nKTLevels</fieldref>
-							</list>
-							<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>
-					<enumref ref="GBNDetail">OtherNames</enumref>
-					<field name="otherDeviceID" type="CARD8" />
-					<field name="which" type="CARD32" mask="NameDetail" />
-					<field name="otherMinKeyCode" type="KEYCODE" />
-					<field name="otherMaxKeyCode" 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>nKTLevels</fieldref>
-							</list>
-							<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>
-					<enumref ref="GBNDetail">Geometry</enumref>
-					<field name="geometryDeviceID" type="CARD8" />
-					<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" />
-					<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>
-				</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>
-			<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="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="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="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="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="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="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="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="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="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="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="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="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="CARD8" />
-		<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>
+<?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="AXFBOpt">
+		<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="SKReleaseFB">   <bit>6</bit> </item>
+		<item name="SKRejectFB">    <bit>7</bit> </item>
+		<item name="BKRejectFB">    <bit>8</bit> </item>
+		<item name="DumbBell">      <bit>9</bit> </item>
+	</enum>
+
+	<enum name="AXSKOpt">
+		<item name="TwoKeys">     <bit>6</bit> </item>
+		<item name="LatchToLock"> <bit>7</bit> </item>
+	</enum>
+
+	<union name="AXOption">
+		<field name="fbopt" type="CARD16" enum="AXFBOpt" />
+		<field name="skopt" type="CARD16" enum="AXSKOpt" />
+	</union>
+
+	<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="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="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="SymInterpret">
+		<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" enum="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="CARD8">
+			<value>4</value>
+		</list>
+	</struct>
+
+	<struct name="KeyAlias">
+		<list name="real" type="CARD8">
+			<value>4</value>
+		</list>
+		<list name="alias" type="CARD8">
+			<value>4</value>
+		</list>
+	</struct>
+
+	<struct name="CountedString8">
+		<field name="length" type="CARD8" />
+		<list name="string" type="CARD8">
+			<fieldref>length</fieldref>
+		</list>
+	</struct>
+
+	<struct name="CountedString16">
+		<field name="length" type="CARD16" />
+		<list name="string" type="CARD8">
+			<fieldref>length</fieldref>
+		</list>
+		<pad bytes="1" />
+	</struct>
+
+	<struct name="KTMapEntry">
+		<field name="active" type="BOOL" />
+		<!-- Xlib uses a different arrangement of fields
+		<field name="mods_mask" type="CARD8" mask="ModMask" />
+		<field name="level" type="CARD8" />
+		-->
+		<field name="level" type="CARD8" />
+		<field name="mods_mask" type="CARD8" mask="ModMask" />
+		<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="Overlay1Behavior">
+		<field name="type" type="CARD8" />
+		<field name="key" type="KEYCODE" />
+	</struct>
+
+	<struct name="Overlay2Behavior">
+		<field name="type" type="CARD8" />
+		<field name="key" type="CARD8" />
+	</struct>
+
+	<typedef oldname="LockBehavior" newname="PermamentLockBehavior" />
+	<typedef oldname="RadioGroupBehavior" newname="PermamentRadioGroupBehavior" />
+	<typedef oldname="Overlay1Behavior" newname="PermamentOverlay1Behavior" />
+	<typedef oldname="Overlay2Behavior" newname="PermamentOverlay2Behavior" />
+
+	<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="Overlay1Behavior" />
+		<field name="overlay2" type="Overlay2Behavior" />
+		<field name="permamentLock" type="PermamentLockBehavior" />
+		<field name="permamentRadioGroup" type="PermamentRadioGroupBehavior" />
+		<field name="permamentOverlay1" type="PermamentOverlay1Behavior" />
+		<field name="permamentOverlay2" type="PermamentOverlay2Behavior" />
+		<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" />
+
+	<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>
+
+	<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>
+
+	<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" />
+	</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>
+	</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">
+		<item name="DfltBtnAbsolute">  <bit>1</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" />
+	</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>
+
+	<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" enum="EventType" />
+		<field name="clear" type="CARD16" enum="EventType" />
+		<field name="selectAll" type="CARD16" enum="EventType" />
+		<field name="affectMap" type="CARD16" enum="MapPart" />
+		<field name="map" type="CARD16" enum="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="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" />
+		<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="AXOption" />
+			<field name="accessXTimeout" type="CARD16" />
+			<field name="accessXTimeoutOptionsMask" type="AXOption" />
+			<field name="accessXTimeoutOptionsValues" type="AXOption" />
+			<pad bytes="2" />
+			<field name="accessXTimeoutMask" type="CARD32" enum="BoolCtrl" />
+			<field name="accessXTimeoutValues" type="CARD32" enum="BoolCtrl" />
+			<field name="enabledControls" type="CARD32" enum="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="interanlRealMods" 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="affectInternalLockVirtualMods" type="CARD16" mask="VMod" />
+		<field name="internalLockVirtualMods" type="CARD16" mask="VMod" />
+		<field name="mouseKeysDfltBtn" type="CARD8" />
+		<field name="groupsWrap" type="CARD8" />
+		<field name="accessXOptions" type="AXOption" />
+		<pad bytes="2" />
+		<field name="affectEnabledControls" type="CARD32" enum="BoolCtrl" />
+		<field name="enabledControls" type="CARD32" enum="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" enum="BoolCtrl" />
+		<field name="accessXTimeoutValues" type="CARD32" enum="BoolCtrl" />
+		<field name="accessXTimeoutOptionsMask" type="AXOption" />
+		<field name="accessXTimeoutOptionsValues" type="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" enum="MapPart" />
+		<field name="partial" type="CARD16" enum="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" enum="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>
+					<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">
+						<fieldref>nVModMapKeys</fieldref>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="MapPart">ExplicitComponents</enumref>
+					<list name="explicit_rtrn" type="SetExplicit">
+						<fieldref>totalKeyExplicit</fieldref>
+					</list>
+				</bitcase>
+				<bitcase>
+					<enumref ref="MapPart">ModifierMap</enumref>
+					<list name="modmap_rtrn" type="KeyModMap">
+						<fieldref>totalModMapKeys</fieldref>
+					</list>
+				</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" enum="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>
+				<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">
+					<fieldref>nVModMapKeys</fieldref>
+				</list>
+			</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="CARD8" mask="SymInterpret">
+				<op op="*">
+					<value>16</value>
+					<fieldref>nSIRtrn</fieldref>
+				</op>
+			</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="CARD8" mask="SymInterpret">
+			<op op="*">
+				<value>16</value>
+				<fieldref>nSI</fieldref>
+			</op>
+		</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">
+				<fieldref>nIndicators</fieldref>
+			</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" />
+			<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>
+					<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>nKTLevels</fieldref>
+				</list>
+				<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>
+
+	<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>
+
+	<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" />
+		<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" />
+		<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>
+					<!-- 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" enum="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>
+							<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">
+								<fieldref>nVModMapKeys</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">ExplicitComponents</enumref>
+							<list name="explicit_rtrn" type="SetExplicit">
+								<fieldref>totalKeyExplicit</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">ModifierMap</enumref>
+							<list name="modmap_rtrn" type="KeyModMap">
+								<fieldref>totalModMapKeys</fieldref>
+							</list>
+						</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>
+					<field name="compatDeviceID" 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="CARD8" mask="SymInterpret">
+						<op op="*">
+							<value>16</value>
+							<fieldref>nSIRtrn</fieldref>
+						</op>
+					</list>
+					<list name="group_rtrn" type="ModDef">
+						<popcount>
+							<fieldref>groupsRtrn</fieldref>
+						</popcount>
+					</list>
+				</bitcase>
+				<bitcase name="client_symbols">
+					<enumref ref="GBNDetail">ClientSymbols</enumref>
+					<field name="clientDeviceID" type="CARD8" />
+					<pad bytes="2" />
+					<field name="clientMinKeyCode" type="KEYCODE" />
+					<field name="clientMaxKeyCode" type="KEYCODE" />
+					<field name="present" type="CARD16" enum="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>
+							<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">
+								<fieldref>nVModMapKeys</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">ExplicitComponents</enumref>
+							<list name="explicit_rtrn" type="SetExplicit">
+								<fieldref>totalKeyExplicit</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">ModifierMap</enumref>
+							<list name="modmap_rtrn" type="KeyModMap">
+								<fieldref>totalModMapKeys</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">VirtualModMap</enumref>
+							<list name="vmodmap_rtrn" type="KeyVModMap">
+								<fieldref>totalVModMapKeys</fieldref>
+							</list>
+						</bitcase>
+					</switch>
+				</bitcase>
+				<bitcase name="server_symbols">
+					<enumref ref="GBNDetail">ServerSymbols</enumref>
+					<field name="serverDeviceID" type="CARD8" />
+					<pad bytes="2" />
+					<field name="serverMinKeyCode" type="KEYCODE" />
+					<field name="serverMaxKeyCode" type="KEYCODE" />
+					<field name="present" type="CARD16" enum="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>
+							<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">
+								<fieldref>nVModMapKeys</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">ExplicitComponents</enumref>
+							<list name="explicit_rtrn" type="SetExplicit">
+								<fieldref>totalKeyExplicit</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">ModifierMap</enumref>
+							<list name="modmap_rtrn" type="KeyModMap">
+								<fieldref>totalModMapKeys</fieldref>
+							</list>
+						</bitcase>
+						<bitcase>
+							<enumref ref="MapPart">VirtualModMap</enumref>
+							<list name="vmodmap_rtrn" type="KeyVModMap">
+								<fieldref>totalVModMapKeys</fieldref>
+							</list>
+						</bitcase>
+					</switch>
+				</bitcase>
+				<bitcase name="indicator_maps">
+					<enumref ref="GBNDetail">IndicatorMaps</enumref>
+					<field name="indicatorDeviceID" 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">
+						<fieldref>nIndicators</fieldref>
+					</list>
+				</bitcase>
+				<bitcase name="key_names">
+					<enumref ref="GBNDetail">KeyNames</enumref>
+					<field name="keyDeviceID" type="CARD8" />
+					<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>nKTLevels</fieldref>
+							</list>
+							<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="other_names">
+					<enumref ref="GBNDetail">OtherNames</enumref>
+					<field name="otherDeviceID" type="CARD8" />
+					<field name="which" type="CARD32" mask="NameDetail" />
+					<field name="otherMinKeyCode" type="KEYCODE" />
+					<field name="otherMaxKeyCode" 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>nKTLevels</fieldref>
+							</list>
+							<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>
+					<field name="geometryDeviceID" type="CARD8" />
+					<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" />
+					<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>
+				</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>
+			<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="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="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="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="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="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="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="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="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="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="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="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="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="CARD8" />
+		<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/libxcb/xcb-proto/xcbgen/expr.py b/libxcb/xcb-proto/xcbgen/expr.py
index 9b1855425..bbc5a3fd7 100644
--- a/libxcb/xcb-proto/xcbgen/expr.py
+++ b/libxcb/xcb-proto/xcbgen/expr.py
@@ -40,6 +40,7 @@ class Expression(object):
 
         self.lenfield_name = None
         self.lenfield_type = None
+        self.lenfield_parent = None
         self.lenfield = None
         self.lenwire = False
         self.bitfield = False
@@ -81,15 +82,46 @@ class Expression(object):
             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')
+
         else:
             # Notreached
-            raise Exception('XXX')
-
+            raise Exception("undefined tag '%s'" % elt.tag)
 
     def fixed_size(self):
         return self.nmemb != None
+
+    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_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
+                    break
+                    
diff --git a/libxcb/xcb-proto/xcbgen/xtypes.py b/libxcb/xcb-proto/xcbgen/xtypes.py
index dae5102b3..fd52d6eeb 100644
--- a/libxcb/xcb-proto/xcbgen/xtypes.py
+++ b/libxcb/xcb-proto/xcbgen/xtypes.py
@@ -32,6 +32,8 @@ class Type(object):
         self.is_reply = False
         self.is_union = False
         self.is_pad = False
+        self.is_switch = False
+        self.is_bitcase = False
 
     def resolve(self, module):
         '''
@@ -73,6 +75,7 @@ class Type(object):
 
         complex_type.fields.append(new_field)
 
+
 class SimpleType(Type):
     '''
     Derived class which represents a cardinal type like CARD32 or char.
@@ -152,11 +155,11 @@ class ListType(Type):
     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):
+    def __init__(self, elt, member, *parent):
         Type.__init__(self, member.name)
         self.is_list = True
         self.member = member
-        self.parent = parent
+        self.parents = list(parent)
 
         if elt.tag == 'list':
             elts = list(elt)
@@ -177,9 +180,10 @@ class ListType(Type):
             needlen = True
 
             # See if the length field is already in the structure.
-            for field in self.parent.fields:
-                if field.field_name == lenfield_name:
-                    needlen = False
+            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:
@@ -194,15 +198,17 @@ class ListType(Type):
         if self.resolved:
             return
         self.member.resolve(module)
+        self.expr.resolve(module, self.parents)
 
         # 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 field in self.parent.fields:
-                if field.field_name == self.expr.lenfield_name and field.wire:
-                    self.expr.lenfield = field
-                    break
-            
+            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):
@@ -215,7 +221,7 @@ class ExprType(Type):
     Public fields added:
     expr is an Expression object containing the value of the field.
     '''
-    def __init__(self, elt, member, parent):
+    def __init__(self, elt, member, *parent):
         Type.__init__(self, member.name)
         self.is_expr = True
         self.member = member
@@ -266,6 +272,7 @@ class ComplexType(Type):
         self.fields = []
         self.nmemb = 1
         self.size = 0
+        self.lenfield_parent = [self]
 
     def resolve(self, module):
         if self.resolved:
@@ -288,18 +295,27 @@ class ComplexType(Type):
             elif child.tag == 'exprfield':
                 field_name = child.get('name')
                 fkey = child.get('type')
-                type = ExprType(child, module.get_type(fkey), self)
+                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')
-                type = ListType(child, module.get_type(fkey), self)
+                type = ListType(child, module.get_type(fkey), *self.lenfield_parent)
                 visible = True
             elif child.tag == 'valueparam':
                 field_name = child.get('value-list-name')
                 fkey = 'CARD32'
-                type = ListType(child, module.get_type(fkey), self)
+                type = ListType(child, module.get_type(fkey), *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
             else:
                 # Hit this on Reply
                 continue 
@@ -331,6 +347,109 @@ class ComplexType(Type):
                 return False
         return True
 
+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
+#        pads = 0
+
+        parents = list(self.parents) + [self]
+
+        # Resolve all of our field datatypes.
+        for index, child in enumerate(list(self.elt)):
+            if child.tag == 'bitcase':
+                field_name = child.get('name')
+                if field_name is None:
+                    field_type = self.name + ('bitcase%d' % index,)
+                else:
+                    field_type = self.name + (field_name,)
+
+                # use self.parent to indicate anchestor, 
+                # as switch does not contain named fields itself
+                type = BitcaseType(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.resolved = True
+
+    def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto):
+        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)
+
+        # 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)
+
+    # 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
+
 
 class Struct(ComplexType):
     '''
@@ -350,6 +469,48 @@ class Union(ComplexType):
     out = __main__.output['union']
 
 
+class BitcaseType(ComplexType):
+    '''
+    Derived class representing a struct data type.
+    '''
+    def __init__(self, index, name, elt, *parent):
+        elts = list(elt)
+        self.expr = Expression(elts[0] if len(elts) else elt, self)
+        ComplexType.__init__(self, name, elts[1:])        
+        self.has_name = True
+        self.index = 1
+        self.lenfield_parent = list(parent) + [self]
+        self.parents = list(parent)
+        self.is_bitcase = True
+
+    def make_member_of(self, module, switch_type, field_type, field_name, visible, wire, auto):
+        '''
+        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)
+
+        # 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
+        
+        self.expr.resolve(module, self.parents+[self])
+
+        # Resolve the bitcase expression
+        ComplexType.resolve(self, module)
+
+
 class Reply(ComplexType):
     '''
     Derived class representing a reply.  Only found as a field of Request.
diff --git a/libxcb/xcb-xkb.pc.in b/libxcb/xcb-xkb.pc.in
new file mode 100644
index 000000000..cb31fadcb
--- /dev/null
+++ b/libxcb/xcb-xkb.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: XCB XKB
+Description: XCB Keyboard Extension (EXPERIMENTAL)
+Version: @PACKAGE_VERSION@
+Requires: xcb
+Libs: -L${libdir} -lxcb-xkb
+Cflags: -I${includedir}
diff --git a/xorg-server/exa/exa_accel.c b/xorg-server/exa/exa_accel.c
index cb364303d..9192f7e74 100644
--- a/xorg-server/exa/exa_accel.c
+++ b/xorg-server/exa/exa_accel.c
@@ -1057,6 +1057,8 @@ exaFillRegionSolid (DrawablePtr	pDrawable, RegionPtr pRegion, Pixel pixel,
 		*(CARD16*)pExaPixmap->sys_ptr = pixel;
 		break;
 	    case 8:
+	    case 4:
+	    case 1:
 		*(CARD8*)pExaPixmap->sys_ptr = pixel;
 	    }
 
diff --git a/xorg-server/exa/exa_unaccel.c b/xorg-server/exa/exa_unaccel.c
index 5e4a8c573..e53a371a7 100644
--- a/xorg-server/exa/exa_unaccel.c
+++ b/xorg-server/exa/exa_unaccel.c
@@ -748,6 +748,8 @@ exaGetPixmapFirstPixel (PixmapPtr pPixmap)
 	    return pixel;
 	}
     case 8:
+    case 4:
+    case 1:
 	{
 	    CARD8 pixel;
 
-- 
cgit v1.2.3