summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-10-08 13:21:55 -0400
committerKristian Høgsberg <krh@bitplanet.net>2012-10-10 20:59:00 -0400
commit85a6a470873357089ffb968a176d5074fddd1756 (patch)
treea477c978049cc712777a4aa7b4fa8c6a50626202
parent385fe30e8b144a968aa88c6546c2ef247771b3d7 (diff)
scanner: Send interface name and version for types new_id args
This makes the scanner generate the code and meta data to send the interface name and version when we pass a typeless new_id. This way, the generic factory mechanism provided by wl_display.bind can be provided by any interface.
-rw-r--r--protocol/wayland.xml6
-rw-r--r--src/scanner.c63
2 files changed, 48 insertions, 21 deletions
diff --git a/protocol/wayland.xml b/protocol/wayland.xml
index efd71dd..a485b42 100644
--- a/protocol/wayland.xml
+++ b/protocol/wayland.xml
@@ -38,9 +38,7 @@
the identifier.
</description>
<arg name="name" type="uint" summary="unique number id for object"/>
- <arg name="interface" type="string"/>
- <arg name="version" type="uint"/>
- <arg name="id" type="new_id" interface="wl_object"/>
+ <arg name="id" type="new_id"/>
</request>
<request name="sync">
@@ -58,7 +56,7 @@
The error event is sent out when a fatal (non-recoverable)
error has occurred.
</description>
- <arg name="object_id" type="object" interface="wl_object"/>
+ <arg name="object_id" type="object"/>
<arg name="code" type="uint"/>
<arg name="message" type="string"/>
</event>
diff --git a/src/scanner.c b/src/scanner.c
index 0fc26e7..3f91916 100644
--- a/src/scanner.c
+++ b/src/scanner.c
@@ -374,9 +374,8 @@ start_element(void *data, const char *element_name, const char **atts)
switch (arg->type) {
case NEW_ID:
case OBJECT:
- if (interface_name == NULL)
- fail(ctx, "no interface name given");
- arg->interface_name = strdup(interface_name);
+ if (interface_name)
+ arg->interface_name = strdup(interface_name);
break;
default:
if (interface_name != NULL)
@@ -575,7 +574,7 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
exit(EXIT_FAILURE);
}
- if (!has_destructor)
+ if (!has_destructor && strcmp(interface->name, "wl_display") != 0)
printf("static inline void\n"
"%s_destroy(struct %s *%s)\n"
"{\n"
@@ -595,7 +594,9 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
ret = a;
}
- if (ret)
+ if (ret && ret->interface_name == NULL)
+ printf("static inline void *\n");
+ else if (ret)
printf("static inline struct %s *\n",
ret->interface_name);
else
@@ -606,7 +607,11 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
interface->name, interface->name);
wl_list_for_each(a, &m->arg_list, link) {
- if (a->type == NEW_ID)
+ if (a->type == NEW_ID && a->interface_name == NULL) {
+ printf(", const struct wl_interface *interface"
+ ", uint32_t version");
+ continue;
+ } else if (a->type == NEW_ID)
continue;
printf(", ");
emit_type(a);
@@ -615,17 +620,21 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
printf(")\n"
"{\n");
- if (ret)
+ if (ret) {
printf("\tstruct wl_proxy *%s;\n\n"
"\t%s = wl_proxy_create("
- "(struct wl_proxy *) %s,\n"
- "\t\t\t &%s_interface);\n"
- "\tif (!%s)\n"
+ "(struct wl_proxy *) %s,\n",
+ ret->name, ret->name, interface->name);
+ if (ret->interface_name == NULL)
+ printf("\t\t\t interface);\n");
+ else
+ printf("\t\t\t &%s_interface);\n",
+ ret->interface_name);
+
+ printf("\tif (!%s)\n"
"\t\treturn NULL;\n\n",
- ret->name,
- ret->name,
- interface->name, ret->interface_name,
ret->name);
+ }
printf("\twl_proxy_marshal((struct wl_proxy *) %s,\n"
"\t\t\t %s_%s",
@@ -634,8 +643,10 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
m->uppercase_name);
wl_list_for_each(a, &m->arg_list, link) {
+ if (a->type == NEW_ID && a->interface_name == NULL)
+ printf(", interface->name, version");
printf(", ");
- printf("%s", a->name);
+ printf("%s", a->name);
}
printf(");\n");
@@ -644,7 +655,9 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
"(struct wl_proxy *) %s);\n",
interface->name);
- if (ret)
+ if (ret && ret->interface_name == NULL)
+ printf("\n\treturn (void *) %s;\n", ret->name);
+ else if (ret)
printf("\n\treturn (struct %s *) %s;\n",
ret->interface_name, ret->name);
@@ -770,6 +783,13 @@ emit_structs(struct wl_list *message_list, struct interface *interface)
desc_dump("\t * %s - ",
m->name, mdesc ? mdesc->summary : "(none)");
wl_list_for_each(a, &m->arg_list, link) {
+
+ if (is_interface && a->type == NEW_ID &&
+ a->interface_name == NULL)
+ printf("\t * @interface: name of the objects interface\n"
+ "\t * @version: version of the objects interface\n");
+
+
desc_dump("\t * @%s: ",
a->name, a->summary ? a->summary : "(none)");
}
@@ -799,6 +819,11 @@ emit_structs(struct wl_list *message_list, struct interface *interface)
if (is_interface && a->type == OBJECT)
printf("struct wl_resource *");
+ else if (is_interface && a->type == NEW_ID && a->interface_name == NULL)
+ printf("const char *interface, uint32_t version, uint32_t ");
+ else if (!is_interface && a->type == OBJECT && a->interface_name == NULL)
+ printf("struct wl_object *");
+
else if (!is_interface && a->type == NEW_ID)
printf("struct %s *", a->interface_name);
else
@@ -925,6 +950,9 @@ emit_types_forward_declarations(struct protocol *protocol,
switch (a->type) {
case NEW_ID:
case OBJECT:
+ if (!a->interface_name)
+ continue;
+
m->all_null = 0;
printf("extern const struct wl_interface %s_interface;\n",
a->interface_name);
@@ -968,8 +996,7 @@ emit_types(struct protocol *protocol, struct wl_list *message_list)
switch (a->type) {
case NEW_ID:
case OBJECT:
- if (strcmp(a->interface_name,
- "wl_object") != 0)
+ if (a->interface_name)
printf("\t&%s_interface,\n",
a->interface_name);
else
@@ -1009,6 +1036,8 @@ emit_messages(struct wl_list *message_list,
printf("i");
break;
case NEW_ID:
+ if (a->interface_name == NULL)
+ printf("su");
printf("n");
break;
case UNSIGNED: