diff options
-rw-r--r-- | libs/input/SpriteController.cpp | 19 | ||||
-rw-r--r-- | libs/input/SpriteController.h | 4 |
2 files changed, 15 insertions, 8 deletions
diff --git a/libs/input/SpriteController.cpp b/libs/input/SpriteController.cpp index da21438bafd1..2b809eab4ae4 100644 --- a/libs/input/SpriteController.cpp +++ b/libs/input/SpriteController.cpp @@ -70,8 +70,8 @@ void SpriteController::closeTransaction() { } void SpriteController::invalidateSpriteLocked(const sp<SpriteImpl>& sprite) { - bool wasEmpty = mLocked.invalidatedSprites.isEmpty(); - mLocked.invalidatedSprites.push(sprite); + bool wasEmpty = mLocked.invalidatedSprites.empty(); + mLocked.invalidatedSprites.push_back(sprite); if (wasEmpty) { if (mLocked.transactionNestingCount != 0) { mLocked.deferredSpriteUpdate = true; @@ -82,8 +82,8 @@ void SpriteController::invalidateSpriteLocked(const sp<SpriteImpl>& sprite) { } void SpriteController::disposeSurfaceLocked(const sp<SurfaceControl>& surfaceControl) { - bool wasEmpty = mLocked.disposedSurfaces.isEmpty(); - mLocked.disposedSurfaces.push(surfaceControl); + bool wasEmpty = mLocked.disposedSurfaces.empty(); + mLocked.disposedSurfaces.push_back(surfaceControl); if (wasEmpty) { mLooper->sendMessage(mHandler, Message(MSG_DISPOSE_SURFACES)); } @@ -113,7 +113,7 @@ void SpriteController::doUpdateSprites() { numSprites = mLocked.invalidatedSprites.size(); for (size_t i = 0; i < numSprites; i++) { - const sp<SpriteImpl>& sprite = mLocked.invalidatedSprites.itemAt(i); + const sp<SpriteImpl>& sprite = mLocked.invalidatedSprites[i]; updates.push(SpriteUpdate(sprite, sprite->getStateLocked())); sprite->resetDirtyLocked(); @@ -305,7 +305,7 @@ void SpriteController::doUpdateSprites() { void SpriteController::doDisposeSurfaces() { // Collect disposed surfaces. - Vector<sp<SurfaceControl> > disposedSurfaces; + std::vector<sp<SurfaceControl>> disposedSurfaces; { // acquire lock AutoMutex _l(mLock); @@ -313,6 +313,13 @@ void SpriteController::doDisposeSurfaces() { mLocked.disposedSurfaces.clear(); } // release lock + // Remove the parent from all surfaces. + SurfaceComposerClient::Transaction t; + for (const sp<SurfaceControl>& sc : disposedSurfaces) { + t.reparent(sc, nullptr); + } + t.apply(); + // Release the last reference to each surface outside of the lock. // We don't want the surfaces to be deleted while we are holding our lock. disposedSurfaces.clear(); diff --git a/libs/input/SpriteController.h b/libs/input/SpriteController.h index 2a80d9579711..2e9cb9685c46 100644 --- a/libs/input/SpriteController.h +++ b/libs/input/SpriteController.h @@ -251,8 +251,8 @@ private: sp<SurfaceComposerClient> mSurfaceComposerClient; struct Locked { - Vector<sp<SpriteImpl> > invalidatedSprites; - Vector<sp<SurfaceControl> > disposedSurfaces; + std::vector<sp<SpriteImpl>> invalidatedSprites; + std::vector<sp<SurfaceControl>> disposedSurfaces; uint32_t transactionNestingCount; bool deferredSpriteUpdate; } mLocked; // guarded by mLock |