Update to xcb-proto 1.7. Tested by krw@, mpi@, shadchin@

This commit is contained in:
matthieu 2012-03-27 19:12:47 +00:00
parent fd19764796
commit bfe2e894a1
19 changed files with 3398 additions and 51 deletions

View File

@ -1,4 +1,4 @@
# $OpenBSD: Makefile,v 1.4 2010/04/18 19:55:51 matthieu Exp $
# $OpenBSD: Makefile,v 1.5 2012/03/27 19:12:47 matthieu Exp $
PKGCONFIG= xcb-proto.pc
@ -21,6 +21,7 @@ FILES= \
sync.xml \
xc_misc.xml \
xevie.xml \
xkb.xml \
xf86dri.xml \
xfixes.xml \
xinerama.xml \

View File

@ -1,5 +1,37 @@
Release 1.7 (2012-01-11)
========================
* Add missing padding bytes to ChangeKeyboardMapping request
* Corrected type of FakeInput rootX & rootY fields
* Changed Exception message in case of unknown/unhandled XML tags
* xcbgen: perform lenfield lookup within all anchestors
* Add support for new expr tags popcount, enumref, sumof
* Changed handling of anchestor types
* Assign switch name to bitcases
* Support name attribute for bitcases and set BitcaseType.has_name accordingly
* Use absolute imports in xcbgen for Python 3 compatibilit
* dri2: Update to version 1.3 (v2)
* glx: Replace some 'reserved' fields with explicit padding
* glx: Use glx:CONTEXT for share_list parameter of CreateNewContext
* glx: Use FBCONFIG type for fbconfig parameter of CreateNewContext and CreatePixmap
* glx: Add protocol for GLX_ARB_create_context and GLX_ARB_create_context_profile
* Add support for fence sync objects
* xf86dri: fix GetDrawableInfo reply
* xproto: fix TranslateCoordinates reply
* xcbgen: Add unop support
* xf86vidmode: Fix padding expressions
* dri2: Add proper padding before driver_name
* Add libdir/exec_prefix to xcb-xproto.pc
* Revive support for hex literals in protocol
* Add description of new protocol elements
* Add XKEYBOARD protocol description
* Fix ChangeHosts address string
* Fix SetFontPath path string encoding
* Fix some fields name
* Fix XKB GetState missing lookupMods field
* Add RENDER 0.11 definitions
Release 1.6 (2009-12-02)
=======================
========================
* Add DRI2 protocol, based off of dri2proto.h and the server code. (v2)
* xf86dri.xml seems to have been wrong forever. Fixes bug #16894.
* shape: add missing padding bytes to GetRectangles

View File

@ -3,7 +3,7 @@
AC_PREREQ(2.57)
AC_INIT([XCB Proto],
1.6,
1.7,
[xcb@lists.freedesktop.org])
AC_CONFIG_SRCDIR([xcb-proto.pc.in])
AM_INIT_AUTOMAKE([foreign dist-bzip2])

View File

@ -225,8 +225,17 @@ enum; the value is restricted to one of the constants named in the enum.
defining the set of values included, and a list containing these values.
value-mask-type gives the type of the bitmask; this must be CARD16 or
CARD32. value-mask-name gives the field name of the bitmask, and
value-list-name gives the field name of the list of values.
value-list-name gives the field name of the list of values. Please use
<switch> instead for new protocol definitions.
<switch name="identifier"> switch expression
<bitcase> bitcase expression, fields </bitcase> </switch>
This element represents conditional inclusion of fields. It can be viewed
as sequence of multiple ifs: if ( switch expression & bitcase expression )
is equal to bitcase expression, bitcase fields are included in structure.
It can be used only as the last field of structure. New protocol definitions
should prefer to use this instead of <valueparam>.
Expressions
-----------
@ -256,3 +265,22 @@ Expressions
The bit element represents a literal bitmask value in an expression.
The integer must be in the range 0..31, expanding to (1<<n) in C.
<enumref ref="identifier">enum item identifier</enumref>
This element represents a reference to item of enum.
<unop op="operator">expression</unop>
This element represents a unary operator, with the op attribute specifying
which operator. The only supported operation so far is ~, and its semantic
is identical to the corresponding operator in C.
<sumof ref="identifier" />
This element represents a sumation of the elements of the referenced list.
<popcount>expression</popcount>
This element represents the number of bits set in the expression.

