mouse.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /** @constructor */
  2. function MouseAdapter()
  3. {
  4. /** @const */
  5. var SPEED_FACTOR = .5;
  6. var left_down = false,
  7. right_down = false,
  8. middle_down = false,
  9. last_x = 0,
  10. last_y = 0,
  11. // callback to call on a mouse click
  12. send_click,
  13. // callback to call on a mouse move
  14. send_delta,
  15. mouse = this;
  16. this.enabled = false;
  17. function may_handle(e)
  18. {
  19. return mouse.enabled &&
  20. (!e.target || e.type === "mousemove" || (e.target.nodeName !== "INPUT" && e.target.nodeName !== "TEXTAREA"));
  21. }
  22. this.destroy = function()
  23. {
  24. window.removeEventListener("mousemove", mousemove_handler, false);
  25. document.removeEventListener("contextmenu", contextmenu_handler, false);
  26. window.removeEventListener("mousedown", mousedown_handler, false);
  27. window.removeEventListener("mouseup", mouseup_handler, false);
  28. };
  29. this.init = function(click_fn, delta_fn, wheel_fn)
  30. {
  31. this.destroy();
  32. send_click = click_fn;
  33. send_delta = delta_fn;
  34. // TODO: wheel_fn
  35. window.addEventListener("mousemove", mousemove_handler, false);
  36. document.addEventListener("contextmenu", contextmenu_handler, false);
  37. window.addEventListener("mousedown", mousedown_handler, false);
  38. window.addEventListener("mouseup", mouseup_handler, false);
  39. };
  40. function mousemove_handler(e)
  41. {
  42. if(!may_handle(e))
  43. {
  44. return;
  45. }
  46. var delta_x, delta_y;
  47. if(true)
  48. {
  49. delta_x = e["webkitMovementX"] || e["mozMovementX"] || 0;
  50. delta_y = e["webkitMovementY"] || e["mozMovementY"] || 0;
  51. }
  52. else
  53. {
  54. // Fallback for other browsers?
  55. delta_x = e.clientX - last_x;
  56. delta_y = e.clientY - last_y;
  57. last_x = e.clientX;
  58. last_y = e.clientY;
  59. }
  60. delta_x = Math.roundInfinity(delta_x * SPEED_FACTOR);
  61. delta_y = Math.roundInfinity(delta_y * SPEED_FACTOR);
  62. send_delta(delta_x, -delta_y);
  63. }
  64. function contextmenu_handler(e)
  65. {
  66. if(may_handle(e))
  67. {
  68. e.preventDefault();
  69. }
  70. }
  71. function mousedown_handler(e)
  72. {
  73. if(may_handle(e))
  74. {
  75. click_event(e, true);
  76. }
  77. }
  78. function mouseup_handler(e)
  79. {
  80. if(may_handle(e))
  81. {
  82. click_event(e, false);
  83. }
  84. }
  85. function click_event(e, down)
  86. {
  87. if(e.which === 1)
  88. {
  89. left_down = down;
  90. }
  91. else if(e.which === 2)
  92. {
  93. middle_down = down;
  94. }
  95. else if(e.which === 3)
  96. {
  97. right_down = down;
  98. }
  99. else
  100. {
  101. dbg_log("Unknown event.which: " + e.which, LOG_MOUSE);
  102. }
  103. send_click(left_down, middle_down, right_down);
  104. e.preventDefault();
  105. }
  106. }