diff options
author | Gareth Stockwell <ext-gareth.stockwell@nokia.com> | 2010-08-10 15:34:19 (GMT) |
---|---|---|
committer | Gareth Stockwell <ext-gareth.stockwell@nokia.com> | 2010-08-18 09:13:51 (GMT) |
commit | cb8d2dcc70846ccd9384a8b94b2a80821c0eb285 (patch) | |
tree | c73cc9799567e86486d22f6985624e6981f477b9 /src/gui/kernel/qapplication_s60.cpp | |
parent | b5360eb223d5377beb62008fcc1da48f432dc8dd (diff) | |
download | Qt-cb8d2dcc70846ccd9384a8b94b2a80821c0eb285.zip Qt-cb8d2dcc70846ccd9384a8b94b2a80821c0eb285.tar.gz Qt-cb8d2dcc70846ccd9384a8b94b2a80821c0eb285.tar.bz2 |
Replaced backing store reference count with list of visible widgets
Previously, the following sequence:
1. Widget is hidden
2. Widget partially revealed
3. Widget fully revealed
resulted in the reference count of the backing store owned by the
widget's window() being incremented twice.
This patch replaces the simple reference count with a QSet which
stores pointers to the native widgets which are descendents of
the backing store owner, and which are currently visible. The
sequence above therefore results in just a single insertion at
step (2), with step (3) having no effect on the backing store.
The QRefCountedWidgetBackingStore class has been renamed
QWidgetBackingStoreTracker to better reflect its purpose.
Task-number: QTBUG-12800
Task-number: QTBUG-12817
Reviewed-by: Jason Barron
Diffstat (limited to 'src/gui/kernel/qapplication_s60.cpp')
-rw-r--r-- | src/gui/kernel/qapplication_s60.cpp | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index 559bb6a..df93bc5 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -1926,27 +1926,24 @@ int QApplicationPrivate::symbianProcessWsEvent(const QSymbianEvent *symbianEvent QWidget *const window = w->window(); if (!window->d_func()->maybeTopData()) break; - QRefCountedWidgetBackingStore &backingStore = window->d_func()->maybeTopData()->backingStore; + QWidgetBackingStoreTracker &backingStore = window->d_func()->maybeTopData()->backingStore; if (visChangedEvent->iFlags & TWsVisibilityChangedEvent::ENotVisible) { #ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS S60->wsSession().SendEffectCommand(ETfxCmdDeallocateLayer); #endif - // Decrement backing store reference count - backingStore.deref(); + backingStore.unregisterWidget(w); // In order to ensure that any resources used by the window surface // are immediately freed, we flush the WSERV command buffer. S60->wsSession().Flush(); } else if (visChangedEvent->iFlags & TWsVisibilityChangedEvent::EPartiallyVisible) { if (backingStore.data()) { - // Increment backing store reference count - backingStore.ref(); + backingStore.registerWidget(w); } else { #ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS S60->wsSession().SendEffectCommand(ETfxCmdRestoreLayer); #endif - // Create backing store with an initial reference count of 1 backingStore.create(window); - backingStore.ref(); + backingStore.registerWidget(w); w->d_func()->invalidateBuffer(w->rect()); w->repaint(); } |