Add support for file descriptor request fields
authorKeith Packard <keithp@keithp.com>
Mon, 14 Jan 2013 22:19:45 +0000 (14:19 -0800)
committerKeith Packard <keithp@keithp.com>
Thu, 7 Nov 2013 13:14:12 +0000 (05:14 -0800)
These are present in the API, but not present on the wire.

Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
xcbgen/expr.py
xcbgen/xtypes.py

index 4f8af6f..f9d5179 100644 (file)
@@ -13,7 +13,7 @@ class Field(object):
     auto is true iff the field is on the wire but not in the request API (e.g. opcode)
     enum is the enum name this field refers to, if any.
     '''
     auto is true iff the field is on the wire but not in the request API (e.g. opcode)
     enum is the enum name this field refers to, if any.
     '''
-    def __init__(self, type, field_type, field_name, visible, wire, auto, enum=None):
+    def __init__(self, type, field_type, field_name, visible, wire, auto, enum=None, isfd=False):
         self.type = type
         self.field_type = field_type
         self.field_name = field_name
         self.type = type
         self.field_type = field_type
         self.field_name = field_name
@@ -21,6 +21,7 @@ class Field(object):
         self.visible = visible
         self.wire = wire
         self.auto = auto
         self.visible = visible
         self.wire = wire
         self.auto = auto
+        self.isfd = isfd
 
 
 class Expression(object):
 
 
 class Expression(object):
index 4b43957..951731a 100644 (file)
@@ -75,6 +75,18 @@ class Type(object):
 
         complex_type.fields.append(new_field)
 
 
         complex_type.fields.append(new_field)
 
+    def make_fd_of(self, module, complex_type, fd_name):
+       '''
+        Method for making a fd member of a structure.
+        '''
+        new_fd = Field(self, module.get_type_name('INT32'), fd_name, True, False, False, None, True)
+        # We dump the _placeholder_byte if any fields are added.
+        for (idx, field) in enumerate(complex_type.fields):
+            if field == _placeholder_byte:
+                complex_type.fields[idx] = new_fd
+                return
+
+        complex_type.fields.append(new_fd)
 
 class SimpleType(Type):
     '''
 
 class SimpleType(Type):
     '''
@@ -279,6 +291,7 @@ class ComplexType(Type):
         self.nmemb = 1
         self.size = 0
         self.lenfield_parent = [self]
         self.nmemb = 1
         self.size = 0
         self.lenfield_parent = [self]
+        self.fds = []
 
     def resolve(self, module):
         if self.resolved:
 
     def resolve(self, module):
         if self.resolved:
@@ -324,9 +337,14 @@ class ComplexType(Type):
                 type.make_member_of(module, self, field_type, field_name, visible, True, False)
                 type.resolve(module)
                 continue
                 type.make_member_of(module, self, field_type, field_name, visible, True, False)
                 type.resolve(module)
                 continue
+            elif child.tag == 'fd':
+                fd_name = child.get('name')
+                type = module.get_type('INT32')
+                type.make_fd_of(module, self, fd_name)
+                continue
             else:
                 # Hit this on Reply
             else:
                 # Hit this on Reply
-                continue 
+                continue
 
             # Get the full type name for the field
             field_type = module.get_type_name(fkey)
 
             # Get the full type name for the field
             field_type = module.get_type_name(fkey)