From 3c50917a6ac1ee7fd4707d69a8ca186343c21f91 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Thu, 16 May 2013 14:28:07 +0200 Subject: Android: Fix crash when using QBackingStore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When making a QBackingStore for a QWindow that was not created yet, Qt would try to dereference the (null) platform window pointer. Task-number: QTBUG-31022 Change-Id: I866c71cce9d401ebb598ea4cc91f7cf9bbb30982 Reviewed-by: Samuel Rødal Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/platformsupport/fbconvenience/qfbbackingstore.cpp | 5 ++++- src/platformsupport/fbconvenience/qfbscreen.cpp | 13 +++++++++++++ src/platformsupport/fbconvenience/qfbscreen_p.h | 4 ++++ 3 files changed, 21 insertions(+), 1 deletion(-) (limited to 'src/platformsupport') diff --git a/src/platformsupport/fbconvenience/qfbbackingstore.cpp b/src/platformsupport/fbconvenience/qfbbackingstore.cpp index 2a481835e2..b378434ef2 100644 --- a/src/platformsupport/fbconvenience/qfbbackingstore.cpp +++ b/src/platformsupport/fbconvenience/qfbbackingstore.cpp @@ -51,7 +51,10 @@ QT_BEGIN_NAMESPACE QFbBackingStore::QFbBackingStore(QWindow *window) : QPlatformBackingStore(window) { - (static_cast(window->handle()))->setBackingStore(this); + if (window->handle()) + (static_cast(window->handle()))->setBackingStore(this); + else + (static_cast(window->screen()->handle()))->addBackingStore(this); } QFbBackingStore::~QFbBackingStore() diff --git a/src/platformsupport/fbconvenience/qfbscreen.cpp b/src/platformsupport/fbconvenience/qfbscreen.cpp index 6427b62972..e5b9f09c14 100644 --- a/src/platformsupport/fbconvenience/qfbscreen.cpp +++ b/src/platformsupport/fbconvenience/qfbscreen.cpp @@ -71,6 +71,19 @@ void QFbScreen::initializeCompositor() void QFbScreen::addWindow(QFbWindow *window) { mWindowStack.prepend(window); + if (!mBackingStores.isEmpty()) { + //check if we have a backing store for this window + for (int i = 0; i < mBackingStores.size(); ++i) { + QFbBackingStore *bs = mBackingStores.at(i); + // this gets called during QWindow::create() at a point where the + // invariant (window->handle()->window() == window) is broken + if (bs->window() == window->window()) { + window->setBackingStore(bs); + mBackingStores.removeAt(i); + break; + } + } + } invalidateRectCache(); setDirty(window->geometry()); QWindow *w = topWindow(); diff --git a/src/platformsupport/fbconvenience/qfbscreen_p.h b/src/platformsupport/fbconvenience/qfbscreen_p.h index c7106358d9..01a352e96a 100644 --- a/src/platformsupport/fbconvenience/qfbscreen_p.h +++ b/src/platformsupport/fbconvenience/qfbscreen_p.h @@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE class QFbWindow; class QFbCursor; class QPainter; +class QFbBackingStore; class QFbScreen : public QObject, public QPlatformScreen { @@ -74,6 +75,8 @@ public: virtual void lower(QFbWindow *window); virtual void topWindowChanged(QWindow *) {} + void addBackingStore(QFbBackingStore *bs) {mBackingStores << bs;} + public slots: virtual void setDirty(const QRect &rect); void setPhysicalSize(const QSize &size); @@ -102,6 +105,7 @@ private: QPainter *mCompositePainter; QList > mCachedRects; + QList mBackingStores; friend class QFbWindow; bool mIsUpToDate; -- cgit v1.2.3