Here's my stab at a Wayland schema written in RELAX NG. It can be converted
to a W3C schema if preferred, but RELAX NG provides more functionality. For
example, the schema is able to require an "interface" attribute for an
argument only if the argument type is "object" or "new_id".

-Jeremy

2011/1/26 Kristian Høgsberg <[email protected]>

> 2011/1/26 Casey Dahlin <[email protected]>:
> > On Wed, Jan 26, 2011 at 01:40:25PM -0500, Kristian Høgsberg wrote:
> >> 2011/1/26 Josh Leverette <[email protected]>:
> >> > I'm not certain, but I think there could eventually be enough
> variation for that to be needed. However, even if there isn't, parsing an
> XML file might be a better long term solution that weakly linked functions
> and things like that. Perhaps we could modify his idea about an XML profile
> structure to allow you to delve into each supported profile and find out
> more about what it supports without having to hard code acceptable version
> numbers into a program. The only problem I foresee is how to modify the XML
> file. It's not going to be the end user's job.. but if any program could
> modify it there needs to be a fallback system to prevent a rogue program
> from deleting other profile advertisements written in by the system or other
> programs.
> >>
> >> The XML file isn't used at runtime.  It's just a convenient mechanism
> >> to describe the interface.  The way it works is that a client connects
> >> to the server and the server will then advertise all the global
> >> objects available by giving their object id, interface name and
> >> version.  A client can then look through the list to see what's
> >> available and adjust its behaviour accordingly.
> >>
> >> Kristian
> >>
> >
> > Does the XML file have a particular schema?
> >
> > It might be useful to install it in /usr/share so it could be used by
> > tools. I'm thinking mostly of a d-feet style introspection tool for the
> > Wayland protocol (we could even go as far as dynamically adaptable
> > bindings for languages like Ruby or Python).
>
> I didn't actually write a schema for it, but if somebody with the
> right XML-fu could do that that would be nice.  It's a good point that
> dynamic languages probably just want to parse the XML directly and
> generate the bindings on the fly and for that we would need to install
> the XML.  As for introspection/logging/xscope, that's built into the
> server side library: set WAYLAND_DEBUG=1 and watch the requests and
> events fly by.
>
> Kristian
> _______________________________________________
> wayland-devel mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
<?xml version="1.0" encoding="UTF-8"?>
<!-- A schema for Wayland protocol definitions written in RELAX NG: http://relaxng.org/ -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"; datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes";>

  <!-- Protocol -->
  <define name="Protocol">
    <element name="protocol">
      <attribute name="name"/>
      <zeroOrMore>
        <ref name="Interface"/>
      </zeroOrMore>
    </element>
  </define>

  <!-- Interface -->
  <define name="Interface">
    <element name="interface">
      <attribute name="name"/>
      <attribute name="version">
        <data type="integer"/>
      </attribute>
      <zeroOrMore>
        <choice>
          <ref name="Request"/>
          <ref name="Event"/>
          <ref name="Enumeration"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>

  <!-- Request -->
  <define name="Request">
    <element name="request">
      <attribute name="name"/>
      <optional>
        <attribute name="type">
          <value>destructor</value>
        </attribute>
      </optional>
      <zeroOrMore>
        <ref name="MessageArgument"/>
      </zeroOrMore>
    </element>
  </define>

  <!-- Event -->
  <define name="Event">
    <element name="event">
      <attribute name="name"/>
      <zeroOrMore>
        <ref name="MessageArgument"/>
      </zeroOrMore>
    </element>
  </define>

  <!-- 
    MessageArgument
    If the type attribute is 'object' or 'new_id', an interface name must be specified.
  -->
  <define name="MessageArgument">
    <element name="arg">
      <attribute name="name"/>
      <choice>
        <attribute name="type">
          <choice>
            <value>int</value>
            <value>uint</value>
            <value>string</value>
            <value>array</value>
            <value>fd</value>
          </choice>
        </attribute>
        <group>
          <attribute name="type">
            <choice>
              <value>object</value>
              <value>new_id</value>
            </choice>
          </attribute>
          <attribute name="interface"/>
        </group>
      </choice>
    </element>
  </define>

  <!-- Enumeration -->
  <define name="Enumeration">
    <element name="enum">
      <attribute name="name"/>
      <zeroOrMore>
        <element name="entry">
          <attribute name="name"/>
          <attribute name="value"/>
        </element>
      </zeroOrMore>
    </element>
  </define>

  <start>
    <ref name="Protocol"/>
  </start>
</grammar>
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to