123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /** @constructor */
- function MouseAdapter()
- {
- /** @const */
- var SPEED_FACTOR = .5;
- var left_down = false,
- right_down = false,
- middle_down = false,
- last_x = 0,
- last_y = 0,
- // callback to call on a mouse click
- send_click,
- // callback to call on a mouse move
- send_delta,
- mouse = this;
- this.enabled = false;
- function may_handle(e)
- {
- return mouse.enabled &&
- (!e.target || e.type === "mousemove" || (e.target.nodeName !== "INPUT" && e.target.nodeName !== "TEXTAREA"));
- }
- this.destroy = function()
- {
- window.removeEventListener("mousemove", mousemove_handler, false);
- document.removeEventListener("contextmenu", contextmenu_handler, false);
- window.removeEventListener("mousedown", mousedown_handler, false);
- window.removeEventListener("mouseup", mouseup_handler, false);
- };
- this.init = function(click_fn, delta_fn, wheel_fn)
- {
- this.destroy();
- send_click = click_fn;
- send_delta = delta_fn;
- // TODO: wheel_fn
- window.addEventListener("mousemove", mousemove_handler, false);
- document.addEventListener("contextmenu", contextmenu_handler, false);
- window.addEventListener("mousedown", mousedown_handler, false);
- window.addEventListener("mouseup", mouseup_handler, false);
- };
- function mousemove_handler(e)
- {
- if(!may_handle(e))
- {
- return;
- }
- var delta_x, delta_y;
- if(true)
- {
- delta_x = e["webkitMovementX"] || e["mozMovementX"] || 0;
- delta_y = e["webkitMovementY"] || e["mozMovementY"] || 0;
- }
- else
- {
- // Fallback for other browsers?
- delta_x = e.clientX - last_x;
- delta_y = e.clientY - last_y;
- last_x = e.clientX;
- last_y = e.clientY;
- }
- delta_x = Math.roundInfinity(delta_x * SPEED_FACTOR);
- delta_y = Math.roundInfinity(delta_y * SPEED_FACTOR);
- send_delta(delta_x, -delta_y);
- }
- function contextmenu_handler(e)
- {
- if(may_handle(e))
- {
- e.preventDefault();
- }
- }
- function mousedown_handler(e)
- {
- if(may_handle(e))
- {
- click_event(e, true);
- }
- }
- function mouseup_handler(e)
- {
- if(may_handle(e))
- {
- click_event(e, false);
- }
- }
- function click_event(e, down)
- {
- if(e.which === 1)
- {
- left_down = down;
- }
- else if(e.which === 2)
- {
- middle_down = down;
- }
- else if(e.which === 3)
- {
- right_down = down;
- }
- else
- {
- dbg_log("Unknown event.which: " + e.which, LOG_MOUSE);
- }
- send_click(left_down, middle_down, right_down);
- e.preventDefault();
- }
- }
|