[PATCH v2 wayland] protocol: add support for cross-interface enum attributes

Nils Chr. Brause nilschrbrause at gmail.com
Wed Dec 2 07:19:52 PST 2015


On Wed, Dec 2, 2015 at 11:48 AM, Auke Booij <auke at tulcod.com> wrote:
> I'd be happy to rebase against that, but since that hasn't been merged
> yet, I thought I'd take the current tree as a a basis.
>
> If you think having the interface:: prefix everywhere makes sense, I
> can change that if you want.

I think that would be very nice for consistency. :)

>
> On 2 December 2015 at 03:09, Bill Spitzak <spitzak at gmail.com> wrote:
>> Looks correct to me.
>>
>> I had a slightly different patch in patchwork which changes
>> protocol-to-docbook. It puts the enumeration into it's own statement, rather
>> than a nested if statement, and it adds the object:: prefix to the
>> documentation for all enumerations, not just the cross-object ones.
>>
>> On Sun, Nov 29, 2015 at 5:54 AM, Auke Booij <auke at tulcod.com> wrote:
>>>
>>> The enum attribute, for which scanner support was introduced in
>>> 1771299, can be used to link message arguments to <enum>s. However,
>>> some arguments refer to <enum>s in a different <interface>.
>>>
>>> This adds scanner support for referring to an <enum> in a different
>>> <interface> using dot notation. It also sets the attributes in this
>>> style in the wayland XML protocol (wl_shm_pool::create_buffer::format
>>> to wl_shm::format, and wl_surface::set_buffer_transform::transform to
>>> wl_output::transform), and updates the documentation XSL so that this
>>> new style is supported.
>>>
>>> Changes since v1:
>>>  - several implementation bugs fixed
>>>
>>> Signed-off-by: Auke Booij <auke at tulcod.com>
>>> ---
>>>  doc/publican/protocol-to-docbook.xsl | 17 +++++++++--
>>>  protocol/wayland.xml                 |  4 +--
>>>  src/scanner.c                        | 59
>>> +++++++++++++++++++++++++++---------
>>>  3 files changed, 61 insertions(+), 19 deletions(-)
>>>
>>> diff --git a/doc/publican/protocol-to-docbook.xsl
>>> b/doc/publican/protocol-to-docbook.xsl
>>> index fad207a..1fa066d 100644
>>> --- a/doc/publican/protocol-to-docbook.xsl
>>> +++ b/doc/publican/protocol-to-docbook.xsl
>>> @@ -103,9 +103,20 @@
>>>      <listitem>
>>>          <simpara>
>>>            <xsl:if test="@enum">
>>> -            <link linkend="protocol-spec-{../../@name}-enum-{@enum}">
>>> -              <xsl:value-of select="@enum"/>
>>> -            </link>
>>> +            <xsl:choose>
>>> +              <xsl:when test="contains(@enum, '.')">
>>> +                <link linkend="protocol-spec-{substring-before(@enum,
>>> '.')}-enum-{substring-after(@enum, '.')}">
>>> +                  <xsl:value-of select="substring-before(@enum, '.')"/>
>>> +                  <xsl:text>::</xsl:text>
>>> +                  <xsl:value-of select="substring-after(@enum, '.')"/>
>>> +                </link>
>>> +              </xsl:when>
>>> +              <xsl:otherwise>
>>> +                <link linkend="protocol-spec-{../../@name}-enum-{@enum}">
>>> +                  <xsl:value-of select="@enum"/>
>>> +                </link>
>>> +              </xsl:otherwise>
>>> +            </xsl:choose>
>>>             <xsl:text> </xsl:text>
>>>            </xsl:if>
>>>            <xsl:value-of select="@type"/>
>>> diff --git a/protocol/wayland.xml b/protocol/wayland.xml
>>> index f9e6d76..0873553 100644
>>> --- a/protocol/wayland.xml
>>> +++ b/protocol/wayland.xml
>>> @@ -229,7 +229,7 @@
>>>        <arg name="width" type="int"/>
>>>        <arg name="height" type="int"/>
>>>        <arg name="stride" type="int"/>
>>> -      <arg name="format" type="uint"/>
>>> +      <arg name="format" type="uint" enum="wl_shm.format"/>
>>>      </request>
>>>
>>>      <request name="destroy" type="destructor">
>>> @@ -1292,7 +1292,7 @@
>>>         wl_output.transform enum the invalid_transform protocol error
>>>         is raised.
>>>        </description>
>>> -      <arg name="transform" type="int"/>
>>> +      <arg name="transform" type="int" enum="wl_output.transform"/>
>>>      </request>
>>>
>>>      <!-- Version 3 additions -->
>>> diff --git a/src/scanner.c b/src/scanner.c
>>> index 406519f..e69bd2a 100644
>>> --- a/src/scanner.c
>>> +++ b/src/scanner.c
>>> @@ -785,32 +785,62 @@ start_element(void *data, const char *element_name,
>>> const char **atts)
>>>         }
>>>  }
>>>
>>> +static struct enumeration *
>>> +find_enumeration(struct protocol *protocol, struct interface *interface,
>>> char *enum_attribute)
>>> +{
>>> +       struct interface *i;
>>> +       struct enumeration *e, *f = NULL;
>>> +       char *enum_name;
>>> +       int idx = 0, j;
>>> +
>>> +        for (j = 0; j + 1 < (int)strlen(enum_attribute); j++) {
>>> +               if (enum_attribute[j] == '.') {
>>> +                       idx = j;
>>> +               }
>>> +       }
>>> +
>>> +       if (idx > 0) {
>>> +               enum_name = enum_attribute + idx + 1;
>>> +
>>> +               wl_list_for_each(i, &protocol->interface_list, link)
>>> +                       if (strncmp(i->name, enum_attribute, idx) == 0)
>>> +                               wl_list_for_each(e, &i->enumeration_list,
>>> link)
>>> +                                       if(strcmp(e->name, enum_name) ==
>>> 0)
>>> +                                               f = e;
>>> +       } else if (interface) {
>>> +               enum_name = enum_attribute;
>>> +
>>> +               wl_list_for_each(e, &interface->enumeration_list, link)
>>> +                       if(strcmp(e->name, enum_name) == 0)
>>> +                               f = e;
>>> +       }
>>> +
>>> +       return f;
>>> +}
>>> +
>>>  static void
>>> -verify_arguments(struct parse_context *ctx, struct wl_list *messages,
>>> struct wl_list *enumerations)
>>> +verify_arguments(struct parse_context *ctx, struct interface *interface,
>>> struct wl_list *messages, struct wl_list *enumerations)
>>>  {
>>>         struct message *m;
>>>         wl_list_for_each(m, messages, link) {
>>>                 struct arg *a;
>>>                 wl_list_for_each(a, &m->arg_list, link) {
>>> -                       struct enumeration *e, *f;
>>> +                       struct enumeration *e;
>>>
>>>                         if (!a->enumeration_name)
>>>                                 continue;
>>>
>>> -                       f = NULL;
>>> -                       wl_list_for_each(e, enumerations, link) {
>>> -                               if(strcmp(e->name, a->enumeration_name) ==
>>> 0)
>>> -                                       f = e;
>>> -                       }
>>>
>>> -                       if (f == NULL)
>>> +                       e = find_enumeration(ctx->protocol, interface,
>>> a->enumeration_name);
>>> +
>>> +                       if (e == NULL)
>>>                                 fail(&ctx->loc,
>>>                                      "could not find enumeration %s",
>>>                                      a->enumeration_name);
>>>
>>>                         switch (a->type) {
>>>                         case INT:
>>> -                               if (f->bitfield)
>>> +                               if (e->bitfield)
>>>                                         fail(&ctx->loc,
>>>                                              "bitfield-style enum must
>>> only be referenced by uint");
>>>                                 break;
>>> @@ -848,12 +878,13 @@ end_element(void *data, const XML_Char *name)
>>>                              ctx->enumeration->name);
>>>                 }
>>>                 ctx->enumeration = NULL;
>>> -       } else if (strcmp(name, "interface") == 0) {
>>> -               struct interface *i = ctx->interface;
>>> -
>>> -               verify_arguments(ctx, &i->request_list,
>>> &i->enumeration_list);
>>> -               verify_arguments(ctx, &i->event_list,
>>> &i->enumeration_list);
>>> +       } else if (strcmp(name, "protocol") == 0) {
>>> +               struct interface *i;
>>>
>>> +               wl_list_for_each(i, &ctx->protocol->interface_list, link)
>>> {
>>> +                       verify_arguments(ctx, i, &i->request_list,
>>> &i->enumeration_list);
>>> +                       verify_arguments(ctx, i, &i->event_list,
>>> &i->enumeration_list);
>>> +               }
>>>         }
>>>  }
>>>
>>> --
>>> 2.6.2
>>>
>>> _______________________________________________
>>> wayland-devel mailing list
>>> wayland-devel at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>>
>>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list