Tap support, ignore mouse events while touch events are in progress.

This commit is contained in:
Michael Jumper
2011-08-27 12:13:10 -07:00
parent 1e47ace656
commit 98a5f06120

View File

@@ -107,6 +107,9 @@ Guacamole.Mouse = function(element) {
element.onmousemove = function(e) { element.onmousemove = function(e) {
// Don't handle if we aren't supposed to
if (gesture_in_progress) return;
e.stopPropagation(); e.stopPropagation();
moveMouse(e.pageX, e.pageY); moveMouse(e.pageX, e.pageY);
@@ -115,30 +118,60 @@ Guacamole.Mouse = function(element) {
var last_touch_x = 0; var last_touch_x = 0;
var last_touch_y = 0; var last_touch_y = 0;
var last_touch_time = 0;
var pixels_moved = 0;
var gesture_in_progress = false;
element.ontouchend = function(e) { element.ontouchend = function(e) {
e.stopPropagation(); // If we're handling a gesture
e.preventDefault(); if (gesture_in_progress) {
// TODO: Handle tap-to-click. 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);
}
// Allow mouse events now that touching is over
gesture_in_progress = false;
}
}; };
element.ontouchstart = function(e) { element.ontouchstart = function(e) {
e.stopPropagation();
e.preventDefault();
// Record initial touch location and time for single-touch movement // Record initial touch location and time for single-touch movement
// and tap gestures // and tap gestures
if (e.touches.length == 1) { if (e.touches.length == 1) {
e.stopPropagation();
e.preventDefault();
// Stop mouse events while touching
gesture_in_progress = true;
var starting_touch = e.touches[0]; var starting_touch = e.touches[0];
last_touch_x = starting_touch.pageX; last_touch_x = starting_touch.pageX;
last_touch_y = starting_touch.pageY; last_touch_y = starting_touch.pageY;
last_touch_time = new Date().getTime();
// TODO: Record time (for sake of tap-to-click) pixels_moved = 0;
} }
@@ -146,17 +179,20 @@ Guacamole.Mouse = function(element) {
element.ontouchmove = function(e) { element.ontouchmove = function(e) {
e.stopPropagation();
e.preventDefault();
// Handle single-touch movement gesture (touchpad mouse move) // Handle single-touch movement gesture (touchpad mouse move)
if (e.touches.length == 1) { if (e.touches.length == 1) {
e.stopPropagation();
e.preventDefault();
// Get change in touch location // Get change in touch location
var touch = e.touches[0]; var touch = e.touches[0];
var delta_x = touch.pageX - last_touch_x; var delta_x = touch.pageX - last_touch_x;
var delta_y = touch.pageY - last_touch_y; var delta_y = touch.pageY - last_touch_y;
// Track pixels moved
pixels_moved += Math.abs(delta_x) + Math.abs(delta_y);
// Update mouse location // Update mouse location
guac_mouse.currentState.x += delta_x; guac_mouse.currentState.x += delta_x;
guac_mouse.currentState.y += delta_y; guac_mouse.currentState.y += delta_y;
@@ -178,6 +214,9 @@ Guacamole.Mouse = function(element) {
element.onmousedown = function(e) { element.onmousedown = function(e) {
// Don't handle if we aren't supposed to
if (gesture_in_progress) return;
e.stopPropagation(); e.stopPropagation();
switch (e.button) { switch (e.button) {
@@ -200,6 +239,9 @@ Guacamole.Mouse = function(element) {
element.onmouseup = function(e) { element.onmouseup = function(e) {
// Don't handle if we aren't supposed to
if (gesture_in_progress) return;
e.stopPropagation(); e.stopPropagation();
switch (e.button) { switch (e.button) {
@@ -221,6 +263,9 @@ Guacamole.Mouse = function(element) {
element.onmouseout = function(e) { element.onmouseout = function(e) {
// Don't handle if we aren't supposed to
if (gesture_in_progress) return;
e.stopPropagation(); e.stopPropagation();
// Release all buttons // Release all buttons
@@ -244,7 +289,10 @@ Guacamole.Mouse = function(element) {
}; };
// Scroll wheel support // 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; var delta = 0;
if (e.detail) if (e.detail)
@@ -282,14 +330,11 @@ Guacamole.Mouse = function(element) {
e.preventDefault(); e.preventDefault();
e.returnValue = false; e.returnValue = false;
}
element.addEventListener('DOMMouseScroll', handleScroll, false);
element.onmousewheel = function(e) {
handleScroll(e);
}; };
element.addEventListener('DOMMouseScroll', element.onmousewheel, false);
}; };
/** /**