[Xcb-commit] xcb/proto: 30 commits - doc src xcbgen

Christian Linhart clinhart at kemper.freedesktop.org
Sat Feb 21 01:25:48 PST 2015


 doc/xml-xcb.txt  |   33 +++
 src/present.xml  |   10 -
 src/xcb.xsd      |   13 +
 src/xinput.xml   |  527 ++++++++++++++++++++++++++++++++++++++++---------------
 xcbgen/expr.py   |   26 ++
 xcbgen/xtypes.py |    1 
 6 files changed, 466 insertions(+), 144 deletions(-)

New commits:
commit 068430a7f9ae5b4fa18bb9e6d41b7fd3b24deedc
Merge: 3255bac 2eba8fd
Author: Christian Linhart <chris at demorecorder.com>
Date:   Tue Feb 10 10:05:29 2015 +0100

    Merge http://git.demorecorder.com/git/free-sw/xcb/proto
    branch demorec/ParametrizedStruct-V5

commit 2eba8fd0c91e1b62aa04dfb8370c2c94e487f1f9
Author: Christian Linhart <chris at demorecorder.com>
Date:   Mon Sep 8 02:29:10 2014 +0200

    xinput: update TODO: remove parametrized structs
    
    Message-ID: <1410136150-30254-5-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] parametrized structs implemented
    Patch-Set: ParametrizedStruct
    Patch-Number: proto 5/5
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index c8c1f07..c729f20 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -50,14 +50,6 @@ This affects the following:
 
 *****
 
-Parametrized structs
-
-This is needed for being able to use the value of the field
-"num_axes" of the GetDeviceMotionEvents-reply
-in struct DeviceTimeCoord.
-
-*****
-
 -->
 
 
commit 8b244dcf787ac029a78d31c46d342a089d9124ba
Author: Christian Linhart <chris at demorecorder.com>
Date:   Mon Sep 8 02:29:09 2014 +0200

    xinput: rep GetDeviceMotionEvents: full support
    
    complete definition of reply GetDeviceMotionEvents and struct DeviceTimeCoord
    using paramref.
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XIproto.txt?id=inputproto-2.3.1#n912
    http://cgit.freedesktop.org/xorg/lib/libXi/tree/specs/encoding.xml?id=libXi-1.7.4#n983
    
    code:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XIproto.h?id=inputproto-2.3.1#n461
    
    Message-ID: <1410136150-30254-4-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] parametrized structs implemented
    Patch-Set: ParametrizedStruct
    Patch-Number: proto 4/5
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index c569257..c8c1f07 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -337,8 +337,9 @@ in struct DeviceTimeCoord.
 
     <struct name="DeviceTimeCoord">
         <field type="TIMESTAMP" name="time" />
-        <!-- Uninterpreted: list (axisvalues) of INT32,
-                            length is num_axes from GetDeviceMotionEvents -->
+        <list type="INT32" name="axisvalues">
+            <paramref type="CARD8">num_axes</paramref>
+        </list>
     </struct>
 
     <request name="GetDeviceMotionEvents" opcode="10">
@@ -352,7 +353,9 @@ in struct DeviceTimeCoord.
             <field type="CARD8"  name="num_axes" />
             <field type="CARD8"  name="device_mode" enum="ValuatorMode" />
             <pad bytes="18" />
-            <!-- Uninterpreted: list (events) of DeviceTimeCoord structures -->
+            <list type="DeviceTimeCoord" name="events">
+                <fieldref>num_events</fieldref>
+            </list>
         </reply>
     </request>
 
commit fffbd04d6344e2fa82f744935caf4be8a3b18a73
Author: Christian Linhart <chris at demorecorder.com>
Date:   Mon Sep 8 02:29:08 2014 +0200

    xcb-doc: add paramref
    
    The first paragraph of the description is loosely based on
    a description proposed by Ran Benita.
    
    Message-ID: <1410136150-30254-3-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] parametrized structs implemented
    Patch-Set: ParametrizedStruct
    Patch-Number: proto 3/5
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/doc/xml-xcb.txt b/doc/xml-xcb.txt
index 01f7678..f8129ea 100644
--- a/doc/xml-xcb.txt
+++ b/doc/xml-xcb.txt
@@ -298,6 +298,23 @@ Expressions
   the structure containing this expression.  The identifier is the value of
   the "name" attribute on the referenced field.
 
+<paramref type="type">identifier</paramref>
+
+  A paramref is similar to a fieldref, but it refers to the value of
+  a field in the context which refers to the struct which contains the paramref.
+
+  So, it refers to a field outside of the structure where it is defined.
+  This has the following consequences:
+  * The generator cannot deduce its type.
+    So, it is mandatory to specify its type.
+  * The identifier-name must not be used as a field in the structure
+    which contaons the paramref.
+
+  For an example, see struct "DeviceTimeCoord" and request/reply
+  "GetDeviceMotionEvents" in xinput.xml, where paramref "num_axes"
+  in struct DeviceTimeCoord refers to field "num_axes" in
+  the DeviceTimeCoord reply.
+
 <value>integer</value>
 
   The value element represents a literal integer value in an expression.  The
commit d8c5e82ab26417afc4383ad16ff3e076a6e4434c
Author: Christian Linhart <chris at demorecorder.com>
Date:   Mon Sep 8 02:29:07 2014 +0200

    schema: add paramref
    
    Message-ID: <1410136150-30254-2-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] parametrized structs implemented
    Patch-Set: ParametrizedStruct
    Patch-Number: proto 2/5
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xcb.xsd b/src/xcb.xsd
index 2f11f64..5a4ab91 100644
--- a/src/xcb.xsd
+++ b/src/xcb.xsd
@@ -146,6 +146,15 @@ authorization from the authors.
          </xsd:complexType>
       </xsd:element>
       <xsd:element name="fieldref" type="xsd:string" />
+      <xsd:element name="paramref">
+        <xsd:complexType>
+          <xsd:simpleContent>
+            <xsd:extension base="xsd:string">
+              <xsd:attribute name="type" use="required" type="xsd:string" />
+            </xsd:extension>
+          </xsd:simpleContent>
+        </xsd:complexType>
+      </xsd:element>
       <xsd:element name="enumref">
         <xsd:complexType>
           <xsd:simpleContent>
commit 4f3678a406c230e41b96cb0e6def53070a1a50fd
Author: Christian Linhart <chris at demorecorder.com>
Date:   Mon Sep 8 02:29:06 2014 +0200

    xcbgen: support paramref in the parser
    
    paramref is similar to fieldref, but has a type attribute.
    
    Message-ID: <1410136150-30254-1-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] parametrized structs implemented
    Patch-Set: ParametrizedStruct
    Patch-Number: proto 1/5
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/xcbgen/expr.py b/xcbgen/expr.py
index f3bf462..e6895ff 100644
--- a/xcbgen/expr.py
+++ b/xcbgen/expr.py
@@ -64,6 +64,10 @@ class Expression(object):
             # Standard list with a fieldref
             self.lenfield_name = elt.text
 
+        elif elt.tag == 'paramref':
+            self.lenfield_name = elt.text
+            self.lenfield_type = elt.get('type')
+
         elif elt.tag == 'valueparam':
             # Value-mask.  The length bitmask is described by attributes.
             self.lenfield_name = elt.get('value-mask-name')
