Add a re-parent function to re-parent a specific child.
This is similar to reparentChildren, but the reparentChild will
only re-parent a specific child to the new parent and not all
children.
Test: Added test in Transaction_test for reparentChild.
Change-Id: I4275e0d5f1d5601b489956753c78a56d1a5d4c1c
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp
index 7ae2672..b0ae7e0 100644
--- a/libs/gui/SurfaceComposerClient.cpp
+++ b/libs/gui/SurfaceComposerClient.cpp
@@ -176,6 +176,9 @@
status_t reparentChildren(const sp<SurfaceComposerClient>& client,
const sp<IBinder>& id,
const sp<IBinder>& newParentHandle);
+ status_t reparentChild(const sp<SurfaceComposerClient>& client,
+ const sp<IBinder>& id, const sp<IBinder>& newParentHandle,
+ const sp<IBinder>& childHandle);
status_t detachChildren(const sp<SurfaceComposerClient>& client,
const sp<IBinder>& id);
status_t setOverrideScalingMode(const sp<SurfaceComposerClient>& client,
@@ -493,6 +496,21 @@
return NO_ERROR;
}
+status_t Composer::reparentChild(const sp<SurfaceComposerClient>& client,
+ const sp<IBinder>& id,
+ const sp<IBinder>& newParentHandle,
+ const sp<IBinder>& childHandle) {
+ Mutex::Autolock lock(mLock);
+ layer_state_t* s = getLayerStateLocked(client, id);
+ if (!s) {
+ return BAD_INDEX;
+ }
+ s->what |= layer_state_t::eReparentChild;
+ s->parentHandleForChild = newParentHandle;
+ s->childHandle = childHandle;
+ return NO_ERROR;
+}
+
status_t Composer::detachChildren(
const sp<SurfaceComposerClient>& client,
const sp<IBinder>& id) {
@@ -831,6 +849,11 @@
return getComposer().reparentChildren(this, id, newParentHandle);
}
+status_t SurfaceComposerClient::reparentChild(const sp<IBinder>& id,
+ const sp<IBinder>& newParentHandle, const sp<IBinder>& childHandle) {
+ return getComposer().reparentChild(this, id, newParentHandle, childHandle);
+}
+
status_t SurfaceComposerClient::detachChildren(const sp<IBinder>& id) {
return getComposer().detachChildren(this, id);
}