From 9a8854dc9096e1d1f4554c4ae816a9e6c5f0ff54 Mon Sep 17 00:00:00 2001 From: "A.Olokhtonov" Date: Mon, 28 Aug 2023 01:52:02 +0300 Subject: [PATCH] Handle touchstart with 2 e.changedTouches. This fixes panning sometimes not working on iPhone --- client/index.html | 24 ++++++++++++------------ client/webgl_listeners.js | 35 +++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/client/index.html b/client/index.html index 46f8448..2d04c31 100644 --- a/client/index.html +++ b/client/index.html @@ -7,20 +7,20 @@ - + - - - - - - - - + + + + + + + + - - - + + +
diff --git a/client/webgl_listeners.js b/client/webgl_listeners.js index c1a9e88..3178da4 100644 --- a/client/webgl_listeners.js +++ b/client/webgl_listeners.js @@ -252,6 +252,23 @@ function wheel(e, state, context) { schedule_draw(state, context); } +function start_move(e, state, context) { + // two touch identifiers are expected to be pushed into state.touch.ids at this point + + geometry_clear_player(state, context, state.me); // Hide predraws of this stroke that is not means to be + fire_event(state, clear_event(state)); // Tell others to hide predraws of this stroke + + for (const touch of e.touches) { + const screenp = {'x': window.devicePixelRatio * touch.clientX, 'y': window.devicePixelRatio * touch.clientY}; + + if (touch.identifier === state.touch.ids[0]) { + state.touch.first_finger_position = screenp; + } else if (touch.identifier === state.touch.ids[1]) { + state.touch.second_finger_position = screenp; + } + } +} + function touchstart(e, state, context) { e.preventDefault(); @@ -270,7 +287,9 @@ function touchstart(e, state, context) { state.touch.waiting_for_second_finger = false; }, config.second_finger_timeout); } else { - console.error('Two touchstarts at the same time are not yet supported'); + state.touch.ids.push(e.changedTouches[0].identifier); + state.touch.ids.push(e.changedTouches[1].identifier); + start_move(e, state, context); } return; @@ -279,20 +298,8 @@ function touchstart(e, state, context) { // There are touches already if (state.touch.waiting_for_second_finger) { if (e.changedTouches.length === 1) { - geometry_clear_player(state, context, state.me); // Hide predraws of this stroke that is not means to be - fire_event(state, clear_event(state)); // Tell others to hide predraws of this stroke - state.touch.ids.push(e.changedTouches[0].identifier); - - for (const touch of e.touches) { - const screenp = {'x': window.devicePixelRatio * touch.clientX, 'y': window.devicePixelRatio * touch.clientY}; - - if (touch.identifier === state.touch.ids[0]) { - state.touch.first_finger_position = screenp; - } else if (touch.identifier === state.touch.ids[1]) { - state.touch.second_finger_position = screenp; - } - } + start_move(e, state, context); } return;