/src/org/mt4j/input/inputSources/MacTrackpadSource.java

http://mt4j.googlecode.com/ · Java · 74 lines · 54 code · 14 blank · 6 comment · 9 complexity · df694291f482aa89a2b7c45afd26de48 MD5 · raw file

  1. package org.mt4j.input.inputSources;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Observable;
  5. import java.util.Observer;
  6. import org.mt4j.MTApplication;
  7. import org.mt4j.input.inputData.ActiveCursorPool;
  8. import org.mt4j.input.inputData.InputCursor;
  9. import org.mt4j.input.inputData.MTFingerInputEvt;
  10. import org.mt4j.util.MT4jSettings;
  11. import com.alderstone.multitouch.mac.touchpad.Finger;
  12. import com.alderstone.multitouch.mac.touchpad.FingerState;
  13. import com.alderstone.multitouch.mac.touchpad.TouchpadObservable;
  14. /**
  15. * Input source for Mac OS X Trackpads.
  16. * Uses the library from http://kenai.com/projects/macmultitouch
  17. *
  18. * @author Florian Thalmann
  19. */
  20. public class MacTrackpadSource extends AbstractInputSource implements Observer {
  21. private TouchpadObservable tpo;
  22. private int windowWidth, windowHeight;
  23. private Map<Integer, Long> fingerIdToCursorId;
  24. public MacTrackpadSource(MTApplication mtApp) {
  25. super(mtApp);
  26. this.tpo = TouchpadObservable.getInstance();
  27. this.tpo.addObserver(this);
  28. this.windowWidth = MT4jSettings.getInstance().getWindowWidth();
  29. this.windowHeight = MT4jSettings.getInstance().getWindowHeight();
  30. this.fingerIdToCursorId = new HashMap<Integer, Long>();
  31. }
  32. public void update(Observable obj, Object arg) {
  33. Finger finger = (Finger) arg;
  34. int fingerID = finger.getID();
  35. ActiveCursorPool cursorPool = ActiveCursorPool.getInstance();
  36. int inputID;
  37. Long cursorID = fingerIdToCursorId.get(fingerID);
  38. InputCursor cursor = (cursorID != null)? cursorPool.getActiveCursorByID(cursorID) : null;
  39. if (finger.getState() == FingerState.PRESSED) {
  40. if (cursor == null) { //new finger
  41. cursor = new InputCursor();
  42. fingerIdToCursorId.put(fingerID, cursor.getId());
  43. cursorPool.putActiveCursor(cursor.getId(), cursor);
  44. inputID = MTFingerInputEvt.INPUT_STARTED;
  45. } else { //updated finger
  46. inputID = MTFingerInputEvt.INPUT_UPDATED;
  47. }
  48. } else { //removed finger
  49. if (cursorID != null){
  50. cursorPool.removeCursor(cursorID);
  51. }
  52. fingerIdToCursorId.remove(fingerID);
  53. inputID = MTFingerInputEvt.INPUT_ENDED;
  54. }
  55. int absoluteX = Math.round(finger.getX()*this.windowWidth);
  56. int absoluteY = Math.round((1-finger.getY())*this.windowHeight);
  57. this.enqueueInputEvent(new MTFingerInputEvt(this, absoluteX, absoluteY, inputID, cursor));
  58. }
  59. public void update() {}
  60. }