[Xcb] Enumerations and typed valueparams

Peter Harris peter.harris at hummingbird.com
Mon Jan 14 08:37:42 PST 2008


Mark Seaborn wrote:
> Peter Harris <peter.harris at hummingbird.com> wrote:
>> My changes so far are at ("gitweb" web page): 
>> http://repo.or.cz/w/xcbproto/enum.git
> 
> Do you have any code that reads your extended definition with "enum"
> attributes?

Yes, but it's pretty ugly. Perl with XML::Twig generating Java classes 
to be loaded by a legacy pretty-printer. The legacy pretty-printer was 
written by hand. I'm getting tired of writing new extension code all the 
time, which is why I'm excited about XCB.

Note that since I have a stable xproto pretty-printer already, I've only 
tested with xv.xml so far.

Before my enum changes:
106-175: [15081.1] (1) <-- Reply to Request 138.1 QueryAdaptors (XVideo)

sequence #        0x21 (105)
num_adaptors      1
info 0:
  base_id          0xc9
  name_size        0x16
  num_ports        1
  num_formats      0x42
  type             17
... and so on ...

After my enum changes:
106-175: [15081.1] (1) <-- Reply to Request 138.1 QueryAdaptors (XVideo)

sequence #        0x21 (105)
num_adaptors      1
info 0:
  base_id          0xc9
  name_size        0x16
  num_ports        1
  num_formats      0x42
  type             InputMask|ImageMask
... and so on ...

(or, after the "reduced Mask" patches I sent to the list,
  type             Input|Image
)

> On typing valueparams: I see you have added comments to the
> valueparams' enums, e.g.
> 
>   <enum name="CW">
>     <item name="BackPixmap"><bit>0</bit></item> <!-- enum="BackPixmap" or PIXMAP -->
>     ...
>   </enum>
> 
> I suppose this could become:
> 
>   <enum name="CW">
>     <item name="BackPixmap" type="PIXMAP" enum="BackPixmap"><bit>0</bit></item>
>     ...
>   </enum>
> 
> The type and enum fields may as well go in XML attributes rather than
> elements.  It would be more readable if "bit" could go in an attribute
> but I suppose that would not be compatible with other code that reads
> the definitions.

This matches my thoughts exactly. After a quick test, my changes so far 
do not break libxcb. Moving "bit" would break libxcb.

> I prefer having the field called "back_pixmap" rather than
> "BackPixmap", because all the existing fields are in the
> lowercase-with-underscores style.

libxcb already translates CamelCase into snake_case (although for enums 
it uses SHOUTING_SNAKE_CASE). I don't mind writing a small bit of 
conversion code (or stealing libxcb's, once it has been ported to a sane 
language).

That said, the XCB maintainers have stated a goal of keeping the XML as 
close to the protocol documentation as possible. The protocol 
documentation uses hypen-ated, which we would have to translate into 
snake_case for most programming languages. Not a real problem, but 
someone else would have to fix libxcb's XSLT (or python, if it is ever 
released).

> On enums in general: Some fields may only contain a value from the
> enumeration (closed enum), whereas others may contain an enum value or
> another value of the original type, usually a resource ID (open enum).

See my reply to Barton elsethread.

> Some enums are subsets of others.  There is a good example in
> CreateWindow:
> 
>     <field type="CARD16 : 0=CopyFromParent 1=InputOutput 2=InputOnly" name="class" />
>     <field type="VISUALID / 0=CopyFromParent" name="visual" />
> 
> (I think you missed the "visual" field, by the way.)

Yes, I did. I probably missed one or two others along the way.

> I think these two enumerations should be defined separately from each
> other.

Agreed.

> I suppose instead of referencing an enumeration, the <field> elements
> could inline the enumeration directly, e.g.
> 
>     <field type="CARD16" name="class">
>       <enum-item number="0" name="CopyFromParent" />
>       <enum-item number="1" name="InputOutput" />
>       <enum-item number="2" name="InputOnly" />
>     </field>
> 
> For a one-off enumeration this could be slightly more readable and
> easier to review.

I think that would add needless complexity to code generators. I'd like 
to keep the XSD as simple as possible while still getting the job done.

> I added the enumeration definitions in my version of xproto.xml by
> going through "Appendix B: Protocol Encoding" of the X spec and just
> typing up what I saw.  I'm fairly sure that I got them all.

I don't doubt that I've missed a couple of things. I went through 
xproto.xml while referencing Appendix B, but I did it quickly. I have 
only tested xv.xml so far; my changes to xproto.xml were more for 
demonstration and discussion purposes.

Peter Harris
-- 
      Hummingbird Connectivity - A Division of Open Text
Peter Harris                    http://connectivity.hummingbird.com
Research and Development        Phone: +1 905 762 6001
peter.harris at hummingbird.com    Toll Free: 1 877 359 4866


More information about the Xcb mailing list