Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c30c54d562 | |||
| 45ff51c0d2 | |||
| 5b86e99138 | |||
| 0c72910eb7 |
+2
-2
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user