Add skeleton code for ds_data_device_manager 69/279269/1
authorSeunghun <chwila927@gmail.com>
Thu, 21 Jul 2022 04:28:21 +0000 (13:28 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 5 Aug 2022 01:14:05 +0000 (10:14 +0900)
Change-Id: I1c298afcfcf5a73eb421a576b87357fda4e5b4dd

include/libds/data_device.h [new file with mode: 0644]
src/data_device/data_device.h [new file with mode: 0644]
src/data_device/manager.c [new file with mode: 0644]
src/data_device/meson.build [new file with mode: 0644]
src/meson.build

diff --git a/include/libds/data_device.h b/include/libds/data_device.h
new file mode 100644 (file)
index 0000000..3513017
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef LIBDS_DATA_DEVICE_H
+#define LIBDS_DATA_DEVICE_H
+
+#include <wayland-server.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct ds_data_device_manager;
+
+struct ds_data_source;
+
+struct ds_data_deivce_manager *
+ds_data_device_manager_create(struct wl_display *display);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/data_device/data_device.h b/src/data_device/data_device.h
new file mode 100644 (file)
index 0000000..97c915a
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef DS_DATA_DEVICE_H
+#define DS_DATA_DEVICE_H
+
+
+
+#endif
diff --git a/src/data_device/manager.c b/src/data_device/manager.c
new file mode 100644 (file)
index 0000000..85b6473
--- /dev/null
@@ -0,0 +1,112 @@
+#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,
+};
diff --git a/src/data_device/meson.build b/src/data_device/meson.build
new file mode 100644 (file)
index 0000000..da71c4c
--- /dev/null
@@ -0,0 +1,3 @@
+libds_files += files(
+  'manager.c',
+)
index 7cde232..55a0263 100644 (file)
@@ -78,6 +78,7 @@ libds_deps = [
 
 subdir('backend')
 subdir('allocator')
+subdir('data_device')
 
 lib_libds = shared_library('ds', libds_files,
   dependencies: libds_deps,