From: Samuel Rødal Date: Fri, 8 Apr 2011 11:40:26 +0000 (+0200) Subject: Prevented crash due to dangling pointer in QWaylandInputDevice. X-Git-Tag: qt-v5.0.0-alpha1~222^2^2~66 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8339acac3c35ad7f884c985631b57fb91b516406;p=profile%2Fivi%2Fqtwayland.git Prevented crash due to dangling pointer in QWaylandInputDevice. When a QWaylandWindow is destroyed we need to make sure it's not still referenced by QWaylandInputDevice. --- diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h index ac0ad71..e02767d 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.h +++ b/src/plugins/platforms/wayland/qwaylanddisplay.h @@ -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 inputDevices() const { return mInputDevices; } + public slots: void createNewScreen(struct wl_output *output, QRect geometry); void readEvents(); diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp index 47f9c91..6c2f341 100644 --- a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp @@ -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, diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.h b/src/plugins/platforms/wayland/qwaylandinputdevice.h index 2328db8..3c83252 100644 --- a/src/plugins/platforms/wayland/qwaylandinputdevice.h +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.h @@ -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; diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp index c7cd147..d58b39d 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -41,9 +41,10 @@ #include "qwaylandwindow.h" +#include "qwaylandbuffer.h" #include "qwaylanddisplay.h" +#include "qwaylandinputdevice.h" #include "qwaylandscreen.h" -#include "qwaylandbuffer.h" #include #include @@ -66,6 +67,10 @@ QWaylandWindow::~QWaylandWindow() { if (mSurface) wl_surface_destroy(mSurface); + + QList inputDevices = mDisplay->inputDevices(); + for (int i = 0; i < inputDevices.size(); ++i) + inputDevices.at(i)->handleWindowDestroyed(this); } WId QWaylandWindow::winId() const