View File

@ -21,6 +21,7 @@ xcbinclude_HEADERS = \
xfixes.xml \
xinerama.xml \
xinput.xml \
xkb.xml \
xprint.xml \
xselinux.xml \
xtest.xml \

View File

@ -28,7 +28,7 @@ authorization from the authors.
-->
<xcb header="dri2" extension-xname="DRI2" extension-name="DRI2"
major-version="1" minor-version="1">
major-version="1" minor-version="3">
<import>xproto</import>
<enum name="Attachment">
@ -42,10 +42,18 @@ authorization from the authors.
<item name="BufferFakeFrontLeft" />
<item name="BufferFakeFrontRight" />
<item name="BufferDepthStencil" />
<item name="BufferHiz" />
</enum>
<enum name="DriverType">
<item name="DRI" />
<item name="VDPAU" />
</enum>
<enum name="EventType">
<item name="ExchangeComplete"><value>1</value></item>
<item name="BlitComplete"> <value>2</value></item>
<item name="FlipComplete"> <value>3</value></item>
</enum>
<!-- Types -->
@ -85,6 +93,20 @@ authorization from the authors.
<list type="char" name="driver_name">
<fieldref>driver_name_length</fieldref>
</list>
<list type="void" name="alignment_pad">
<op op="-">
<op op="&amp;">
<op op="+">
<fieldref>driver_name_length</fieldref>
<value> 3 </value>
</op>
<unop op="~">
<value>3</value>
</unop>
</op>
<fieldref>driver_name_length</fieldref>
</op>
</list>
<list type="char" name="device_name">
<fieldref>device_name_length</fieldref>
</list>
@ -149,4 +171,94 @@ authorization from the authors.
</list>
</reply>
</request>
<!-- Version 1.2 -->
<request name="SwapBuffers" opcode="8">
<field type="DRAWABLE" name="drawable" />
<field type="CARD32" name="target_msc_hi" />
<field type="CARD32" name="target_msc_lo" />
<field type="CARD32" name="divisor_hi" />
<field type="CARD32" name="divisor_lo" />
<field type="CARD32" name="remainder_hi" />
<field type="CARD32" name="remainder_lo" />
<reply>
<pad bytes="1" />
<field type="CARD32" name="swap_hi" />
<field type="CARD32" name="swap_lo" />
</reply>
</request>
<request name="GetMSC" opcode="9">
<field type="DRAWABLE" name="drawable" />
<reply>
<pad bytes="1" />
<field type="CARD32" name="ust_hi" />
<field type="CARD32" name="ust_lo" />
<field type="CARD32" name="msc_hi" />
<field type="CARD32" name="msc_lo" />
<field type="CARD32" name="sbc_hi" />
<field type="CARD32" name="sbc_lo" />
</reply>
</request>
<request name="WaitMSC" opcode="10">
<field type="DRAWABLE" name="drawable" />
<field type="CARD32" name="target_msc_hi" />
<field type="CARD32" name="target_msc_lo" />
<field type="CARD32" name="divisor_hi" />
<field type="CARD32" name="divisor_lo" />
<field type="CARD32" name="remainder_hi" />
<field type="CARD32" name="remainder_lo" />
<reply>
<pad bytes="1" />
<field type="CARD32" name="ust_hi" />
<field type="CARD32" name="ust_lo" />
<field type="CARD32" name="msc_hi" />
<field type="CARD32" name="msc_lo" />
<field type="CARD32" name="sbc_hi" />
<field type="CARD32" name="sbc_lo" />
</reply>
</request>
<request name="WaitSBC" opcode="11">
<field type="DRAWABLE" name="drawable" />
<field type="CARD32" name="target_sbc_hi" />
<field type="CARD32" name="target_sbc_lo" />
<reply>
<pad bytes="1" />
<field type="CARD32" name="ust_hi" />
<field type="CARD32" name="ust_lo" />
<field type="CARD32" name="msc_hi" />
<field type="CARD32" name="msc_lo" />
<field type="CARD32" name="sbc_hi" />
<field type="CARD32" name="sbc_lo" />
</reply>
</request>
<request name="SwapInterval" opcode="12">
<field type="DRAWABLE" name="drawable" />
<field type="CARD32" name="interval" />
</request>
<!-- Events -->
<event name="BufferSwapComplete" number="0">
<pad bytes="1" />
<field type="CARD16" name="event_type" enum="EventType" />
<pad bytes="2" />
<field type="DRAWABLE" name="drawable" />
<field type="CARD32" name="ust_hi" />
<field type="CARD32" name="ust_lo" />
<field type="CARD32" name="msc_hi" />
<field type="CARD32" name="msc_lo" />
<field type="CARD32" name="sbc" />
</event>
<!-- Version 1.3 -->
<event name="InvalidateBuffers" number="1">
<pad bytes="1" />
<field type="DRAWABLE" name="drawable" />
</event>
</xcb>

View File

@ -89,6 +89,7 @@ The patch that fixed this server bug in X.org CVS is here:
<errorcopy name="BadPbuffer" number="10" ref="Generic" />
<errorcopy name="BadCurrentDrawable" number="11" ref="Generic" />
<errorcopy name="BadWindow" number="12" ref="Generic" />
<errorcopy name="GLXBadProfileARB" number="13" ref="Generic" />
<!-- Events -->
<event name="PbufferClobber" number="0">
@ -348,7 +349,7 @@ The patch that fixed this server bug in X.org CVS is here:
<request name="CreatePixmap" opcode="22">
<field type="CARD32" name="screen" />
<field type="CARD32" name="fbconfig" />
<field type="FBCONFIG" name="fbconfig" />
<field type="xproto:PIXMAP" name="pixmap" />
<field type="glx:PIXMAP" name="glx_pixmap" />
<field type="CARD32" name="num_attribs" />
@ -366,13 +367,12 @@ The patch that fixed this server bug in X.org CVS is here:
<request name="CreateNewContext" opcode="24">
<field type="glx:CONTEXT" name="context" />
<field type="CARD32" name="fbconfig" />
<field type="FBCONFIG" name="fbconfig" />
<field type="CARD32" name="screen" />
<field type="CARD32" name="render_type" />
<field type="CARD32" name="share_list" />
<field type="glx:CONTEXT" name="share_list" />
<field type="BOOL" name="is_direct" />
<field type="CARD8" name="reserved1" />
<field type="CARD16" name="reserved2" />
<pad bytes="3" />
</request>
<request name="QueryContext" opcode="25">
@ -463,6 +463,64 @@ The patch that fixed this server bug in X.org CVS is here:
<field type="glx:WINDOW" name="glxwindow" />
</request>
<!-- Start of GLX_ARB_create_context and GLX_ARB_create_context_profile
requests. -->
<request name="SetClientInfoARB" opcode="33">
<field type="CARD32" name="major_version" />
<field type="CARD32" name="minor_version" />
<field type="CARD32" name="num_versions" />
<field type="CARD32" name="gl_str_len" />
<field type="CARD32" name="glx_str_len" />
<list type="CARD32" name="gl_versions">
<op op="*">
<fieldref>num_versions</fieldref>
<value>2</value>
</op>
</list>
<list type="char" name="gl_extension_string">
<fieldref>gl_str_len</fieldref>
</list>
<list type="char" name="glx_extension_string">
<fieldref>glx_str_len</fieldref>
</list>
</request>
<request name="CreateContextAttribsARB" opcode="34">
<field type="glx:CONTEXT" name="context" />
<field type="FBCONFIG" name="fbconfig" />
<field type="CARD32" name="screen" />
<field type="glx:CONTEXT" name="share_list" />
<field type="BOOL" name="is_direct" />
<pad bytes="3" />
<field type="CARD32" name="num_attribs" />
<list type="CARD32" name="attribs">
<op op="*">
<fieldref>num_attribs</fieldref>
<value>2</value>
</op>
</list>
</request>
<request name="SetClientInfo2ARB" opcode="35">
<field type="CARD32" name="major_version" />
<field type="CARD32" name="minor_version" />
<field type="CARD32" name="num_versions" />
<field type="CARD32" name="gl_str_len" />
<field type="CARD32" name="glx_str_len" />
<list type="CARD32" name="gl_versions">
<op op="*">
<fieldref>num_versions</fieldref>
<value>3</value>
</op>
</list>
<list type="char" name="gl_extension_string">
<fieldref>gl_str_len</fieldref>
</list>
<list type="char" name="glx_extension_string">
<fieldref>glx_str_len</fieldref>
</list>
</request>
<!-- Requests for GL Non-rendering Commands (single ops) -->
<request name="NewList" opcode="101">

View File

@ -5,8 +5,8 @@ All Rights Reserved. See the file COPYING in this directory
for licensing information.
-->
<xcb header="render" extension-xname="RENDER" extension-name="Render"
major-version="0" minor-version="10">
<!-- supports version 0.10 -->
major-version="0" minor-version="11">
<!-- supports version 0.11 -->
<import>xproto</import>
@ -20,6 +20,7 @@ for licensing information.
</enum>
<!-- Disjoint* and Conjoint* are new in version 0.2 -->
<!-- PDF blend modes are new in version 0.11 -->
<enum name="PictOp">
<item name="Clear" />
<item name="Src" />
@ -61,6 +62,23 @@ for licensing information.
<item name="ConjointAtop" />
<item name="ConjointAtopReverse" />
<item name="ConjointXor" />
<!-- PDF blend modes are new in version 0.11 -->
<item name="Multiply"><value>48</value></item>
<item name="Screen" />
<item name="Overlay" />
<item name="Darken" />
<item name="Lighten" />
<item name="ColorDodge" />
<item name="ColorBurn" />
<item name="HardLight" />
<item name="SoftLight" />
<item name="Difference" />
<item name="Exclusion" />
<item name="HSLHue" />
<item name="HSLSaturation" />
<item name="HSLColor" />
<item name="HSLLuminosity" />
</enum>
<enum name="PolyEdge">

View File

@ -5,7 +5,7 @@ All Rights Reserved. See the file COPYING in this directory
for licensing information.
-->
<xcb header="sync" extension-xname="SYNC" extension-name="Sync"
major-version="3" minor-version="0">
major-version="3" minor-version="1">
<import>xproto</import>
<xidtype name="ALARM" />
@ -18,6 +18,8 @@ for licensing information.
<xidtype name="COUNTER" />
<xidtype name="FENCE" />
<enum name="TESTTYPE">
<item name="PositiveTransition" />
<item name="NegativeTransition" />
@ -173,6 +175,37 @@ for licensing information.
</reply>
</request>
<request name="CreateFence" opcode="14">
<field type="DRAWABLE" name="drawable" />
<field type="FENCE" name="fence" />
<field type="BOOL" name="initially_triggered" />
</request>
<request name="TriggerFence" opcode="15">
<field type="FENCE" name="fence" />
</request>
<request name="ResetFence" opcode="16">
<field type="FENCE" name="fence" />
</request>
<request name="DestroyFence" opcode="17">
<field type="FENCE" name="fence" />
</request>
<request name="QueryFence" opcode="18">
<field type="FENCE" name="fence" />
<reply>
<pad bytes="1" />
<field type="BOOL" name="triggered" />
<pad bytes="23" />
</reply>
</request>
<request name="AwaitFence" opcode="19">
<list type="FENCE" name="fence_list" />
</request>
<event name="CounterNotify" number="0">
<field type="CARD8" name="kind" />
<field type="COUNTER" name="counter" />

View File

@ -55,6 +55,37 @@ authorization from the authors.
<xsd:attribute name="mask" type="xsd:string" use="optional" />
</xsd:complexType>
<!-- case expression -->
<xsd:complexType name="caseexpr">
<xsd:sequence>
<!-- case expression: -->
<xsd:group ref="expression" minOccurs="1" maxOccurs="1" />
<!-- match -->
<xsd:group ref="fields" minOccurs="1" maxOccurs="unbounded" />
<xsd:choice>
<xsd:element ref="switch" minOccurs="0" maxOccurs="unbounded" />
</xsd:choice>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="optional" />
</xsd:complexType>
<!-- switch expression -->
<xsd:complexType name="switchexpr">
<xsd:sequence>
<!-- switch(expression) -->
<xsd:group ref="expression" minOccurs="1" maxOccurs="1" />
<xsd:choice>
<!-- bitcase expression - bit test -->
<xsd:element name="bitcase" type="caseexpr" minOccurs="1" maxOccurs="unbounded" />
</xsd:choice>
<!-- default: -->
<xsd:group ref="fields" minOccurs="0" maxOccurs="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
<xsd:element name="switch" type="switchexpr" />
<!-- field replaces FIELD, PARAM, and REPLY. -->
<xsd:element name="field" type="var" />
@ -89,7 +120,40 @@ authorization from the authors.
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="unop">
<xsd:complexType>
<xsd:sequence>
<xsd:group ref="expression" />
</xsd:sequence>
<xsd:attribute name="op" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="~" />
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="fieldref" type="xsd:string" />
<xsd:element name="enumref">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="ref" use="required" type="xsd:string" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="popcount">
<xsd:complexType>
<xsd:group ref="expression" />
</xsd:complexType>
</xsd:element>
<xsd:element name="sumof">
<xsd:complexType>
<xsd:attribute name="ref" use="required" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="value" type="dec-or-hex-integer" />
<xsd:element name="bit" type="xsd:integer" />
</xsd:choice>
@ -126,7 +190,12 @@ authorization from the authors.
<!-- Type for a structure -->
<xsd:complexType name="struct">
<xsd:group ref="fields" minOccurs="1" maxOccurs="unbounded" />
<xsd:sequence>
<xsd:group ref="fields" minOccurs="1" maxOccurs="unbounded" />
<xsd:choice minOccurs="0" maxOccurs="1">
<xsd:element ref="switch" />
</xsd:choice>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
@ -166,12 +235,20 @@ authorization from the authors.
<xsd:element ref="exprfield" />
<xsd:element ref="valueparam" />
</xsd:choice>
<xsd:choice minOccurs="0" maxOccurs="1">
<xsd:element ref="switch" />
</xsd:choice>
<xsd:element name="reply" minOccurs="0" maxOccurs="1">
<xsd:complexType>
<xsd:choice minOccurs="1" maxOccurs="unbounded">
<xsd:group ref="fields" />
<xsd:element ref="valueparam" />
</xsd:choice>
<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" />
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>

View File

@ -132,10 +132,15 @@ authorization from the authors.
<field type="INT16" name="drawable_size_W" />
<field type="INT16" name="drawable_size_H" />
<field type="CARD32" name="num_clip_rects" />
<pad bytes="4" />
<field type="INT16" name="back_x" />
<field type="INT16" name="back_y" />
<field type="CARD32" name="num_back_clip_rects" />
<list type="DrmClipRect" name="clip_rects">
<fieldref>num_clip_rects</fieldref>
</list>
<list type="DrmClipRect" name="back_clip_rects">
<fieldref>num_back_clip_rects</fieldref>
</list>
</reply>
</request>

2775
proto/xcb-proto/src/xkb.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1296,8 +1296,8 @@ authorization from the authors.
<reply>
<field type="BOOL" name="same_screen" />
<field type="WINDOW" name="child" altenum="Window" />
<field type="CARD16" name="dst_x" />
<field type="CARD16" name="dst_y" />
<field type="INT16" name="dst_x" />
<field type="INT16" name="dst_y" />
</reply>
</request>
@ -1482,7 +1482,10 @@ authorization from the authors.
<request name="SetFontPath" opcode="51">
<pad bytes="1" />
<field type="CARD16" name="font_qty" />
<list type="char" name="path" />
<pad bytes="2" />
<list type="STR" name="font">
<fieldref>font_qty</fieldref>
</list>
</request>
<request name="GetFontPath" opcode="52">
@ -2155,6 +2158,7 @@ authorization from the authors.
<field type="CARD8" name="keycode_count" />
<field type="KEYCODE" name="first_keycode" />
<field type="CARD8" name="keysyms_per_keycode" />
<pad bytes="2" />
<list type="KEYSYM" name="keysyms">
<op op="*">
<fieldref>keycode_count</fieldref>
@ -2294,7 +2298,7 @@ authorization from the authors.
<field type="CARD8" name="family" enum="Family" />
<pad bytes="1" />
<field type="CARD16" name="address_len" />
<list type="char" name="address">
<list type="BYTE" name="address">
<fieldref>address_len</fieldref>
</list>
</request>

