From fde7966c1b6122ed904d30e1f6e83eb8cd3a80b2 Mon Sep 17 00:00:00 2001 From: axis Date: Tue, 14 Jul 2009 10:31:41 +0200 Subject: Fixed a consistency problem in the backing store. Widgets maintain an internal state (inDirtyList) which says whether that widget is in the backing store's list of dirty widgets. Naturally this list has to be kept in sync with the actual list contents. This did not happen if the backing store was destroyed and recreated; if the list had any contents it would be destroyed without resetting the widget flags. Destroying and recreating the backing store is common on S60 where we try to save memory. Fixed by making sure those flags are reset during backing store destruction. Done together with Jason. RevBy: Jason Barron RevBy: bnilsen AutoTest: Included --- src/gui/painting/qbackingstore.cpp | 4 ++++ tests/auto/qwidget/tst_qwidget.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/gui/painting/qbackingstore.cpp b/src/gui/painting/qbackingstore.cpp index 34bc578..405acb7 100644 --- a/src/gui/painting/qbackingstore.cpp +++ b/src/gui/painting/qbackingstore.cpp @@ -829,6 +829,10 @@ QWidgetBackingStore::QWidgetBackingStore(QWidget *topLevel) QWidgetBackingStore::~QWidgetBackingStore() { + for (int c = 0; c < dirtyWidgets.size(); ++c) { + resetWidget(dirtyWidgets.at(c)); + } + delete windowSurface; windowSurface = 0; delete dirtyOnScreenWidgets; diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp index 4ddc6c4..e148fdb 100644 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ b/tests/auto/qwidget/tst_qwidget.cpp @@ -67,6 +67,7 @@ #include #include #include +#include #ifdef Q_WS_S60 #include // EEikStatusPaneUidTitle @@ -361,6 +362,8 @@ private slots: void focusWidget_task254563(); + void destroyBackingStore(); + private: bool ensureScreenSize(int width, int height); QWidget *testWidget; @@ -9199,5 +9202,31 @@ void tst_QWidget::focusWidget_task254563() QVERIFY(top.focusWidget() != widget); //dangling pointer } +void tst_QWidget::destroyBackingStore() +{ + UpdateWidget w; + w.show(); + +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(&w); +#endif + QApplication::processEvents(); + + w.reset(); + w.update(); + delete qt_widget_private(&w)->topData()->backingStore; + qt_widget_private(&w)->topData()->backingStore = 0; + qt_widget_private(&w)->topData()->backingStore = new QWidgetBackingStore(&w); + + w.update(); + QApplication::processEvents(); + QCOMPARE(w.numPaintEvents, 1); + + // Check one more time, because the second time around does more caching. + w.update(); + QApplication::processEvents(); + QCOMPARE(w.numPaintEvents, 2); +} + QTEST_MAIN(tst_QWidget) #include "tst_qwidget.moc" -- cgit v0.12