commit b98639bbe3338ce9e5643db0255e4746016b12b4
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 17:49:02 2014 +0200

    xinput: remove TODO-entry for popcount of a list
    
    Message-ID: <1409845742-38797-8-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes
    Patch-Set: PopcountList
    Patch-Number: proto 8/8
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index f861231..c569257 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -50,19 +50,6 @@ This affects the following:
 
 *****
 
-xml and generator have to support <popcount> of all members of a list
-
-This is needed for the following XI2-events ( and eventcopies thereof )
-	KeyPress
-	ButtonPress
-	RawKeyPress
-	RawKeyPress
-	RawButtonPress
-	TouchBegin
-	RawTouchBegin
-
-*****
-
 Parametrized structs
 
 This is needed for being able to use the value of the field
commit 3d8e9abc8019a8f1da90ae779617b93f24fe3239
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 17:49:01 2014 +0200

    xinput: RawEvents: support lists axisvalues and axisvalues_raw
    
    Support the lists axisvalues and axisvalues_raw in RawEvents.
    These are RawKeyPress, RawButtonPress, RawTouchBegin and their eventcopies.
    
    The length of both lists is determined by the number of bits set in the
    list valuator_mask. This is solved in the same way as for event KeyPress.
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XI2proto.txt?id=inputproto-2.3.1#n2362
    
    code:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI2proto.h?id=inputproto-2.3.1#n980
    
    Message-ID: <1409845742-38797-7-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes
    Patch-Set: PopcountList
    Patch-Number: proto 7/8
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index 7f67cfe..f861231 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -2472,10 +2472,20 @@ in struct DeviceTimeCoord.
         <list type="CARD32" name="valuator_mask">
             <fieldref>valuators_len</fieldref>
         </list>
-        <!-- Uninterpreted: list (axisvalues) of FP3232,
-                            length is <popcount> on valuator_mask list -->
-        <!-- Uninterpreted: list (axisvalues_raw) of FP3232,
-                            length is <popcount> on valuator_mask list -->
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+        <list type="FP3232" name="axisvalues_raw">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
     </event>
 
     <eventcopy name="RawKeyRelease" number="14" ref="RawKeyPress" />
@@ -2493,10 +2503,20 @@ in struct DeviceTimeCoord.
         <list type="CARD32" name="valuator_mask">
             <fieldref>valuators_len</fieldref>
         </list>
-        <!-- Uninterpreted: list (axisvalues) of FP3232,
-                            length is <popcount> on valuator_mask list -->
-        <!-- Uninterpreted: list (axisvalues_raw) of FP3232,
-                            length is <popcount> on valuator_mask list -->
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+        <list type="FP3232" name="axisvalues_raw">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
     </event>
 
     <eventcopy name="RawButtonRelease" number="16" ref="RawButtonPress" />
@@ -2580,10 +2600,20 @@ in struct DeviceTimeCoord.
         <list type="CARD32" name="valuator_mask">
             <fieldref>valuators_len</fieldref>
         </list>
-        <!-- Uninterpreted: list (axisvalues) of FP3232,
-                            length is <popcount> on valuator_mask list -->
-        <!-- Uninterpreted: list (axisvalues_raw) of FP3232,
-                            length is <popcount> on valuator_mask list -->
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
+        <list type="FP3232" name="axisvalues_raw">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
     </event>
 
     <eventcopy name="RawTouchUpdate" number="23" ref="RawTouchBegin" />
commit fd9f1ade9605efe7c443d962134c4ded6c54f565
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 17:49:00 2014 +0200

    xinput: ev ButtonPress, TouchBegin: support list axisvalues
    
    These events are identical to KeyPress, so needed to be changed the same way.
    ( in the spec, these are all listed under DeviceEvent )
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XI2proto.txt?id=inputproto-2.3.1#n2214
    
    code:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI2proto.h?id=inputproto-2.3.1#n944
    
    Message-ID: <1409845742-38797-6-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes
    Patch-Set: PopcountList
    Patch-Number: proto 6/8
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index d42f6fc..7f67cfe 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -2347,8 +2347,13 @@ in struct DeviceTimeCoord.
         <list type="CARD32" name="valuator_mask">
             <fieldref>valuators_len</fieldref>
         </list>
-        <!-- Uninterpreted: list (axisvalues) of FP3232,
-                            length is <popcount> on valuator_mask list -->
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
     </event>
 
     <eventcopy name="ButtonRelease" number="5" ref="ButtonPress" />
@@ -2530,8 +2535,13 @@ in struct DeviceTimeCoord.
         <list type="CARD32" name="valuator_mask">
             <fieldref>valuators_len</fieldref>
         </list>
-        <!-- Uninterpreted: list (axisvalues) of FP3232,
-                            length is <popcount> on valuator_mask list -->
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
     </event>
 
     <eventcopy name="TouchUpdate" number="19" ref="TouchBegin" />
commit d2a80fed905843d04e8b4ab01e0e723d282aa49b
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 17:48:59 2014 +0200

    xinput: ev KeyPress: support list axisvalues
    
    The length of list axisvalues is determined by the number of bits set in the
    list valuator_mask.
    
    This is computed using sumof over popcount of the list-elements of valuator_mask.
    This uses the new expression type <listelement-ref/> which refers to the current
    list-element iterated by sumof.
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XI2proto.txt?id=inputproto-2.3.1#n2214
    
    code:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI2proto.h?id=inputproto-2.3.1#n944
    
    Message-ID: <1409845742-38797-5-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes
    Patch-Set: PopcountList
    Patch-Number: proto 5/8
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index b5e22a0..d42f6fc 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -2306,8 +2306,13 @@ in struct DeviceTimeCoord.
         <list type="CARD32" name="valuator_mask">
             <fieldref>valuators_len</fieldref>
         </list>
-        <!-- Uninterpreted: list (axisvalues) of FP3232,
-                            length is <popcount> on valuator_mask list -->
+        <list type="FP3232" name="axisvalues">
+            <sumof ref="valuator_mask">
+                <popcount>
+                    <listelement-ref/>
+                </popcount>
+            </sumof>
+        </list>
     </event>
 
     <eventcopy name="KeyRelease" number="3" ref="KeyPress" />
commit e0d5a80d9c313046b7b5ba7f494f52ae46266e4c
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 17:48:58 2014 +0200

    xcb-schema: add listelement-ref
    
    Message-ID: <1409845742-38797-4-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes
    Patch-Set: PopcountList
    Patch-Number: proto 4/8
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xcb.xsd b/src/xcb.xsd
index 4ee578c..2f11f64 100644
--- a/src/xcb.xsd
+++ b/src/xcb.xsd
@@ -168,6 +168,7 @@ authorization from the authors.
           <xsd:attribute name="ref" use="required" type="xsd:string" />
         </xsd:complexType>
       </xsd:element>
+      <xsd:element name="listelement-ref" />
       <xsd:element name="value" type="xsd:integer" />
       <xsd:element name="bit" type="bitType" />
     </xsd:choice>
commit e5bc503a071bc42d3da10ecaf6456cb2d0e1e0e1
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 17:48:57 2014 +0200

    doc: new expr element listelement-ref
    
    Message-ID: <1409845742-38797-3-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes
    Patch-Set: PopcountList
    Patch-Number: proto 3/8
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/doc/xml-xcb.txt b/doc/xml-xcb.txt
index d47b12c..01f7678 100644
--- a/doc/xml-xcb.txt
+++ b/doc/xml-xcb.txt
@@ -337,6 +337,11 @@ Expressions
 
   This element represents the number of bits set in the expression.
 
+<listelement-ref/>
+
+  This element represents the current list-element when used inside
+  a list-iteration expression such as <sumof>.
+
 Documentation
 -------------
 
commit 408feddde339dab962e84d637a18658c0bea112d
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 17:48:56 2014 +0200

    xcbgen: new expr-type listelement-ref
    
    Add parser-support for the new expression-type "listelement-ref"
    which represents the current list-element when used inside
    a list-iteration expression such as <sumof>.
    
    This patch includes computation of the flag "contains_listelement_ref"
    which is set to True when an expression or any of its
    subexpressions is a listelement-ref.
    (This is needed by the generator)
    
    Message-ID: <1409845742-38797-2-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes
    Patch-Set: PopcountList
    Patch-Number: proto 2/8
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/xcbgen/expr.py b/xcbgen/expr.py
index a03703f..f3bf462 100644
--- a/xcbgen/expr.py
+++ b/xcbgen/expr.py
@@ -53,6 +53,8 @@ class Expression(object):
         self.lhs = None
         self.rhs = None
 
+        self.contains_listelement_ref = False
+
         if elt.tag == 'list':
             # List going into a request, which has no length field (inferred by server)
             self.lenfield_name = elt.get('name') + '_len'
@@ -111,6 +113,11 @@ class Expression(object):
                 # sumof then returns the sum of the results of these evaluations
                 self.rhs = Expression(subexpressions[0], parent)
 
+        elif elt.tag == 'listelement-ref':
+            # current list element inside iterating expressions such as sumof
+            self.op = 'listelement-ref'
+            self.contains_listelement_ref = True
+
         else:
             # Notreached
             raise Exception("undefined tag '%s'" % elt.tag)
@@ -118,6 +125,12 @@ class Expression(object):
     def fixed_size(self):
         return self.nmemb != None
 
+    def recursive_resolve_tasks(self, module, parents):
+        for subexpr in (self.lhs, self.rhs):
+            if subexpr != None:
+                subexpr.recursive_resolve_tasks(module, parents)
+                self.contains_listelement_ref |= subexpr.contains_listelement_ref
+
     def resolve(self, module, parents):
         if self.op == 'enumref':
             self.lenfield_type = module.get_type(self.lenfield_name[0])
@@ -134,4 +147,6 @@ class Expression(object):
                         self.lenfield_parent = p
                     self.lenfield_type = fields[self.lenfield_name].field_type
                     break
+
+        self.recursive_resolve_tasks(module, parents)
                     
commit c9b1523b23af52087a6354730f86b8d19fa3c7c0
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 17:48:55 2014 +0200

    present: specify length of RedirectNotify.notifies
    
    The list "notifies" of the event RedirectNotify didn't have
    a length.
    
    The missing length has caused uncompilable C-Code with our
    event-acessors patch because the length-acessor for that list
    has used an undeclared variable for the list-length.
    
    Having a length for that list is good anyways for ease of use.
    
    Since the event doesn't contain a field which specifies the
    length of the list, the length is derived from the length
    of the event.
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/presentproto/tree/presentproto.txt?id=presentproto-1.0#n429
    http://cgit.freedesktop.org/xorg/proto/presentproto/tree/presentproto.txt?id=presentproto-1.0#n710
    
    note:
    The event definition starting at line 429 lists the relationship between
    length of event ( "length" ) and length of list ( "n" )
    as 17+2n where as the definition starting at line 710
    lists 18+2n. The latter is correct according to my verification.
    The spec should be fixed.
    
    Message-ID: <1409845742-38797-1-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes
    Patch-Set: PopcountList
    Patch-Number: proto 1/8
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/present.xml b/src/present.xml
index a9adc2b..95fee01 100644
--- a/src/present.xml
+++ b/src/present.xml
@@ -199,7 +199,15 @@ OF THIS SOFTWARE.
     <field type="CARD64" name="target_msc" />
     <field type="CARD64" name="divisor" />
     <field type="CARD64" name="remainder" />
-    <list type="Notify" name="notifies"/>
+    <list type="Notify" name="notifies">
+        <op op="/">
+            <op op="-">
+                <fieldref>length</fieldref>
+                <value>18</value>
+            </op>
+            <value>2</value>
+        </op>
+    </list>
   </event>
 
 </xcb>
commit b92405a2d0dc533b22ad2950d9daf0fb48139713
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 10:53:21 2014 +0200

    xinput: rep XIGetProperty: replace bitcase with case
    
    Message-ID: <1409820801-43629-10-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] xinput: xml-fixes possible with new generator features
    Patch-Set: XmlFixesNewGenerator
    Patch-Number: proto 10/10
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index d472fc9..b5e22a0 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -2046,30 +2046,26 @@ in struct DeviceTimeCoord.
             <pad bytes="11" />
             <switch name="items">
                 <fieldref>format</fieldref>
-                <!-- <bitcase> is not correct, this would need <cases>s.
-                     It works in that case, because PropertyFormat items can be
-                     distinguished exactly as their values don't have equal bits.
-                -->
-                <bitcase>
+                <case>
                     <enumref ref="PropertyFormat">8Bits</enumref>
                     <list type="CARD8" name="data8">
                         <fieldref>num_items</fieldref>
                     </list>
                     <pad align="4" />
-                </bitcase>
-                <bitcase>
+                </case>
+                <case>
                     <enumref ref="PropertyFormat">16Bits</enumref>
                     <list type="CARD16" name="data16">
                         <fieldref>num_items</fieldref>
                     </list>
                     <pad align="4" />
-                </bitcase>
-                <bitcase>
+                </case>
+                <case>
                     <enumref ref="PropertyFormat">32Bits</enumref>
                     <list type="CARD32" name="data32">
                         <fieldref>num_items</fieldref>
                     </list>
-                </bitcase>
+                </case>
             </switch>
         </reply>
     </request>
commit b1d0917005207986b8302d1500d798bff7c9c7b7
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 10:53:20 2014 +0200

    xinput: req XIChangeProperty: replace bitcase with case
    
    Message-ID: <1409820801-43629-9-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] xinput: xml-fixes possible with new generator features
    Patch-Set: XmlFixesNewGenerator
    Patch-Number: proto 09/10
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index d350753..d472fc9 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -1998,28 +1998,24 @@ in struct DeviceTimeCoord.
         <field type="CARD32"   name="num_items" />
         <switch name="items">
             <fieldref>format</fieldref>
-            <!-- <bitcase> is not correct, this would need <cases>s.
-                 It works in that case, because PropertyFormat items can be
-                 distinguished exactly as their values don't have equal bits.
-            -->
-            <bitcase>
+            <case>
                 <enumref ref="PropertyFormat">8Bits</enumref>
                 <list type="CARD8" name="data8">
                     <fieldref>num_items</fieldref>
                 </list>
-            </bitcase>
-            <bitcase>
+            </case>
+            <case>
                 <enumref ref="PropertyFormat">16Bits</enumref>
                 <list type="CARD16" name="data16">
                     <fieldref>num_items</fieldref>
                 </list>
