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; }