*/
#include <stdlib.h>
+#include <string.h>
#include "wayland.h"
+struct wl_hash {
+ struct wl_object **objects;
+ uint32_t count, alloc;
+};
+
+struct wl_hash *
+wl_hash_create(void)
+{
+ struct wl_hash *hash;
+
+ hash = malloc(sizeof *hash);
+ if (hash == NULL)
+ return hash;
+
+ memset(hash, 0, sizeof *hash);
+
+ return hash;
+}
+
+void
+wl_hash_destroy(struct wl_hash *hash)
+{
+ free(hash);
+}
+
int wl_hash_insert(struct wl_hash *hash, struct wl_object *object)
{
struct wl_object **objects;
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
-struct wl_hash {
- struct wl_object **objects;
- uint32_t count, alloc, id;
-};
-
+struct wl_object;
+struct wl_hash;
+struct wl_hash *wl_hash_create(void);
+void wl_hash_destroy(struct wl_hash *hash);
int wl_hash_insert(struct wl_hash *hash, struct wl_object *object);
struct wl_object *wl_hash_lookup(struct wl_hash *hash, uint32_t id);
void wl_hash_delete(struct wl_hash *hash, struct wl_object *object);
struct wl_display {
struct wl_object base;
struct wl_event_loop *loop;
- struct wl_hash objects;
+ struct wl_hash *objects;
struct wl_object *pointer;
break;
case 'o':
types[i] = &ffi_type_pointer;
- object = wl_hash_lookup(&client->display->objects, *p);
+ object = wl_hash_lookup(client->display->objects, *p);
if (object == NULL)
printf("unknown object (%d)\n", *p);
if (object->interface != method->types[j])
case 'n':
types[i] = &ffi_type_uint32;
values[i].new_id = *p;
- object = wl_hash_lookup(&client->display->objects, *p);
+ object = wl_hash_lookup(client->display->objects, *p);
if (object != NULL)
printf("object already exists (%d)\n", *p);
p++;
if (len < size)
break;
- object = wl_hash_lookup(&client->display->objects, p[0]);
+ object = wl_hash_lookup(client->display->objects, p[0]);
if (object == NULL) {
wl_client_marshal(client, &client->display->base,
WL_DISPLAY_INVALID_OBJECT, p[0]);
}
ref->object = &surface->base;
- wl_hash_insert(&display->objects, &surface->base);
+ wl_hash_insert(display->objects, &surface->base);
wl_list_insert(client->object_list.prev, &ref->link);
return 0;
return NULL;
}
+ display->objects = wl_hash_create();
+ if (display->objects == NULL) {
+ free(display);
+ return NULL;
+ }
+
wl_list_init(&display->surface_list);
wl_list_init(&display->client_list);
wl_list_init(&display->global_list);
wl_display_add_object(struct wl_display *display, struct wl_object *object)
{
object->id = display->id++;
- wl_hash_insert(&display->objects, object);
+ wl_hash_insert(display->objects, object);
}
WL_EXPORT int