-            </bitcase>
-            <bitcase>
+            </case>
+            <case>
                 <enumref ref="PropertyFormat">32Bits</enumref>
                 <list type="CARD32" name="data32">
                     <fieldref>num_items</fieldref>
                 </list>
-            </bitcase>
+            </case>
         </switch>
     </request>
 
commit 2b54d78b66808646db0401809e7061dd35f26aa7
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 10:53:19 2014 +0200

    xinput: rep GetDeviceProperty: replace bitcase with case
    
    Message-ID: <1409820801-43629-8-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] xinput: xml-fixes possible with new generator features
    Patch-Set: XmlFixesNewGenerator
    Patch-Number: proto 08/10
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index 38bde51..d350753 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -1369,30 +1369,26 @@ in struct DeviceTimeCoord.
             <pad bytes="10" />
             <switch name="items">
                 <fieldref>format</fieldref>
-                <!-- <bitcase> is not correct, this would need <cases>s.
-                     It works in that case, because PropertyFormat items can be
-                     distinguished exactly as their values don't have equal bits.
-                -->
-                <bitcase>
+                <case>
                     <enumref ref="PropertyFormat">8Bits</enumref>
                     <list type="CARD8" name="data8">
                         <fieldref>num_items</fieldref>
                     </list>
                     <pad align="4" />
-                </bitcase>
-                <bitcase>
+                </case>
+                <case>
                     <enumref ref="PropertyFormat">16Bits</enumref>
                     <list type="CARD16" name="data16">
                         <fieldref>num_items</fieldref>
                     </list>
                     <pad align="4" />
-                </bitcase>
-                <bitcase>
+                </case>
+                <case>
                     <enumref ref="PropertyFormat">32Bits</enumref>
                     <list type="CARD32" name="data32">
                         <fieldref>num_items</fieldref>
                     </list>
-                </bitcase>
+                </case>
             </switch>
         </reply>
     </request>
commit e184abaad4a08ddb9f6f00a3c357a0c651236933
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 10:53:18 2014 +0200

    xinput: cleanup the TODO-list
    
    Message-ID: <1409820801-43629-7-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] xinput: xml-fixes possible with new generator features
    Patch-Set: XmlFixesNewGenerator
    Patch-Number: proto 07/10
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index 0fb15e4..38bde51 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -46,7 +46,6 @@ This will, e.g., be necessary for automatically generated byte-order conversion
 which will, e.g., be necessary for server-side xcb.
 
 This affects the following:
-* QueryDeviceState reply field "classes" ( structs InputState, ... )
 * SendExtensionEvent member "events"
 
 *****
@@ -64,17 +63,6 @@ This is needed for the following XI2-events ( and eventcopies thereof )
 
 *****
 
-xml and generator should support
-switch-case similar to switch-bitcase.
-
-(and maybe: variable sized unions with a mechanism to define
-which union-field is selected.)
-
-One of these features is needed for the InputInfo type
-which is used by request "ListInputDevices" for the list "input_infos".
-
-*****
-
 Parametrized structs
 
 This is needed for being able to use the value of the field
commit 6a5ed4a8c685cad0341467114013a127e4141c4d
Author: Christian Linhart <chris at DemoRecorder.com>
Date:   Mon Oct 20 12:18:15 2014 +0200

    xinput: struct DeviceClass: full support
    
    replace uninterpreted_data by switch-case
    
    this is needed by struct XIDeviceInfo which is needed by reply XIQueryDevice.
    
    changes for V2 of this patch:
    * remove the pad after "sourceid" because that space is used by the first two bytes defined inside each case of the bit-case.
      ( noticed that problem by testing )
    
    changes for V3 of this patch:
    * adapt to removal of patches "proto 6/7 and 7/7" in patchset ListInputDevices:
      adjust linenumbers in the patch accordingly
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XI2proto.txt?id=inputproto-2.3.1#n752
    
    Note:
    The spec lists TOUCHCLASS.num_touches as a CARD16 but the XI2proto.h header and the xml
    use the type CARD8 for it.
    Is this a spec bug?
    
    code:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI2.h?id=inputproto-2.3.1#n138
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI2proto.h?id=inputproto-2.3.1#n117
    
    Message-ID: <5444E167.8090702 at DemoRecorder.com>
    Patch-Thread-Subject: [Xcb] xinput: xml-fixes possible with new generator features
    Patch-Set: XmlFixesNewGenerator
    Patch-Number: proto 06/10
    Patch-Version: V3
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index 1909a23..0fb15e4 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -47,7 +47,6 @@ which will, e.g., be necessary for server-side xcb.
 
 This affects the following:
 * QueryDeviceState reply field "classes" ( structs InputState, ... )
-* struct XIDeviceInfo field "classes" ( structs DeviceClass, ... )
 * SendExtensionEvent member "events"
 
 *****
@@ -1759,16 +1758,56 @@ in struct DeviceTimeCoord.
         <field type="CARD16"   name="type" enum="DeviceClassType" />
         <field type="CARD16"   name="len" />
         <field type="DeviceId" name="sourceid" />
-        <pad bytes="2" />
-        <list type="CARD8" name="uninterpreted_data">
-            <op op="-">
-                <op op="*">
-                    <fieldref>len</fieldref>
-                    <value>4</value>
-                </op>
-                <value>8</value>
-            </op>
-        </list>
+	<switch name="data">
+	    <fieldref>type</fieldref>
+	    <case name="key">
+		<enumref ref="DeviceClassType">Key</enumref>
+		<field type="CARD16"   name="num_keys" />
+		<list type="CARD32" name="keys">
+		    <fieldref>num_keys</fieldref>
+		</list>
+	    </case>
+	    <case name="button">
+		<enumref ref="DeviceClassType">Button</enumref>
+		<field type="CARD16"   name="num_buttons" />
+		<list type="CARD32"    name="state">
+		    <op op="/">
+		        <op op="+">
+		            <fieldref>num_buttons</fieldref>
+		            <value>31</value>
+		        </op>
+		        <value>32</value>
+		    </op>
+		</list>
+		<list type="ATOM" name="labels">
+		    <fieldref>num_buttons</fieldref>
+		</list>
+	    </case>
+	    <case name="valuator">
+		<enumref ref="DeviceClassType">Valuator</enumref>
+		<field type="CARD16"   name="number" />
+		<field type="ATOM"     name="label" />
+		<field type="FP3232"   name="min" />
+		<field type="FP3232"   name="max" />
+		<field type="FP3232"   name="value" />
+		<field type="CARD32"   name="resolution" />
+		<field type="CARD8"    name="mode" enum="ValuatorMode" />
+		<pad bytes="3" />
+	    </case>
+	    <case name="scroll">
+		<enumref ref="DeviceClassType">Scroll</enumref>
+		<field type="CARD16"   name="number" />
+		<field type="CARD16"   name="scroll_type" enum="ScrollType" />
+		<pad bytes="2" />
+		<field type="CARD32"   name="flags" mask="ScrollFlags" />
+		<field type="FP3232"   name="increment" />
+	    </case>
+	    <case name="touch">
+		<enumref ref="DeviceClassType">Touch</enumref>
+		<field type="CARD8"    name="mode" enum="TouchMode" />
+		<field type="CARD8"    name="num_touches" />
+	    </case>
+	</switch>
     </struct>
 
     <struct name="XIDeviceInfo">
