From 67dae3429207672884c09470cb36e8ff7dbef5ab Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 27 Aug 2011 12:13:10 -0700 Subject: [PATCH] Tap support, ignore mouse events while touch events are in progress. --- src/main/resources/mouse.js | 79 +++++++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/src/main/resources/mouse.js b/src/main/resources/mouse.js index 8fff3cf..9614c99 100644 --- a/src/main/resources/mouse.js +++ b/src/main/resources/mouse.js @@ -107,6 +107,9 @@ Guacamole.Mouse = function(element) { element.onmousemove = function(e) { + // Don't handle if we aren't supposed to + if (gesture_in_progress) return; + e.stopPropagation(); moveMouse(e.pageX, e.pageY); @@ -115,30 +118,60 @@ Guacamole.Mouse = function(element) { var last_touch_x = 0; var last_touch_y = 0; + var last_touch_time = 0; + var pixels_moved = 0; + + var gesture_in_progress = false; element.ontouchend = function(e) { - e.stopPropagation(); - e.preventDefault(); + // If we're handling a gesture + if (gesture_in_progress) { + + e.stopPropagation(); + e.preventDefault(); + + var time = new Date().getTime(); + + // If single tap detected (based on time and distance) + if (time - last_touch_time <= 250 && pixels_moved < 10) { + + // Fire left button down event + guac_mouse.currentState.left = true; + if (guac_mouse.onmousedown) + guac_mouse.onmousedown(guac_mouse.currentState); + + // Fire left button up event + guac_mouse.currentState.left = false; + if (guac_mouse.onmouseup) + guac_mouse.onmouseup(guac_mouse.currentState); + + } - // TODO: Handle tap-to-click. + // Allow mouse events now that touching is over + gesture_in_progress = false; + + } }; element.ontouchstart = function(e) { - e.stopPropagation(); - e.preventDefault(); - // Record initial touch location and time for single-touch movement // and tap gestures if (e.touches.length == 1) { + e.stopPropagation(); + e.preventDefault(); + + // Stop mouse events while touching + gesture_in_progress = true; + var starting_touch = e.touches[0]; last_touch_x = starting_touch.pageX; last_touch_y = starting_touch.pageY; - - // TODO: Record time (for sake of tap-to-click) + last_touch_time = new Date().getTime(); + pixels_moved = 0; } @@ -146,17 +179,20 @@ Guacamole.Mouse = function(element) { element.ontouchmove = function(e) { - e.stopPropagation(); - e.preventDefault(); - // Handle single-touch movement gesture (touchpad mouse move) if (e.touches.length == 1) { + e.stopPropagation(); + e.preventDefault(); + // Get change in touch location var touch = e.touches[0]; var delta_x = touch.pageX - last_touch_x; var delta_y = touch.pageY - last_touch_y; + // Track pixels moved + pixels_moved += Math.abs(delta_x) + Math.abs(delta_y); + // Update mouse location guac_mouse.currentState.x += delta_x; guac_mouse.currentState.y += delta_y; @@ -178,6 +214,9 @@ Guacamole.Mouse = function(element) { element.onmousedown = function(e) { + // Don't handle if we aren't supposed to + if (gesture_in_progress) return; + e.stopPropagation(); switch (e.button) { @@ -200,6 +239,9 @@ Guacamole.Mouse = function(element) { element.onmouseup = function(e) { + // Don't handle if we aren't supposed to + if (gesture_in_progress) return; + e.stopPropagation(); switch (e.button) { @@ -221,6 +263,9 @@ Guacamole.Mouse = function(element) { element.onmouseout = function(e) { + // Don't handle if we aren't supposed to + if (gesture_in_progress) return; + e.stopPropagation(); // Release all buttons @@ -244,7 +289,10 @@ Guacamole.Mouse = function(element) { }; // Scroll wheel support - function handleScroll(e) { + element.onmousewheel = function(e) { + + // Don't handle if we aren't supposed to + if (gesture_in_progress) return; var delta = 0; if (e.detail) @@ -282,14 +330,11 @@ Guacamole.Mouse = function(element) { e.preventDefault(); e.returnValue = false; - } - - element.addEventListener('DOMMouseScroll', handleScroll, false); - element.onmousewheel = function(e) { - handleScroll(e); }; + element.addEventListener('DOMMouseScroll', element.onmousewheel, false); + }; /** -- 1.7.10.4