1
0
Fork 0
mirror of https://github.com/rfc2822/GfxTablet synced 2025-10-03 09:39:16 +02:00

make the android client sent stylus-in-range events if required

This commit is contained in:
Jarrad Whitaker 2015-11-27 23:53:55 +11:00
parent a4721a34ea
commit 0663ea37e6

View file

@ -17,10 +17,17 @@ import at.bitfire.gfxtablet.NetEvent.Type;
public class CanvasView extends View implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = "GfxTablet.CanvasView";
private enum InRangeStatus {
OutOfRange,
InRange,
FakeInRange
}
final SharedPreferences settings;
NetworkClient netClient;
boolean acceptStylusOnly;
int maxX, maxY;
InRangeStatus inRangeStatus;
// setup
@ -35,6 +42,7 @@ public class CanvasView extends View implements SharedPreferences.OnSharedPrefer
settings.registerOnSharedPreferenceChangeListener(this);
setBackground();
setInputMethods();
inRangeStatus = InRangeStatus.OutOfRange;
}
public void setNetworkClient(NetworkClient networkClient) {
@ -83,13 +91,23 @@ public class CanvasView extends View implements SharedPreferences.OnSharedPrefer
if (isEnabled()) {
for (int ptr = 0; ptr < event.getPointerCount(); ptr++)
if (!acceptStylusOnly || (event.getToolType(ptr) == MotionEvent.TOOL_TYPE_STYLUS)) {
short nx = normalizeX(event.getX(ptr)),
ny = normalizeY(event.getY(ptr)),
npressure = normalizePressure(event.getPressure(ptr));
Log.v(TAG, String.format("Generic motion event logged: %f|%f, pressure %f", event.getX(ptr), event.getY(ptr), event.getPressure(ptr)));
if (event.getActionMasked() == MotionEvent.ACTION_HOVER_MOVE)
netClient.getQueue().add(new NetEvent(Type.TYPE_MOTION,
normalizeX(event.getX(ptr)),
normalizeY(event.getY(ptr)),
normalizePressure(event.getPressure(ptr))
));
switch (event.getActionMasked()) {
case MotionEvent.ACTION_HOVER_MOVE:
netClient.getQueue().add(new NetEvent(Type.TYPE_MOTION, nx, ny, npressure));
break;
case MotionEvent.ACTION_HOVER_ENTER:
inRangeStatus = InRangeStatus.InRange;
netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, npressure, -1, true));
break;
case MotionEvent.ACTION_HOVER_EXIT:
inRangeStatus = InRangeStatus.OutOfRange;
netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, npressure, -1, false));
break;
}
}
return true;
}
@ -110,11 +128,19 @@ public class CanvasView extends View implements SharedPreferences.OnSharedPrefer
netClient.getQueue().add(new NetEvent(Type.TYPE_MOTION, nx, ny, npressure));
break;
case MotionEvent.ACTION_DOWN:
if (inRangeStatus == inRangeStatus.OutOfRange) {
inRangeStatus = inRangeStatus.FakeInRange;
netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, (short)0, -1, true));
}
netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, npressure, 0, true));
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, npressure, 0, false));
if (inRangeStatus == inRangeStatus.FakeInRange) {
inRangeStatus = inRangeStatus.OutOfRange;
netClient.getQueue().add(new NetEvent(Type.TYPE_BUTTON, nx, ny, (short)0, -1, false));
}
break;
}