View File

@ -88,8 +88,8 @@ authorization from the authors.
<field type="CARD32" name="time" />
<field type="WINDOW" name="root" />
<pad bytes="8" />
<field type="CARD16" name="rootX" />
<field type="CARD16" name="rootY" />
<field type="INT16" name="rootX" />
<field type="INT16" name="rootY" />
<pad bytes="7" />
<!-- Version 2.2: XInput device -->
<field type="CARD8" name="deviceid" />

View File

@ -1,6 +1,8 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
datarootdir=@datarootdir@
datadir=@datadir@
libdir=@libdir@
xcbincludedir=@xcbincludedir@
pythondir=@pythondir@

View File

@ -26,7 +26,7 @@ class Expression(object):
Represents a mathematical expression for a list length or exprfield.
Public fields:
op is the operation (text +,*,/,<<) or None.
op is the operation (text +,*,/,<<,~) or None.
lhs and rhs are the sub-Expressions if op is set.
lenfield_name is the name of the length field, or None for request lists.
lenfield is the Field object for the length field, or None.
@ -40,6 +40,7 @@ class Expression(object):
self.lenfield_name = None
self.lenfield_type = None
self.lenfield_parent = None
self.lenfield = None
self.lenwire = False
self.bitfield = False
@ -75,14 +76,52 @@ class Expression(object):
if self.lenfield_name == None:
self.lenfield_name = self.rhs.lenfield_name
elif elt.tag == 'unop':
# Op field. Need to recurse.
self.op = elt.get('op')
self.rhs = Expression(list(elt)[0], parent)
self.lenfield_name = self.rhs.lenfield_name
elif elt.tag == 'value':
# Constant expression
self.nmemb = int(elt.text)
self.nmemb = int(elt.text, 0)
elif elt.tag == 'popcount':
self.op = 'popcount'
self.rhs = Expression(list(elt)[0], parent)
self.lenfield_name = self.rhs.lenfield_name
# xcb_popcount returns 'int' - handle the type in the language-specific part
elif elt.tag == 'enumref':
self.op = 'enumref'
self.lenfield_name = (elt.get('ref'), elt.text)
elif elt.tag == 'sumof':
self.op = 'sumof'
self.lenfield_name = elt.get('ref')
else:
# Notreached
raise Exception('XXX')
raise Exception("undefined tag '%s'" % elt.tag)
def fixed_size(self):
return self.nmemb != None
def resolve(self, module, parents):
if self.op == 'enumref':
self.lenfield_type = module.get_type(self.lenfield_name[0])
self.lenfield_name = self.lenfield_name[1]
elif self.op == 'sumof':
# need to find the field with lenfield_name
for p in reversed(parents):
fields = dict([(f.field_name, f) for f in p.fields])
if self.lenfield_name in fields.keys():
if p.is_bitcase:
# switch is the anchestor
self.lenfield_parent = p.parents[-1]
else:
self.lenfield_parent = p
self.lenfield_type = fields[self.lenfield_name].field_type
break

View File

@ -9,14 +9,15 @@ we do not create a new type object, we just record the existing one under a new
from os.path import join
from xml.etree.cElementTree import parse
import state
from xtypes import *
from xcbgen.xtypes import *
def import_(node, module, namespace):
'''
For imports, we load the file, create a new namespace object,
execute recursively, then record the import (for header files, etc.)
'''
# To avoid circular import error
from xcbgen import state
new_file = join(namespace.dir, '%s.xml' % node.text)
new_root = parse(new_file).getroot()
new_namespace = state.Namespace(new_file)

View File

@ -4,9 +4,9 @@ This module contains the namespace class and the singleton module class.
from os.path import dirname, basename
from xml.etree.cElementTree import parse
import matcher
from error import *
from xtypes import *
from xcbgen import matcher
from xcbgen.error import *
from xcbgen.xtypes import *
import __main__

