On 6 November 2013 01:39, Keith Packard <kei...@keithp.com> wrote: > These are present in the API, but not present on the wire. > > Signed-off-by: Keith Packard <kei...@keithp.com> > --- > xcbgen/expr.py | 3 ++- > xcbgen/xtypes.py | 58 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 59 insertions(+), 2 deletions(-) > > diff --git a/xcbgen/expr.py b/xcbgen/expr.py > index 4f8af6f..f9d5179 100644 > --- a/xcbgen/expr.py > +++ b/xcbgen/expr.py > @@ -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. > ''' > - 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 > @@ -21,6 +21,7 @@ class Field(object): > self.visible = visible > self.wire = wire > self.auto = auto > + self.isfd = isfd > > > class Expression(object): > diff --git a/xcbgen/xtypes.py b/xcbgen/xtypes.py > index 5012f0b..d007635 100644 > --- a/xcbgen/xtypes.py > +++ b/xcbgen/xtypes.py > @@ -75,6 +75,18 @@ class Type(object): > > 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)
Reading this and the code how <fd>s are handled: The <fd> tag is not necessary. It should be an ordinary field - as it gets handled. And if the request causes fds to be attached to the reply, should be an attribute at the request (or reply). Because, atm. <fd> is just a trigger to set a boolean (isfd). c_client.py walks over all fields in the reply (_c_reply_has_fds()), searches for a field having isfd==True - if there's such a field it adds the func_flag 'XCB_REQUEST_REPLY_FDS' and generates an additional function via _c_reply_fds(). You could an FD type: <typedef oldname="INT32" newname="FD" /> replace the <fd>s with: <field type="FD" name="..." /> and add an attribute to the requests (or reply) having such field(s) in the reply. > + # 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): > ''' > @@ -152,6 +164,44 @@ class Enum(SimpleType): > out = __main__.output['enum'] > > > +class FileDescriptor(SimpleType): > ... Is this class a leftover from tests? Looks like it's not used anywhere. > class ListType(Type): > ''' > Derived class which represents a list of some other datatype. Fixed- or > variable-sized. > @@ -279,6 +329,7 @@ class ComplexType(Type): > self.nmemb = 1 > self.size = 0 > self.lenfield_parent = [self] > + self.fds = [] > > def resolve(self, module): > if self.resolved: > @@ -324,9 +375,14 @@ class ComplexType(Type): > 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 > - continue > + continue > > # Get the full type name for the field > field_type = module.get_type_name(fkey) > -- > 1.8.4.2 > > _______________________________________________ > xorg-devel@lists.x.org: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel Regardless of using a <fd> or an attribute it looks like you've forgotten to modify the xml schema. Try `make check-local` in proto/src. _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel