From ccfd4db37071139b45348ddadf000dc7a14e134b Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 29 Sep 2019 16:08:03 +0200 Subject: [PATCH] localId --- .../com/genymobile/scrcpy/Controller.java | 18 +++++-- .../java/com/genymobile/scrcpy/Finger.java | 8 ++- .../com/genymobile/scrcpy/FingersState.java | 54 ++++++------------- 3 files changed, 37 insertions(+), 43 deletions(-) diff --git a/server/src/main/java/com/genymobile/scrcpy/Controller.java b/server/src/main/java/com/genymobile/scrcpy/Controller.java index 31672023..9fd4455e 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Controller.java +++ b/server/src/main/java/com/genymobile/scrcpy/Controller.java @@ -199,16 +199,24 @@ public class Controller { // ignore event return false; } - boolean ok = fingersState.set(fingerId, point, pressure, action == MotionEvent.ACTION_UP); - if (!ok) { + Finger finger = fingersState.get(fingerId); + if (finger == null) { Ln.w("Too many fingers for touch event"); return false; } + finger.setPoint(point); + finger.setPressure(pressure); + finger.setUp(action == MotionEvent.ACTION_UP); + // FAIL: action_up will always remove the finger, and the event will not be written! int pointerCount = fingersState.update(touchPointerProperties, touchPointerCoords); - fingersState.cleanUp(); - Ln.w("pointerCount = " + pointerCount); - MotionEvent event = MotionEvent.obtain(lastTouchDown, now, action, pointerCount, touchPointerProperties, touchPointerCoords, 0, 0, 1f, 1f, 0, 0, + + Ln.d("pointerCount = " + pointerCount); + for (int i = 0; i < pointerCount; ++i) { + Ln.d("props = " + touchPointerProperties[i].id); + Ln.d("coords = " + touchPointerCoords[i].x + "," + touchPointerCoords[i].y); + } + MotionEvent event = MotionEvent.obtain(lastTouchDown, now, action | (finger.getLocalId() << 8), pointerCount, touchPointerProperties, touchPointerCoords, 0, 0, 1f, 1f, 0, 0, InputDevice.SOURCE_TOUCHSCREEN, 0); return injectEvent(event); } diff --git a/server/src/main/java/com/genymobile/scrcpy/Finger.java b/server/src/main/java/com/genymobile/scrcpy/Finger.java index 90e25f0b..dfeb6e2e 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Finger.java +++ b/server/src/main/java/com/genymobile/scrcpy/Finger.java @@ -3,18 +3,24 @@ package com.genymobile.scrcpy; public class Finger { private final long id; + private final int localId; private Point point; private float pressure; private boolean up; - public Finger(long id) { + public Finger(long id, int localId) { this.id = id; + this.localId = localId; } public long getId() { return id; } + public int getLocalId() { + return localId; + } + public Point getPoint() { return point; } diff --git a/server/src/main/java/com/genymobile/scrcpy/FingersState.java b/server/src/main/java/com/genymobile/scrcpy/FingersState.java index 71a15784..c08fff6a 100644 --- a/server/src/main/java/com/genymobile/scrcpy/FingersState.java +++ b/server/src/main/java/com/genymobile/scrcpy/FingersState.java @@ -36,50 +36,24 @@ public class FingersState { return -1; } - private Finger create(long id) { + public Finger get(long id) { int index = indexOf(id); if (index != -1) { // already exists, return it return fingers[index]; } - int firstEmpty = indexOfFirstEmpty(); - if (firstEmpty == -1) { + index = indexOfFirstEmpty(); + if (index == -1) { // it's full return null; } - Finger finger = new Finger(id); - fingers[firstEmpty] = finger; + // id 0 is reserved for mouse events + int localId = index;// + 1; + Finger finger = new Finger(id, localId); + fingers[index] = finger; return finger; } - public boolean unset(long id) { - int index = indexOf(id); - if (index == -1) { - return false; - } - fingers[index] = null; - return true; - } - - public boolean set(long id, Point point, float pressure, boolean up) { - Finger finger = create(id); - if (finger == null) { - return false; - } - finger.setPoint(point); - finger.setPressure(pressure); - finger.setUp(up); - return true; - } - - public void cleanUp() { - for (int i = 0; i < fingers.length; ++i) { - if (fingers[i] != null && fingers[i].isUp()) { - fingers[i] = null; - } - } - } - /** * Initialize the motion event parameters. * @@ -93,12 +67,18 @@ public class FingersState { Finger finger = fingers[i]; if (finger != null) { // id 0 is reserved for mouse events - props[count].id = i + 1; + props[count].id = finger.getLocalId(); + Ln.d("update id = " + finger.getLocalId()); Point point = finger.getPoint(); - coords[i].x = point.getX(); - coords[i].y = point.getY(); - coords[i].pressure = finger.getPressure(); + coords[count].x = point.getX(); + coords[count].y = point.getY(); + coords[count].pressure = finger.getPressure(); + + if (finger.isUp()) { + // remove it + fingers[i] = null; + } ++count; }