Implement right and middle-click.

This commit is contained in:
Michael Jumper
2012-03-30 22:48:22 -07:00
parent fa96143884
commit ed3d12fbce

View File

@@ -143,28 +143,38 @@ Guacamole.Mouse = function(element) {
}, false); }, false);
var touch_count = 0;
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 last_touch_time = 0;
var pixels_moved = 0; var pixels_moved = 0;
var touch_buttons = {
1: "left",
2: "right",
3: "middle"
};
var gesture_in_progress = false; var gesture_in_progress = false;
var click_release_timeout = null; var click_release_timeout = null;
element.addEventListener("touchend", function(e) { element.addEventListener("touchend", function(e) {
// If we're handling a gesture // If we're handling a gesture AND this is the last touch
if (gesture_in_progress) { if (gesture_in_progress && e.touches.length == 1) {
cancelEvent(e); cancelEvent(e);
var time = new Date().getTime(); var time = new Date().getTime();
// If mouse already down, release anad clear timeout // Get corresponding mouse button
if (guac_mouse.currentState.left) { var button = touch_buttons[touch_count];
// Fire left button up event // If mouse already down, release anad clear timeout
guac_mouse.currentState.left = false; if (guac_mouse.currentState[button]) {
// Fire button up event
guac_mouse.currentState[button] = false;
if (guac_mouse.onmouseup) if (guac_mouse.onmouseup)
guac_mouse.onmouseup(guac_mouse.currentState); guac_mouse.onmouseup(guac_mouse.currentState);
@@ -179,8 +189,8 @@ Guacamole.Mouse = function(element) {
// If single tap detected (based on time and distance) // If single tap detected (based on time and distance)
if (time - last_touch_time <= 250 && pixels_moved < 10) { if (time - last_touch_time <= 250 && pixels_moved < 10) {
// Fire left button down event // Fire button down event
guac_mouse.currentState.left = true; guac_mouse.currentState[button] = true;
if (guac_mouse.onmousedown) if (guac_mouse.onmousedown)
guac_mouse.onmousedown(guac_mouse.currentState); guac_mouse.onmousedown(guac_mouse.currentState);
@@ -188,8 +198,8 @@ Guacamole.Mouse = function(element) {
// touchstart within timeout. // touchstart within timeout.
click_release_timeout = window.setTimeout(function() { click_release_timeout = window.setTimeout(function() {
// Fire left button up event // Fire button up event
guac_mouse.currentState.left = false; guac_mouse.currentState[button] = false;
if (guac_mouse.onmouseup) if (guac_mouse.onmouseup)
guac_mouse.onmouseup(guac_mouse.currentState); guac_mouse.onmouseup(guac_mouse.currentState);
@@ -206,7 +216,10 @@ Guacamole.Mouse = function(element) {
element.addEventListener("touchstart", function(e) { element.addEventListener("touchstart", function(e) {
// Record initial touch location and time for single-touch movement // Track number of touches, but no more than three
touch_count = Math.max(e.touches.length, 3);
// Record initial touch location and time for touch movement
// and tap gestures // and tap gestures
if (e.touches.length == 1) { if (e.touches.length == 1) {
@@ -228,52 +241,45 @@ Guacamole.Mouse = function(element) {
last_touch_time = new Date().getTime(); last_touch_time = new Date().getTime();
pixels_moved = 0; pixels_moved = 0;
// TODO: Handle different buttons
} }
}, false); }, false);
element.addEventListener("touchmove", function(e) { element.addEventListener("touchmove", function(e) {
// Handle single-touch movement gesture (touchpad mouse move) cancelEvent(e);
if (e.touches.length == 1) {
cancelEvent(e); // Get change in touch location
var touch = e.touches[0];
var delta_x = touch.screenX - last_touch_x;
var delta_y = touch.screenY - last_touch_y;
// Get change in touch location // Track pixels moved
var touch = e.touches[0]; pixels_moved += Math.abs(delta_x) + Math.abs(delta_y);
var delta_x = touch.screenX - last_touch_x;
var delta_y = touch.screenY - last_touch_y;
// Track pixels moved // Update mouse location
pixels_moved += Math.abs(delta_x) + Math.abs(delta_y); guac_mouse.currentState.x += delta_x;
guac_mouse.currentState.y += delta_y;
// Update mouse location // Prevent mouse from leaving screen
guac_mouse.currentState.x += delta_x;
guac_mouse.currentState.y += delta_y;
// Prevent mouse from leaving screen if (guac_mouse.currentState.x < 0)
guac_mouse.currentState.x = 0;
else if (guac_mouse.currentState.x >= element.offsetWidth)
guac_mouse.currentState.x = element.offsetWidth - 1;
if (guac_mouse.currentState.x < 0) if (guac_mouse.currentState.y < 0)
guac_mouse.currentState.x = 0; guac_mouse.currentState.y = 0;
else if (guac_mouse.currentState.x >= element.offsetWidth) else if (guac_mouse.currentState.y >= element.offsetHeight)
guac_mouse.currentState.x = element.offsetWidth - 1; guac_mouse.currentState.y = element.offsetHeight - 1;
if (guac_mouse.currentState.y < 0) // Fire movement event, if defined
guac_mouse.currentState.y = 0; if (guac_mouse.onmousemove)
else if (guac_mouse.currentState.y >= element.offsetHeight) guac_mouse.onmousemove(guac_mouse.currentState);
guac_mouse.currentState.y = element.offsetHeight - 1;
// Fire movement event, if defined // Update touch location
if (guac_mouse.onmousemove) last_touch_x = touch.screenX;
guac_mouse.onmousemove(guac_mouse.currentState); last_touch_y = touch.screenY;
// Update touch location
last_touch_x = touch.screenX;
last_touch_y = touch.screenY;
}
}, false); }, false);