uint32_t id_count;
uint32_t mask;
struct wl_list link;
+ struct wl_hash_table *objects;
};
struct wl_display {
struct wl_resource resource;
struct wl_event_loop *loop;
- struct wl_hash_table *objects;
int run;
struct wl_list callback_list;
if (len < size)
break;
- resource = wl_hash_table_lookup(client->display->objects, p[0]);
+ resource = wl_hash_table_lookup(client->objects, p[0]);
if (resource == NULL) {
wl_client_post_error(client,
&client->display->resource.object,
message = &object->interface->methods[opcode];
closure = wl_connection_demarshal(client->connection, size,
- client->display->objects,
- message);
+ client->objects, message);
len -= size;
if (closure == NULL && errno == EINVAL) {
return NULL;
}
+ client->objects = wl_hash_table_create();
+ if (client->objects == NULL) {
+ wl_connection_destroy(client->connection);
+ free(client);
+ return NULL;
+ }
+
client->display_resource.object = display->resource.object;
client->display_resource.client = client;
+ client->display_resource.data = &display->resource;
+
+ wl_hash_table_insert(client->objects,
+ client->display_resource.object.id,
+ &client->display_resource);
wl_list_insert(display->client_list.prev, &client->link);
resource->client = client;
wl_list_init(&resource->destroy_listener_list);
- wl_hash_table_insert(client->display->objects,
- resource->object.id, resource);
+ wl_hash_table_insert(client->objects, resource->object.id, resource);
wl_list_insert(client->resource_list.prev, &resource->link);
}
WL_EXPORT void
wl_resource_destroy(struct wl_resource *resource, uint32_t time)
{
- struct wl_display *display = resource->client->display;
+ struct wl_client *client = resource->client;
struct wl_listener *l, *next;
wl_list_for_each_safe(l, next, &resource->destroy_listener_list, link)
wl_list_remove(&resource->link);
if (resource->object.id > 0)
- wl_hash_table_remove(display->objects, resource->object.id);
+ wl_hash_table_remove(client->objects, resource->object.id);
resource->destroy(resource);
}
wl_list_for_each_safe(resource, tmp, &client->resource_list, link)
wl_resource_destroy(resource, 0);
+ wl_hash_table_destroy(client->objects);
wl_event_source_remove(client->source);
wl_connection_destroy(client->connection);
wl_list_remove(&client->link);
"invalid object %d", id);
else if (global->bind)
global->bind(client, global->object, version);
+
+ wl_hash_table_insert(client->objects,
+ global->object->id, global->object);
+
}
static void
return NULL;
}
- display->objects = wl_hash_table_create();
- if (display->objects == NULL) {
- wl_event_loop_destroy(display->loop);
- free(display);
- return NULL;
- }
-
wl_list_init(&display->callback_list);
wl_list_init(&display->global_list);
wl_list_init(&display->socket_list);
wl_display_add_object(display, &display->resource.object);
if (wl_display_add_global(display, &display->resource.object, NULL)) {
- wl_hash_table_destroy(display->objects);
wl_event_loop_destroy(display->loop);
free(display);
return NULL;
struct wl_global *global, *gnext;
wl_event_loop_destroy(display->loop);
- wl_hash_table_destroy(display->objects);
wl_list_for_each_safe(s, next, &display->socket_list, link) {
close(s->fd);
unlink(s->addr.sun_path);
wl_display_add_object(struct wl_display *display, struct wl_object *object)
{
object->id = display->id++;
- wl_hash_table_insert(display->objects, object->id, object);
}
WL_EXPORT int