summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@digia.com>2013-05-16 14:28:07 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-05-22 15:20:18 +0200
commit3c50917a6ac1ee7fd4707d69a8ca186343c21f91 (patch)
treea66d2b91c1a3e92f86b9b9a51435951245711e35 /src
parent18db71d601f7164e4120ae94277fe9faa398abe6 (diff)
Android: Fix crash when using QBackingStore
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 <samuel.rodal@digia.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/platformsupport/fbconvenience/qfbbackingstore.cpp5
-rw-r--r--src/platformsupport/fbconvenience/qfbscreen.cpp13
-rw-r--r--src/platformsupport/fbconvenience/qfbscreen_p.h4
3 files changed, 21 insertions, 1 deletions
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<QFbWindow *>(window->handle()))->setBackingStore(this);
+ if (window->handle())
+ (static_cast<QFbWindow *>(window->handle()))->setBackingStore(this);
+ else
+ (static_cast<QFbScreen *>(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<QPair<QRect, int> > mCachedRects;
+ QList <QFbBackingStore*> mBackingStores;
friend class QFbWindow;
bool mIsUpToDate;