Fix data device handling.
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>
Tue, 7 Feb 2012 14:37:11 +0000 (16:37 +0200)
committerJørgen Lind <jorgen.lind@nokia.com>
Tue, 7 Feb 2012 15:17:17 +0000 (16:17 +0100)
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
src/compositor/wayland_wrapper/wlinputdevice.h

index f908fe4..fd08624 100644 (file)
@@ -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);
 
index ac105d5..05980b6 100644 (file)
@@ -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;