commit 0b86d30be26838ca4563780eb073e30a14641bc1
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 10:53:16 2014 +0200

    xinput: struct HierarchyChange: full support
    
    replace uninterpreted_data by switch-case
    
    this is needed by request XIChangeHierarchy.
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XI2proto.txt?id=inputproto-2.3.1#n1170
    
    code:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI2.h?id=inputproto-2.3.1#n118
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI2proto.h?id=inputproto-2.3.1#n444
    
    Message-ID: <1409820801-43629-5-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] xinput: xml-fixes possible with new generator features
    Patch-Set: XmlFixesNewGenerator
    Patch-Number: proto 05/10
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index 3c36c0b..1909a23 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -47,7 +47,6 @@ which will, e.g., be necessary for server-side xcb.
 
 This affects the following:
 * QueryDeviceState reply field "classes" ( structs InputState, ... )
-* XIChangeHierarchy request field "changes" ( structs  HierarchyChange, ... )
 * struct XIDeviceInfo field "classes" ( structs DeviceClass, ... )
 * SendExtensionEvent member "events"
 
@@ -1534,15 +1533,37 @@ in struct DeviceTimeCoord.
     <struct name="HierarchyChange">
         <field type="CARD16" name="type" enum="HierarchyChangeType" />
         <field type="CARD16" name="len" />
-        <list type="CARD8" name="uninterpreted_data">
-            <op op="-">
-                <op op="*">
-                    <fieldref>len</fieldref>
-                    <value>4</value>
-                </op>
-                <value>4</value>
-            </op>
-        </list>
+        <switch name="data">
+            <fieldref>type</fieldref>
+            <case name="add_master">
+                <enumref ref="HierarchyChangeType">AddMaster</enumref>
+                <field type="CARD16" name="name_len" />
+                <field type="BOOL"   name="send_core" />
+                <field type="BOOL"   name="enable" />
+                <list type="char" name="name">
+                    <fieldref>name_len</fieldref>
+                </list>
+                <pad align="4" />
+            </case>
+            <case name="remove_master">
+                <enumref ref="HierarchyChangeType">RemoveMaster</enumref>
+                <field type="DeviceId" name="deviceid" altenum="Device" />
+                <field type="CARD8"    name="return_mode" enum="ChangeMode" />
+                <pad bytes="1" />
+                <field type="DeviceId" name="return_pointer" altenum="Device" />
+                <field type="DeviceId" name="return_keyboard" altenum="Device" />
+            </case>
+            <case name="attach_slave">
+                <enumref ref="HierarchyChangeType">AttachSlave</enumref>
+                <field type="DeviceId" name="deviceid" altenum="Device" />
+                <field type="DeviceId" name="master" altenum="Device" />
+            </case>
+            <case name="detach_slave">
+                <enumref ref="HierarchyChangeType">DetachSlave</enumref>
+                <field type="DeviceId" name="deviceid" altenum="Device" />
+                <pad bytes="2" />
+            </case>
+        </switch>
     </struct>
 
     <request name="XIChangeHierarchy" opcode="43">
commit 186d877b0082abca1397256babbdc5fc668e78e6
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 10:53:15 2014 +0200

    xinput: struct DeviceCtl: full support
    
    replace uninterpreted_data by switch-case
    
    this is needed by request ChangeDeviceControl.
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XIproto.txt?id=inputproto-2.3.1#n688
    http://cgit.freedesktop.org/xorg/lib/libXi/tree/specs/encoding.xml?id=libXi-1.7.4#n1907
    
    Note: Only the DeviceCtl of type DeviceResolution is defined in both specs.
    ( this is struct name="DeviceResolutionCtl" in the xml. )
    The other DeviceCtls are not defined in any of the specs.
    
    code:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI.h?id=inputproto-2.3.1#n170
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XIproto.h?id=inputproto-2.3.1#n1343
    
    Message-ID: <1409820801-43629-4-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] xinput: xml-fixes possible with new generator features
    Patch-Set: XmlFixesNewGenerator
    Patch-Number: proto 04/10
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index 109bcba..3c36c0b 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -47,7 +47,6 @@ which will, e.g., be necessary for server-side xcb.
 
 This affects the following:
 * QueryDeviceState reply field "classes" ( structs InputState, ... )
-* ChangeDeviceControl request field "control" ( structs ChangeDeviceControl, ... )
 * XIChangeHierarchy request field "changes" ( structs  HierarchyChange, ... )
 * struct XIDeviceInfo field "classes" ( structs DeviceClass, ... )
 * SendExtensionEvent member "events"
@@ -1242,12 +1241,48 @@ in struct DeviceTimeCoord.
     <struct name="DeviceCtl">
         <field type="CARD16" name="control_id" enum="DeviceControl" />
         <field type="CARD16" name="len" />
-        <list type="CARD8" name="uninterpreted_data">
-            <op op="-">
-                <fieldref>len</fieldref>
-                <value>4</value>
-            </op>
-        </list>
+        <switch name="data">
+            <fieldref>control_id</fieldref>
+            <case name="resolution">
+                <enumref ref="DeviceControl">resolution</enumref>
+                <field type="CARD8"  name="first_valuator" />
+                <field type="CARD8"  name="num_valuators" />
+                <pad bytes="2" />
+                <list type="CARD32"  name="resolution_values">
+                    <fieldref>num_valuators</fieldref>
+                </list>
+            </case>
+            <case name="abs_calib">
+                <enumref ref="DeviceControl">abs_calib</enumref>
+                <field type="INT32"  name="min_x" />
+                <field type="INT32"  name="max_x" />
+                <field type="INT32"  name="min_y" />
+                <field type="INT32"  name="max_y" />
+                <field type="CARD32" name="flip_x" />
+                <field type="CARD32" name="flip_y" />
+                <field type="CARD32" name="rotation" />
+                <field type="CARD32" name="button_threshold" />
+            </case>
+            <case name="core">
+                <enumref ref="DeviceControl">core</enumref>
+                <field type="CARD8"  name="status" />
+                <pad bytes="3" />
+            </case>
+            <case name="enable">
+                <enumref ref="DeviceControl">enable</enumref>
+                <field type="CARD8"  name="enable" />
+                <pad bytes="3" />
+            </case>
+            <case name="abs_area">
+                <enumref ref="DeviceControl">abs_area</enumref>
+                <field type="CARD32" name="offset_x" />
+                <field type="CARD32" name="offset_y" />
+                <field type="INT32"  name="width" />
+                <field type="INT32"  name="height" />
+                <field type="INT32"  name="screen" />
+                <field type="CARD32" name="following" />
+            </case>
+        </switch>
     </struct>
 
     <request name="ChangeDeviceControl" opcode="35">
