summaryrefslogtreecommitdiff
path: root/src/resource.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/resource.c')
-rw-r--r--src/resource.c67
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;
+}