View File

@ -1,7 +1,7 @@
'''
This module contains the classes which represent XCB data types.
'''
from expr import Field, Expression
from xcbgen.expr import Field, Expression
import __main__
class Type(object):
@ -32,6 +32,8 @@ class Type(object):
self.is_reply = False
self.is_union = False
self.is_pad = False
self.is_switch = False
self.is_bitcase = False
def resolve(self, module):
'''
@ -73,6 +75,7 @@ class Type(object):
complex_type.fields.append(new_field)
class SimpleType(Type):
'''
Derived class which represents a cardinal type like CARD32 or char.
@ -131,7 +134,7 @@ class Enum(SimpleType):
if value.tag == 'value':
self.values.append((item.get('name'), value.text))
elif value.tag == 'bit':
self.values.append((item.get('name'), '%u' % (1 << int(value.text))))
self.values.append((item.get('name'), '%u' % (1 << int(value.text, 0))))
self.bits.append((item.get('name'), value.text))
def resolve(self, module):
@ -152,11 +155,11 @@ class ListType(Type):
parent is the structure type containing the list.
expr is an Expression object containing the length information, for variable-sized lists.
'''
def __init__(self, elt, member, parent):
def __init__(self, elt, member, *parent):
Type.__init__(self, member.name)
self.is_list = True
self.member = member
self.parent = parent
self.parents = list(parent)
if elt.tag == 'list':
elts = list(elt)
@ -177,9 +180,10 @@ class ListType(Type):
needlen = True
# See if the length field is already in the structure.
for field in self.parent.fields:
if field.field_name == lenfield_name:
needlen = False
for parent in self.parents:
for field in parent.fields:
if field.field_name == lenfield_name:
needlen = False
# It isn't, so we need to add it to the structure ourself.
if needlen:
@ -194,14 +198,16 @@ class ListType(Type):
if self.resolved:
return
self.member.resolve(module)
self.expr.resolve(module, self.parents)
# Find my length field again. We need the actual Field object in the expr.
# This is needed because we might have added it ourself above.
if not self.fixed_size():
for field in self.parent.fields:
if field.field_name == self.expr.lenfield_name and field.wire:
self.expr.lenfield = field
break
for parent in self.parents:
for field in parent.fields:
if field.field_name == self.expr.lenfield_name and field.wire:
self.expr.lenfield = field
break
self.resolved = True
@ -215,7 +221,7 @@ class ExprType(Type):
Public fields added:
expr is an Expression object containing the value of the field.
'''
def __init__(self, elt, member, parent):
def __init__(self, elt, member, *parent):
Type.__init__(self, member.name)
self.is_expr = True
self.member = member
@ -243,7 +249,7 @@ class PadType(Type):
Type.__init__(self, tcard8.name)
self.is_pad = True
self.size = 1
self.nmemb = 1 if (elt == None) else int(elt.get('bytes'))
self.nmemb = 1 if (elt == None) else int(elt.get('bytes'), 0)
def resolve(self, module):
self.resolved = True
@ -266,6 +272,7 @@ class ComplexType(Type):
self.fields = []
self.nmemb = 1
self.size = 0
self.lenfield_parent = [self]
def resolve(self, module):
if self.resolved:
@ -288,18 +295,27 @@ class ComplexType(Type):
elif child.tag == 'exprfield':
field_name = child.get('name')
fkey = child.get('type')
type = ExprType(child, module.get_type(fkey), self)
type = ExprType(child, module.get_type(fkey), *self.lenfield_parent)
visible = False
elif child.tag == 'list':
field_name = child.get('name')
fkey = child.get('type')
type = ListType(child, module.get_type(fkey), self)
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)
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
field_type = self.name + (field_name,)
type = SwitchType(field_type, child, *self.lenfield_parent)
visible = True
type.make_member_of(module, self, field_type, field_name, visible, True, False)
type.resolve(module)
continue
else:
# Hit this on Reply
continue
@ -331,6 +347,109 @@ class ComplexType(Type):
return False
return True
class SwitchType(ComplexType):
'''
Derived class which represents a List of Items.
Public fields added:
bitcases is an array of Bitcase objects describing the list items
'''
def __init__(self, name, elt, *parents):
ComplexType.__init__(self, name, elt)
self.parents = parents
# FIXME: switch cannot store lenfields, so it should just delegate the parents
self.lenfield_parent = list(parents) + [self]
# self.fields contains all possible fields collected from the Bitcase objects,
# whereas self.items contains the Bitcase objects themselves
self.bitcases = []
self.is_switch = True
elts = list(elt)
self.expr = Expression(elts[0] if len(elts) else elt, self)
def resolve(self, module):
if self.resolved:
return
# pads = 0
parents = list(self.parents) + [self]
# Resolve all of our field datatypes.
for index, child in enumerate(list(self.elt)):
if child.tag == 'bitcase':
field_name = child.get('name')
if field_name is None:
field_type = self.name + ('bitcase%d' % index,)
else:
field_type = self.name + (field_name,)
# use self.parent to indicate anchestor,
# as switch does not contain named fields itself
type = BitcaseType(index, field_type, child, *parents)
# construct the switch type name from the parent type and the field name
if field_name is None:
type.has_name = False
# Get the full type name for the field
field_type = type.name
visible = True
# add the field to ourself
type.make_member_of(module, self, field_type, field_name, visible, True, False)
# recursively resolve the type (could be another structure, list)
type.resolve(module)
inserted = False
for new_field in type.fields:
# We dump the _placeholder_byte if any fields are added.
for (idx, field) in enumerate(self.fields):
if field == _placeholder_byte:
self.fields[idx] = new_field
inserted = True
break
if False == inserted:
self.fields.append(new_field)
self.calc_size() # Figure out how big we are
self.resolved = True
def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto):
if not self.fixed_size():
# We need a length field.
# Ask our Expression object for it's name, type, and whether it's on the wire.
lenfid = self.expr.lenfield_type
lenfield_name = self.expr.lenfield_name
lenwire = self.expr.lenwire
needlen = True
# See if the length field is already in the structure.
for parent in self.parents:
for field in parent.fields:
if field.field_name == lenfield_name:
needlen = False
# It isn't, so we need to add it to the structure ourself.
if needlen:
type = module.get_type(lenfid)
lenfield_type = module.get_type_name(lenfid)
type.make_member_of(module, complex_type, lenfield_type, lenfield_name, True, lenwire, False)
# Add ourself to the structure by calling our original method.
Type.make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto)
# size for switch can only be calculated at runtime
def calc_size(self):
pass
# note: switch is _always_ of variable size, but we indicate here wether
# it contains elements that are variable-sized themselves
def fixed_size(self):
return False
# for m in self.fields:
# if not m.type.fixed_size():
# return False
# return True
class Struct(ComplexType):
'''
@ -350,6 +469,48 @@ class Union(ComplexType):
out = __main__.output['union']
class BitcaseType(ComplexType):
'''
Derived class representing a struct data type.
'''
def __init__(self, index, name, elt, *parent):
elts = list(elt)
self.expr = Expression(elts[0] if len(elts) else elt, self)
ComplexType.__init__(self, name, elts[1:])
self.has_name = True
self.index = 1
self.lenfield_parent = list(parent) + [self]
self.parents = list(parent)
self.is_bitcase = True
def make_member_of(self, module, switch_type, field_type, field_name, visible, wire, auto):
'''
register BitcaseType with the corresponding SwitchType
module is the global module object.
complex_type is the structure object.
see Field for the meaning of the other parameters.
'''
new_field = Field(self, field_type, field_name, visible, wire, auto)
# We dump the _placeholder_byte if any bitcases are added.
for (idx, field) in enumerate(switch_type.bitcases):
if field == _placeholder_byte:
switch_type.bitcases[idx] = new_field
return
switch_type.bitcases.append(new_field)
def resolve(self, module):
if self.resolved:
return
self.expr.resolve(module, self.parents+[self])
# Resolve the bitcase expression
ComplexType.resolve(self, module)
class Reply(ComplexType):
'''
Derived class representing a reply. Only found as a field of Request.