Add synchronous transaction to wait for setInputWindow to complete (2/n)
Added InputWindowCommand syncInputWindows
This will allow the client to request SF to wait until setInputWindow
has completed on the InputDispatcher side.
Bug: 123041491
Test: Builds, no execution yet
Change-Id: Ibb5539455d20e4d612696ae7164ce84130bf91b4
diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp
index 206bc30..962d263 100644
--- a/libs/gui/LayerState.cpp
+++ b/libs/gui/LayerState.cpp
@@ -414,10 +414,13 @@
.insert(transferTouchFocusCommands.end(),
std::make_move_iterator(other.transferTouchFocusCommands.begin()),
std::make_move_iterator(other.transferTouchFocusCommands.end()));
+
+ syncInputWindows |= other.syncInputWindows;
}
void InputWindowCommands::clear() {
transferTouchFocusCommands.clear();
+ syncInputWindows = false;
}
void InputWindowCommands::write(Parcel& output) const {
@@ -426,6 +429,8 @@
output.writeStrongBinder(transferTouchFocusCommand.fromToken);
output.writeStrongBinder(transferTouchFocusCommand.toToken);
}
+
+ output.writeBool(syncInputWindows);
}
void InputWindowCommands::read(const Parcel& input) {
@@ -437,6 +442,8 @@
transferTouchFocusCommand.toToken = input.readStrongBinder();
transferTouchFocusCommands.emplace_back(transferTouchFocusCommand);
}
+
+ syncInputWindows = input.readBool();
}
}; // namespace android
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp
index bf2a03d..8c2538c 100644
--- a/libs/gui/SurfaceComposerClient.cpp
+++ b/libs/gui/SurfaceComposerClient.cpp
@@ -1083,6 +1083,11 @@
return *this;
}
+SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::syncInputWindows() {
+ mInputWindowCommands.syncInputWindows = true;
+ return *this;
+}
+
#endif
SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorTransform(
diff --git a/libs/gui/include/gui/LayerState.h b/libs/gui/include/gui/LayerState.h
index c780c07..8430874 100644
--- a/libs/gui/include/gui/LayerState.h
+++ b/libs/gui/include/gui/LayerState.h
@@ -254,6 +254,7 @@
};
std::vector<TransferTouchFocusCommand> transferTouchFocusCommands;
+ bool syncInputWindows;
void merge(const InputWindowCommands& other);
void clear();
diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h
index aa99bd2..cb38209 100644
--- a/libs/gui/include/gui/SurfaceComposerClient.h
+++ b/libs/gui/include/gui/SurfaceComposerClient.h
@@ -378,6 +378,7 @@
#ifndef NO_INPUT
Transaction& setInputWindowInfo(const sp<SurfaceControl>& sc, const InputWindowInfo& info);
Transaction& transferTouchFocus(const sp<IBinder>& fromToken, const sp<IBinder>& toToken);
+ Transaction& syncInputWindows();
#endif
// Set a color transform matrix on the given layer on the built-in display.
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index a4f6005..6d1c9fc 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -4180,6 +4180,10 @@
flags |= eTraversalNeeded;
}
+ if (inputWindowCommands.syncInputWindows) {
+ flags |= eTraversalNeeded;
+ }
+
mPendingInputWindowCommands.merge(inputWindowCommands);
return flags;
}