From: Bill Spitzak <[email protected]>

This function assigns the id into an existing wl_proxy structure. Allows
setting of the queue before binding so that events are sent to the correct
thread.

The arguments are purposely swapped around so that just changing 
wl_registry_bind
to wl_registry_bind_id will not compile.

The display-test modified to test this and show the usage.

Signed-off-by: Bill Spitzak <[email protected]>
---
 src/scanner.c             | 29 +++++++++++++++++++----------
 src/wayland-client-core.h |  4 ++++
 src/wayland-client.c      | 15 ++++++++++++++-
 tests/display-test.c      |  4 ++++
 4 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/src/scanner.c b/src/scanner.c
index fbe8193..3c0db01 100644
--- a/src/scanner.c
+++ b/src/scanner.c
@@ -1184,14 +1184,13 @@ emit_stubs(struct wl_list *message_list, struct 
interface *interface)
                 */
                if (!ret)
                        continue;
-               if (!ret->interface_name)
-                       continue; /* wl_registry_bind_id nyi */
                printf("/**\n"
                       " * @ingroup iface_%s\n", interface->name);
                printf(" *\n"
                       " * Same as %s_%s() except it uses an existing proxy 
created by\n"
                       " * %s_new().\n"
-                      " */\n", interface->name, m->name, ret->interface_name);
+                      " */\n", interface->name, m->name,
+                      ret->interface_name ? ret->interface_name : "wl_proxy");
                printf("static inline void\n");
 
                printf("%s_%s_id(struct %s *%s",
@@ -1200,23 +1199,33 @@ emit_stubs(struct wl_list *message_list, struct 
interface *interface)
 
                wl_list_for_each(a, &m->arg_list, link) {
                        printf(", ");
-                       if (a->type != NEW_ID)
+                       if (a->type != NEW_ID) {
                                emit_type(a);
-                       else
-                               printf("struct %s *", ret->interface_name);
-                       printf("%s", a->name);
+                               printf("%s", a->name);
+                       } else if (ret->interface_name) {
+                               printf("struct %s *proxy", ret->interface_name);
+                       } else {
+                               printf("uint32_t version, void *proxy");
+                       }
                }
 
                printf(")\n"
                       "{\n"
-                      "\twl_proxy_marshal_id((struct wl_proxy *) %s,\n"
+                      "\twl_proxy_marshal_%s((struct wl_proxy *) %s,\n"
                       "\t\t\t %s_%s",
+                      ret->interface_name ? "id" : "bind",
                       interface->name,
                       interface->uppercase_name,
                       m->uppercase_name);
 
                wl_list_for_each(a, &m->arg_list, link) {
-                       printf(", %s", a->name);
+                       if (a->type != NEW_ID) {
+                               printf(", %s", a->name);
+                       } else if (ret->interface_name) {
+                               printf(", proxy");
+                       } else {
+                               printf(", version, (struct wl_proxy *) proxy");
+                       }
                }
                printf(");\n");
 
@@ -1398,7 +1407,7 @@ emit_structs(struct wl_list *message_list, struct 
interface *interface, enum sid
                printf("/**\n"
                   " * @ingroup iface_%s\n"
                   " *\n"
-                  " * Create a %s and allocate an id.\n"
+                  " * Allocate a new %s.\n"
                   " */\n"
                   "static inline struct %s *\n"
                   "%s_new(void)\n"
diff --git a/src/wayland-client-core.h b/src/wayland-client-core.h
index 8e48cab..84ceb70 100644
--- a/src/wayland-client-core.h
+++ b/src/wayland-client-core.h
@@ -128,6 +128,10 @@ void
 wl_proxy_marshal_id(struct wl_proxy *proxy, uint32_t opcode, ...);
 
 void
+wl_proxy_marshal_bind(struct wl_proxy *factory, uint32_t opcode,
+                     uint32_t name, uint32_t version, struct wl_proxy 
*new_proxy);
+
+void
 wl_proxy_marshal_array(struct wl_proxy *p, uint32_t opcode,
                       union wl_argument *args);
 
diff --git a/src/wayland-client.c b/src/wayland-client.c
index d539bf7..326ca14 100644
--- a/src/wayland-client.c
+++ b/src/wayland-client.c
@@ -741,11 +741,24 @@ wl_proxy_marshal_id(struct wl_proxy *factory, uint32_t 
opcode, ...)
        new_proxy->display = factory->display;
        if (new_proxy->queue == NULL)
                new_proxy->queue = factory->queue;
-       new_proxy->version = factory->version;
+       if (new_proxy->version == 0)
+               new_proxy->version = factory->version;
 
        proxy_marshal_array(factory, opcode, args, new_proxy);
 }
 
+/** Same as wl_proxy_marshal_id() except special handling of the new_id.
+ * The message will prefix this with the interface name and the version.
+ * Currently the api only works for the wl_registry_bind argument list.
+ */
+WL_EXPORT void
+wl_proxy_marshal_bind(struct wl_proxy *factory, uint32_t opcode,
+                     uint32_t name, uint32_t version, struct wl_proxy 
*new_proxy)
+{
+       new_proxy->version = version;
+       wl_proxy_marshal_id(factory, opcode, name, 
wl_proxy_get_class(new_proxy), version, new_proxy);
+}
+
 /** Prepare a request to be sent to the compositor
  *
  * \param factory The proxy object
diff --git a/tests/display-test.c b/tests/display-test.c
index f9f8160..3c82f34 100644
--- a/tests/display-test.c
+++ b/tests/display-test.c
@@ -141,6 +141,10 @@ registry_handle_globals(void *data, struct wl_registry 
*registry,
                if (hi->use_unversioned)
                        hi->seat = old_registry_bind(registry, id,
                                                     &wl_seat_interface, ver);
+               else if (1) { /* test _id version of bind */
+                       hi->seat = wl_seat_new();
+                       wl_registry_bind_id(registry, id, ver, hi->seat);
+               }
                else
                        hi->seat = wl_registry_bind(registry, id,
                                                    &wl_seat_interface, ver);
-- 
1.9.1

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to