diff options
Diffstat (limited to 'src/resource.c')
-rw-r--r-- | src/resource.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/resource.c b/src/resource.c new file mode 100644 index 0000000..8d28f64 --- /dev/null +++ b/src/resource.c @@ -0,0 +1,67 @@ + +#include <stdint.h> +#include <stdlib.h> +#include <wayland-client.h> + +#include "Xlib-wayland.h" + +#include "private.h" + +union entry { + uintptr_t next; + void *data; +}; + +XID +csx_display_add_resource(struct csx_display *display, void *p) +{ + union entry *e, *map; + int size; + + if (display->free_resource > 0) { + e = display->resource_map + display->free_resource; + display->free_resource = e->next; + } else { + if (display->resource_count == display->resource_size) { + if (display->resource_size == 0) + size = 256; + else + size = display->resource_size * 2; + map = realloc(display->resource_map, + size * sizeof *e); + if (map == NULL) + abort(); /* FIXME: how do we handle OOM? */ + display->resource_map = map; + display->resource_size = size; + } + + e = display->resource_map + display->resource_count; + display->resource_count++; + } + + e->data = p; + + return e - display->resource_map; +} + +void +csx_display_remove_resource(struct csx_display *display, XID id) +{ + union entry *e; + + e = display->resource_map + id; + e->next = display->free_resource; + display->free_resource = id; +} + +void * +csx_display_lookup_resource(struct csx_display *display, XID id) +{ + /* FIXME: verify that we're looking up a valid resource: + * inside valid range and not in free-list. */ + + if (id >= display->resource_size) + return NULL; + + return display->resource_map[id].data; +} |