--- /dev/null
+#include <stdlib.h>
+#include <wayland-server.h>
+
+#include "libds/log.h"
+
+#define DATA_DEVICE_MANAGER_VERSION 3
+
+struct ds_data_device_manager
+{
+ struct wl_global *global;
+
+ struct wl_listener display_destroy;
+
+ struct {
+ struct wl_signal destroy;
+ } events;
+};
+
+static void
+data_device_manager_bind(struct wl_client *client, void *data,
+ uint32_t version, uint32_t id);
+static void
+data_device_manager_handle_display_destroy(struct wl_listener *listener,
+ void *data);
+
+WL_EXPORT struct ds_data_device_manager *
+ds_data_device_manager_create(struct wl_display *display)
+{
+ struct ds_data_device_manager *manager;
+
+ manager = calloc(1, sizeof *manager);
+ if (!manager) {
+ ds_err("Could not create data device manager");
+ return NULL;
+ }
+
+ wl_signal_init(&manager->events.destroy);
+
+ manager->global = wl_global_create(display,
+ &wl_data_device_manager_interface, DATA_DEVICE_MANAGER_VERSION,
+ manager, data_device_manager_bind);
+ if (!manager->global) {
+ ds_err("Could not create data device manager wl_global");
+ free(manager);
+ return NULL;
+ }
+
+ manager->display_destroy.notify =
+ data_device_manager_handle_display_destroy;
+ wl_display_add_destroy_listener(display, &manager->display_destroy);
+
+ return manager;
+}
+
+WL_EXPORT void
+ds_data_device_manager_add_destroy_listener(
+ struct ds_data_device_manager *manager,
+ struct wl_listener *listener)
+{
+ wl_signal_add(&manager->events.destroy, listener);
+}
+
+static const struct wl_data_device_manager_interface data_device_manager_iface;
+
+static void
+data_device_manager_bind(struct wl_client *client, void *data,
+ uint32_t version, uint32_t id)
+{
+ struct ds_data_device_manager *manager = data;
+ struct wl_resource *resource;
+
+ resource = wl_resource_create(client, &wl_data_device_manager_interface,
+ version, id);
+ if (!resource) {
+ wl_client_post_no_memory(client);
+ return;
+ }
+ wl_resource_set_implementation(resource, &data_device_manager_iface,
+ manager, NULL);
+}
+
+static void
+data_device_manager_handle_display_destroy(struct wl_listener *listener,
+ void *data)
+{
+ struct ds_data_device_manager *manager;
+
+ manager = wl_container_of(listener, manager, display_destroy);
+
+ wl_signal_emit(&manager->events.destroy, manager);
+ wl_list_remove(&manager->display_destroy.link);
+ wl_global_destroy(manager->global);
+ free(manager);
+}
+
+static void data_device_manager_handle_create_data_source(
+ struct wl_client *client, struct wl_resource *resource,
+ uint32_t id)
+{
+}
+
+static void data_device_manager_handle_get_data_device(
+ struct wl_client *client, struct wl_resource *resource,
+ uint32_t id, struct wl_resource *seat_resource)
+{
+}
+
+static const struct wl_data_device_manager_interface
+data_device_manager_iface = {
+ .create_data_source = data_device_manager_handle_create_data_source,
+ .get_data_device = data_device_manager_handle_get_data_device,
+};