From 20ced841dd2e40eab3dd58d49e399fd31f5c520c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Feb 2021 15:48:37 -0600 Subject: [PATCH] Handle pointer capture on SOURCE_TOUCHPAD devices --- app/src/main/java/com/limelight/Game.java | 1 + .../AndroidNativePointerCaptureProvider.java | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index 264d4e84..d8f0588e 100644 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -1187,6 +1187,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, { // This case is for mice and non-finger touch devices if (event.getSource() == InputDevice.SOURCE_MOUSE || + event.getSource() == InputDevice.SOURCE_TOUCHPAD || event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE || (event.getPointerCount() >= 1 && (event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE || diff --git a/app/src/main/java/com/limelight/binding/input/capture/AndroidNativePointerCaptureProvider.java b/app/src/main/java/com/limelight/binding/input/capture/AndroidNativePointerCaptureProvider.java index 1c777a4f..09bb97fc 100644 --- a/app/src/main/java/com/limelight/binding/input/capture/AndroidNativePointerCaptureProvider.java +++ b/app/src/main/java/com/limelight/binding/input/capture/AndroidNativePointerCaptureProvider.java @@ -38,23 +38,31 @@ public class AndroidNativePointerCaptureProvider extends AndroidPointerIconCaptu @Override public boolean eventHasRelativeMouseAxes(MotionEvent event) { - return event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE; + // SOURCE_MOUSE_RELATIVE is how SOURCE_MOUSE appears when our view has pointer capture. + // SOURCE_TOUCHPAD will have relative axes populated iff our view has pointer capture. + // See https://developer.android.com/reference/android/view/View#requestPointerCapture() + return event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE || + (event.getSource() == InputDevice.SOURCE_TOUCHPAD && targetView.hasPointerCapture()); } @Override public float getRelativeAxisX(MotionEvent event) { - float x = event.getX(); + int axis = (event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE) ? + MotionEvent.AXIS_X : MotionEvent.AXIS_RELATIVE_X; + float x = event.getAxisValue(axis); for (int i = 0; i < event.getHistorySize(); i++) { - x += event.getHistoricalX(i); + x += event.getHistoricalAxisValue(axis, i); } return x; } @Override public float getRelativeAxisY(MotionEvent event) { - float y = event.getY(); + int axis = (event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE) ? + MotionEvent.AXIS_Y : MotionEvent.AXIS_RELATIVE_Y; + float y = event.getAxisValue(axis); for (int i = 0; i < event.getHistorySize(); i++) { - y += event.getHistoricalY(i); + y += event.getHistoricalAxisValue(axis, i); } return y; }