diff options
| -rw-r--r-- | libs/gui/tests/EndToEndNativeInputTest.cpp | 19 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 6 |
2 files changed, 24 insertions, 1 deletions
diff --git a/libs/gui/tests/EndToEndNativeInputTest.cpp b/libs/gui/tests/EndToEndNativeInputTest.cpp index 4a7848020f..ff1ba0ad17 100644 --- a/libs/gui/tests/EndToEndNativeInputTest.cpp +++ b/libs/gui/tests/EndToEndNativeInputTest.cpp @@ -391,6 +391,25 @@ TEST_F(InputSurfacesTest, input_respects_cropped_surface_insets) { parentSurface->expectTap(1, 1); } +// Ensure a surface whose insets are scaled, handles the touch offset correctly. +TEST_F(InputSurfacesTest, input_respects_scaled_surface_insets) { + std::unique_ptr<InputSurface> bgSurface = makeSurface(100, 100); + std::unique_ptr<InputSurface> fgSurface = makeSurface(100, 100); + bgSurface->showAt(100, 100); + + fgSurface->mInputInfo.surfaceInset = 5; + fgSurface->showAt(100, 100); + + fgSurface->doTransaction([&](auto &t, auto &sc) { t.setMatrix(sc, 2.0, 0, 0, 4.0); }); + + // expect = touch / scale - inset + injectTap(112, 124); + fgSurface->expectTap(1, 1); + + injectTap(101, 101); + bgSurface->expectTap(1, 1); +} + // Ensure we ignore transparent region when getting screen bounds when positioning input frame. TEST_F(InputSurfacesTest, input_ignores_transparent_region) { std::unique_ptr<InputSurface> surface = makeSurface(100, 100); diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index cbe8b299db..379b004f9e 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -2004,10 +2004,14 @@ InputWindowInfo Layer::fillInputInfo() { ui::Transform t = getTransform(); const float xScale = t.sx(); const float yScale = t.sy(); + float xSurfaceInset = info.surfaceInset; + float ySurfaceInset = info.surfaceInset; if (xScale != 1.0f || yScale != 1.0f) { info.windowXScale *= 1.0f / xScale; info.windowYScale *= 1.0f / yScale; info.touchableRegion.scaleSelf(xScale, yScale); + xSurfaceInset *= xScale; + ySurfaceInset *= yScale; } // Transform layer size to screen space and inset it by surface insets. @@ -2019,7 +2023,7 @@ InputWindowInfo Layer::fillInputInfo() { layerBounds = getCroppedBufferSize(getDrawingState()); } layerBounds = t.transform(layerBounds); - layerBounds.inset(info.surfaceInset, info.surfaceInset, info.surfaceInset, info.surfaceInset); + layerBounds.inset(xSurfaceInset, ySurfaceInset, xSurfaceInset, ySurfaceInset); // Input coordinate should match the layer bounds. info.frameLeft = layerBounds.left; |