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 <a...@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 <a...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/wayland-devel >
_______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel