Commit 3c50917a authored by Paul Olav Tvete's avatar Paul Olav Tvete Committed by The Qt Project
Browse files

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: default avatarSamuel Rødal <samuel.rodal@digia.com>
Reviewed-by: default avatarEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
parent 18db71d6
dev 5.10 5.11 5.12 5.12.1 5.12.10 5.12.11 5.12.12 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13 5.13.0 5.13.1 5.13.2 5.14 5.14.0 5.14.1 5.14.2 5.15 5.15.0 5.15.1 5.15.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.9.8 6.0 6.0.0 6.1 6.1.0 6.1.1 6.1.2 6.1.3 6.2 6.2.0 6.2.1 6.2.2 old/5.1 old/5.2 wip/cmake wip/highdpi wip/lite wip/mir wip/nacl wip/network-test-server wip/remac wip/tizen wip/webassembly v5.15.0-alpha1 v5.14.1 v5.14.0 v5.14.0-rc2 v5.14.0-rc1 v5.14.0-beta3 v5.14.0-beta2 v5.14.0-beta1 v5.14.0-alpha1 v5.13.2 v5.13.1 v5.13.0 v5.13.0-rc3 v5.13.0-rc2 v5.13.0-rc1 v5.13.0-beta4 v5.13.0-beta3 v5.13.0-beta2 v5.13.0-beta1 v5.13.0-alpha1 v5.12.7 v5.12.6 v5.12.5 v5.12.4 v5.12.3 v5.12.2 v5.12.1 v5.12.0 v5.12.0-rc2 v5.12.0-rc1 v5.12.0-beta4 v5.12.0-beta3 v5.12.0-beta2 v5.12.0-beta1 v5.12.0-alpha1 v5.11.3 v5.11.2 v5.11.1 v5.11.0 v5.11.0-rc2 v5.11.0-rc1 v5.11.0-beta4 v5.11.0-beta3 v5.11.0-beta2 v5.11.0-beta1 v5.11.0-alpha1 v5.10.1 v5.10.0 v5.10.0-rc3 v5.10.0-rc2 v5.10.0-rc1 v5.10.0-beta4 v5.10.0-beta3 v5.10.0-beta2 v5.10.0-beta1 v5.10.0-alpha1 v5.9.9 v5.9.8 v5.9.7 v5.9.6 v5.9.5 v5.9.4 v5.9.3 v5.9.2 v5.9.1 v5.9.0 v5.9.0-rc2 v5.9.0-rc1 v5.9.0-beta4 v5.9.0-beta3 v5.9.0-beta2 v5.9.0-beta1 v5.9.0-alpha1 v5.8.0 v5.8.0-rc1 v5.8.0-beta1 v5.8.0-alpha1 v5.7.1 v5.7.0 v5.7.0-rc1 v5.7.0-beta1 v5.7.0-alpha1 v5.6.3 v5.6.2 v5.6.1 v5.6.1-1 v5.6.0 v5.6.0-rc1 v5.6.0-beta1 v5.6.0-alpha1 v5.5.1 v5.5.0 v5.5.0-rc1 v5.5.0-beta1 v5.5.0-alpha1 v5.4.2 v5.4.1 v5.4.0 v5.4.0-rc1 v5.4.0-beta1 v5.4.0-alpha1 v5.3.2 v5.3.1 v5.3.0 v5.3.0-rc1 v5.3.0-beta1 v5.3.0-alpha1 v5.2.1 v5.2.0 v5.2.0-rc1 v5.2.0-beta1 v5.2.0-alpha1 v5.1.1 v5.1.0 v5.1.0-rc2 v5.1.0-rc1
No related merge requests found
Showing with 21 additions and 1 deletion
...@@ -51,7 +51,10 @@ QT_BEGIN_NAMESPACE ...@@ -51,7 +51,10 @@ QT_BEGIN_NAMESPACE
QFbBackingStore::QFbBackingStore(QWindow *window) QFbBackingStore::QFbBackingStore(QWindow *window)
: QPlatformBackingStore(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() QFbBackingStore::~QFbBackingStore()
......
...@@ -71,6 +71,19 @@ void QFbScreen::initializeCompositor() ...@@ -71,6 +71,19 @@ void QFbScreen::initializeCompositor()
void QFbScreen::addWindow(QFbWindow *window) void QFbScreen::addWindow(QFbWindow *window)
{ {
mWindowStack.prepend(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(); invalidateRectCache();
setDirty(window->geometry()); setDirty(window->geometry());
QWindow *w = topWindow(); QWindow *w = topWindow();
......
...@@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE ...@@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE
class QFbWindow; class QFbWindow;
class QFbCursor; class QFbCursor;
class QPainter; class QPainter;
class QFbBackingStore;
class QFbScreen : public QObject, public QPlatformScreen class QFbScreen : public QObject, public QPlatformScreen
{ {
...@@ -74,6 +75,8 @@ public: ...@@ -74,6 +75,8 @@ public:
virtual void lower(QFbWindow *window); virtual void lower(QFbWindow *window);
virtual void topWindowChanged(QWindow *) {} virtual void topWindowChanged(QWindow *) {}
void addBackingStore(QFbBackingStore *bs) {mBackingStores << bs;}
public slots: public slots:
virtual void setDirty(const QRect &rect); virtual void setDirty(const QRect &rect);
void setPhysicalSize(const QSize &size); void setPhysicalSize(const QSize &size);
...@@ -102,6 +105,7 @@ private: ...@@ -102,6 +105,7 @@ private:
QPainter *mCompositePainter; QPainter *mCompositePainter;
QList<QPair<QRect, int> > mCachedRects; QList<QPair<QRect, int> > mCachedRects;
QList <QFbBackingStore*> mBackingStores;
friend class QFbWindow; friend class QFbWindow;
bool mIsUpToDate; bool mIsUpToDate;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment