[PATCH weston v3 2/2] Implement data_device interface destructor

kabeer.khan at samsung.com kabeer.khan at samsung.com
Wed Aug 27 04:04:25 PDT 2014


From: kabeer <kabeer.khan at samsung.com>

window: use data_device interface destructor
data-device: implement data_device_release destructor

Signed-off-by: kabeer <kabeer.khan at samsung.com>
---
 clients/window.c  |   14 ++++++++++----
 src/data-device.c |   14 ++++++++++----
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/clients/window.c b/clients/window.c
index 5d64022..e32c2b3 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -133,6 +133,7 @@ struct display {
 
 	int has_rgb565;
 	int seat_version;
+    int data_device_manager_version;
 };
 
 struct window_output {
@@ -5036,6 +5037,7 @@ display_add_input(struct display *d, uint32_t id)
 			 EPOLLIN, &input->repeat_task);
 }
 
+#define DATA_DEVICE_MANAGER_VERSION_CURRENT 2 /* Current version of data_device_manager */
 static void
 input_destroy(struct input *input)
 {
@@ -5048,9 +5050,12 @@ input_destroy(struct input *input)
 	if (input->selection_offer)
 		data_offer_destroy(input->selection_offer);
 
-	if (input->data_device)
-		wl_data_device_destroy(input->data_device);
-
+    if (input->data_device) {
+        if(input->display->data_device_manager_version>=DATA_DEVICE_MANAGER_VERSION_CURRENT)
+            wl_data_device_release(input->data_device);
+        else
+            wl_data_device_destroy(input->data_device);
+    }
 	if (input->display->seat_version >= 3) {
 		if (input->pointer)
 			wl_pointer_release(input->pointer);
@@ -5134,9 +5139,10 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t id,
 		d->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1);
 		wl_shm_add_listener(d->shm, &shm_listener, d);
 	} else if (strcmp(interface, "wl_data_device_manager") == 0) {
+        d->data_device_manager_version=MIN(version,DATA_DEVICE_MANAGER_VERSION_CURRENT);
 		d->data_device_manager =
 			wl_registry_bind(registry, id,
-					 &wl_data_device_manager_interface, 1);
+                     &wl_data_device_manager_interface, d->data_device_manager_version);
 	} else if (strcmp(interface, "xdg_shell") == 0) {
 		d->xdg_shell = wl_registry_bind(registry, id,
 						&xdg_shell_interface, 1);
diff --git a/src/data-device.c b/src/data-device.c
index 75fc60c..697ed55 100644
--- a/src/data-device.c
+++ b/src/data-device.c
@@ -761,10 +761,16 @@ data_device_set_selection(struct wl_client *client,
 				  wl_resource_get_user_data(source_resource),
 				  serial);
 }
+static void
+data_device_release(struct wl_client *client, struct wl_resource *resource)
+{
+       wl_resource_destroy(resource);
+}
 
 static const struct wl_data_device_interface data_device_interface = {
 	data_device_start_drag,
 	data_device_set_selection,
+	data_device_release
 };
 
 static void
@@ -844,8 +850,8 @@ get_data_device(struct wl_client *client,
 	struct wl_resource *resource;
 
 	resource = wl_resource_create(client,
-				      &wl_data_device_interface, 1, id);
-	if (resource == NULL) {
+                      &wl_data_device_interface, wl_resource_get_version(manager_resource), id);
+    if (resource == NULL) {
 		wl_resource_post_no_memory(manager_resource);
 		return;
 	}
@@ -869,7 +875,7 @@ bind_manager(struct wl_client *client,
 
 	resource =
 		wl_resource_create(client,
-				   &wl_data_device_manager_interface, 1, id);
+				   &wl_data_device_manager_interface, MIN(version, 2), id);
 	if (resource == NULL) {
 		wl_client_post_no_memory(client);
 		return;
@@ -909,7 +915,7 @@ WL_EXPORT int
 wl_data_device_manager_init(struct wl_display *display)
 {
 	if (wl_global_create(display,
-			     &wl_data_device_manager_interface, 1,
+                 &wl_data_device_manager_interface, 2,
 			     NULL, bind_manager) == NULL)
 		return -1;
 
-- 
1.7.9.5



More information about the wayland-devel mailing list