commit acced13ba0d8ce57aaf342cc92ee489249cb0fc0
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 10:53:14 2014 +0200

    xinput: struct DeviceState: full support
    
    replace uninterpreted_data by switch-case
    
    this is needed by reply GetDeviceControl.
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XIproto.txt?id=inputproto-2.3.1#n640
    http://cgit.freedesktop.org/xorg/lib/libXi/tree/specs/encoding.xml?id=libXi-1.7.4#n1856
    
    Note: Only the DeviceControl of type DeviceResolution is defined in both specs.
    ( this is struct name="DeviceResolutionState" in the xml. )
    The other DeviceControls are not defined in any of the specs.
    
    code:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI.h?id=inputproto-2.3.1#n170
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XIproto.h?id=inputproto-2.3.1#n1263
    
    Message-ID: <1409820801-43629-3-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] xinput: xml-fixes possible with new generator features
    Patch-Set: XmlFixesNewGenerator
    Patch-Number: proto 03/10
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index c99d20c..109bcba 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -47,7 +47,6 @@ which will, e.g., be necessary for server-side xcb.
 
 This affects the following:
 * QueryDeviceState reply field "classes" ( structs InputState, ... )
-* GetDeviceControl reply field "control"  ( structs DeviceState, ... )
 * ChangeDeviceControl request field "control" ( structs ChangeDeviceControl, ... )
 * XIChangeHierarchy request field "changes" ( structs  HierarchyChange, ... )
 * struct XIDeviceInfo field "classes" ( structs DeviceClass, ... )
@@ -1128,12 +1127,53 @@ in struct DeviceTimeCoord.
     <struct name="DeviceState">
         <field type="CARD16" name="control_id" enum="DeviceControl" />
         <field type="CARD16" name="len" />
-        <list type="CARD8" name="uninterpreted_data">
-            <op op="-">
-                <fieldref>len</fieldref>
-                <value>4</value>
-            </op>
-        </list>
+        <switch name="data">
+            <fieldref>control_id</fieldref>
+            <case name="resolution">
+                <enumref ref="DeviceControl">resolution</enumref>
+                <field type="CARD32" name="num_valuators" />
+                <list type="CARD32"  name="resolution_values">
+                    <fieldref>num_valuators</fieldref>
+                </list>
+                <list type="CARD32" name="resolution_min">
+                    <fieldref>num_valuators</fieldref>
+                </list>
+                <list type="CARD32" name="resolution_max">
+                    <fieldref>num_valuators</fieldref>
+                </list>
+            </case>
+            <case name="abs_calib">
+                <enumref ref="DeviceControl">abs_calib</enumref>
+                <field type="INT32"  name="min_x" />
+                <field type="INT32"  name="max_x" />
+                <field type="INT32"  name="min_y" />
+                <field type="INT32"  name="max_y" />
+                <field type="CARD32" name="flip_x" />
+                <field type="CARD32" name="flip_y" />
+                <field type="CARD32" name="rotation" />
+                <field type="CARD32" name="button_threshold" />
+            </case>
+            <case name="core">
+                <enumref ref="DeviceControl">core</enumref>
+                <field type="CARD8"  name="status" />
+                <field type="CARD8"  name="iscore" />
+                <pad bytes="2" />
+            </case>
+            <case name="enable">
+                <enumref ref="DeviceControl">enable</enumref>
+                <field type="CARD8"  name="enable" />
+                <pad bytes="3" />
+            </case>
+            <case name="abs_area">
+                <enumref ref="DeviceControl">abs_area</enumref>
+                <field type="CARD32" name="offset_x" />
+                <field type="CARD32" name="offset_y" />
+                <field type="CARD32" name="width" />
+                <field type="CARD32" name="height" />
+                <field type="CARD32" name="screen" />
+                <field type="CARD32" name="following" />
+            </case>
+        </switch>
     </struct>
 
     <request name="GetDeviceControl" opcode="34">
commit 2dee213bbfbfda5e3f202b12e1af3f3f75a16be8
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 10:53:13 2014 +0200

    xinput: struct FeedbackCtl: full support
    
    replace uninterpreted_data by switch-case
    
    this is needed by request ChangeFeedbackControl.
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XIproto.txt?id=inputproto-2.3.1#n1719
    http://cgit.freedesktop.org/xorg/lib/libXi/tree/specs/encoding.xml?id=libXi-1.7.4#n1445
    
    code:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI.h?id=inputproto-2.3.1#n244
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XIproto.h?id=inputproto-2.3.1#n862
    
    Message-ID: <1409820801-43629-2-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] xinput: xml-fixes possible with new generator features
    Patch-Set: XmlFixesNewGenerator
    Patch-Number: proto 02/10
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index 98f7dec..c99d20c 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -46,7 +46,6 @@ This will, e.g., be necessary for automatically generated byte-order conversion
 which will, e.g., be necessary for server-side xcb.
 
 This affects the following:
-* ChangeFeedbackControl request field "feedback" ( structs FeedbackCtl, ... )
 * QueryDeviceState reply field "classes" ( structs InputState, ... )
 * GetDeviceControl reply field "control"  ( structs DeviceState, ... )
 * ChangeDeviceControl request field "control" ( structs ChangeDeviceControl, ... )
@@ -761,12 +760,51 @@ in struct DeviceTimeCoord.
         <field type="CARD8"  name="class_id" enum="FeedbackClass" />
         <field type="CARD8"  name="feedback_id" />
         <field type="CARD16" name="len" />
-        <list type="CARD8" name="uninterpreted_data">
-            <op op="-">
-                <fieldref>len</fieldref>
-                <value>4</value>
-            </op>
-        </list>
+        <switch name="data">
+	    <fieldref>class_id</fieldref>
+            <case name="keyboard">
+                <enumref ref="FeedbackClass">Keyboard</enumref>
+		<field type="KeyCode" name="key" />
+		<field type="CARD8"   name="auto_repeat_mode" />
+		<field type="INT8"    name="key_click_percent" />
+		<field type="INT8"    name="bell_percent" />
+		<field type="INT16"   name="bell_pitch" />
+		<field type="INT16"   name="bell_duration" />
+		<field type="CARD32"  name="led_mask" />
+		<field type="CARD32"  name="led_values" />
+            </case>
+            <case name="pointer">
+                <enumref ref="FeedbackClass">Pointer</enumref>
+		<pad bytes="2" />
+		<field type="INT16"  name="num" />
+		<field type="INT16"  name="denom" />
+		<field type="INT16"  name="threshold" />
+            </case>
+            <case name="string">
+                <enumref ref="FeedbackClass">String</enumref>
+		<pad bytes="2" />
+		<field type="CARD16" name="num_keysyms" />
+		<list type="KEYSYM"  name="keysyms">
+		    <fieldref>num_keysyms</fieldref>
+		</list>
+            </case>
+            <case name="integer">
+                <enumref ref="FeedbackClass">Integer</enumref>
+	        <field type="INT32"  name="int_to_display" />
+            </case>
+            <case name="led">
+                <enumref ref="FeedbackClass">Led</enumref>
+		<field type="CARD32" name="led_mask" />
+		<field type="CARD32" name="led_values" />
+            </case>
+            <case name="bell">
+                <enumref ref="FeedbackClass">Bell</enumref>
+		<field type="INT8"   name="percent" />
+		<pad bytes="3" />
+		<field type="INT16"  name="pitch" />
+		<field type="INT16"  name="duration" />
+            </case>
+	</switch>
     </struct>
 
     <enum name="ChangeFeedbackControlMask">
commit 022cec314e0bcac2acc5c26fccf755f30cf60464
Author: Christian Linhart <chris at demorecorder.com>
Date:   Thu Sep 4 10:53:12 2014 +0200

    xinput: struct FeedbackState: full support
    
    replace uninterpreted_data by switch-case
    
    this is needed by reply GetFeedbackControl.
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XIproto.txt?id=inputproto-2.3.1#n1613
    http://cgit.freedesktop.org/xorg/lib/libXi/tree/specs/encoding.xml?id=libXi-1.7.4#n1341
    
    code:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XI.h?id=inputproto-2.3.1#n244
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/XIproto.h?id=inputproto-2.3.1#n754
    
    Message-ID: <1409820801-43629-1-git-send-email-chris at demorecorder.com>
    Patch-Thread-Subject: [Xcb] xinput: xml-fixes possible with new generator features
    Patch-Set: XmlFixesNewGenerator
    Patch-Number: proto 01/10
    Patch-Version: V1
    Signed-off-by: Christian Linhart <chris at DemoRecorder.com>

diff --git a/src/xinput.xml b/src/xinput.xml
index e418b65..98f7dec 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -46,7 +46,6 @@ This will, e.g., be necessary for automatically generated byte-order conversion
 which will, e.g., be necessary for server-side xcb.
 
 This affects the following:
-* GetFeedbackControl reply field "feedbacks" ( structs FeedbackState, ... )
 * ChangeFeedbackControl request field "feedback" ( structs FeedbackCtl, ... )
 * QueryDeviceState reply field "classes" ( structs InputState, ... )
 * GetDeviceControl reply field "control"  ( structs DeviceState, ... )
@@ -631,12 +630,56 @@ in struct DeviceTimeCoord.
         <field type="CARD8"  name="class_id" enum="FeedbackClass" />
         <field type="CARD8"  name="feedback_id" />
         <field type="CARD16" name="len" />
-        <list type="CARD8" name="uninterpreted_data">
-            <op op="-">
-                <fieldref>len</fieldref>
-                <value>4</value>
-            </op>
-        </list>
+        <switch name="data">
+            <fieldref>class_id</fieldref>
+            <case name="keyboard">
+                <enumref ref="FeedbackClass">Keyboard</enumref>
+                <field type="CARD16" name="pitch" />
+                <field type="CARD16" name="duration" />
+                <field type="CARD32" name="led_mask" />
+                <field type="CARD32" name="led_values" />
+                <field type="BOOL"   name="global_auto_repeat" />
+                <field type="CARD8"  name="click" />
+                <field type="CARD8"  name="percent" />
+                <pad bytes="1" />
+                <list type="CARD8" name="auto_repeats">
+                    <value>32</value>
+                </list>
+            </case>
+            <case name="pointer">
+                <enumref ref="FeedbackClass">Pointer</enumref>
+                <pad bytes="2" />
+                <field type="CARD16" name="accel_num" />
+                <field type="CARD16" name="accel_denom" />
+                <field type="CARD16" name="threshold" />
+            </case>
+            <case name="string">
+                <enumref ref="FeedbackClass">String</enumref>
+                <field type="CARD16" name="max_symbols" />
+                <field type="CARD16" name="num_keysyms" />
+                <list type="KEYSYM"  name="keysyms">
+	            <fieldref>num_keysyms</fieldref>
+	        </list>
+            </case>
+            <case name="integer">
+                <enumref ref="FeedbackClass">Integer</enumref>
+                <field type="CARD32" name="resolution" />
+                <field type="INT32"  name="min_value" />
+                <field type="INT32"  name="max_value" />
+            </case>
+            <case name="led">
+                <enumref ref="FeedbackClass">Led</enumref>
+                <field type="CARD32" name="led_mask" />
+                <field type="CARD32" name="led_values" />
+            </case>
+            <case name="bell">
+                <enumref ref="FeedbackClass">Bell</enumref>
+                <field type="CARD8"  name="percent" />
+                <pad bytes="3" />
+                <field type="CARD16" name="pitch" />
+                <field type="CARD16" name="duration" />
+            </case>
+        </switch>
     </struct>
 
     <request name="GetFeedbackControl" opcode="22">
commit a46b477830d2599182bd711143b66dcd052e2137
Author: Christian Linhart <chris at DemoRecorder.com>
Date:   Sun Nov 2 13:47:43 2014 +0100

    xinput: remove TODO-entry for sumof and ListInputDevices
    
    Note: patches 6 and 7 of this patchset were removed during the review process.
    
    Signed-off-by: Christian Linhart <chris at demorecorder.com>
    Reviewed-by: Ran Benita <ran234 at gmail.com>
    
    Message-ID: <545627EF.8020708 at DemoRecorder.com>
    Patch-Thread-Subject: [Xcb] [PATCHSET] ListInputDevices revision 2
    Patch-Set: ListInputDevices
    Patch-Number: proto 8/8
    Patch-Version: V1

diff --git a/src/xinput.xml b/src/xinput.xml
index b20a069..e418b65 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -68,13 +68,6 @@ This is needed for the following XI2-events ( and eventcopies thereof )
 	TouchBegin
 	RawTouchBegin
 
-
-*****
-
-<sumof> should support fields of listmembers.
-
-This is needed for request "ListInputDevices"
-
 *****
 
 xml and generator should support
commit 0d5a061ef288bab9c75a9aa434d63527174e29a9
Author: Christian Linhart <chris at DemoRecorder.com>
Date:   Sun Nov 2 13:47:38 2014 +0100

    xinput: ListInputDevices: full support
    
    * define struct InputInfo with switch-case
    * define the lists "infos" and "names"
    * the list "infos" requires a new xml-construct:
      <sumof> with a nested expression, to access fields
      of the list which is iterated by sumof.
    
    spec:
    http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XIproto.txt?id=inputproto-2.3.1#n305
    http://cgit.freedesktop.org/xorg/lib/libXi/tree/specs/encoding.xml?id=libXi-1.7.4#n715
    
    code:
    http://cgit.freedesktop.org/xorg/lib/libXi/tree/src/XListDev.c?id=libXi-1.7.4
    
    Both specs are misleading ( or buggy ) in the following aspect:
    
    In both specs, struct Deviceinfo is defined to contain a list
    of InputInfo and a list of STR.
    
    But, by analyzing the code in libXi, it was clear that
    * InputInfo is contained in an extra toplevel list
      in the reply ListInputDevices
    * the strings ( struct xproto:STR ) are also contained in a toplevel list
      in the reply
    
    Signed-off-by: Christian Linhart <chris at demorecorder.com>
    Reviewed-by: Ran Benita <ran234 at gmail.com>
    
    Message-ID: <545627EA.8010408 at DemoRecorder.com>
    Patch-Thread-Subject: [Xcb] [PATCHSET] ListInputDevices revision 2
    Patch-Set: ListInputDevices
    Patch-Number: proto 5/8
    Patch-Version: V1

diff --git a/src/xinput.xml b/src/xinput.xml
index 7f7b0a6..b20a069 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -217,6 +217,29 @@ in struct DeviceTimeCoord.
     <struct name="InputInfo">
         <field type="CARD8" name="class_id" enum="InputClass" />
         <field type="CARD8" name="len" />
