\r
ArrayList<KeyEvent> keyEvents = new ArrayList<KeyEvent>();\r
ArrayList<TouchEvent> touchEvents = new ArrayList<TouchEvent>();\r
- int[] touchX = new int[40];\r
- int[] touchY = new int[40];\r
- boolean[] touched = new boolean[40];\r
+ int[] touchX = new int[20];\r
+ int[] touchY = new int[20];\r
+ boolean[] touched = new boolean[20];\r
+ int[] realId = new int[20];\r
final boolean hasMultitouch;\r
private HashSet<Integer> keys = new HashSet<Integer>();\r
private SensorManager manager;\r
view.requestFocusFromTouch();\r
this.config = config;\r
\r
+ for(int i = 0; i < realId.length; i++) realId[i] = -1;\r
handle = new Handler();\r
this.app = activity;\r
this.sleepTime = config.touchSleepTime;\r
}\r
\r
@Override public int getX () {\r
- return touchX[0];\r
+ synchronized (realId) {\r
+ return touchX[0];\r
+ }\r
}\r
\r
@Override public int getY () {\r
- return touchY[0];\r
+ synchronized (realId) {\r
+ return touchY[0];\r
+ }\r
}\r
\r
@Override public int getX (int pointer) {\r
- return touchX[pointer];\r
+ synchronized (realId) {\r
+ return touchX[pointer];\r
+ }\r
}\r
\r
@Override public int getY (int pointer) {\r
- return touchY[pointer];\r
+ synchronized (realId) {\r
+ return touchY[pointer];\r
+ }\r
}\r
\r
public boolean isTouched (int pointer) {\r
- return touched[pointer];\r
+ synchronized (realId) {\r
+ return touched[pointer];\r
+ }\r
}\r
\r
@Override public boolean isKeyPressed (int key) {\r
if(peripheral == Peripheral.MultitouchScreen) return hasMultitouch;\r
return false;\r
}\r
+ \r
+ public int getFreePointerIndex() {\r
+ int len = realId.length;\r
+ for(int i = 0; i < len; i++) {\r
+ if(realId[i] == -1) return i;\r
+ }\r
+ return -1;\r
+ }\r
+ \r
+ public int lookUpPointerIndex(int pointerId) {\r
+ int len = realId.length;\r
+ for(int i = 0; i < len; i++) {\r
+ if(realId[i] == pointerId) return i;\r
+ }\r
+ return -1;\r
+ }\r
}\r
public void onTouch (MotionEvent event, AndroidInput input) {\r
final int action = event.getAction() & MotionEvent.ACTION_MASK;\r
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;\r
- int pointerId = event.getPointerId(pointerIndex);\r
-\r
+ int pointerId = event.getPointerId(pointerIndex); \r
+ \r
int x = 0, y = 0;\r
+ int realPointerIndex = 0;\r
\r
- switch (action) {\r
- case MotionEvent.ACTION_DOWN:\r
- case MotionEvent.ACTION_POINTER_DOWN:\r
- x = (int)event.getX(pointerIndex);\r
- y = (int)event.getY(pointerIndex);\r
- postTouchEvent(input, TouchEvent.TOUCH_DOWN, x, y, pointerId);\r
- input.touchX[pointerId] = x;\r
- input.touchY[pointerId] = y;\r
- input.touched[pointerId] = true;\r
- break;\r
-\r
- case MotionEvent.ACTION_UP:\r
- case MotionEvent.ACTION_POINTER_UP:\r
- case MotionEvent.ACTION_OUTSIDE:\r
- case MotionEvent.ACTION_CANCEL:\r
- x = (int)event.getX(pointerIndex);\r
- y = (int)event.getY(pointerIndex);\r
- postTouchEvent(input, TouchEvent.TOUCH_UP, x, y, pointerId);\r
- input.touchX[pointerId] = x;\r
- input.touchY[pointerId] = y;\r
- input.touched[pointerId] = false;\r
- break;\r
-\r
- case MotionEvent.ACTION_MOVE:\r
- int pointerCount = event.getPointerCount();\r
- for (int i = 0; i < pointerCount; i++) {\r
- pointerIndex = i;\r
- pointerId = event.getPointerId(pointerIndex);\r
+ synchronized(input.realId) { // FUCK \r
+ switch (action) {\r
+ case MotionEvent.ACTION_DOWN:\r
+ case MotionEvent.ACTION_POINTER_DOWN:\r
+ realPointerIndex = input.getFreePointerIndex(); // get a free pointer index as reported by Input.getX() etc.\r
+ input.realId[realPointerIndex] = pointerId;\r
+ x = (int)event.getX(pointerIndex);\r
+ y = (int)event.getY(pointerIndex);\r
+ postTouchEvent(input, TouchEvent.TOUCH_DOWN, x, y, realPointerIndex);\r
+ input.touchX[realPointerIndex] = x;\r
+ input.touchY[realPointerIndex] = y;\r
+ input.touched[realPointerIndex] = true;\r
+ break;\r
+ \r
+ case MotionEvent.ACTION_UP:\r
+ case MotionEvent.ACTION_POINTER_UP:\r
+ case MotionEvent.ACTION_OUTSIDE:\r
+ case MotionEvent.ACTION_CANCEL:\r
+ realPointerIndex = input.lookUpPointerIndex(pointerId);\r
+ input.realId[realPointerIndex] = -1;\r
x = (int)event.getX(pointerIndex);\r
y = (int)event.getY(pointerIndex);\r
- postTouchEvent(input, TouchEvent.TOUCH_DRAGGED, x, y, pointerId);\r
- input.touchX[pointerId] = x;\r
- input.touchY[pointerId] = y;\r
+ postTouchEvent(input, TouchEvent.TOUCH_UP, x, y, realPointerIndex);\r
+ input.touchX[realPointerIndex] = x;\r
+ input.touchY[realPointerIndex] = y;\r
+ input.touched[realPointerIndex] = false;\r
+ break;\r
+ \r
+ case MotionEvent.ACTION_MOVE:\r
+ int pointerCount = event.getPointerCount();\r
+ for (int i = 0; i < pointerCount; i++) {\r
+ pointerIndex = i;\r
+ pointerId = event.getPointerId(pointerIndex);\r
+ x = (int)event.getX(pointerIndex);\r
+ y = (int)event.getY(pointerIndex);\r
+ realPointerIndex = input.lookUpPointerIndex(pointerId);\r
+ postTouchEvent(input, TouchEvent.TOUCH_DRAGGED, x, y, realPointerIndex);\r
+ input.touchX[realPointerIndex] = x;\r
+ input.touchY[realPointerIndex] = y;\r
+ }\r
+ break;\r
}\r
- break;\r
}\r
}\r
\r