From 2d4a6c6ad65926b49cff93626c5d3b963644d8aa Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Wed, 4 Dec 2024 23:35:43 +0100 Subject: [PATCH] Inject main display events to the original display When mirroring a secondary display, touch and scroll events must be sent to the mirroring virtual display id (with coordinates relative to the virtual display size), rather than to the original display (with coordinates relative to the original display size). This behavior, introduced by d19396718ee0c0ba7fb578f595a6553c0458da59, was also applied for the main display for consistency. However, this mechanism has been found to cause some UI elements to become unclickable. To minimize inconveniences, restore the previous behavior when mirroring the main display: send all events to the original display id (0) with coordinates relative to the original display size. Fixes #5545 Fixes #5605 Refs #4598 Refs #5137 Refs #5370 --- .../com/genymobile/scrcpy/video/ScreenCapture.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java b/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java index 47425d090f..5d026a7322 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java @@ -129,10 +129,18 @@ public void start(Surface surface) throws IOException { try { virtualDisplay = ServiceManager.getDisplayManager() .createVirtualDisplay("scrcpy", inputSize.getWidth(), inputSize.getHeight(), displayId, surface); - virtualDisplayId = virtualDisplay.getDisplay().getDisplayId(); - // The positions are relative to the virtual display, not the original display (so use inputSize, not deviceSize!) - positionMapper = PositionMapper.create(videoSize, transform, inputSize); + + if (displayId == 0) { + // Main display: send all events to the original display, relative to the device size + Size deviceSize = displayInfo.getSize(); + positionMapper = PositionMapper.create(videoSize, transform, deviceSize); + virtualDisplayId = 0; + } else { + // The positions are relative to the virtual display, not the original display (so use inputSize, not deviceSize!) + positionMapper = PositionMapper.create(videoSize, transform, inputSize); + virtualDisplayId = virtualDisplay.getDisplay().getDisplayId(); + } Ln.d("Display: using DisplayManager API"); } catch (Exception displayManagerException) { try {