diff options
author | marha <marha@users.sourceforge.net> | 2015-02-22 21:39:56 +0100 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2015-02-22 21:39:56 +0100 |
commit | 462f18c7b25fe3e467f837647d07ab0a78aa8d2b (patch) | |
tree | fc8013c0a1bac05a1945846c1697e973f4c35013 /libxcb | |
parent | 36f711ee12b6dd5184198abed3aa551efb585587 (diff) | |
download | vcxsrv-462f18c7b25fe3e467f837647d07ab0a78aa8d2b.tar.gz vcxsrv-462f18c7b25fe3e467f837647d07ab0a78aa8d2b.tar.bz2 vcxsrv-462f18c7b25fe3e467f837647d07ab0a78aa8d2b.zip |
Merged origin/release (checked in because wanted to merge new stuff)
Diffstat (limited to 'libxcb')
-rwxr-xr-x | libxcb/src/c_client.py | 444 | ||||
-rw-r--r-- | libxcb/xcb-proto/doc/xml-xcb.txt | 33 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/present.xml | 10 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/render.xml | 118 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/screensaver.xml | 68 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/xcb.xsd | 24 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/xfixes.xml | 2 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/xinput.xml | 527 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/xprint.xml | 13 | ||||
-rw-r--r-- | libxcb/xcb-proto/src/xproto.xml | 414 | ||||
-rw-r--r-- | libxcb/xcb-proto/xcbgen/expr.py | 31 | ||||
-rw-r--r-- | libxcb/xcb-proto/xcbgen/xtypes.py | 8 |
12 files changed, 1427 insertions, 265 deletions
diff --git a/libxcb/src/c_client.py b/libxcb/src/c_client.py index b9f47db7d..e78fd7755 100755 --- a/libxcb/src/c_client.py +++ b/libxcb/src/c_client.py @@ -58,6 +58,107 @@ def _hc(fmt, *args): _h(fmt, *args) _c(fmt, *args) +def _c_wr_stringlist(indent, strlist): + ''' + Writes the given list of strings to the source file. + Each line is prepended by the indent string + ''' + for str in strlist: + _c("%s%s", indent, str) + + +class PreCode(object): + ''' + For pre-code generated by expression generation + (for example, the for-loop of a sumof) + This has to account for recursiveness of the expression + generation, i.e., there may be pre-code for pre-code. + Therefore this is implemented as a stack of lists of lines. + + If redirection is switched on, then all output is collected in + self.redirect_code and self.redirect_tempvars instead of + being sent to the output via _h und _c. + ''' + def __init__(self): + self.nesting_level = 0 + self.tempvars = [] + self.codelines = [] + self.redirect_code = None + self.redirect_tempvars = None + self.indent_str = ' ' + self.indent_stack = [] + self.tempvar_num = 0 + + + # start and end of pre-code blocks + def start(self): + self.nesting_level += 1 + + def end(self): + self.nesting_level -= 1 + if self.nesting_level == 0: + # lowest pre-code level is finished -> output to source + if self.redirect_tempvars is None: + _c_wr_stringlist('', self.tempvars) + self.tempvars = [] + else: + self.redirect_tempvars.extend(self.tempvars) + self.tempvars = [] + if self.redirect_code == None: + _c_wr_stringlist('', self.codelines) + self.codelines = [] + else: + self.redirect_code.extend(self.codelines) + self.codelines = [] + + + def output_tempvars(self): + if self.redirect_code == None: + _c_wr_stringlist('', self.tempvars) + self.tempvars = [] + + # output to precode + def code(self, fmt, *args): + self.codelines.append(self.indent_str + fmt % args) + + def tempvar(self, fmt, *args): + self.tempvars.append(' ' + (fmt % args)) + + # get a unique name for a temporary variable + def get_tempvarname(self): + self.tempvar_num += 1 + return "xcb_pre_tmp_%d" % self.tempvar_num + + # indentation + + def push_indent(self, indentstr): + self.indent_stack.append(self.indent_str) + self.indent_str = indentstr + + def push_addindent(self, indent_add_str): + self.push_indent(self.indent_str + indent_add_str) + + def indent(self): + self.push_addindent(' ') + + def pop_indent(self): + self.indent_str = self.indent_stack.pop() + + # redirection to lists + def redirect_start(self, redirect_code, redirect_tempvars=None): + self.redirect_code = redirect_code + self.redirect_tempvars = redirect_tempvars + if redirect_tempvars is not None: + self.tempvar_num = 0 + + def redirect_end(self): + self.redirect_code = None + self.redirect_tempvars = None + +# global PreCode handler +_c_pre = PreCode() + + # XXX See if this level thing is really necessary. def _h_setlevel(idx): ''' @@ -337,12 +438,6 @@ def _c_type_setup(self, name, postfix): first_field_after_varsized = None for field in self.fields: - _c_type_setup(field.type, field.field_type, ()) - if field.type.is_list: - _c_type_setup(field.type.member, field.field_type, ()) - if (field.type.nmemb is None): - self.c_need_sizeof = True - field.c_field_type = _t(field.field_type) field.c_field_const_type = ('' if field.type.nmemb == 1 else 'const ') + field.c_field_type field.c_field_name = _cpp(field.field_name) @@ -392,6 +487,15 @@ def _c_type_setup(self, name, postfix): if field.type.fixed_size(): field.prev_varsized_field = None + # recurse into this field this has to be done here, i.e., + # after the field has been set up. Otherwise the function + # _c_helper_fieldaccess_expr will produce garbage or crash + _c_type_setup(field.type, field.field_type, ()) + if field.type.is_list: + _c_type_setup(field.type.member, field.field_type, ()) + if (field.type.nmemb is None): + self.c_need_sizeof = True + if self.c_need_serialize: # when _unserialize() is wanted, create _sizeof() as well for consistency reasons self.c_need_sizeof = True @@ -428,23 +532,64 @@ def _c_type_setup(self, name, postfix): _c_serialize('sizeof', self) # _c_type_setup() -def _c_helper_absolute_name(prefix, field=None): +# Functions for querying field properties +def _c_field_needs_list_accessor(field): + return field.type.is_list and not field.type.fixed_size() + +def _c_field_needs_field_accessor(field): + if field.type.is_list: + return False + else: + return (field.prev_varsized_field is not None or + not field.type.fixed_size()) + +def _c_field_needs_accessor(field): + return (_c_field_needs_list_accessor(field) or + _c_field_needs_field_accessor(field)) + +def _c_field_is_member_of_case_or_bitcase(field): + return field.parent and field.parent.is_case_or_bitcase + +def _c_helper_fieldaccess_expr(prefix, field=None): """ turn prefix, which is a list of tuples (name, separator, Type obj) into a string - representing a valid name in C (based on the context) - if field is not None, append the field name as well + representing a valid field-access-expression in C (based on the context) + if field is not None, append access to the field as well. + + "separator" is one of the C-operators "." or "->". + + A field access expression can consist of the following components: + * struct/union member access from a value with the "."-operator + * struct/union member access from a pointer with "->"-operator + * function-call of an accessor function: + This is used when a xcb-field is not contained in a struct. + This can, e.g., happen for fields after var-sized fields, etc. """ prefix_str = '' + last_sep ='' for name, sep, obj in prefix: - prefix_str += name - if '' == sep: - sep = '->' - if ((obj.is_case_or_bitcase and obj.has_name) or # named bitcase - (obj.is_switch and len(obj.parents)>1)): - sep = '.' - prefix_str += sep - if field is not None: - prefix_str += _cpp(field.field_name) + prefix_str += last_sep + name + last_sep = sep + + if field is None: + # add separator for access to a yet unknown field + prefix_str += last_sep + else: + if _c_field_needs_accessor(field): + if _c_field_is_member_of_case_or_bitcase(field): + # case members are available in the deserialized struct, + # so there is no need to use the accessor function + # (also, their accessor function needs a different arglist + # so this would require special treatment here) + # Therefore: Access as struct member + prefix_str += last_sep + _cpp(field.field_name) + else: + # Access with the accessor function + prefix_str = field.c_accessor_name + "(" + prefix_str + ")" + else: + # Access as struct member + prefix_str += last_sep + _cpp(field.field_name) + return prefix_str # _c_absolute_name @@ -466,7 +611,7 @@ def _c_helper_field_mapping(complex_type, prefix, flat=False): all_fields.update(_c_helper_field_mapping(b.type, bitcase_prefix, flat)) else: for f in complex_type.fields: - fname = _c_helper_absolute_name(prefix, f) + fname = _c_helper_fieldaccess_expr(prefix, f) if f.field_name in all_fields: raise Exception("field name %s has been registered before" % f.field_name) @@ -579,6 +724,31 @@ def resolve_expr_fields(complex_obj): return unresolved # resolve_expr_fields() +def resolve_expr_fields_list(self, parents): + """ + Find expr fields appearing in a list and descendents + that cannot be resolved within the parents of the list. + These are normally fields that need to be given as function parameters + for length and iterator functions. + """ + all_fields = [] + expr_fields = get_expr_fields(self) + unresolved = [] + + for complex_obj in parents: + for field in complex_obj.fields: + if field.wire: + all_fields.append(field) + + # try to resolve expr fields + for e in expr_fields: + if e not in all_fields and e not in unresolved: + unresolved.append(e) + + return unresolved +# resolve_expr_fields_list() + + def get_serialize_params(context, self, buffer_var='_buffer', aux_var='_aux'): """ functions like _serialize(), _unserialize(), and _unpack() sometimes need additional parameters: @@ -751,7 +921,7 @@ def _c_serialize_helper_switch_field(context, self, field, c_switch_variable, pr # switch is handled by this function as a special case param_fields, wire_fields, params = get_serialize_params(context, self) field_mapping = _c_helper_field_mapping(self, prefix) - prefix_str = _c_helper_absolute_name(prefix) + prefix_str = _c_helper_fieldaccess_expr(prefix) # find the parameters that need to be passed to _serialize()/_unpack(): # all switch expr fields must be given as parameters @@ -788,6 +958,16 @@ def _c_serialize_helper_switch_field(context, self, field, c_switch_variable, pr return length # _c_serialize_helper_switch_field() +def _c_get_additional_type_params(type): + """ + compute list of additional params for functions created for the given type + """ + if type.is_simple: + return [] + else: + param_fields, wire_fields, params = get_serialize_params('sizeof', type) + return params[1:] + def _c_serialize_helper_list_field(context, self, field, code_lines, temp_vars, space, prefix): @@ -795,7 +975,7 @@ def _c_serialize_helper_list_field(context, self, field, helper function to cope with lists of variable length """ expr = field.type.expr - prefix_str = _c_helper_absolute_name(prefix) + prefix_str = _c_helper_fieldaccess_expr(prefix) param_fields, wire_fields, params = get_serialize_params('sizeof', self) param_names = [p[2] for p in params] @@ -826,6 +1006,14 @@ def _c_serialize_helper_list_field(context, self, field, # list with variable-sized elements if not field.type.member.fixed_size(): + # compute string for argumentlist for member-type functions + member_params = _c_get_additional_type_params(field.type.member) + member_arg_names = [p[2] for p in member_params] + member_arg_str = '' + for member_arg_name in member_arg_names: + member_arg_str += ', ' + field_mapping[member_arg_name][0] + + # length = '' if context in ('unserialize', 'sizeof', 'unpack'): int_i = ' unsigned int i;' @@ -837,8 +1025,8 @@ def _c_serialize_helper_list_field(context, self, field, # loop over all list elements and call sizeof repeatedly # this should be a bit faster than using the iterators code_lines.append("%s for(i=0; i<%s; i++) {" % (space, list_length)) - code_lines.append("%s xcb_tmp_len = %s(xcb_tmp);" % - (space, field.type.c_sizeof_name)) + code_lines.append("%s xcb_tmp_len = %s(xcb_tmp%s);" % + (space, field.type.c_sizeof_name, member_arg_str)) code_lines.append("%s xcb_block_len += xcb_tmp_len;" % space) code_lines.append("%s xcb_tmp += xcb_tmp_len;" % space) code_lines.append("%s }" % space) @@ -847,7 +1035,7 @@ def _c_serialize_helper_list_field(context, self, field, code_lines.append('%s xcb_parts[xcb_parts_idx].iov_len = 0;' % space) code_lines.append('%s xcb_tmp = (char *) %s%s;' % (space, prefix_str, field.c_field_name)) code_lines.append('%s for(i=0; i<%s; i++) { ' % (space, list_length)) - code_lines.append('%s xcb_block_len = %s(xcb_tmp);' % (space, field.type.c_sizeof_name)) + code_lines.append('%s xcb_block_len = %s(xcb_tmp%s);' % (space, field.type.c_sizeof_name, member_arg_str)) code_lines.append('%s xcb_parts[xcb_parts_idx].iov_len += xcb_block_len;' % space) code_lines.append('%s }' % space) code_lines.append('%s xcb_block_len = xcb_parts[xcb_parts_idx].iov_len;' % space) @@ -866,7 +1054,7 @@ def _c_serialize_helper_fields_fixed_size(context, self, field, typename = reduce(lambda x,y: "%s.%s" % (x, y), scoped_name) code_lines.append('%s /* %s.%s */' % (space, typename, field.c_field_name)) - abs_field_name = _c_helper_absolute_name(prefix, field) + abs_field_name = _c_helper_fieldaccess_expr(prefix, field) # default for simple cases: call sizeof() length = "sizeof(%s)" % field.c_field_type @@ -928,7 +1116,7 @@ def _c_serialize_helper_fields_fixed_size(context, self, field, def _c_serialize_helper_fields_variable_size(context, self, field, code_lines, temp_vars, space, prefix): - prefix_str = _c_helper_absolute_name(prefix) + prefix_str = _c_helper_fieldaccess_expr(prefix) if context in ('unserialize', 'unpack', 'sizeof'): value = '' @@ -985,6 +1173,8 @@ def _c_serialize_helper_fields(context, self, need_padding = False prev_field_was_variable = False + _c_pre.push_indent(space + ' ') + for field in self.fields: if not field.visible: if not ((field.wire and not field.auto) or 'unserialize' == context): @@ -1073,6 +1263,8 @@ def _c_serialize_helper_fields(context, self, if self.c_var_followed_by_fixed_fields: need_padding = False + _c_pre.pop_indent() + return count # _c_serialize_helper_fields() @@ -1171,6 +1363,8 @@ def _c_serialize(context, self): temp_vars = [] prefix = [] + _c_pre.redirect_start(code_lines, temp_vars) + if 'serialize' == context: if not self.is_switch and not self.c_var_followed_by_fixed_fields: _c(' %s *xcb_out = *_buffer;', self.c_type) @@ -1216,11 +1410,13 @@ def _c_serialize(context, self): _c(' %s _aux;', self.c_type) _c(' return %s(%s, &_aux);', self.c_unpack_name, reduce(lambda x,y: "%s, %s" % (x, y), param_names)) _c('}') + _c_pre.redirect_end() return elif self.c_var_followed_by_fixed_fields: # special case: call _unserialize() _c(' return %s(%s, NULL);', self.c_unserialize_name, reduce(lambda x,y: "%s, %s" % (x, y), param_names)) _c('}') + _c_pre.redirect_end() return else: _c(' char *xcb_tmp = (char *)_buffer;') @@ -1256,6 +1452,8 @@ def _c_serialize(context, self): _c(' unsigned int xcb_pad = 0;') _c(' unsigned int xcb_align_to = 0;') + _c_pre.redirect_end() + _c('') for t in temp_vars: _c(t) @@ -1348,6 +1546,14 @@ def _c_iterator(self, name): _h(' %s *data; /**< */', self.c_type) _h(' int%s rem; /**< */', ' ' * (len(self.c_type) - 2)) _h(' int%s index; /**< */', ' ' * (len(self.c_type) - 2)) + # add additional params of the type "self" as fields to the iterator struct + # so that they can be passed to the sizeof-function by the iterator's next-function + params = _c_get_additional_type_params(self) + for param in params: + _h(' %s%s %s; /**< */', + param[0], + ' ' * (len(self.c_type) + 1 - len(param[0])), + param[2]) _h('} %s;', self.c_iterator_type) _h_setlevel(1) @@ -1375,9 +1581,14 @@ def _c_iterator(self, name): _c(' /* FIXME - determine the size of the union %s */', self.c_type) else: if self.c_need_sizeof: + # compute the string of additional arguments for the sizeof-function + additional_args = '' + for param in params: + additional_args += ', i->' + param[2] + _c(' xcb_generic_iterator_t child;') - _c(' child.data = (%s *)(((char *)R) + %s(R));', - self.c_type, self.c_sizeof_name) + _c(' child.data = (%s *)(((char *)R) + %s(R%s));', + self.c_type, self.c_sizeof_name, additional_args) _c(' i->index = (char *) child.data - (char *) i->data;') else: _c(' xcb_generic_iterator_t child = %s;', _c_iterator_get_end(self.last_varsized_field, 'R')) @@ -1436,12 +1647,7 @@ def _c_accessor_get_length(expr, field_mapping=None): if field_mapping is not None: lenfield_name = field_mapping[lenfield_name][0] - if expr.lenfield is not None and expr.lenfield.prev_varsized_field is not None: - # special case: variable and fixed size fields are intermixed - # if the lenfield is among the fixed size fields, there is no need - # to call a special accessor function like <expr.lenfield.c_accessor_name + '(' + prefix + ')'> - return field_mapping(expr.lenfield_name) - elif expr.lenfield_name is not None: + if expr.lenfield_name is not None: return lenfield_name else: return str(expr.nmemb) @@ -1478,9 +1684,65 @@ def _c_accessor_get_expr(expr, field_mapping): raise Exception("list field '%s' referenced by sumof not found" % expr.lenfield_name) list_name = field_mapping[field.c_field_name][0] c_length_func = "%s(%s)" % (field.c_length_name, list_name) - # note: xcb_sumof() has only been defined for integers c_length_func = _c_accessor_get_expr(field.type.expr, field_mapping) - return 'xcb_sumof(%s, %s)' % (list_name, c_length_func) + # create explicit code for computing the sum. + # This works for all C-types which can be added to int64_t with += + _c_pre.start() + lengthvar = _c_pre.get_tempvarname() + loopvar = _c_pre.get_tempvarname() + sumvar = _c_pre.get_tempvarname() + listvar = _c_pre.get_tempvarname() + _c_pre.tempvar("int %s; /* sumof length */", lengthvar) + _c_pre.tempvar("int %s; /* sumof loop counter */", loopvar) + _c_pre.tempvar("int64_t %s; /* sumof sum */", sumvar) + _c_pre.tempvar("const %s* %s; /* sumof list ptr */", field.c_field_type, listvar) + _c_pre.code("/* sumof start */") + _c_pre.code("%s = %s;", lengthvar, c_length_func) + _c_pre.code("%s = 0;", sumvar) + _c_pre.code("%s = %s;", listvar, list_name) + _c_pre.code("for (%s = 0; %s < %s; %s++) {", loopvar, loopvar, lengthvar, loopvar) + _c_pre.indent() + + # define and set xcb_listelement, so that it can be used by + # listelement-ref expressions. + if expr.contains_listelement_ref: + _c_pre.code( + "const %s *xcb_listelement = %s;", + field.c_field_type, listvar) + + # summation + if expr.rhs is None: + _c_pre.code("%s += *%s;", sumvar, listvar) + else: + # sumof has a nested expression which has to be evaluated in + # the context of this list element + + # field mapping for the subexpression needs to include + # the fields of the list-member type + scoped_field_mapping = field_mapping.copy() + if not field.type.member.is_simple: + scoped_field_mapping.update( + _c_helper_field_mapping( + field.type.member, + [(listvar, '->', field.type.member)])) + + # cause pre-code of the subexpression be added right here + _c_pre.end() + # compute the subexpression + rhs_expr_str = _c_accessor_get_expr(expr.rhs, scoped_field_mapping) + # resume with our code + _c_pre.start() + # output the summation expression + _c_pre.code("%s += %s;", sumvar, rhs_expr_str) + + _c_pre.code("%s++;", listvar) + _c_pre.pop_indent() + _c_pre.code("}") + _c_pre.code("/* sumof end. Result is in %s */", sumvar) + _c_pre.end() + return sumvar + elif expr.op == 'listelement-ref': + return '(*xcb_listelement)' elif expr.op != None: return ('(' + _c_accessor_get_expr(expr.lhs, field_mapping) + ' ' + expr.op + ' ' + @@ -1610,6 +1872,29 @@ def _c_accessors_list(self, field): # auxiliary object for 'S' parameter S_obj = parents[1] + # for functions generated below: + # * compute list of additional parameters which contains as parameter + # any expr fields that cannot be resolved within self and descendants. + # * and make sure that they are accessed without prefix within the function. + unresolved_fields = resolve_expr_fields_list(list, parents) + additional_params = [] + additional_param_names = set(); + for f in unresolved_fields: + if f.c_field_name not in additional_param_names: + # add to the list of additional params + additional_params.append((f.c_field_type, f.c_field_name)); + # make sure that the param is accessed without prefix within the function + fields[ f.c_field_name ] = (f.c_field_name, f) + + # internal function to compute the parameterlist with given indentation + # such that the formatting of the additional parameters is consistent with + # the other parameters. + def additional_params_to_str(indent): + if len(additional_params) == 0: + return '' + else: + return (',\n' + indent).join([''] + ['%s %s /**< */' % p for p in additional_params]) + _h_setlevel(1) _c_setlevel(1) if list.member.fixed_size(): @@ -1640,31 +1925,32 @@ def _c_accessors_list(self, field): _hc('') _hc('int') + spacing = ' '*(len(field.c_length_name)+2) + add_param_str = additional_params_to_str(spacing) if switch_obj is not None: _hc('%s (const %s *R /**< */,', field.c_length_name, R_obj.c_type) - spacing = ' '*(len(field.c_length_name)+2) - _h('%sconst %s *S /**< */);', spacing, S_obj.c_type) - _c('%sconst %s *S /**< */)', spacing, S_obj.c_type) - length = _c_accessor_get_expr(field.type.expr, fields) + _h('%sconst %s *S /**< */%s);', spacing, S_obj.c_type, add_param_str) + _c('%sconst %s *S /**< */%s)', spacing, S_obj.c_type, add_param_str) else: - _h('%s (const %s *R /**< */);', field.c_length_name, c_type) - _c('%s (const %s *R /**< */)', field.c_length_name, c_type) - length = _c_accessor_get_expr(field.type.expr, fields) + _h('%s (const %s *R /**< */%s);', field.c_length_name, c_type, add_param_str) + _c('%s (const %s *R /**< */%s)', field.c_length_name, c_type, add_param_str) _c('{') + length = _c_accessor_get_expr(field.type.expr, fields) _c(' return %s;', length) _c('}') if field.type.member.is_simple: _hc('') _hc('xcb_generic_iterator_t') + spacing = ' '*(len(field.c_end_name)+2) + add_param_str = additional_params_to_str(spacing) if switch_obj is not None: _hc('%s (const %s *R /**< */,', field.c_end_name, R_obj.c_type) - spacing = ' '*(len(field.c_end_name)+2) - _h('%sconst %s *S /**< */);', spacing, S_obj.c_type) - _c('%sconst %s *S /**< */)', spacing, S_obj.c_type) + _h('%sconst %s *S /**< */%s);', spacing, S_obj.c_type, add_param_str) + _c('%sconst %s *S /**< */%s)', spacing, S_obj.c_type, add_param_str) else: - _h('%s (const %s *R /**< */);', field.c_end_name, c_type) - _c('%s (const %s *R /**< */)', field.c_end_name, c_type) + _h('%s (const %s *R /**< */%s);', field.c_end_name, c_type, add_param_str) + _c('%s (const %s *R /**< */%s)', field.c_end_name, c_type, add_param_str) _c('{') _c(' xcb_generic_iterator_t i;') @@ -1689,21 +1975,27 @@ def _c_accessors_list(self, field): else: _hc('') _hc('%s', field.c_iterator_type) + spacing = ' '*(len(field.c_iterator_name)+2) + add_param_str = additional_params_to_str(spacing) if switch_obj is not None: _hc('%s (const %s *R /**< */,', field.c_iterator_name, R_obj.c_type) - spacing = ' '*(len(field.c_iterator_name)+2) - _h('%sconst %s *S /**< */);', spacing, S_obj.c_type) - _c('%sconst %s *S /**< */)', spacing, S_obj.c_type) + _h('%sconst %s *S /**< */%s);', spacing, S_obj.c_type, add_param_str) + _c('%sconst %s *S /**< */%s)', spacing, S_obj.c_type, add_param_str) else: - _h('%s (const %s *R /**< */);', field.c_iterator_name, c_type) - _c('%s (const %s *R /**< */)', field.c_iterator_name, c_type) + _h('%s (const %s *R /**< */%s);', field.c_iterator_name, c_type, add_param_str) + _c('%s (const %s *R /**< */%s)', field.c_iterator_name, c_type, add_param_str) _c('{') _c(' %s i;', field.c_iterator_type) + _c_pre.start() + length_expr_str = _c_accessor_get_expr(field.type.expr, fields) + if switch_obj is not None: + _c_pre.end() _c(' i.data = %s;', fields[field.c_field_name][0]) - _c(' i.rem = %s;', _c_accessor_get_expr(field.type.expr, fields)) + _c(' i.rem = %s;', length_expr_str) elif field.prev_varsized_field == None: + _c_pre.end() _c(' i.data = (%s *) (R + 1);', field.c_field_type) else: (prev_varsized_field, align_pad) = get_align_pad(field) @@ -1714,12 +2006,20 @@ def _c_accessors_list(self, field): _c(' xcb_generic_iterator_t prev = %s;', _c_iterator_get_end(prev_varsized_field, 'R')) + _c_pre.end() _c(' i.data = (%s *) ((char *) prev.data + %s);', field.c_field_type, align_pad) if switch_obj is None: - _c(' i.rem = %s;', _c_accessor_get_expr(field.type.expr, fields)) + _c(' i.rem = %s;', length_expr_str) _c(' i.index = (char *) i.data - (char *) %s;', 'R' if switch_obj is None else 'S' ) + + # initialize additional iterator fields which are derived from + # additional type parameters for the list member type. + additional_iter_fields = _c_get_additional_type_params(field.type.member) + for iter_field in additional_iter_fields: + _c(' i.%s = %s;', iter_field[2], fields[iter_field[2]][0]) + _c(' return i;') _c('}') @@ -1735,9 +2035,9 @@ def _c_accessors(self, name, base): if True: for field in self.fields: if not field.type.is_pad: - if field.type.is_list and not field.type.fixed_size(): + if _c_field_needs_list_accessor(field): _c_accessors_list(self, field) - elif field.prev_varsized_field is not None or not field.type.fixed_size(): + elif _c_field_needs_field_accessor(field): _c_accessors_field(self, field) def c_simple(self, name): @@ -2838,6 +3138,7 @@ def c_request(self, name): if self.c_need_aux: _c_request_helper(self, name, 'xcb_void_cookie_t', True, False, True) _c_request_helper(self, name, 'xcb_void_cookie_t', True, True, True) + _c_accessors(self, name, name) # We generate the manpage afterwards because _c_type_setup has been called. # TODO: what about aux helpers? @@ -2871,7 +3172,18 @@ def c_event(self, name): force_packed = any(f.type.size == 8 and f.type.is_simple for f in self.fields[(idx+1):]) break - _c_type_setup(self, name, ('event',)) + if self.name == name: + _c_type_setup(self, name, ('event',)) + # generate accessors + # (needed for fields after var-sized fields, for lists with var-sized elements, + # switches, ...) + _c_accessors(self, name, name) + else: + # no type-setup needed for eventcopies + # (the type-setup of an eventcopy would overwrite members of the original + # event, and it would create sizeof-etc funtions which + # called undefined accessor functions) + pass # Opcode define _c_opcode(name, self.opcodes[name]) @@ -2884,6 +3196,22 @@ def c_event(self, name): _h('') _h('typedef %s %s;', _t(self.name + ('event',)), _t(name + ('event',))) + # Create sizeof-function for eventcopies for compatibility reasons + if self.c_need_sizeof: + _h_setlevel(1) + _c_setlevel(1) + _h('') + _h('int') + _h('%s (const void *_buffer /**< */);', _n(name + ('sizeof',))) + _c('') + _c('int') + _c('%s (const void *_buffer /**< */)', _n(name + ('sizeof',))) + _c('{'); + _c(' return %s(_buffer);', _n(self.name + ('sizeof',))) + _c('}'); + _h_setlevel(0) + _c_setlevel(0) + _man_event(self, name) def c_error(self, name): diff --git a/libxcb/xcb-proto/doc/xml-xcb.txt b/libxcb/xcb-proto/doc/xml-xcb.txt index 235958de3..f8129ea9c 100644 --- a/libxcb/xcb-proto/doc/xml-xcb.txt +++ b/libxcb/xcb-proto/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 @@ -322,10 +339,26 @@ 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. +<listelement-ref/> + + This element represents the current list-element when used inside + a list-iteration expression such as <sumof>. + Documentation ------------- diff --git a/libxcb/xcb-proto/src/present.xml b/libxcb/xcb-proto/src/present.xml index a9adc2ba8..95fee0181 100644 --- a/libxcb/xcb-proto/src/present.xml +++ b/libxcb/xcb-proto/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> diff --git a/libxcb/xcb-proto/src/render.xml b/libxcb/xcb-proto/src/render.xml index 55b73f7b8..c54608e72 100644 --- a/libxcb/xcb-proto/src/render.xml +++ b/libxcb/xcb-proto/src/render.xml @@ -280,16 +280,122 @@ for licensing information. <field type="PICTURE" name="pid" /> <field type="DRAWABLE" name="drawable" /> <field type="PICTFORMAT" name="format" /> - <valueparam value-mask-type="CARD32" - value-mask-name="value_mask" - value-list-name="value_list" /> + <field type="CARD32" name="value_mask" mask="CP"/> + <switch name="value_list"> + <fieldref>value_mask</fieldref> + <bitcase> + <enumref ref="CP">Repeat</enumref> + <field type="CARD32" name="repeat" enum="Repeat"/> + </bitcase> + <bitcase> + <enumref ref="CP">AlphaMap</enumref> + <field type="PICTURE" name="alphamap" /> + </bitcase> + <bitcase> + <enumref ref="CP">AlphaXOrigin</enumref> + <field type="INT32" name="alphaxorigin" /> + </bitcase> + <bitcase> + <enumref ref="CP">AlphaYOrigin</enumref> + <field type="INT32" name="alphayorigin" /> + </bitcase> + <bitcase> + <enumref ref="CP">ClipXOrigin</enumref> + <field type="INT32" name="clipxorigin" /> + </bitcase> + <bitcase> + <enumref ref="CP">ClipYOrigin</enumref> + <field type="INT32" name="clipyorigin" /> + </bitcase> + <bitcase> + <enumref ref="CP">ClipMask</enumref> + <field type="PIXMAP" name="clipmask" /> + </bitcase> + <bitcase> + <enumref ref="CP">GraphicsExposure</enumref> + <field type="CARD32" name="graphicsexposure" /> + </bitcase> + <bitcase> + <enumref ref="CP">SubwindowMode</enumref> + <field type="CARD32" name="subwindowmode" enum="SubwindowMode"/> + </bitcase> + <bitcase> + <enumref ref="CP">PolyEdge</enumref> + <field type="CARD32" name="polyedge" enum="PolyEdge"/> + </bitcase> + <bitcase> + <enumref ref="CP">PolyMode</enumref> + <field type="CARD32" name="polymode" enum="PolyMode"/> + </bitcase> + <bitcase> + <enumref ref="CP">Dither</enumref> + <field type="ATOM" name="dither" /> + </bitcase> + <bitcase> + <enumref ref="CP">ComponentAlpha</enumref> + <field type="CARD32" name="componentalpha" /> + </bitcase> + </switch> </request> <request name="ChangePicture" opcode="5"> <field type="PICTURE" name="picture" /> - <valueparam value-mask-type="CARD32" - value-mask-name="value_mask" - value-list-name="value_list" /> + <field type="CARD32" name="value_mask" mask="CP"/> + <switch name="value_list"> + <fieldref>value_mask</fieldref> + <bitcase> + <enumref ref="CP">Repeat</enumref> + <field type="CARD32" name="repeat" enum="Repeat"/> + </bitcase> + <bitcase> + <enumref ref="CP">AlphaMap</enumref> + <field type="PICTURE" name="alphamap" /> + </bitcase> + <bitcase> + <enumref ref="CP">AlphaXOrigin</enumref> + <field type="INT32" name="alphaxorigin" /> + </bitcase> + <bitcase> + <enumref ref="CP">AlphaYOrigin</enumref> + <field type="INT32" name="alphayorigin" /> + </bitcase> + <bitcase> + <enumref ref="CP">ClipXOrigin</enumref> + <field type="INT32" name="clipxorigin" /> + </bitcase> + <bitcase> + <enumref ref="CP">ClipYOrigin</enumref> + <field type="INT32" name="clipyorigin" /> + </bitcase> + <bitcase> + <enumref ref="CP">ClipMask</enumref> + <field type="PIXMAP" name="clipmask" /> + </bitcase> + <bitcase> + <enumref ref="CP">GraphicsExposure</enumref> + <field type="CARD32" name="graphicsexposure" /> + </bitcase> + <bitcase> + <enumref ref="CP">SubwindowMode</enumref> + <field type="CARD32" name="subwindowmode" enum="SubwindowMode"/> + </bitcase> + <bitcase> + <enumref ref="CP">PolyEdge</enumref> + <field type="CARD32" name="polyedge" enum="PolyEdge"/> + </bitcase> + <bitcase> + <enumref ref="CP">PolyMode</enumref> + <field type="CARD32" name="polymode" enum="PolyMode"/> + </bitcase> + <bitcase> + <enumref ref="CP">Dither</enumref> + <field type="ATOM" name="dither" /> + </bitcase> + <bitcase> + <enumref ref="CP">ComponentAlpha</enumref> + <field type="CARD32" name="componentalpha" /> + </bitcase> + </switch> </request> <request name="SetPictureClipRectangles" opcode="6"> diff --git a/libxcb/xcb-proto/src/screensaver.xml b/libxcb/xcb-proto/src/screensaver.xml index 491869e81..8d5abb43d 100644 --- a/libxcb/xcb-proto/src/screensaver.xml +++ b/libxcb/xcb-proto/src/screensaver.xml @@ -95,9 +95,71 @@ Draft Standard Version 1.1 <field type="BYTE" name="class" enum="WindowClass"/> <field type="CARD8" name="depth"/> <field type="VISUALID" name="visual"/> - <valueparam value-mask-type="CARD32" - value-mask-name="value_mask" - value-list-name="value_list" /> + <field type="CARD32" name="value_mask" mask="CW" /> + <switch name="value_list"> + <fieldref>value_mask</fieldref> + <bitcase> + <enumref ref="CW">BackPixmap</enumref> + <field type="PIXMAP" name="background_pixmap" altenum="BackPixmap"/> + </bitcase> + <bitcase> + <enumref ref="CW">BackPixel</enumref> + <field type="CARD32" name="background_pixel" /> + </bitcase> + <bitcase> + <enumref ref="CW">BorderPixmap</enumref> + <field type="PIXMAP" name="border_pixmap" altenum="Pixmap"/> + </bitcase> + <bitcase> + <enumref ref="CW">BorderPixel</enumref> + <field type="CARD32" name="border_pixel" /> + </bitcase> + <bitcase> + <enumref ref="CW">BitGravity</enumref> + <field type="CARD32" name="bit_gravity" enum="Gravity"/> + </bitcase> + <bitcase> + <enumref ref="CW">WinGravity</enumref> + <field type="CARD32" name="win_gravity" enum="Gravity"/> + </bitcase> + <bitcase> + <enumref ref="CW">BackingStore</enumref> + <field type="CARD32" name="backing_store" enum="BackingStore"/> + </bitcase> + <bitcase> + <enumref ref="CW">BackingPlanes</enumref> + <field type="CARD32" name="backing_planes" /> + </bitcase> + <bitcase> + <enumref ref="CW">BackingPixel</enumref> + <field type="CARD32" name="backing_pixel" /> + </bitcase> + <bitcase> + <enumref ref="CW">OverrideRedirect</enumref> + <field type="BOOL32" name="override_redirect" /> + </bitcase> + <bitcase> + <enumref ref="CW">SaveUnder</enumref> + <field type="BOOL32" name="save_under" /> + </bitcase> + <bitcase> + <enumref ref="CW">EventMask</enumref> + <field type="CARD32" name="event_mask" mask="EventMask"/> + </bitcase> + <bitcase> + <enumref ref="CW">DontPropagate</enumref> + <field type="CARD32" name="do_not_propogate_mask" mask="EventMask"/> + </bitcase> + <bitcase> + <enumref ref="CW">Colormap</enumref> + <field type="COLORMAP" name="colormap" altenum="Colormap"/> + </bitcase> + <bitcase> + <enumref ref="CW">Cursor</enumref> + <field type="CURSOR" name="cursor" altenum="Cursor"/> + </bitcase> + </switch> + </request> <request name="UnsetAttributes" opcode="4"> diff --git a/libxcb/xcb-proto/src/xcb.xsd b/libxcb/xcb-proto/src/xcb.xsd index 85f5bc2af..c1dce3e1e 100644 --- a/libxcb/xcb-proto/src/xcb.xsd +++ b/libxcb/xcb-proto/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> @@ -162,9 +171,13 @@ 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> + <xsd:element name="listelement-ref" /> <xsd:element name="value" type="xsd:integer" /> <xsd:element name="bit" type="bitType" /> </xsd:choice> @@ -182,15 +195,6 @@ authorization from the authors. </xsd:complexType> </xsd:element> - <!-- BITMASK/LISTofVALUE parameter pairs. --> - <xsd:element name="valueparam"> - <xsd:complexType> - <xsd:attribute name="value-mask-type" type="xsd:string" use="required" /> - <xsd:attribute name="value-mask-name" type="xsd:string" use="required" /> - <xsd:attribute name="value-list-name" type="xsd:string" use="required" /> - </xsd:complexType> - </xsd:element> - <xsd:group name="fields"> <xsd:choice> <xsd:element ref="pad" /> @@ -296,7 +300,6 @@ authorization from the authors. <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:group ref="fields" /> <xsd:element ref="exprfield" /> - <xsd:element ref="valueparam" /> </xsd:choice> <xsd:choice minOccurs="0" maxOccurs="1"> <xsd:element ref="switch" /> @@ -306,7 +309,6 @@ authorization from the authors. <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" /> diff --git a/libxcb/xcb-proto/src/xfixes.xml b/libxcb/xcb-proto/src/xfixes.xml index c5cba352a..0a3d5ffee 100644 --- a/libxcb/xcb-proto/src/xfixes.xml +++ b/libxcb/xcb-proto/src/xfixes.xml @@ -291,13 +291,13 @@ authorization from the authors. <field type="ATOM" name="cursor_atom" altenum="Atom" /> <field type="CARD16" name="nbytes" /> <pad bytes="2" /> - <list type="char" name="name"><fieldref>nbytes</fieldref></list> <list type="CARD32" name="cursor_image"> <op op="*"> <fieldref>width</fieldref> <fieldref>height</fieldref> </op> </list> + <list type="char" name="name"><fieldref>nbytes</fieldref></list> </reply> </request> diff --git a/libxcb/xcb-proto/src/xinput.xml b/libxcb/xcb-proto/src/xinput.xml index 7f7b0a66d..c729f20fb 100644 --- a/libxcb/xcb-proto/src/xinput.xml +++ b/libxcb/xcb-proto/src/xinput.xml @@ -46,56 +46,10 @@ 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, ... ) -* ChangeDeviceControl request field "control" ( structs ChangeDeviceControl, ... ) -* XIChangeHierarchy request field "changes" ( structs HierarchyChange, ... ) -* struct XIDeviceInfo field "classes" ( structs DeviceClass, ... ) * SendExtensionEvent member "events" ***** -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 - - -***** - -<sumof> should support fields of listmembers. - -This is needed for request "ListInputDevices" - -***** - -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 -"num_axes" of the GetDeviceMotionEvents-reply -in struct DeviceTimeCoord. - -***** - --> @@ -217,6 +171,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 +211,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> @@ -346,8 +329,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"> @@ -361,7 +345,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> @@ -609,12 +595,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"> @@ -696,12 +726,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"> @@ -1025,12 +1094,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"> @@ -1099,12 +1209,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"> @@ -1205,30 +1351,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> @@ -1356,15 +1498,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"> @@ -1560,16 +1724,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"> @@ -1776,28 +1980,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> @@ -1828,30 +2028,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> @@ -2092,8 +2288,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" /> @@ -2128,8 +2329,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" /> @@ -2248,10 +2454,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" /> @@ -2269,10 +2485,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" /> @@ -2311,8 +2537,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" /> @@ -2351,10 +2582,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" /> diff --git a/libxcb/xcb-proto/src/xprint.xml b/libxcb/xcb-proto/src/xprint.xml index e32293f3b..dc23dd0da 100644 --- a/libxcb/xcb-proto/src/xprint.xml +++ b/libxcb/xcb-proto/src/xprint.xml @@ -209,21 +209,14 @@ authorization from the authors. <request name="PrintSelectInput" opcode="15"> <field type="PCONTEXT" name="context" /> - <valueparam value-mask-type="CARD32" - value-mask-name="event_mask" - value-list-name="event_list" /> + <field type="CARD32" name="event_mask" /> </request> <request name="PrintInputSelected" opcode="16"> <field type="PCONTEXT" name="context" /> <reply> - <pad bytes="1" /> - <valueparam value-mask-type="CARD32" - value-mask-name="event_mask" - value-list-name="event_list" /> - <valueparam value-mask-type="CARD32" - value-mask-name="all_events_mask" - value-list-name="all_events_list" /> + <field type="CARD32" name="event_mask" /> + <field type="CARD32" name="all_events_mask" /> </reply> </request> diff --git a/libxcb/xcb-proto/src/xproto.xml b/libxcb/xcb-proto/src/xproto.xml index bfb8a4cff..d50a4285a 100644 --- a/libxcb/xcb-proto/src/xproto.xml +++ b/libxcb/xcb-proto/src/xproto.xml @@ -57,6 +57,7 @@ authorization from the authors. <type>GCONTEXT</type> </xidunion> + <typedef oldname="CARD32" newname="BOOL32" /> <typedef oldname="CARD32" newname="VISUALID" /> <typedef oldname="CARD32" newname="TIMESTAMP" /> @@ -64,6 +65,8 @@ authorization from the authors. <typedef oldname="CARD32" newname="KEYSYM" /> <typedef oldname="CARD8" newname="KEYCODE" /> + + <typedef oldname="CARD32" newname="KEYCODE32" /> <typedef oldname="CARD8" newname="BUTTON" /> @@ -1293,9 +1296,71 @@ parent's cursor will cause an immediate change in the displayed cursor. <field type="CARD16" name="border_width" /> <field type="CARD16" name="class" enum="WindowClass" /> <field type="VISUALID" name="visual" /> - <valueparam value-mask-type="CARD32" - value-mask-name="value_mask" - value-list-name="value_list" /> + <field type="CARD32" name="value_mask" mask="CW" /> + <switch name="value_list"> + <fieldref>value_mask</fieldref> + <bitcase> + <enumref ref="CW">BackPixmap</enumref> + <field type="PIXMAP" name="background_pixmap" altenum="BackPixmap"/> + </bitcase> + <bitcase> + <enumref ref="CW">BackPixel</enumref> + <field type="CARD32" name="background_pixel" /> + </bitcase> + <bitcase> + <enumref ref="CW">BorderPixmap</enumref> + <field type="PIXMAP" name="border_pixmap" altenum="Pixmap"/> + </bitcase> + <bitcase> + <enumref ref="CW">BorderPixel</enumref> + <field type="CARD32" name="border_pixel" /> + </bitcase> + <bitcase> + <enumref ref="CW">BitGravity</enumref> + <field type="CARD32" name="bit_gravity" enum="Gravity"/> + </bitcase> + <bitcase> + <enumref ref="CW">WinGravity</enumref> + <field type="CARD32" name="win_gravity" enum="Gravity"/> + </bitcase> + <bitcase> + <enumref ref="CW">BackingStore</enumref> + <field type="CARD32" name="backing_store" enum="BackingStore"/> + </bitcase> + <bitcase> + <enumref ref="CW">BackingPlanes</enumref> + <field type="CARD32" name="backing_planes" /> + </bitcase> + <bitcase> + <enumref ref="CW">BackingPixel</enumref> + <field type="CARD32" name="backing_pixel" /> + </bitcase> + <bitcase> + <enumref ref="CW">OverrideRedirect</enumref> + <field type="BOOL32" name="override_redirect" /> + </bitcase> + <bitcase> + <enumref ref="CW">SaveUnder</enumref> + <field type="BOOL32" name="save_under" /> + </bitcase> + <bitcase> + <enumref ref="CW">EventMask</enumref> + <field type="CARD32" name="event_mask" mask="EventMask"/> + </bitcase> + <bitcase> + <enumref ref="CW">DontPropagate</enumref> + <field type="CARD32" name="do_not_propogate_mask" mask="EventMask"/> + </bitcase> + <bitcase> + <enumref ref="CW">Colormap</enumref> + <field type="COLORMAP" name="colormap" altenum="Colormap"/> + </bitcase> + <bitcase> + <enumref ref="CW">Cursor</enumref> + <field type="CURSOR" name="cursor" altenum="Cursor"/> + </bitcase> + </switch> + <doc> <brief>Creates a window</brief> <description><![CDATA[ @@ -1374,9 +1439,71 @@ The X server could not allocate the requested resources (no memory?). <request name="ChangeWindowAttributes" opcode="2"> <pad bytes="1" /> <field type="WINDOW" name="window" /> - <valueparam value-mask-type="CARD32" - value-mask-name="value_mask" - value-list-name="value_list" /> + <field type="CARD32" name="value_mask" mask="CW" /> + <switch name="value_list"> + <fieldref>value_mask</fieldref> + <bitcase> + <enumref ref="CW">BackPixmap</enumref> + <field type="PIXMAP" name="background_pixmap" altenum="BackPixmap"/> + </bitcase> + <bitcase> + <enumref ref="CW">BackPixel</enumref> + <field type="CARD32" name="background_pixel" /> + </bitcase> + <bitcase> + <enumref ref="CW">BorderPixmap</enumref> + <field type="PIXMAP" name="border_pixmap" altenum="Pixmap"/> + </bitcase> + <bitcase> + <enumref ref="CW">BorderPixel</enumref> + <field type="CARD32" name="border_pixel" /> + </bitcase> + <bitcase> + <enumref ref="CW">BitGravity</enumref> + <field type="CARD32" name="bit_gravity" enum="Gravity"/> + </bitcase> + <bitcase> + <enumref ref="CW">WinGravity</enumref> + <field type="CARD32" name="win_gravity" enum="Gravity"/> + </bitcase> + <bitcase> + <enumref ref="CW">BackingStore</enumref> + <field type="CARD32" name="backing_store" enum="BackingStore"/> + </bitcase> + <bitcase> + <enumref ref="CW">BackingPlanes</enumref> + <field type="CARD32" name="backing_planes" /> + </bitcase> + <bitcase> + <enumref ref="CW">BackingPixel</enumref> + <field type="CARD32" name="backing_pixel" /> + </bitcase> + <bitcase> + <enumref ref="CW">OverrideRedirect</enumref> + <field type="BOOL32" name="override_redirect" /> + </bitcase> + <bitcase> + <enumref ref="CW">SaveUnder</enumref> + <field type="BOOL32" name="save_under" /> + </bitcase> + <bitcase> + <enumref ref="CW">EventMask</enumref> + <field type="CARD32" name="event_mask" mask="EventMask"/> + </bitcase> + <bitcase> + <enumref ref="CW">DontPropagate</enumref> + <field type="CARD32" name="do_not_propogate_mask" mask="EventMask"/> + </bitcase> + <bitcase> + <enumref ref="CW">Colormap</enumref> + <field type="COLORMAP" name="colormap" altenum="Colormap"/> + </bitcase> + <bitcase> + <enumref ref="CW">Cursor</enumref> + <field type="CURSOR" name="cursor" altenum="Cursor"/> + </bitcase> + </switch> + <doc> <brief>change window attributes</brief> <description><![CDATA[ @@ -1689,11 +1816,40 @@ The specified window does not exist. <request name="ConfigureWindow" opcode="12"> <pad bytes="1" /> <field type="WINDOW" name="window" /> - <field type="CARD16" name="value_mask" /> + <field type="CARD16" name="value_mask" mask="ConfigWindow" /> <pad bytes="2" /> - <valueparam value-mask-type="CARD16" - value-mask-name="value_mask" - value-list-name="value_list" /> + <switch name="value_list"> + <fieldref>value_mask</fieldref> + <bitcase> + <enumref ref="ConfigWindow">X</enumref> + <field type="INT32" name="x" /> + </bitcase> + <bitcase> + <enumref ref="ConfigWindow">Y</enumref> + <field type="INT32" name="y" /> + </bitcase> + <bitcase> + <enumref ref="ConfigWindow">Width</enumref> + <field type="CARD32" name="width" /> + </bitcase> + <bitcase> + <enumref ref="ConfigWindow">Height</enumref> + <field type="CARD32" name="height" /> + </bitcase> + <bitcase> + <enumref ref="ConfigWindow">BorderWidth</enumref> + <field type="CARD32" name="border_width" /> + </bitcase> + <bitcase> + <enumref ref="ConfigWindow">Sibling</enumref> + <field type="WINDOW" name="sibling" altenum="Window"/> + </bitcase> + <bitcase> + <enumref ref="ConfigWindow">StackMode</enumref> + <field type="CARD32" name="stack_mode" enum="StackMode"/> + </bitcase> + </switch> + <doc> <brief>Configures window attributes</brief> <description><![CDATA[ @@ -3883,9 +4039,102 @@ TODO <pad bytes="1" /> <field type="GCONTEXT" name="cid" /> <field type="DRAWABLE" name="drawable" /> - <valueparam value-mask-type="CARD32" - value-mask-name="value_mask" - value-list-name="value_list" /> + <field type="CARD32" name="value_mask" mask="GC" /> + <switch name="value_list"> + <fieldref>value_mask</fieldref> + <bitcase> + <enumref ref="GC">Function</enumref> + <field type="CARD32" name="function" enum="GX"/> + </bitcase> + <bitcase> + <enumref ref="GC">PlaneMask</enumref> + <field type="CARD32" name="plane_mask" /> + </bitcase> + <bitcase> + <enumref ref="GC">Foreground</enumref> + <field type="CARD32" name="foreground" /> + </bitcase> + <bitcase> + <enumref ref="GC">Background</enumref> + <field type="CARD32" name="background" /> + </bitcase> + <bitcase> + <enumref ref="GC">LineWidth</enumref> + <field type="CARD32" name="line_width" /> + </bitcase> + <bitcase> + <enumref ref="GC">LineStyle</enumref> + <field type="CARD32" name="line_style" enum="LineStyle"/> + </bitcase> + <bitcase> + <enumref ref="GC">CapStyle</enumref> + <field type="CARD32" name="cap_style" enum="CapStyle"/> + </bitcase> + <bitcase> + <enumref ref="GC">JoinStyle</enumref> + <field type="CARD32" name="join_style" enum="JoinStyle"/> + </bitcase> + <bitcase> + <enumref ref="GC">FillStyle</enumref> + <field type="CARD32" name="fill_style" enum="FillStyle"/> + </bitcase> + <bitcase> + <enumref ref="GC">FillRule</enumref> + <field type="CARD32" name="fill_rule" enum="FillRule"/> + </bitcase> + <bitcase> + <enumref ref="GC">Tile</enumref> + <field type="PIXMAP" name="tile" altenum="Pixmap"/> + </bitcase> + <bitcase> + <enumref ref="GC">Stipple</enumref> + <field type="PIXMAP" name="stipple" altenum="Pixmap"/> + </bitcase> + <bitcase> + <enumref ref="GC">TileStippleOriginX</enumref> + <field type="INT32" name="tile_stipple_x_origin" /> + </bitcase> + <bitcase> + <enumref ref="GC">TileStippleOriginY</enumref> + <field type="INT32" name="tile_stipple_y_origin" /> + </bitcase> + <bitcase> + <enumref ref="GC">Font</enumref> + <field type="FONT" name="font" altenum="Font"/> + </bitcase> + <bitcase> + <enumref ref="GC">SubwindowMode</enumref> + <field type="CARD32" name="subwindow_mode" enum="SubwindowMode"/> + </bitcase> + <bitcase> + <enumref ref="GC">GraphicsExposures</enumref> + <field type="BOOL32" name="graphics_exposures" /> + </bitcase> + <bitcase> + <enumref ref="GC">ClipOriginX</enumref> + <field type="INT32" name="clip_x_origin" /> + </bitcase> + <bitcase> + <enumref ref="GC">ClipOriginY</enumref> + <field type="INT32" name="clip_y_origin" /> + </bitcase> + <bitcase> + <enumref ref="GC">ClipMask</enumref> + <field type="PIXMAP" name="clip_mask" altenum="Pixmap"/> + </bitcase> + <bitcase> + <enumref ref="GC">DashOffset</enumref> + <field type="CARD32" name="dash_offset" /> + </bitcase> + <bitcase> + <enumref ref="GC">DashList</enumref> + <field type="CARD32" name="dashes" /> + </bitcase> + <bitcase> + <enumref ref="GC">ArcMode</enumref> + <field type="CARD32" name="arc_mode" enum="ArcMode"/> + </bitcase> + </switch> <doc> <brief>Creates a graphics context</brief> <description><![CDATA[ @@ -3924,9 +4173,102 @@ The X server could not allocate the requested resources (no memory?). <request name="ChangeGC" opcode="56"> <pad bytes="1" /> <field type="GCONTEXT" name="gc" /> - <valueparam value-mask-type="CARD32" - value-mask-name="value_mask" - value-list-name="value_list" /> + <field type="CARD32" name="value_mask" mask="GC" /> + <switch name="value_list"> + <fieldref>value_mask</fieldref> + <bitcase> + <enumref ref="GC">Function</enumref> + <field type="CARD32" name="function" enum="GX"/> + </bitcase> + <bitcase> + <enumref ref="GC">PlaneMask</enumref> + <field type="CARD32" name="plane_mask" /> + </bitcase> + <bitcase> + <enumref ref="GC">Foreground</enumref> + <field type="CARD32" name="foreground" /> + </bitcase> + <bitcase> + <enumref ref="GC">Background</enumref> + <field type="CARD32" name="background" /> + </bitcase> + <bitcase> + <enumref ref="GC">LineWidth</enumref> + <field type="CARD32" name="line_width" /> + </bitcase> + <bitcase> + <enumref ref="GC">LineStyle</enumref> + <field type="CARD32" name="line_style" enum="LineStyle"/> + </bitcase> + <bitcase> + <enumref ref="GC">CapStyle</enumref> + <field type="CARD32" name="cap_style" enum="CapStyle"/> + </bitcase> + <bitcase> + <enumref ref="GC">JoinStyle</enumref> + <field type="CARD32" name="join_style" enum="JoinStyle"/> + </bitcase> + <bitcase> + <enumref ref="GC">FillStyle</enumref> + <field type="CARD32" name="fill_style" enum="FillStyle"/> + </bitcase> + <bitcase> + <enumref ref="GC">FillRule</enumref> + <field type="CARD32" name="fill_rule" enum="FillRule"/> + </bitcase> + <bitcase> + <enumref ref="GC">Tile</enumref> + <field type="PIXMAP" name="tile" altenum="Pixmap"/> + </bitcase> + <bitcase> + <enumref ref="GC">Stipple</enumref> + <field type="PIXMAP" name="stipple" altenum="Pixmap"/> + </bitcase> + <bitcase> + <enumref ref="GC">TileStippleOriginX</enumref> + <field type="INT32" name="tile_stipple_x_origin" /> + </bitcase> + <bitcase> + <enumref ref="GC">TileStippleOriginY</enumref> + <field type="INT32" name="tile_stipple_y_origin" /> + </bitcase> + <bitcase> + <enumref ref="GC">Font</enumref> + <field type="FONT" name="font" altenum="Font"/> + </bitcase> + <bitcase> + <enumref ref="GC">SubwindowMode</enumref> + <field type="CARD32" name="subwindow_mode" enum="SubwindowMode"/> + </bitcase> + <bitcase> + <enumref ref="GC">GraphicsExposures</enumref> + <field type="BOOL32" name="graphics_exposures" /> + </bitcase> + <bitcase> + <enumref ref="GC">ClipOriginX</enumref> + <field type="INT32" name="clip_x_origin" /> + </bitcase> + <bitcase> + <enumref ref="GC">ClipOriginY</enumref> + <field type="INT32" name="clip_y_origin" /> + </bitcase> + <bitcase> + <enumref ref="GC">ClipMask</enumref> + <field type="PIXMAP" name="clip_mask" altenum="Pixmap"/> + </bitcase> + <bitcase> + <enumref ref="GC">DashOffset</enumref> + <field type="CARD32" name="dash_offset" /> + </bitcase> + <bitcase> + <enumref ref="GC">DashList</enumref> + <field type="CARD32" name="dashes" /> + </bitcase> + <bitcase> + <enumref ref="GC">ArcMode</enumref> + <field type="CARD32" name="arc_mode" enum="ArcMode"/> + </bitcase> + </switch> <doc> <brief>change graphics context components</brief> <description><![CDATA[ @@ -4982,9 +5324,43 @@ sensitive! <request name="ChangeKeyboardControl" opcode="102"> <pad bytes="1" /> - <valueparam value-mask-type="CARD32" - value-mask-name="value_mask" - value-list-name="value_list" /> + <field type="CARD32" name="value_mask" mask="KB" /> + <switch name="value_list"> + <fieldref>value_mask</fieldref> + <bitcase> + <enumref ref="KB">KeyClickPercent</enumref> + <field type="INT32" name="key_click_percent" /> + </bitcase> + <bitcase> + <enumref ref="KB">BellPercent</enumref> + <field type="INT32" name="bell_percent" /> + </bitcase> + <bitcase> + <enumref ref="KB">BellPitch</enumref> + <field type="INT32" name="bell_pitch" /> + </bitcase> + <bitcase> + <enumref ref="KB">BellDuration</enumref> + <field type="INT32" name="bell_duration" /> + </bitcase> + <bitcase> + <enumref ref="KB">Led</enumref> + <field type="CARD32" name="led" /> + </bitcase> + <bitcase> + <enumref ref="KB">LedMode</enumref> + <field type="CARD32" name="led_mode" enum="LedMode"/> + </bitcase> + <bitcase> + <enumref ref="KB">Key</enumref> + <field type="KEYCODE32" name="key" /> + </bitcase> + <bitcase> + <enumref ref="KB">AutoRepeatMode</enumref> + <field type="CARD32" name="auto_repeat_mode" enum="AutoRepeatMode"/> + </bitcase> + </switch> + </request> <request name="GetKeyboardControl" opcode="103"> diff --git a/libxcb/xcb-proto/xcbgen/expr.py b/libxcb/xcb-proto/xcbgen/expr.py index e4fb06e93..e4ee8c6e2 100644 --- a/libxcb/xcb-proto/xcbgen/expr.py +++ b/libxcb/xcb-proto/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): @@ -52,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' @@ -61,12 +64,9 @@ class Expression(object): # Standard list with a fieldref self.lenfield_name = elt.text - elif elt.tag == 'valueparam': - # Value-mask. The length bitmask is described by attributes. - self.lenfield_name = elt.get('value-mask-name') - self.lenfield_type = elt.get('value-mask-type') - self.lenwire = True - self.bitfield = True + elif elt.tag == 'paramref': + self.lenfield_name = elt.text + self.lenfield_type = elt.get('type') elif elt.tag == 'op': # Op field. Need to recurse. @@ -103,6 +103,17 @@ 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) + + 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 @@ -111,6 +122,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]) @@ -127,4 +144,6 @@ class Expression(object): self.lenfield_parent = p self.lenfield_type = fields[self.lenfield_name].field_type break + + self.recursive_resolve_tasks(module, parents) diff --git a/libxcb/xcb-proto/xcbgen/xtypes.py b/libxcb/xcb-proto/xcbgen/xtypes.py index 45d7568f5..4d6bbc031 100644 --- a/libxcb/xcb-proto/xcbgen/xtypes.py +++ b/libxcb/xcb-proto/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): ''' @@ -184,8 +185,6 @@ class ListType(Type): if elt.tag == 'list': elts = list(elt) self.expr = Expression(elts[0] if len(elts) else elt, self) - elif elt.tag == 'valueparam': - self.expr = Expression(elt, self) self.size = member.size if member.fixed_size() else None self.nmemb = self.expr.nmemb if self.expr.fixed_size() else None @@ -328,11 +327,6 @@ class ComplexType(Type): fkey = child.get('type') 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.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 |