Prevented crash due to dangling pointer in QWaylandInputDevice.
authorSamuel Rødal <samuel.rodal@nokia.com>
Fri, 8 Apr 2011 11:40:26 +0000 (13:40 +0200)
committerSamuel Rødal <samuel.rodal@nokia.com>
Fri, 8 Apr 2011 12:17:04 +0000 (14:17 +0200)
When a QWaylandWindow is destroyed we need to make sure it's not still
referenced by QWaylandInputDevice.

src/plugins/platforms/wayland/qwaylanddisplay.h
src/plugins/platforms/wayland/qwaylandinputdevice.cpp
src/plugins/platforms/wayland/qwaylandinputdevice.h
src/plugins/platforms/wayland/qwaylandwindow.cpp

index ac0ad71..e02767d 100644 (file)
@@ -76,11 +76,13 @@ public:
 #endif
     void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y);
 
-
     void syncCallback(wl_display_sync_func_t func, void *data);
     void frameCallback(wl_display_frame_func_t func, void *data);
 
     struct wl_display *wl_display() const { return mDisplay; }
+
+    QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
+
 public slots:
     void createNewScreen(struct wl_output *output, QRect geometry);
     void readEvents();
index 47f9c91..6c2f341 100644 (file)
@@ -83,6 +83,14 @@ QWaylandInputDevice::QWaylandInputDevice(struct wl_display *display,
 #endif
 }
 
+void QWaylandInputDevice::handleWindowDestroyed(QWaylandWindow *window)
+{
+    if (window == mPointerFocus)
+        mPointerFocus = 0;
+    if (window == mKeyboardFocus)
+        mKeyboardFocus = 0;
+}
+
 void QWaylandInputDevice::inputHandleMotion(void *data,
                                            struct wl_input_device *input_device,
                                            uint32_t time,
index 2328db8..3c83252 100644 (file)
@@ -59,6 +59,7 @@ class QWaylandInputDevice {
 public:
     QWaylandInputDevice(struct wl_display *display, uint32_t id);
     void attach(QWaylandBuffer *buffer, int x, int y);
+    void handleWindowDestroyed(QWaylandWindow *window);
 
 private:
     struct wl_display *mDisplay;
index c7cd147..d58b39d 100644 (file)
 
 #include "qwaylandwindow.h"
 
+#include "qwaylandbuffer.h"
 #include "qwaylanddisplay.h"
+#include "qwaylandinputdevice.h"
 #include "qwaylandscreen.h"
-#include "qwaylandbuffer.h"
 
 #include <QtGui/QWidget>
 #include <QtGui/QWindowSystemInterface>
@@ -66,6 +67,10 @@ QWaylandWindow::~QWaylandWindow()
 {
     if (mSurface)
         wl_surface_destroy(mSurface);
+
+    QList<QWaylandInputDevice *> inputDevices = mDisplay->inputDevices();
+    for (int i = 0; i < inputDevices.size(); ++i)
+        inputDevices.at(i)->handleWindowDestroyed(this);
 }
 
 WId QWaylandWindow::winId() const