upload tizen2.0 source 2.0alpha master 2.0_alpha submit/master/20120920.151152
authorBoram Park <boram1288.park@samsung.com>
Tue, 21 Aug 2012 09:03:34 +0000 (18:03 +0900)
committerBoram Park <boram1288.park@samsung.com>
Tue, 21 Aug 2012 09:03:34 +0000 (18:03 +0900)
25 files changed:
Makefile.am
NEWS
configure.ac
doc/xml-xcb.txt
packaging/xcb-proto.spec
py-compile [new file with mode: 0755]
src/Makefile.am
src/dri2.xml
src/glx.xml
src/import.py [deleted file]
src/render.xml
src/size.py [deleted file]
src/sync.xml
src/type.py [deleted file]
src/xcb.xsd
src/xf86dri.xml
src/xf86vidmode.xml
src/xkb.xml [new file with mode: 0644]
src/xproto.xml
src/xtest.xml
xcb-proto.pc.in
xcbgen/expr.py
xcbgen/matcher.py
xcbgen/state.py
xcbgen/xtypes.py

index c272c62..6bc14ad 100644 (file)
@@ -3,4 +3,4 @@ SUBDIRS = src xcbgen
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = xcb-proto.pc
 
-EXTRA_DIST=doc xcb-proto.pc.in
+EXTRA_DIST=doc xcb-proto.pc.in autogen.sh
diff --git a/NEWS b/NEWS
index e6028d6..3e50762 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,43 @@
+Release 1.7.1 (2012-03-23)
+==========================
+* Add ge and xf86vidmode protocol descriptions
+* Remove now unnecessary files as everything is implemented in xcbgen
+* Rename the ExprType "parent" attribute to "parents"
+
+Release 1.7 (2012-01-11)
+========================
+* Add missing padding bytes to ChangeKeyboardMapping request
+* Corrected type of FakeInput rootX & rootY fields
+* Changed Exception message in case of unknown/unhandled XML tags
+* xcbgen: perform lenfield lookup within all anchestors
+* Add support for new expr tags popcount, enumref, sumof
+* Changed handling of anchestor types
+* Assign switch name to bitcases
+* Support name attribute for bitcases and set BitcaseType.has_name accordingly
+* Use absolute imports in xcbgen for Python 3 compatibilit
+* dri2: Update to version 1.3 (v2)
+* glx: Replace some 'reserved' fields with explicit padding
+* glx: Use glx:CONTEXT for share_list parameter of CreateNewContext
+* glx: Use FBCONFIG type for fbconfig parameter of CreateNewContext and CreatePixmap
+* glx: Add protocol for GLX_ARB_create_context and GLX_ARB_create_context_profile
+* Add support for fence sync objects
+* xf86dri: fix GetDrawableInfo reply
+* xproto: fix TranslateCoordinates reply
+* xcbgen: Add unop support
+* xf86vidmode: Fix padding expressions
+* dri2: Add proper padding before driver_name
+* Add libdir/exec_prefix to xcb-xproto.pc
+* Revive support for hex literals in protocol
+* Add description of new protocol elements
+* Add XKEYBOARD protocol description
+* Fix ChangeHosts address string
+* Fix SetFontPath path string encoding
+* Fix some fields name
+* Fix XKB GetState missing lookupMods field
+* Add RENDER 0.11 definitions
+
 Release 1.6 (2009-12-02)
-=======================
+========================
 * Add DRI2 protocol, based off of dri2proto.h and the server code. (v2)
 * xf86dri.xml seems to have been wrong forever. Fixes bug #16894.
 * shape: add missing padding bytes to GetRectangles
index 1a6ca01..e20c9aa 100644 (file)
@@ -3,7 +3,7 @@
 
 AC_PREREQ(2.57)
 AC_INIT([XCB Proto],
-        1.6,
+        1.7.1,
         [xcb@lists.freedesktop.org])
 AC_CONFIG_SRCDIR([xcb-proto.pc.in])
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
index feb9984..3c6a155 100644 (file)
@@ -225,8 +225,17 @@ enum; the value is restricted to one of the constants named in the enum.
   defining the set of values included, and a list containing these values.
   value-mask-type gives the type of the bitmask; this must be CARD16 or
   CARD32.  value-mask-name gives the field name of the bitmask, and
-  value-list-name gives the field name of the list of values.
+  value-list-name gives the field name of the list of values. Please use
+  <switch> instead for new protocol definitions.
 
+<switch name="identifier"> switch expression
+    <bitcase> bitcase expression, fields </bitcase> </switch>
+
+  This element represents conditional inclusion of fields. It can be viewed
+  as sequence of multiple ifs: if ( switch expression & bitcase expression )
+  is equal to bitcase expression, bitcase fields are included in structure.
+  It can be used only as the last field of structure. New protocol definitions
+  should prefer to use this instead of <valueparam>.
 
 Expressions
 -----------
@@ -256,3 +265,22 @@ Expressions
 
   The bit element represents a literal bitmask value in an expression.
   The integer must be in the range 0..31, expanding to (1<<n) in C.
+
+<enumref ref="identifier">enum item identifier</enumref>
+
+  This element represents a reference to item of enum.
+
+<unop op="operator">expression</unop>
+
+  This element represents a unary operator, with the op attribute specifying
+  which operator. The only supported operation so far is ~, and its semantic
+  is identical to the corresponding operator in C.
+
+<sumof ref="identifier" />
+
+  This element represents a sumation of the elements of the referenced list.
+
+<popcount>expression</popcount>
+
+  This element represents the number of bits set in the expression.
+
index 5635e08..0d7ff05 100644 (file)
@@ -1,44 +1,49 @@
+Name:    xcb-proto
+Summary: XCB protocol descriptions
+Version: 1.7.1
+Release: 1
+Group:   Development/Libraries
+License: MIT
+URL:     http://xcb.freedesktop.org/
+Source0: http://xcb.freedesktop.org/dist/%{name}-%{version}.tar.gz
+#Source101:  xcb-proto-rpmlintrc
 
-Name:       xcb-proto
-Summary:    XCB protocol descriptions
-Version:    1.6
-Release:    0
-Group:      Development/Libraries
-License:    MIT
-URL:        http://xcb.freedesktop.org/
-Source0:    http://xcb.freedesktop.org/dist/%{name}-%{version}.tar.gz
-Source101:  xcb-proto-rpmlintrc
-Requires:   pkgconfig
 BuildRequires:  python-devel
 
-%description
-Description: %{summary}
+Requires:  pkgconfig
 
+# some file to be intalled can be ignored when rpm generates packages
+#%define _unpackaged_files_terminate_build 0
 
+%description
+Description: %{summary}
+XCB is a project to enable efficient language bindings to the X11 protocol.
+This package contains the protocol descriptions themselves.  Language
+bindings use these protocol descriptions to generate code for marshalling
+the protocol.
 
 %prep
 %setup -q -n %{name}-%{version}
 
-
 %build
 
+./autogen.sh
 %reconfigure --disable-shared
 
+# Call make instruction with smp support
 make %{?jobs:-j%jobs}
 
 %install
 rm -rf %{buildroot}
 %make_install
 
+%remove_docs
 
-
-
-
-
+%clean
+rm -rf %{buildroot}
 
 %files
 %defattr(-,root,root,-)
-%doc COPYING NEWS README TODO doc/xml-xcb.txt
 %{_libdir}/pkgconfig/xcb-proto.pc
 %dir %{_datadir}/xcb/
 %{_datadir}/xcb/*.xsd
diff --git a/py-compile b/py-compile
new file mode 100755 (executable)
index 0000000..15c834c
--- /dev/null
@@ -0,0 +1,161 @@
+#!/bin/sh
+# py-compile - Compile a Python program
+
+scriptversion=2011-06-08.12; # UTC
+
+# Copyright (C) 2000, 2001, 2003, 2004, 2005, 2008, 2009, 2011 Free
+# Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+if [ -z "$PYTHON" ]; then
+  PYTHON=python
+fi
+
+me=py-compile
+
+usage_error ()
+{
+  echo "$me: $*" >&2
+  echo "Try \`$me --help' for more information." >&2
+  exit 1
+}
+
+basedir=
+destdir=
+while test $# -ne 0; do
+  case "$1" in
+    --basedir)
+      if test $# -lt 2; then
+        usage_error "option '--basedir' requires an argument"
+      else
+        basedir=$2
+      fi
+      shift
+      ;;
+    --destdir)
+      if test $# -lt 2; then
+        usage_error "option '--destdir' requires an argument"
+      else
+        destdir=$2
+      fi
+      shift
+      ;;
+    -h|--help)
+      cat <<\EOF
+Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..."
+
+Byte compile some python scripts FILES.  Use --destdir to specify any
+leading directory path to the FILES that you don't want to include in the
+byte compiled file.  Specify --basedir for any additional path information you
+do want to be shown in the byte compiled file.
+
+Example:
+  py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+      exit $?
+      ;;
+    -v|--version)
+      echo "$me $scriptversion"
+      exit $?
+      ;;
+    --)
+      shift
+      break
+      ;;
+    -*)
+      usage_error "unrecognized option '$1'"
+      ;;
+    *)
+      break
+      ;;
+  esac
+  shift
+done
+
+files=$*
+if test -z "$files"; then
+    usage_error "no files given"
+fi
+
+# if basedir was given, then it should be prepended to filenames before
+# byte compilation.
+if [ -z "$basedir" ]; then
+    pathtrans="path = file"
+else
+    pathtrans="path = os.path.join('$basedir', file)"
+fi
+
+# if destdir was given, then it needs to be prepended to the filename to
+# byte compile but not go into the compiled file.
+if [ -z "$destdir" ]; then
+    filetrans="filepath = path"
+else
+    filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)"
+fi
+
+$PYTHON -c "
+import sys, os, py_compile
+
+files = '''$files'''
+
+sys.stdout.write('Byte-compiling python modules...\n')
+for file in files.split():
+    $pathtrans
+    $filetrans
+    if not os.path.exists(filepath) or not (len(filepath) >= 3
+                                            and filepath[-3:] == '.py'):
+           continue
+    sys.stdout.write(file)
+    sys.stdout.flush()
+    py_compile.compile(filepath, filepath + 'c', path)
+sys.stdout.write('\n')" || exit $?
+
+# this will fail for python < 1.5, but that doesn't matter ...
+$PYTHON -O -c "
+import sys, os, py_compile
+
+files = '''$files'''
+sys.stdout.write('Byte-compiling python modules (optimized versions) ...\n')
+for file in files.split():
+    $pathtrans
+    $filetrans
+    if not os.path.exists(filepath) or not (len(filepath) >= 3
+                                            and filepath[-3:] == '.py'):
+           continue
+    sys.stdout.write(file)
+    sys.stdout.flush()
+    py_compile.compile(filepath, filepath + 'o', path)
+sys.stdout.write('\n')" 2>/dev/null || :
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
index 0f0dfbc..eef2dbc 100644 (file)
@@ -6,6 +6,7 @@ xcbinclude_HEADERS = \
        damage.xml \
        dpms.xml \
        dri2.xml \
+       ge.xml \
        glx.xml \
        randr.xml \
        record.xml \
@@ -18,9 +19,11 @@ xcbinclude_HEADERS = \
        xc_misc.xml \
        xevie.xml \
        xf86dri.xml \
+       xf86vidmode.xml \
        xfixes.xml \
        xinerama.xml \
        xinput.xml \
+       xkb.xml \
        xprint.xml \
        xselinux.xml \
        xtest.xml \
index 7fea948..3af1600 100644 (file)
@@ -28,7 +28,7 @@ authorization from the authors.
 -->
 
 <xcb header="dri2" extension-xname="DRI2" extension-name="DRI2"
-  major-version="1" minor-version="1">
+  major-version="1" minor-version="3">
   <import>xproto</import>
 
   <enum name="Attachment">
@@ -42,10 +42,18 @@ authorization from the authors.
     <item name="BufferFakeFrontLeft" />
     <item name="BufferFakeFrontRight" />
     <item name="BufferDepthStencil" />
+    <item name="BufferHiz" />
   </enum>
 
   <enum name="DriverType">
     <item name="DRI" />
+    <item name="VDPAU" />
+  </enum>
+
+  <enum name="EventType">
+    <item name="ExchangeComplete"><value>1</value></item>
+    <item name="BlitComplete">    <value>2</value></item>
+    <item name="FlipComplete">    <value>3</value></item>
   </enum>
 
   <!-- Types -->
@@ -85,6 +93,20 @@ authorization from the authors.
       <list type="char" name="driver_name">
         <fieldref>driver_name_length</fieldref>
       </list>
+      <list type="void" name="alignment_pad">
+         <op op="-">
+             <op op="&amp;">
+                 <op op="+">
+                     <fieldref>driver_name_length</fieldref>
+                     <value> 3 </value>
+                 </op>
+                 <unop op="~">
+                     <value>3</value>
+                 </unop>
+             </op>
+             <fieldref>driver_name_length</fieldref>
+         </op>
+      </list>
       <list type="char" name="device_name">
         <fieldref>device_name_length</fieldref>
       </list>
@@ -149,4 +171,94 @@ authorization from the authors.
       </list>
     </reply>
   </request>
+
+  <!-- Version 1.2 -->
+
+  <request name="SwapBuffers" opcode="8">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="target_msc_hi" />
+    <field type="CARD32" name="target_msc_lo" />
+    <field type="CARD32" name="divisor_hi" />
+    <field type="CARD32" name="divisor_lo" />
+    <field type="CARD32" name="remainder_hi" />
+    <field type="CARD32" name="remainder_lo" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="swap_hi" />
+      <field type="CARD32" name="swap_lo" />
+    </reply>
+  </request>
+
+  <request name="GetMSC" opcode="9">
+    <field type="DRAWABLE" name="drawable" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="ust_hi" />
+      <field type="CARD32" name="ust_lo" />
+      <field type="CARD32" name="msc_hi" />
+      <field type="CARD32" name="msc_lo" />
+      <field type="CARD32" name="sbc_hi" />
+      <field type="CARD32" name="sbc_lo" />
+    </reply>
+  </request>
+
+  <request name="WaitMSC" opcode="10">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="target_msc_hi" />
+    <field type="CARD32" name="target_msc_lo" />
+    <field type="CARD32" name="divisor_hi" />
+    <field type="CARD32" name="divisor_lo" />
+    <field type="CARD32" name="remainder_hi" />
+    <field type="CARD32" name="remainder_lo" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="ust_hi" />
+      <field type="CARD32" name="ust_lo" />
+      <field type="CARD32" name="msc_hi" />
+      <field type="CARD32" name="msc_lo" />
+      <field type="CARD32" name="sbc_hi" />
+      <field type="CARD32" name="sbc_lo" />
+    </reply>
+  </request>
+
+  <request name="WaitSBC" opcode="11">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="target_sbc_hi" />
+    <field type="CARD32" name="target_sbc_lo" />
+    <reply>
+      <pad bytes="1" />
+      <field type="CARD32" name="ust_hi" />
+      <field type="CARD32" name="ust_lo" />
+      <field type="CARD32" name="msc_hi" />
+      <field type="CARD32" name="msc_lo" />
+      <field type="CARD32" name="sbc_hi" />
+      <field type="CARD32" name="sbc_lo" />
+    </reply>
+  </request>
+
+  <request name="SwapInterval" opcode="12">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="interval" />
+  </request>
+
+  <!-- Events -->
+
+  <event name="BufferSwapComplete" number="0">
+    <pad bytes="1" />
+    <field type="CARD16" name="event_type" enum="EventType" />
+    <pad bytes="2" />
+    <field type="DRAWABLE" name="drawable" />
+    <field type="CARD32" name="ust_hi" />
+    <field type="CARD32" name="ust_lo" />
+    <field type="CARD32" name="msc_hi" />
+    <field type="CARD32" name="msc_lo" />
+    <field type="CARD32" name="sbc" />
+  </event>
+
+  <!-- Version 1.3 -->
+
+  <event name="InvalidateBuffers" number="1">
+    <pad bytes="1" />
+    <field type="DRAWABLE" name="drawable" />
+  </event>
 </xcb>
index 544b543..53c9267 100644 (file)
@@ -89,6 +89,7 @@ The patch that fixed this server bug in X.org CVS is here:
        <errorcopy name="BadPbuffer" number="10" ref="Generic" />
        <errorcopy name="BadCurrentDrawable" number="11" ref="Generic" />
        <errorcopy name="BadWindow" number="12" ref="Generic" />
+       <errorcopy name="GLXBadProfileARB" number="13" ref="Generic" />
 
        <!-- Events -->
        <event name="PbufferClobber" number="0">
@@ -348,7 +349,7 @@ The patch that fixed this server bug in X.org CVS is here:
 
        <request name="CreatePixmap" opcode="22">
                <field type="CARD32" name="screen" />
-               <field type="CARD32" name="fbconfig" />
+               <field type="FBCONFIG" name="fbconfig" />
                <field type="xproto:PIXMAP" name="pixmap" />
                <field type="glx:PIXMAP" name="glx_pixmap" />
                <field type="CARD32" name="num_attribs" />  
@@ -366,13 +367,12 @@ The patch that fixed this server bug in X.org CVS is here:
 
        <request name="CreateNewContext" opcode="24">
                <field type="glx:CONTEXT" name="context" />
-               <field type="CARD32" name="fbconfig" />
+               <field type="FBCONFIG" name="fbconfig" />
                <field type="CARD32" name="screen" />
                <field type="CARD32" name="render_type" />
-               <field type="CARD32" name="share_list" />
+               <field type="glx:CONTEXT" name="share_list" />
                <field type="BOOL" name="is_direct" />
-               <field type="CARD8" name="reserved1" />
-               <field type="CARD16" name="reserved2" />
+               <pad bytes="3" />
        </request>
 
        <request name="QueryContext" opcode="25">
@@ -463,6 +463,64 @@ The patch that fixed this server bug in X.org CVS is here:
                <field type="glx:WINDOW" name="glxwindow" />
        </request>
 
+       <!-- Start of GLX_ARB_create_context and GLX_ARB_create_context_profile
+             requests. -->
+       <request name="SetClientInfoARB" opcode="33">
+               <field type="CARD32" name="major_version" />
+               <field type="CARD32" name="minor_version" />
+               <field type="CARD32" name="num_versions" />
+               <field type="CARD32" name="gl_str_len" />
+               <field type="CARD32" name="glx_str_len" />
+               <list type="CARD32" name="gl_versions">
+                       <op op="*">
+                               <fieldref>num_versions</fieldref>
+                               <value>2</value>
+                       </op>
+               </list>
+               <list type="char" name="gl_extension_string">
+                       <fieldref>gl_str_len</fieldref>
+               </list>
+               <list type="char" name="glx_extension_string">
+                       <fieldref>glx_str_len</fieldref>
+               </list>
+       </request>
+
+       <request name="CreateContextAttribsARB" opcode="34">
+               <field type="glx:CONTEXT" name="context" />
+               <field type="FBCONFIG" name="fbconfig" />
+               <field type="CARD32" name="screen" />
+               <field type="glx:CONTEXT" name="share_list" />
+               <field type="BOOL" name="is_direct" />
+               <pad bytes="3" />
+               <field type="CARD32" name="num_attribs" />
+               <list type="CARD32" name="attribs">
+                       <op op="*">
+                               <fieldref>num_attribs</fieldref>
+                               <value>2</value>
+                       </op>
+               </list>
+       </request>
+
+       <request name="SetClientInfo2ARB" opcode="35">
+               <field type="CARD32" name="major_version" />
+               <field type="CARD32" name="minor_version" />
+               <field type="CARD32" name="num_versions" />
+               <field type="CARD32" name="gl_str_len" />
+               <field type="CARD32" name="glx_str_len" />
+               <list type="CARD32" name="gl_versions">
+                       <op op="*">
+                               <fieldref>num_versions</fieldref>
+                               <value>3</value>
+                       </op>
+               </list>
+               <list type="char" name="gl_extension_string">
+                       <fieldref>gl_str_len</fieldref>
+               </list>
+               <list type="char" name="glx_extension_string">
+                       <fieldref>glx_str_len</fieldref>
+               </list>
+       </request>
+
        <!-- Requests for GL Non-rendering Commands (single ops) -->
 
        <request name="NewList" opcode="101">
diff --git a/src/import.py b/src/import.py
deleted file mode 100644 (file)
index eb58f55..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/python
-
-from xml.sax.saxutils import XMLFilterBase, XMLGenerator
-from xml.sax import make_parser
-import sys, os
-
-path = [os.path.curdir, 'extensions']
-def find_file_on_path(name):
-       for d in path:
-               test = os.path.join(d, name)
-               if os.path.isfile(test):
-                       return test
-       raise OSError(errno.ENOENT, os.strerror(errno.ENOENT), name)
-
-seen = {}
-
-class ProcessImports(XMLFilterBase):
-       def setContentHandler(self, handler):
-               self.handler = handler
-               XMLFilterBase.setContentHandler(self, handler)
-
-       def ensure(self, name):
-               if not seen.has_key(name):
-                       child = ProcessImports(make_parser())
-                       child.setContentHandler(self.handler)
-                       child.parse(find_file_on_path(name + '.xml'))
-
-       def startDocument(self):
-               pass
-       def endDocument(self):
-               pass
-
-       inimport = None
-
-       def startElement(self, name, attrs):
-               assert self.inimport is None
-               if name == 'import':
-                       self.inimport = ""
-                       return
-               XMLFilterBase.startElement(self, name, attrs)
-               if name == 'xcb':
-                       seen[attrs['header']] = True
-                       self.ensure('xproto')
-
-       def characters(self, content):
-               if self.inimport is not None:
-                       self.inimport += content
-               else:
-                       XMLFilterBase.characters(self, content)
-
-       def endElement(self, name):
-               if name == 'import':
-                       self.ensure(self.inimport)
-                       self.inimport = None
-                       return
-               XMLFilterBase.endElement(self, name)
-
-out = XMLGenerator()
-importer = ProcessImports(make_parser())
-importer.setContentHandler(out)
-out.startDocument()
-if len(sys.argv) > 1:
-       importer.parse(sys.argv[1])
-else:
-       importer.parse(sys.stdin)
-out.endDocument()
index 59cc8e0..9667fbe 100644 (file)
@@ -5,8 +5,8 @@ All Rights Reserved.  See the file COPYING in this directory
 for licensing information.
 -->
 <xcb header="render" extension-xname="RENDER" extension-name="Render"
-    major-version="0" minor-version="10">
-  <!-- supports version 0.10 -->
+    major-version="0" minor-version="11">
+  <!-- supports version 0.11 -->
 
   <import>xproto</import>
 
@@ -20,6 +20,7 @@ for licensing information.
   </enum>
 
   <!-- Disjoint* and Conjoint* are new in version 0.2 -->
+  <!-- PDF blend modes are new in version 0.11 -->
   <enum name="PictOp">
     <item name="Clear" />
     <item name="Src" />
@@ -61,6 +62,23 @@ for licensing information.
     <item name="ConjointAtop" />
     <item name="ConjointAtopReverse" />
     <item name="ConjointXor" />
+
+    <!-- PDF blend modes are new in version 0.11 -->
+    <item name="Multiply"><value>48</value></item>
+    <item name="Screen" />
+    <item name="Overlay" />
+    <item name="Darken" />
+    <item name="Lighten" />
+    <item name="ColorDodge" />
+    <item name="ColorBurn" />
+    <item name="HardLight" />
+    <item name="SoftLight" />
+    <item name="Difference" />
+    <item name="Exclusion" />
+    <item name="HSLHue" />
+    <item name="HSLSaturation" />
+    <item name="HSLColor" />
+    <item name="HSLLuminosity" />
   </enum>
 
   <enum name="PolyEdge">
diff --git a/src/size.py b/src/size.py
deleted file mode 100644 (file)
index 5ead8b2..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/python
-
-from xml.sax.saxutils import XMLFilterBase, XMLGenerator
-from xml.sax.xmlreader import AttributesImpl
-from xml.sax import make_parser
-import sys
-
-def AttributesUnion(base, **values):
-       baseitems = dict(base)
-       baseitems.update(values)
-       return AttributesImpl(baseitems)
-
-class AnnotateSize(XMLFilterBase):
-       types = {
-               'BYTE': 1, 'BOOL': 1,
-               'CARD8': 1, 'CARD16': 2, 'CARD32': 4,
-               'INT8': 1, 'INT16': 2, 'INT32': 4,
-               'char': 1, 'void': 1,
-               'float': 4, 'double': 8,
-               'XID': 4,
-       }
-       header = []
-       def setTypeSize(self, name, size):
-               assert not self.types.has_key(name), "size of " + name + " declared as both " + str(size) + " and " + str(self.types[name])
-               self.types[name] = size
-
-       struct = None
-       union = None
-       def startElement(self, name, attrs):
-               if name == 'xcb':
-                       self.header.insert(0, attrs['header'])
-               elif name == 'field':
-                       size = self.types.get(attrs['type'], 0)
-                       if self.struct is not None:
-                               self.totalsize += size
-                       elif self.union is not None:
-                               self.totalsize = max(self.totalsize, size)
-                       attrs = AttributesUnion(attrs, bytes=str(size))
-               elif name == 'pad':
-                       assert self.union is None
-                       if self.struct is not None:
-                               self.totalsize += int(attrs['bytes'])
-               elif name == 'xidtype':
-                       self.setTypeSize(attrs['name'], 4)
-               elif name == 'typedef':
-                       self.setTypeSize(attrs['newname'], self.types[attrs['oldname']])
-               elif name == 'struct' or name == 'union':
-                       assert self.struct is None and self.union is None
-                       setattr(self, name, attrs['name'])
-                       self.totalsize = 0
-
-               if len(self.header) == 1 or name == 'xcb':
-                       XMLFilterBase.startElement(self, name, attrs)
-
-       def characters(self, content):
-               if len(self.header) == 1:
-                       XMLFilterBase.characters(self, content)
-
-       def endElement(self, name):
-               if len(self.header) == 1 or name == 'xcb':
-                       XMLFilterBase.endElement(self, name)
-
-               if name == 'xcb':
-                       self.header.pop(0)
-               elif name == 'struct' or name == 'union':
-                       assert getattr(self, name) is not None
-                       self.setTypeSize(getattr(self, name), self.totalsize)
-                       setattr(self, name, None)
-                       del self.totalsize
-
-annotator = AnnotateSize(make_parser())
-annotator.setContentHandler(XMLGenerator())
-if len(sys.argv) > 1:
-       annotator.parse(sys.argv[1])
-else:
-       annotator.parse(sys.stdin)
index e309233..516d149 100644 (file)
@@ -5,7 +5,7 @@ All Rights Reserved.  See the file COPYING in this directory
 for licensing information.
 -->
 <xcb header="sync" extension-xname="SYNC" extension-name="Sync"
-    major-version="3" minor-version="0">
+    major-version="3" minor-version="1">
   <import>xproto</import>
 
   <xidtype name="ALARM" />
@@ -18,6 +18,8 @@ for licensing information.
 
   <xidtype name="COUNTER" />
 
+  <xidtype name="FENCE" />
+
   <enum name="TESTTYPE">
     <item name="PositiveTransition" />
     <item name="NegativeTransition" />
@@ -173,6 +175,37 @@ for licensing information.
     </reply>
   </request>
 
+  <request name="CreateFence" opcode="14">
+    <field type="DRAWABLE" name="drawable" />
+    <field type="FENCE" name="fence" />
+    <field type="BOOL" name="initially_triggered" />
+  </request>
+
+  <request name="TriggerFence" opcode="15">
+    <field type="FENCE" name="fence" />
+  </request>
+
+  <request name="ResetFence" opcode="16">
+    <field type="FENCE" name="fence" />
+  </request>
+
+  <request name="DestroyFence" opcode="17">
+    <field type="FENCE" name="fence" />
+  </request>
+
+  <request name="QueryFence" opcode="18">
+    <field type="FENCE" name="fence" />
+    <reply>
+      <pad bytes="1" />
+      <field type="BOOL" name="triggered" />
+      <pad bytes="23" />
+    </reply>
+  </request>
+
+  <request name="AwaitFence" opcode="19">
+    <list type="FENCE" name="fence_list" />
+  </request>
+
   <event name="CounterNotify" number="0">
     <field type="CARD8" name="kind" />
     <field type="COUNTER" name="counter" />
diff --git a/src/type.py b/src/type.py
deleted file mode 100644 (file)
index 8338232..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/python
-
-from xml.sax.saxutils import XMLFilterBase, XMLGenerator
-from xml.sax.xmlreader import AttributesImpl
-from xml.sax import make_parser
-import sys
-
-def AttributesUnion(base, **values):
-       baseitems = dict(base)
-       baseitems.update(values)
-       return AttributesImpl(baseitems)
-
-class AnnotateType(XMLFilterBase):
-       scopes = []
-       map = dict([(name, [name]) for name in [
-                       'BOOL', 'BYTE',
-                       'CARD8', 'CARD16', 'CARD32',
-                       'INT8', 'INT16', 'INT32',
-                       'char', 'void',
-                       'float', 'double',
-                       'XID',
-               ]])
-       def startScope(self, name):
-               self.scopes.insert(0, name)
-       def declareType(self, name):
-               assert ':' not in name
-               qname = self.scopes[0] + ':' + name
-               self.map.setdefault(name, []).insert(0, qname)
-       def getQualifiedType(self, name):
-               if ':' in name:
-                       return name
-               names = self.map.get(name, [])
-               return names[0]
-       def endScope(self):
-               self.scopes.pop(0)
-
-       def startElement(self, name, attrs):
-               attnames = []
-               if name == 'xcb':
-                       self.startScope(attrs['header'])
-               elif name in ['struct', 'union', 'xidtype', 'enum', 'event', 'eventcopy', 'error', 'errorcopy']:
-                       self.declareType(attrs['name'])
-                       attnames = ['name']
-                       if name.endswith('copy'):
-                               attnames.append('ref')
-               elif name == 'typedef':
-                       self.declareType(attrs['newname'])
-                       attnames = ['oldname', 'newname']
-               elif name == 'valueparam':
-                       attnames = ['value-mask-type']
-               elif attrs.has_key('type'):
-                       attnames = ['type']
-               newattrs = {}
-               for attname in attnames:
-                       newattrs[attname] = self.getQualifiedType(attrs[attname])
-               if newattrs:
-                       attrs = AttributesUnion(attrs, **newattrs)
-               XMLFilterBase.startElement(self, name, attrs)
-
-       def endElement(self, name):
-               XMLFilterBase.endElement(self, name)
-               if name == 'xcb':
-                       self.endScope()
-
-annotator = AnnotateType(make_parser())
-annotator.setContentHandler(XMLGenerator())
-if len(sys.argv) > 1:
-       annotator.parse(sys.argv[1])
-else:
-       annotator.parse(sys.stdin)
-
-for name,names in annotator.map.iteritems():
-       if len(names) != 1:
-               print "<!-- warning:", name, "has the following definitions:", names, "-->"
index f3fcb6f..7fdf125 100644 (file)
@@ -55,6 +55,37 @@ authorization from the authors.
     <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" />
 
@@ -89,7 +120,40 @@ authorization from the authors.
           </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>
@@ -126,7 +190,12 @@ authorization from the authors.
 
   <!-- Type for a structure -->
   <xsd:complexType name="struct">
-    <xsd:group ref="fields" minOccurs="1" maxOccurs="unbounded" />
+    <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>
 
@@ -166,12 +235,20 @@ authorization from the authors.
               <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:choice minOccurs="1" maxOccurs="unbounded">
-                  <xsd:group ref="fields" />
-                  <xsd:element ref="valueparam" />
-                </xsd:choice>
+                <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>
index 981c968..5bfc572 100644 (file)
@@ -132,10 +132,15 @@ authorization from the authors.
            <field type="INT16" name="drawable_size_W" />
            <field type="INT16" name="drawable_size_H" />
            <field type="CARD32" name="num_clip_rects" />
-           <pad bytes="4" />
+           <field type="INT16" name="back_x" />
+           <field type="INT16" name="back_y" />
+           <field type="CARD32" name="num_back_clip_rects" />
            <list type="DrmClipRect" name="clip_rects">
                <fieldref>num_clip_rects</fieldref>
            </list>
+           <list type="DrmClipRect" name="back_clip_rects">
+               <fieldref>num_back_clip_rects</fieldref>
+           </list>
        </reply>
     </request>
 
index 718240c..9dacaef 100644 (file)
@@ -161,7 +161,9 @@ authorization from the authors.
                            <fieldref>vendor_length</fieldref>
                            <value> 3 </value>
                        </op>
-                       <value>0xFFFFFFFC</value>
+                       <unop op="~">
+                           <value>3</value>
+                       </unop>
                    </op>
                    <fieldref>vendor_length</fieldref>
                </op>
@@ -377,7 +379,9 @@ authorization from the authors.
                        <fieldref>size</fieldref>
                        <value>1</value>
                    </op>
-                   <value>0xFFFFFFFE</value>
+                   <unop op="~">
+                       <value>1</value>
+                   </unop>
                </op>
            </list>
            <list type="CARD16" name="green">
@@ -386,7 +390,9 @@ authorization from the authors.
                        <fieldref>size</fieldref>
                        <value>1</value>
                    </op>
-                   <value>0xFFFFFFFE</value>
+                   <unop op="~">
+                       <value>1</value>
+                   </unop>
                </op>
            </list>
            <list type="CARD16" name="blue">
@@ -395,7 +401,9 @@ authorization from the authors.
                        <fieldref>size</fieldref>
                        <value>1</value>
                    </op>
-                   <value>0xFFFFFFFE</value>
+                   <unop op="~">
+                       <value>1</value>
+                   </unop>
                </op>
            </list>
        </reply>
@@ -410,7 +418,9 @@ authorization from the authors.
                    <fieldref>size</fieldref>
                    <value>1</value>
                </op>
-               <value>0xFFFFFFFE</value>
+               <unop op="~">
+                   <value>1</value>
+               </unop>
            </op>
        </list>
        <list type="CARD16" name="green">
@@ -419,7 +429,9 @@ authorization from the authors.
                    <fieldref>size</fieldref>
                    <value>1</value>
                </op>
-               <value>0xFFFFFFFE</value>
+               <unop op="~">
+                   <value>1</value>
+               </unop>
            </op>
        </list>
        <list type="CARD16" name="blue">
@@ -428,7 +440,9 @@ authorization from the authors.
                    <fieldref>size</fieldref>
                    <value>1</value>
                </op>
-               <value>0xFFFFFFFE</value>
+               <unop op="~">
+                   <value>1</value>
+               </unop>
            </op>
        </list>
     </request>
diff --git a/src/xkb.xml b/src/xkb.xml
new file mode 100644 (file)
index 0000000..e8f4c02
--- /dev/null
@@ -0,0 +1,2775 @@
+<?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="lookupMods" type="CARD8" mask="ModMask" />
+                       <field name="compatLookupMods" type="CARD8" mask="ModMask" />
+                       <pad bytes="1" />
+                       <field name="ptrBtnState" type="CARD16" mask="KeyButMask" />
+                       <pad bytes="6" />
+               </reply>
+       </request>
+
+       <request name="LatchLockState" opcode="5">
+               <field name="deviceSpec" type="DeviceSpec" />
+               <field name="affectModLocks" type="CARD8" mask="ModMask" />
+               <field name="modLocks" type="CARD8" mask="ModMask" />
+               <field name="lockGroup" type="BOOL" />
+               <field name="groupLock" type="CARD8" enum="Group" />
+               <field name="affectModLatches" type="CARD8" mask="ModMask" />
+               <pad bytes="1" />
+               <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="internalRealMods" type="CARD8" mask="ModMask" />
+               <field name="affectIgnoreLockRealMods" type="CARD8" mask="ModMask" />
+               <field name="ignoreLockRealMods" type="CARD8" mask="ModMask" />
+               <field name="affectInternalVirtualMods" type="CARD16" mask="VMod" />
+               <field name="internalVirtualMods" type="CARD16" mask="VMod" />
+               <field name="affectIgnoreLockVirtualMods" type="CARD16" mask="VMod" />
+               <field name="ignoreLockVirtualMods" type="CARD16" mask="VMod" />
+               <field name="mouseKeysDfltBtn" type="CARD8" />
+               <field name="groupsWrap" type="CARD8" />
+               <field name="accessXOptions" type="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>
index b6521c3..42a6852 100644 (file)
@@ -1296,8 +1296,8 @@ authorization from the authors.
     <reply>
       <field type="BOOL" name="same_screen" />
       <field type="WINDOW" name="child" altenum="Window" />
-      <field type="CARD16" name="dst_x" />
-      <field type="CARD16" name="dst_y" />
+      <field type="INT16" name="dst_x" />
+      <field type="INT16" name="dst_y" />
     </reply>
   </request>
 
@@ -1482,7 +1482,10 @@ authorization from the authors.
   <request name="SetFontPath" opcode="51">
     <pad bytes="1" />
     <field type="CARD16" name="font_qty" />
-    <list type="char" name="path" />
+    <pad bytes="2" />
+    <list type="STR" name="font">
+      <fieldref>font_qty</fieldref>
+    </list>
   </request>
 
   <request name="GetFontPath" opcode="52">
@@ -2155,6 +2158,7 @@ authorization from the authors.
     <field type="CARD8" name="keycode_count" />
     <field type="KEYCODE" name="first_keycode" />
     <field type="CARD8" name="keysyms_per_keycode" />
+    <pad bytes="2" />
     <list type="KEYSYM" name="keysyms">
       <op op="*">
         <fieldref>keycode_count</fieldref>
@@ -2294,7 +2298,7 @@ authorization from the authors.
     <field type="CARD8" name="family" enum="Family" />
     <pad bytes="1" />
     <field type="CARD16" name="address_len" />
-    <list type="char" name="address">
+    <list type="BYTE" name="address">
       <fieldref>address_len</fieldref>
     </list>
   </request>
index e481929..7f0b262 100644 (file)
@@ -88,8 +88,8 @@ authorization from the authors.
         <field type="CARD32" name="time" />
         <field type="WINDOW" name="root" />
         <pad bytes="8" />
-        <field type="CARD16" name="rootX" />
-        <field type="CARD16" name="rootY" />
+        <field type="INT16" name="rootX" />
+        <field type="INT16" name="rootY" />
         <pad bytes="7" />
         <!-- Version 2.2: XInput device -->
         <field type="CARD8"  name="deviceid" />
index 6cbcf27..d312e6e 100644 (file)
@@ -1,6 +1,8 @@
 prefix=@prefix@
+exec_prefix=@exec_prefix@
 datarootdir=@datarootdir@
 datadir=@datadir@
+libdir=@libdir@
 xcbincludedir=@xcbincludedir@
 pythondir=@pythondir@
 
index 522e17d..274c290 100644 (file)
@@ -26,7 +26,7 @@ class Expression(object):
     Represents a mathematical expression for a list length or exprfield.
 
     Public fields:
-    op is the operation (text +,*,/,<<) or None.
+    op is the operation (text +,*,/,<<,~) or None.
     lhs and rhs are the sub-Expressions if op is set.
     lenfield_name is the name of the length field, or None for request lists.
     lenfield is the Field object for the length field, or None.
@@ -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
@@ -75,14 +76,52 @@ class Expression(object):
             if self.lenfield_name == None:
                 self.lenfield_name = self.rhs.lenfield_name
 
+        elif elt.tag == 'unop':
+            # Op field.  Need to recurse.
+            self.op = elt.get('op')
+            self.rhs = Expression(list(elt)[0], parent)
+
+            self.lenfield_name = self.rhs.lenfield_name
+            
         elif elt.tag == 'value':
             # Constant expression
-            self.nmemb = int(elt.text)
+            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
+                    
index e7958fa..6e45b23 100644 (file)
@@ -9,14 +9,15 @@ we do not create a new type object, we just record the existing one under a new
 from os.path import join
 from xml.etree.cElementTree import parse
 
-import state
-from xtypes import *
+from xcbgen.xtypes import *
 
 def import_(node, module, namespace):
     '''
     For imports, we load the file, create a new namespace object,
     execute recursively, then record the import (for header files, etc.)
     '''
+    # To avoid circular import error
+    from xcbgen import state
     new_file = join(namespace.dir, '%s.xml' % node.text)
     new_root = parse(new_file).getroot()
     new_namespace = state.Namespace(new_file)
index 51efc94..ae3d2d4 100644 (file)
@@ -4,9 +4,9 @@ This module contains the namespace class and the singleton module class.
 from os.path import dirname, basename
 from xml.etree.cElementTree import parse
 
-import matcher
-from error import *
-from xtypes import *
+from xcbgen import matcher
+from xcbgen.error import *
+from xcbgen.xtypes import *
 
 import __main__
 
index 01d765e..c789158 100644 (file)
@@ -1,7 +1,7 @@
 '''
 This module contains the classes which represent XCB data types.
 '''
-from expr import Field, Expression
+from xcbgen.expr import Field, Expression
 import __main__
 
 class Type(object):
@@ -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.
@@ -131,7 +134,7 @@ class Enum(SimpleType):
             if value.tag == 'value':
                 self.values.append((item.get('name'), value.text))
             elif value.tag == 'bit':
-                self.values.append((item.get('name'), '%u' % (1 << int(value.text))))
+                self.values.append((item.get('name'), '%u' % (1 << int(value.text, 0))))
                 self.bits.append((item.get('name'), value.text))
 
     def resolve(self, module):
@@ -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,11 +221,11 @@ 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, *parents):
         Type.__init__(self, member.name)
         self.is_expr = True
         self.member = member
-        self.parent = parent
+        self.parents = parents
 
         self.expr = Expression(list(elt)[0], self)
 
@@ -243,7 +249,7 @@ class PadType(Type):
         Type.__init__(self, tcard8.name)
         self.is_pad = True
         self.size = 1
-        self.nmemb = 1 if (elt == None) else int(elt.get('bytes'))
+        self.nmemb = 1 if (elt == None) else int(elt.get('bytes'), 0)
 
     def resolve(self, module):
         self.resolved = True
@@ -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.