mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-03 09:01:42 -05:00
Bind globals to client provided object IDs
This commit is contained in:
parent
a7c6824328
commit
e908893080
6 changed files with 30 additions and 43 deletions
|
|
@ -31,9 +31,10 @@
|
|||
It is used for internal wayland protocol features. -->
|
||||
<interface name="wl_display" version="1">
|
||||
<request name="bind">
|
||||
<arg name="id" type="uint"/>
|
||||
<arg name="name" type="uint"/>
|
||||
<arg name="interface" type="string"/>
|
||||
<arg name="version" type="uint"/>
|
||||
<arg name="id" type="new_id" interface="wl_object"/>
|
||||
</request>
|
||||
|
||||
<!-- sync is an just an echo, which will reply with a key event.
|
||||
|
|
|
|||
|
|
@ -347,19 +347,6 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
|
|||
if (strcmp(interface->name, "wl_display") == 0)
|
||||
return;
|
||||
|
||||
printf("static inline struct %s *\n"
|
||||
"%s_create(struct wl_display *display, uint32_t id, uint32_t version)\n"
|
||||
"{\n"
|
||||
"\twl_display_bind(display, id, \"%s\", version);\n\n"
|
||||
"\treturn (struct %s *)\n"
|
||||
"\t\twl_proxy_create_for_id(display, &%s_interface, id);\n"
|
||||
"}\n\n",
|
||||
interface->name,
|
||||
interface->name,
|
||||
interface->name,
|
||||
interface->name,
|
||||
interface->name);
|
||||
|
||||
printf("static inline void\n"
|
||||
"%s_set_user_data(struct %s *%s, void *user_data)\n"
|
||||
"{\n"
|
||||
|
|
|
|||
|
|
@ -122,10 +122,10 @@ wl_display_remove_global_listener(struct wl_display *display,
|
|||
}
|
||||
|
||||
WL_EXPORT struct wl_proxy *
|
||||
wl_proxy_create_for_id(struct wl_display *display,
|
||||
const struct wl_interface *interface, uint32_t id)
|
||||
wl_proxy_create(struct wl_proxy *factory, const struct wl_interface *interface)
|
||||
{
|
||||
struct wl_proxy *proxy;
|
||||
struct wl_display *display = factory->display;
|
||||
|
||||
proxy = malloc(sizeof *proxy);
|
||||
if (proxy == NULL)
|
||||
|
|
@ -133,21 +133,13 @@ wl_proxy_create_for_id(struct wl_display *display,
|
|||
|
||||
proxy->object.interface = interface;
|
||||
proxy->object.implementation = NULL;
|
||||
proxy->object.id = id;
|
||||
proxy->object.id = wl_display_allocate_id(display);
|
||||
proxy->display = display;
|
||||
wl_hash_table_insert(display->objects, proxy->object.id, proxy);
|
||||
|
||||
return proxy;
|
||||
}
|
||||
|
||||
WL_EXPORT struct wl_proxy *
|
||||
wl_proxy_create(struct wl_proxy *factory,
|
||||
const struct wl_interface *interface)
|
||||
{
|
||||
return wl_proxy_create_for_id(factory->display, interface,
|
||||
wl_display_allocate_id(factory->display));
|
||||
}
|
||||
|
||||
WL_EXPORT void
|
||||
wl_proxy_destroy(struct wl_proxy *proxy)
|
||||
{
|
||||
|
|
@ -367,8 +359,6 @@ wl_display_connect(const char *name)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
wl_display_bind(display, 1, "wl_display", 1);
|
||||
|
||||
return display;
|
||||
}
|
||||
|
||||
|
|
@ -524,12 +514,20 @@ wl_display_allocate_id(struct wl_display *display)
|
|||
return display->id++;
|
||||
}
|
||||
|
||||
WL_EXPORT void
|
||||
WL_EXPORT void *
|
||||
wl_display_bind(struct wl_display *display,
|
||||
uint32_t id, const char *interface, uint32_t version)
|
||||
uint32_t name, const struct wl_interface *interface)
|
||||
{
|
||||
wl_proxy_marshal(&display->proxy,
|
||||
WL_DISPLAY_BIND, id, interface, version);
|
||||
struct wl_proxy *proxy;
|
||||
|
||||
proxy = wl_proxy_create(&display->proxy, interface);
|
||||
if (proxy == NULL)
|
||||
return NULL;
|
||||
|
||||
wl_proxy_marshal(&display->proxy, WL_DISPLAY_BIND,
|
||||
name, interface->name, interface->version, proxy);
|
||||
|
||||
return proxy;
|
||||
}
|
||||
|
||||
WL_EXPORT struct wl_callback *
|
||||
|
|
|
|||
|
|
@ -44,8 +44,9 @@ int wl_proxy_add_listener(struct wl_proxy *proxy,
|
|||
void wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data);
|
||||
void *wl_proxy_get_user_data(struct wl_proxy *proxy);
|
||||
|
||||
void wl_display_bind(struct wl_display *display,
|
||||
uint32_t id, const char *interface, uint32_t version);
|
||||
void *wl_display_bind(struct wl_display *display,
|
||||
uint32_t name, const struct wl_interface *interface);
|
||||
|
||||
struct wl_callback *wl_display_sync(struct wl_display *display);
|
||||
|
||||
#include "wayland-client-protocol.h"
|
||||
|
|
|
|||
|
|
@ -544,26 +544,24 @@ wl_input_device_update_grab(struct wl_input_device *device,
|
|||
|
||||
static void
|
||||
display_bind(struct wl_client *client,
|
||||
struct wl_resource *resource, uint32_t id,
|
||||
const char *interface, uint32_t version)
|
||||
struct wl_resource *resource, uint32_t name,
|
||||
const char *interface, uint32_t version, uint32_t id)
|
||||
{
|
||||
struct wl_global *global;
|
||||
struct wl_display *display = resource->data;
|
||||
|
||||
wl_list_for_each(global, &display->global_list, link)
|
||||
if (global->object->id == id)
|
||||
if (global->object->id == name)
|
||||
break;
|
||||
|
||||
if (&global->link == &display->global_list)
|
||||
wl_client_post_error(client, &client->display->resource.object,
|
||||
WL_DISPLAY_ERROR_INVALID_OBJECT,
|
||||
"invalid object %d", id);
|
||||
"invalid global %d", name);
|
||||
else if (global->bind)
|
||||
global->bind(client, global->object, version);
|
||||
|
||||
wl_hash_table_insert(client->objects,
|
||||
global->object->id, global->object);
|
||||
global->bind(client, global->object, version, id);
|
||||
|
||||
wl_hash_table_insert(client->objects, id, global->object);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -849,12 +847,14 @@ wl_display_add_socket(struct wl_display *display, const char *name)
|
|||
|
||||
static void
|
||||
compositor_bind(struct wl_client *client,
|
||||
struct wl_object *global, uint32_t version)
|
||||
struct wl_object *global, uint32_t version, uint32_t id)
|
||||
{
|
||||
struct wl_compositor *compositor =
|
||||
container_of(global, struct wl_compositor, resource.object);
|
||||
|
||||
compositor->resource.client = client;
|
||||
compositor->resource.object.id = id;
|
||||
|
||||
wl_resource_post_event(&compositor->resource,
|
||||
WL_COMPOSITOR_TOKEN_VISUAL,
|
||||
&compositor->argb_visual.object,
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ void wl_display_add_object(struct wl_display *display,
|
|||
|
||||
typedef void (*wl_global_bind_func_t)(struct wl_client *client,
|
||||
struct wl_object *global,
|
||||
uint32_t version);
|
||||
uint32_t version, uint32_t id);
|
||||
|
||||
int wl_display_add_global(struct wl_display *display,
|
||||
struct wl_object *object,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue