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

Auke Booij auke at tulcod.com
Wed Dec 2 02:48:08 PST 2015


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.

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
>
>


More information about the wayland-devel mailing list