Introduce xcb_wait_for_event_until, for consuming responses in wire-order.
[free-sw/xcb/libxcb] / src / c_client.py
index 08d6ec4..a10b3f1 100644 (file)
@@ -875,7 +875,7 @@ def _c_serialize_helper_fields_variable_size(context, self, field,
         
         # special case: intermixed fixed and variable size fields
         if self.var_followed_by_fixed_fields and 'unserialize' == context:
-            value = '    %s = xcb_tmp;' % field.c_field_name
+            value = '    %s = (%s *)xcb_tmp;' % (field.c_field_name, field.c_field_type)
             temp_vars.append('    %s *%s;' % (field.type.c_type, field.c_field_name))
         # special case: switch
         if 'unpack' == context:
@@ -925,8 +925,9 @@ def _c_serialize_helper_fields(context, self,
     prev_field_was_variable = False
 
     for field in self.fields:
-        if not ((field.wire and not field.auto) or field.visible):
-            continue
+        if not field.visible:
+            if not ((field.wire and not field.auto) or 'unserialize' == context):
+                continue
 
         # switch/bitcase: fixed size fields must be considered explicitly 
         if field.type.fixed_size():
@@ -1218,12 +1219,13 @@ def _c_serialize(context, self):
             
         # unserialize: assign variable size fields individually
         if 'unserialize' == context:
-            _c('    *%s = xcb_out;', aux_ptr)
-            _c('    xcb_tmp = (char *)(*_aux+1);')
+            _c('    xcb_tmp = ((char *)*_aux)+xcb_buffer_len;')
+            param_fields.reverse()
             for field in param_fields:
                 if not field.type.fixed_size():
-                    _c('    memcpy(xcb_tmp, %s, %s_len);', field.c_field_name, field.c_field_name)
-                    _c('    xcb_tmp += %s_len;', field.c_field_name)
+                    _c('    xcb_tmp -= %s_len;', field.c_field_name)
+                    _c('    memmove(xcb_tmp, %s, %s_len);', field.c_field_name, field.c_field_name)
+            _c('    *%s = xcb_out;', aux_ptr)
  
     _c('')
     _c('    return xcb_buffer_len;')
@@ -1421,6 +1423,11 @@ def _c_accessor_get_expr(expr, field_mapping):
     else:
         return lenexp
 
+def type_pad_type(type):
+    if type == 'void':
+        return 'char'
+    return type
+
 def _c_accessors_field(self, field):
     '''
     Declares the accessor functions for a non-list field that follows a variable-length field.
@@ -1455,7 +1462,7 @@ def _c_accessors_field(self, field):
         else:
             _c('    xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
             _c('    return * (%s *) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index) + %d);', 
-               field.c_field_type, field.first_field_after_varsized.type.c_type, field.prev_varsized_offset)
+               field.c_field_type, type_pad_type(field.first_field_after_varsized.type.c_type), field.prev_varsized_offset)
         _c('}')
     else:
         _hc('')
@@ -1486,7 +1493,7 @@ def _c_accessors_field(self, field):
         else:
             _c('    xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
             _c('    return (%s) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index) + %d);', 
-               return_type, field.first_field_after_varsized.type.c_type, field.prev_varsized_offset)
+               return_type, type_pad_type(field.first_field_after_varsized.type.c_type), field.prev_varsized_offset)
         _c('}')
 
     
@@ -1573,7 +1580,7 @@ def _c_accessors_list(self, field):
         else:
             _c('    xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
             _c('    return (%s *) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index) + %d);', 
-               field.c_field_type, field.first_field_after_varsized.type.c_type, field.prev_varsized_offset)
+               field.c_field_type, type_pad_type(field.first_field_after_varsized.type.c_type), field.prev_varsized_offset)
         _c('}')
 
     _hc('')
@@ -1677,7 +1684,7 @@ def _c_accessors_list(self, field):
         else:
             _c('    xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(field.prev_varsized_field, 'R'))
             _c('    i.data = (%s *) ((char *) prev.data + XCB_TYPE_PAD(%s, prev.index));', 
-               field.c_field_type, field.c_field_type)
+               field.c_field_type, type_pad_type(field.c_field_type))
         if switch_obj is None:
             _c('    i.rem = %s;', _c_accessor_get_expr(field.type.expr, fields))
         _c('    i.index = (char *) i.data - (char *) %s;', 'R' if switch_obj is None else 'S' )