From 39aacb4dd11b6745a32d4404cee207c047177b07 Mon Sep 17 00:00:00 2001
From: Laszlo Agocs <laszlo.p.agocs@nokia.com>
Date: Tue, 7 Feb 2012 16:37:11 +0200
Subject: [PATCH] Fix data device handling.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Clearing the device list on resource destroy is wrong: it cleans away
data devices for all clients. Calling free when removing stale devices
for a client is also wrong.

Change-Id: I7bfcc928762dc4ca7dbf5abeebcd2489956e6828
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
---
 src/compositor/wayland_wrapper/wlinputdevice.cpp | 10 +++++++---
 src/compositor/wayland_wrapper/wlinputdevice.h   |  3 +++
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/compositor/wayland_wrapper/wlinputdevice.cpp b/src/compositor/wayland_wrapper/wlinputdevice.cpp
index f908fe41..fd08624b 100644
--- a/src/compositor/wayland_wrapper/wlinputdevice.cpp
+++ b/src/compositor/wayland_wrapper/wlinputdevice.cpp
@@ -220,17 +220,21 @@ void InputDevice::setMouseFocus(Surface *surface, const QPoint &globalPos, const
                                       localPos.x(), localPos.y());
 }
 
-void InputDevice::clientRequestedDataDevice(DataDeviceManager *data_device_manager, struct wl_client *client, uint32_t id)
+void InputDevice::cleanupDataDeviceForClient(struct wl_client *client)
 {
     for (int i = 0; i < m_data_devices.size(); i++) {
         struct wl_resource *data_device_resource =
                 m_data_devices.at(i)->dataDeviceResource();
         if (data_device_resource->client == client) {
             m_data_devices.removeAt(i);
-            free(data_device_resource);
             break;
         }
     }
+}
+
+void InputDevice::clientRequestedDataDevice(DataDeviceManager *data_device_manager, struct wl_client *client, uint32_t id)
+{
+    cleanupDataDeviceForClient(client);
     DataDevice *dataDevice = new DataDevice(data_device_manager,client,id);
     m_data_devices.append(dataDevice);
 }
@@ -328,7 +332,7 @@ void InputDevice::destroy_resource(wl_resource *resource)
         input_device->base()->pointer_focus_resource = 0;
     }
 
-    input_device->m_data_devices.clear();
+    input_device->cleanupDataDeviceForClient(resource->client);
 
     wl_list_remove(&resource->link);
 
diff --git a/src/compositor/wayland_wrapper/wlinputdevice.h b/src/compositor/wayland_wrapper/wlinputdevice.h
index ac105d56..05980b66 100644
--- a/src/compositor/wayland_wrapper/wlinputdevice.h
+++ b/src/compositor/wayland_wrapper/wlinputdevice.h
@@ -89,7 +89,10 @@ public:
 
     Compositor *compositor() const;
     WaylandInputDevice *handle() const;
+
 private:
+    void cleanupDataDeviceForClient(struct wl_client *client);
+
     WaylandInputDevice *m_handle;
     Compositor *m_compositor;
     QList<DataDevice *>m_data_devices;
-- 
GitLab