Compare commits

...

4 Commits

Author SHA1 Message Date
Cameron Gutman c30c54d562 Version 9.2.1 2020-04-23 18:40:40 -07:00
Cameron Gutman 45ff51c0d2 Fix mouse jumping on Shield devices when clicking or scrolling 2020-04-23 00:13:19 -07:00
Cameron Gutman 5b86e99138 Improve dead zone precision for stylus input 2020-04-22 22:46:05 -07:00
Cameron Gutman 0c72910eb7 Fix tap location for styluses without hover support 2020-04-22 22:00:25 -07:00
4 changed files with 69 additions and 39 deletions
+2 -2
View File
@@ -7,8 +7,8 @@ android {
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 29 targetSdkVersion 29
versionName "9.2" versionName "9.2.1"
versionCode = 222 versionCode = 223
} }
flavorDimensions "root" flavorDimensions "root"
+60 -35
View File
@@ -95,8 +95,11 @@ public class Game extends Activity implements SurfaceHolder.Callback,
private static final int REFERENCE_HORIZ_RES = 1280; private static final int REFERENCE_HORIZ_RES = 1280;
private static final int REFERENCE_VERT_RES = 720; private static final int REFERENCE_VERT_RES = 720;
private static final int STYLUS_DEAD_ZONE_DELAY = 250; private static final int STYLUS_DOWN_DEAD_ZONE_DELAY = 100;
private static final int STYLUS_DEAD_ZONE_RADIUS = 50; private static final int STYLUS_DOWN_DEAD_ZONE_RADIUS = 20;
private static final int STYLUS_UP_DEAD_ZONE_DELAY = 150;
private static final int STYLUS_UP_DEAD_ZONE_RADIUS = 50;
private static final int THREE_FINGER_TAP_THRESHOLD = 300; private static final int THREE_FINGER_TAP_THRESHOLD = 300;
@@ -119,8 +122,10 @@ public class Game extends Activity implements SurfaceHolder.Callback,
private boolean grabbedInput = true; private boolean grabbedInput = true;
private boolean grabComboDown = false; private boolean grabComboDown = false;
private StreamView streamView; private StreamView streamView;
private long stylusDownTime = 0; private long lastAbsTouchUpTime = 0;
private float stylusDownX, stylusDownY; private long lastAbsTouchDownTime = 0;
private float lastAbsTouchUpX, lastAbsTouchUpY;
private float lastAbsTouchDownX, lastAbsTouchDownY;
private boolean isHidingOverlays; private boolean isHidingOverlays;
private TextView notificationOverlayView; private TextView notificationOverlayView;
@@ -1176,6 +1181,23 @@ public class Game extends Activity implements SurfaceHolder.Callback,
return true; return true;
} }
// Always update the position before sending any button events. If we're
// dealing with a stylus without hover support, our position might be
// significantly different than before.
if (inputCaptureProvider.eventHasRelativeMouseAxes(event)) {
// Send the deltas straight from the motion event
short deltaX = (short)inputCaptureProvider.getRelativeAxisX(event);
short deltaY = (short)inputCaptureProvider.getRelativeAxisY(event);
if (deltaX != 0 || deltaY != 0) {
conn.sendMouseMove(deltaX, deltaY);
}
}
else if (view != null) {
// Otherwise send absolute position
updateMousePosition(view, event);
}
if (event.getActionMasked() == MotionEvent.ACTION_SCROLL) { if (event.getActionMasked() == MotionEvent.ACTION_SCROLL) {
// Send the vertical scroll packet // Send the vertical scroll packet
byte vScrollClicks = (byte) event.getAxisValue(MotionEvent.AXIS_VSCROLL); byte vScrollClicks = (byte) event.getAxisValue(MotionEvent.AXIS_VSCROLL);
@@ -1235,16 +1257,16 @@ public class Game extends Activity implements SurfaceHolder.Callback,
if (event.getPointerCount() == 1 && event.getActionIndex() == 0) { if (event.getPointerCount() == 1 && event.getActionIndex() == 0) {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) { if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) {
stylusDownTime = SystemClock.uptimeMillis(); lastAbsTouchDownTime = SystemClock.uptimeMillis();
stylusDownX = event.getX(0); lastAbsTouchDownX = event.getX(0);
stylusDownY = event.getY(0); lastAbsTouchDownY = event.getY(0);
// Stylus is left click // Stylus is left click
conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_LEFT); conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_LEFT);
} else if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) { } else if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) {
stylusDownTime = SystemClock.uptimeMillis(); lastAbsTouchDownTime = SystemClock.uptimeMillis();
stylusDownX = event.getX(0); lastAbsTouchDownX = event.getX(0);
stylusDownY = event.getY(0); lastAbsTouchDownY = event.getY(0);
// Eraser is right click // Eraser is right click
conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_RIGHT); conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_RIGHT);
@@ -1252,18 +1274,16 @@ public class Game extends Activity implements SurfaceHolder.Callback,
} }
else if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) { else if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) { if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) {
// It looks odd to set these on ACTION_UP, but it makes sense. lastAbsTouchUpTime = SystemClock.uptimeMillis();
// The last "down" position is actually when we come up. lastAbsTouchUpX = event.getX(0);
stylusDownTime = SystemClock.uptimeMillis(); lastAbsTouchUpY = event.getY(0);
stylusDownX = event.getX(0);
stylusDownY = event.getY(0);
// Stylus is left click // Stylus is left click
conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_LEFT); conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_LEFT);
} else if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) { } else if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) {
stylusDownTime = SystemClock.uptimeMillis(); lastAbsTouchUpTime = SystemClock.uptimeMillis();
stylusDownX = event.getX(0); lastAbsTouchUpX = event.getX(0);
stylusDownY = event.getY(0); lastAbsTouchUpY = event.getY(0);
// Eraser is right click // Eraser is right click
conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_RIGHT); conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_RIGHT);
@@ -1271,17 +1291,6 @@ public class Game extends Activity implements SurfaceHolder.Callback,
} }
} }
// Get relative axis values if we can
if (inputCaptureProvider.eventHasRelativeMouseAxes(event)) {
// Send the deltas straight from the motion event
conn.sendMouseMove((short) inputCaptureProvider.getRelativeAxisX(event),
(short) inputCaptureProvider.getRelativeAxisY(event));
}
else if (view != null) {
// Otherwise send absolute position
updateMousePosition(view, event);
}
lastButtonState = event.getButtonState(); lastButtonState = event.getButtonState();
} }
// This case is for fingers // This case is for fingers
@@ -1403,13 +1412,29 @@ public class Game extends Activity implements SurfaceHolder.Callback,
float eventY = event.getY(0); float eventY = event.getY(0);
if (event.getPointerCount() == 1 && event.getActionIndex() == 0 && if (event.getPointerCount() == 1 && event.getActionIndex() == 0 &&
(event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) || (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER ||
event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS))
{ {
if (SystemClock.uptimeMillis() - stylusDownTime <= STYLUS_DEAD_ZONE_DELAY && switch (event.getActionMasked()) {
Math.sqrt(Math.pow(eventX - stylusDownX, 2) + Math.pow(eventY - stylusDownY, 2)) <= STYLUS_DEAD_ZONE_RADIUS) { case MotionEvent.ACTION_DOWN:
// Ignore small inputs shortly after the stylus has been pressed. This ensures users can reliably double click. case MotionEvent.ACTION_HOVER_ENTER:
return; case MotionEvent.ACTION_HOVER_EXIT:
case MotionEvent.ACTION_HOVER_MOVE:
if (SystemClock.uptimeMillis() - lastAbsTouchUpTime <= STYLUS_UP_DEAD_ZONE_DELAY &&
Math.sqrt(Math.pow(eventX - lastAbsTouchUpX, 2) + Math.pow(eventY - lastAbsTouchUpY, 2)) <= STYLUS_UP_DEAD_ZONE_RADIUS) {
// Enforce a small deadzone between touch up and hover or touch down to allow more precise double-clicking
return;
}
break;
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
if (SystemClock.uptimeMillis() - lastAbsTouchDownTime <= STYLUS_DOWN_DEAD_ZONE_DELAY &&
Math.sqrt(Math.pow(eventX - lastAbsTouchDownX, 2) + Math.pow(eventY - lastAbsTouchDownY, 2)) <= STYLUS_DOWN_DEAD_ZONE_RADIUS) {
// Enforce a small deadzone between touch down and move or touch up to allow more precise double-clicking
return;
}
break;
} }
} }
@@ -75,8 +75,10 @@ public class ShieldCaptureProvider extends InputCaptureProvider {
@Override @Override
public boolean eventHasRelativeMouseAxes(MotionEvent event) { public boolean eventHasRelativeMouseAxes(MotionEvent event) {
return event.getAxisValue(AXIS_RELATIVE_X) != 0 || // All mouse events should use relative axes, even if they are zero. This avoids triggering
event.getAxisValue(AXIS_RELATIVE_Y) != 0; // cursor jumps if we get an event with no associated motion, like ACTION_DOWN or ACTION_UP.
return event.getPointerCount() == 1 && event.getActionIndex() == 0 &&
event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE;
} }
@Override @Override
@@ -0,0 +1,3 @@
- Improved stylus deadzone behavior
- Fixed incorrect mouse position on styluses without hover support
- Fixed mouse clicks causing cursor jumping on Nvidia Shield devices