diff options
author | Jason Ekstrand <jason@jlekstrand.net> | 2013-06-27 20:09:20 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-07-02 17:01:23 -0400 |
commit | 4917a967bdcd33b7ad264af9c984c3957d87f569 (patch) | |
tree | cc8e65fb1da5b52c62d1070c6981bf90479ebf3b | |
parent | d35b6278c0a4b731fcd2464c848a1c3ab5ec93a4 (diff) |
Add wl_resource_create() and a version field to wl_resource
A new function, wl_resource_create(), lets the compositor create a
wl_resource for a given version of the interface. Passing 0 for the
object ID will allocate a new ID. The implementation, user data and
destructor can be set with wl_resource_set_implementation().
These two functions deprecates wl_client_add/new_object and the
main difference and motivation is the ability to provide a version number
for the resource. This lets the compositor track which version of the
interface a client has created and we'll use that to verify incoming requests.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
-rw-r--r-- | src/wayland-server.c | 69 | ||||
-rw-r--r-- | src/wayland-server.h | 12 | ||||
-rw-r--r-- | src/wayland-shm.c | 31 |
3 files changed, 80 insertions, 32 deletions
diff --git a/src/wayland-server.c b/src/wayland-server.c index 0c3fbc9..57770ab 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -109,6 +109,7 @@ struct wl_resource { struct wl_signal destroy_signal; struct wl_client *client; void *data; + int version; }; static int wl_debug = 0; @@ -510,6 +511,12 @@ wl_resource_get_user_data(struct wl_resource *resource) return resource->data; } +WL_EXPORT int +wl_resource_get_version(struct wl_resource *resource) +{ + return resource->version; +} + WL_EXPORT void wl_resource_set_destructor(struct wl_resource *resource, wl_resource_destroy_func_t destroy) @@ -603,8 +610,7 @@ display_sync(struct wl_client *client, struct wl_resource *callback; uint32_t serial; - callback = wl_client_add_object(client, - &wl_callback_interface, NULL, id, NULL); + callback = wl_resource_create(client, &wl_callback_interface, 1, id); serial = wl_display_get_serial(client->display); wl_callback_send_done(callback, serial); wl_resource_destroy(callback); @@ -626,9 +632,10 @@ display_get_registry(struct wl_client *client, struct wl_global *global; registry_resource = - wl_client_add_object(client, &wl_registry_interface, - ®istry_interface, id, display); - registry_resource->destroy = unbind_resource; + wl_resource_create(client, &wl_registry_interface, 1, id); + wl_resource_set_implementation(registry_resource, + ®istry_interface, + display, unbind_resource); wl_list_insert(&display->registry_resource_list, ®istry_resource->link); @@ -660,11 +667,10 @@ bind_display(struct wl_client *client, struct wl_display *display = data; client->display_resource = - wl_client_add_object(client, &wl_display_interface, - &display_interface, id, display); - - if(client->display_resource) - client->display_resource->destroy = destroy_client_display_resource; + wl_resource_create(client, &wl_display_interface, 1, id); + wl_resource_set_implementation(client->display_resource, + &display_interface, display, + destroy_client_display_resource); } WL_EXPORT struct wl_display * @@ -998,8 +1004,31 @@ wl_display_get_destroy_listener(struct wl_display *display, WL_EXPORT struct wl_resource * wl_client_add_object(struct wl_client *client, const struct wl_interface *interface, - const void *implementation, - uint32_t id, void *data) + const void *implementation, uint32_t id, void *data) +{ + struct wl_resource *resource; + + resource = wl_resource_create(client, interface, -1, id); + wl_resource_set_implementation(resource, implementation, data, NULL); + + return resource; +} + +WL_EXPORT void +wl_resource_set_implementation(struct wl_resource *resource, + const void *implementation, + void *data, wl_resource_destroy_func_t destroy) +{ + resource->object.implementation = implementation; + resource->data = data; + resource->destroy = destroy; +} + + +WL_EXPORT struct wl_resource * +wl_resource_create(struct wl_client *client, + const struct wl_interface *interface, + int version, uint32_t id) { struct wl_resource *resource; @@ -1009,15 +1038,19 @@ wl_client_add_object(struct wl_client *client, return NULL; } + if (id == 0) + id = wl_map_insert_new(&client->objects, 0, NULL); + resource->object.id = id; resource->object.interface = interface; - resource->object.implementation = implementation; + resource->object.implementation = NULL; wl_signal_init(&resource->destroy_signal); resource->destroy = NULL; resource->client = client; - resource->data = data; + resource->data = NULL; + resource->version = version; if (wl_map_insert_at(&client->objects, 0, resource->object.id, resource) < 0) { wl_resource_post_error(client->display_resource, @@ -1036,12 +1069,12 @@ wl_client_new_object(struct wl_client *client, const struct wl_interface *interface, const void *implementation, void *data) { - uint32_t id; + struct wl_resource *resource; - id = wl_map_insert_new(&client->objects, 0, NULL); - return wl_client_add_object(client, - interface, implementation, id, data); + resource = wl_resource_create(client, interface, -1, 0); + wl_resource_set_implementation(resource, implementation, data, NULL); + return resource; } WL_EXPORT void diff --git a/src/wayland-server.h b/src/wayland-server.h index df771e9..e20ade5 100644 --- a/src/wayland-server.h +++ b/src/wayland-server.h @@ -242,6 +242,16 @@ void wl_resource_post_no_memory(struct wl_resource *resource); struct wl_display * wl_client_get_display(struct wl_client *client); +struct wl_resource * +wl_resource_create(struct wl_client *client, + const struct wl_interface *interface, + int version, uint32_t id); +void +wl_resource_set_implementation(struct wl_resource *resource, + const void *implementation, + void *data, + wl_resource_destroy_func_t destroy); + void wl_resource_destroy(struct wl_resource *resource); uint32_t @@ -258,6 +268,8 @@ void wl_resource_set_user_data(struct wl_resource *resource, void *data); void * wl_resource_get_user_data(struct wl_resource *resource); +int +wl_resource_get_version(struct wl_resource *resource); void wl_resource_set_destructor(struct wl_resource *resource, wl_resource_destroy_func_t destroy); diff --git a/src/wayland-shm.c b/src/wayland-shm.c index 8a10253..dc9731b 100644 --- a/src/wayland-shm.c +++ b/src/wayland-shm.c @@ -127,10 +127,11 @@ shm_pool_create_buffer(struct wl_client *client, struct wl_resource *resource, buffer->pool = pool; pool->refcount++; - buffer->resource = wl_client_add_object(client, &wl_buffer_interface, - &shm_buffer_interface, - id, buffer); - wl_resource_set_destructor(buffer->resource, destroy_buffer); + buffer->resource = + wl_resource_create(client, &wl_buffer_interface, 1, id); + wl_resource_set_implementation(buffer->resource, + &shm_buffer_interface, + buffer, destroy_buffer); } static void @@ -204,12 +205,14 @@ shm_create_pool(struct wl_client *client, struct wl_resource *resource, } close(fd); - pool->resource = wl_client_add_object(client, &wl_shm_pool_interface, - &shm_pool_interface, id, pool); + pool->resource = + wl_resource_create(client, &wl_shm_pool_interface, 1, id); if (!pool->resource) goto err_free; - wl_resource_set_destructor(pool->resource, destroy_pool); + wl_resource_set_implementation(pool->resource, + &shm_pool_interface, + pool, destroy_pool); return; @@ -229,8 +232,8 @@ bind_shm(struct wl_client *client, { struct wl_resource *resource; - resource = wl_client_add_object(client, &wl_shm_interface, - &shm_interface, id, data); + resource = wl_resource_create(client, &wl_shm_interface, 1, id); + wl_resource_set_implementation(resource, &shm_interface, data, NULL); wl_shm_send_format(resource, WL_SHM_FORMAT_ARGB8888); wl_shm_send_format(resource, WL_SHM_FORMAT_XRGB8888); @@ -271,11 +274,11 @@ wl_shm_buffer_create(struct wl_client *client, buffer->offset = 0; buffer->pool = NULL; - - buffer->resource = wl_client_add_object(client, &wl_buffer_interface, - &shm_buffer_interface, - id, buffer); - wl_resource_set_destructor(buffer->resource, destroy_buffer); + buffer->resource = + wl_resource_create(client, &wl_buffer_interface, 1, id); + wl_resource_set_implementation(buffer->resource, + &shm_buffer_interface, + buffer, destroy_buffer); return buffer; } |