+        <switch name="info">
+            <fieldref>class_id</fieldref>
+            <case name="key">
+                <enumref ref="InputClass">Key</enumref>
+                <field type="KeyCode" name="min_keycode" />
+                <field type="KeyCode" name="max_keycode" />
+                <field type="CARD16"  name="num_keys" />
+                <pad bytes="2" />
+            </case>
+            <case name="button">
+                <enumref ref="InputClass">Button</enumref>
+                <field type="CARD16"    name="num_buttons" />
+            </case>
+            <case name="valuator">
+                <enumref ref="InputClass">Valuator</enumref>
+                <field type="CARD8"   name="axes_len" />
+                <field type="CARD8"   name="mode" enum="ValuatorMode" />
+                <field type="CARD32"  name="motion_size" />
+                <list type="AxisInfo" name="axes">
+                    <fieldref>axes_len</fieldref>
+                </list>
+            </case>
+	</switch>
     </struct>
 
     <struct name="DeviceName">
@@ -234,9 +257,15 @@ in struct DeviceTimeCoord.
             <list type="DeviceInfo" name="devices">
                 <fieldref>devices_len</fieldref>
             </list>
-            <!-- Uninterpreted: list (infos) of InputInfo structures,
-                                length is <sumof> all devices.num_class_info -->
-            <!-- Uninterpreted: list (name) of DeviceName structures -->
+            <list type="InputInfo" name="infos">
+                <sumof ref="devices">
+			<fieldref>num_class_info</fieldref>
+		</sumof>
+            </list>
+            <list type="STR" name="names">
+                <fieldref>devices_len</fieldref>
+            </list>
+            <pad align="4" />
         </reply>
     </request>
 
commit 8c5c89f9f6c8e2b7334bdf19d47209e1ade4ef7c
Author: Christian Linhart <chris at DemoRecorder.com>
Date:   Sun Nov 2 13:47:29 2014 +0100

    xcbgen: sumof with nested expression
    
    Add parser support for sumof with a nested expression.
    For example:
    	<sumof ref="mylist1">
    		<fieldref>bar</fieldref>
    	</sumof>
    
    The nested expression is added as the "rhs"-field of the
    expression.object.
    
    Signed-off-by: Christian Linhart <chris at demorecorder.com>
    Reviewed-by: Ran Benita <ran234 at gmail.com>
    
    Message-ID: <545627E1.8070302 at DemoRecorder.com>
    Patch-Thread-Subject: [Xcb] [PATCHSET] ListInputDevices revision 2
    Patch-Set: ListInputDevices
    Patch-Number: proto 4/8
    Patch-Version: V1

diff --git a/xcbgen/expr.py b/xcbgen/expr.py
index 51e738f..a03703f 100644
--- a/xcbgen/expr.py
+++ b/xcbgen/expr.py
@@ -104,6 +104,12 @@ class Expression(object):
         elif elt.tag == 'sumof':
             self.op = 'sumof'
             self.lenfield_name = elt.get('ref')
+            subexpressions = list(elt)
+            if len(subexpressions) > 0:
+                # sumof with a nested expression which is to be evaluated
+                # for each list-element in the context of that list-element.
+                # sumof then returns the sum of the results of these evaluations
+                self.rhs = Expression(subexpressions[0], parent)
 
         else:
             # Notreached
commit c057c4336fb4fd2b65052536629383aa03ddf518
Author: Christian Linhart <chris at DemoRecorder.com>
Date:   Sun Nov 2 13:47:23 2014 +0100

    schema: add rule for sumof with nested expression
    
    Signed-off-by: Christian Linhart <chris at demorecorder.com>
    Reviewed-by: Ran Benita <ran234 at gmail.com>
    
    Message-ID: <545627DB.5090101 at DemoRecorder.com>
    Patch-Thread-Subject: [Xcb] [PATCHSET] ListInputDevices revision 2
    Patch-Set: ListInputDevices
    Patch-Number: proto 3/8
    Patch-Version: V1

diff --git a/src/xcb.xsd b/src/xcb.xsd
index 85f5bc2..4ee578c 100644
--- a/src/xcb.xsd
+++ b/src/xcb.xsd
@@ -162,6 +162,9 @@ authorization from the authors.
       </xsd:element>
       <xsd:element name="sumof">
         <xsd:complexType>
+          <xsd:sequence>
+            <xsd:group ref="expression" minOccurs="0" maxOccurs="1"/>
+          </xsd:sequence>
           <xsd:attribute name="ref" use="required" type="xsd:string" />
         </xsd:complexType>
       </xsd:element>
commit afdfe208486cb90841518e91488b6a585c38aff7
Author: Christian Linhart <chris at DemoRecorder.com>
Date:   Sun Nov 2 13:47:17 2014 +0100

    xml-doc: add sumof with nested expression
    
    Signed-off-by: Christian Linhart <chris at demorecorder.com>
    Reviewed-by: Ran Benita <ran234 at gmail.com>
    
    Message-ID: <545627D5.4010008 at DemoRecorder.com>
    Patch-Thread-Subject: [Xcb] [PATCHSET] ListInputDevices revision 2
    Patch-Set: ListInputDevices
    Patch-Number: proto 2/8
    Patch-Version: V1

diff --git a/doc/xml-xcb.txt b/doc/xml-xcb.txt
index 235958d..d47b12c 100644
--- a/doc/xml-xcb.txt
+++ b/doc/xml-xcb.txt
@@ -322,6 +322,17 @@ Expressions
 
   This element represents a sumation of the elements of the referenced list.
 
+<sumof ref="identifier" >expression</sumof>
+
+  The expression is evaluated for each element of the referenced list,
+  in the context of this element.
+  This sumof element then represents a sumation of the results of these
+  evaluations.
+
+  expression will usually be a fieldref which references a field of
+  a list-element or an expression containing a fieldref,
+  such as popcount of a fieldref.
+
 <popcount>expression</popcount>
 
   This element represents the number of bits set in the expression.
commit 88f9def9341b8f9c8f45e8a95f6c40ac94fa959f
Author: Christian Linhart <chris at DemoRecorder.com>
Date:   Sun Nov 2 13:47:07 2014 +0100

    xcbgen: fields get a parent reference
    
    Objects of type Field get a reference to their parent.
    This is needed in the generator to differentiate
    field handling dependend on properties of their parent.
    
    Signed-off-by: Christian Linhart <chris at demorecorder.com>
    Reviewed-by: Ran Benita <ran234 at gmail.com>
    
    Message-ID: <545627CB.1000606 at DemoRecorder.com>
    Patch-Thread-Subject: [Xcb] [PATCHSET] ListInputDevices revision 2
    Patch-Set: ListInputDevices
    Patch-Number: proto 1/8
    Patch-Version: V1

diff --git a/xcbgen/expr.py b/xcbgen/expr.py
index e4fb06e..51e738f 100644
--- a/xcbgen/expr.py
+++ b/xcbgen/expr.py
@@ -22,6 +22,7 @@ class Field(object):
         self.wire = wire
         self.auto = auto
         self.isfd = isfd
+        self.parent = None
 
 
 class Expression(object):
diff --git a/xcbgen/xtypes.py b/xcbgen/xtypes.py
index 45d7568..8ecbaa2 100644
--- a/xcbgen/xtypes.py
+++ b/xcbgen/xtypes.py
@@ -76,6 +76,7 @@ class Type(object):
                 return
 
         complex_type.fields.append(new_field)
+        new_field.parent = complex_type
 
     def make_fd_of(self, module, complex_type, fd_name):
         '''


More information about the xcb-commit mailing list