Merge pull request #507 from Heap-Hop/csf

mobile three fingers vertical drag -> mouse scroll
This commit is contained in:
RustDesk 2022-05-12 22:14:01 +08:00 committed by GitHub
commit 614be61ca1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 98 additions and 139 deletions

Binary file not shown.

View File

@ -691,11 +691,9 @@ class FFI {
sendMouse('up', button);
}
static void scroll(double y) {
var y2 = y.round();
if (y2 == 0) return;
static void scroll(int y) {
setByName('send_mouse',
json.encode(modify({'type': 'wheel', 'y': y2.toString()})));
json.encode(modify({'type': 'wheel', 'y': y.toString()})));
}
static void reconnect() {

View File

@ -32,6 +32,7 @@ class _RemotePageState extends State<RemotePage> {
double _bottom = 0;
String _value = '';
double _scale = 1;
double _mouseScrollIntegral = 0; // mouse scroll speed controller
var _more = true;
var _fn = false;
@ -541,10 +542,17 @@ class _RemotePageState extends State<RemotePage> {
_scale = 1;
FFI.setByName('peer_option', '{"name": "view-style", "value": ""}');
},
onTwoFingerVerticalDragUpdate: FFI.ffiModel.isPeerAndroid
onThreeFingerVerticalDragUpdate: FFI.ffiModel.isPeerAndroid
? null
: (d) {
FFI.scroll(d.delta.dy / 2);
_mouseScrollIntegral += d.delta.dy / 4;
if (_mouseScrollIntegral > 1) {
FFI.scroll(1);
_mouseScrollIntegral = 0;
} else if (_mouseScrollIntegral < -1) {
FFI.scroll(-1);
_mouseScrollIntegral = 0;
}
});
}

View File

@ -32,6 +32,8 @@ class GestureIcons {
IconData(0xe68f, fontFamily: _family);
static const IconData icon_gesture_f_double_tap =
IconData(0xe691, fontFamily: _family);
static const IconData icon_gesture_f_three_fingers =
IconData(0xe687, fontFamily: _family);
}
typedef OnTouchModeChange = void Function(bool);
@ -118,8 +120,8 @@ class _GestureHelpState extends State<GestureHelp> {
translate("Mouse Drag")),
GestureInfo(
width,
GestureIcons.icon_gesture_f_drag_up_down_,
translate("Two-Finger vertically"),
GestureIcons.icon_gesture_f_three_fingers,
translate("Three-Finger vertically"),
translate("Mouse Wheel")),
GestureInfo(
width,
@ -140,8 +142,8 @@ class _GestureHelpState extends State<GestureHelp> {
translate("Left Mouse")),
GestureInfo(
width,
GestureIcons.icon_gesture_f_tap_,
translate("Two-Finger Tap"),
GestureIcons.icon_gesture_press_hold,
translate("One-Long Tap"),
translate("Right Mouse")),
GestureInfo(
width,
@ -150,8 +152,8 @@ class _GestureHelpState extends State<GestureHelp> {
translate("Mouse Drag")),
GestureInfo(
width,
GestureIcons.icon_gesture_f_drag_up_down_,
translate("Two-Finger vertically"),
GestureIcons.icon_gesture_f_three_fingers,
translate("Three-Finger vertically"),
translate("Mouse Wheel")),
GestureInfo(
width,

View File

@ -6,13 +6,9 @@ enum CustomTouchGestureState {
none,
oneFingerPan,
twoFingerScale,
twoFingerVerticalDrag,
twoFingerHorizontalDrag,
threeFingerVerticalDrag
}
// Adjust Carefully! balance vertical and pan
const kScaleSlop = kPrecisePointerPanSlop / 28;
class CustomTouchGestureRecognizer extends ScaleGestureRecognizer {
CustomTouchGestureRecognizer({
Object? debugOwner,
@ -34,39 +30,56 @@ class CustomTouchGestureRecognizer extends ScaleGestureRecognizer {
GestureScaleUpdateCallback? onTwoFingerScaleUpdate;
GestureScaleEndCallback? onTwoFingerScaleEnd;
// twoFingerVerticalDrag
GestureDragStartCallback? onTwoFingerVerticalDragStart;
GestureDragUpdateCallback? onTwoFingerVerticalDragUpdate;
GestureDragEndCallback? onTwoFingerVerticalDragEnd;
// threeFingerVerticalDrag
GestureDragStartCallback? onThreeFingerVerticalDragStart;
GestureDragUpdateCallback? onThreeFingerVerticalDragUpdate;
GestureDragEndCallback? onThreeFingerVerticalDragEnd;
// twoFingerHorizontalDrag
GestureDragStartCallback? onTwoFingerHorizontalDragStart;
GestureDragUpdateCallback? onTwoFingerHorizontalDragUpdate;
GestureDragEndCallback? onTwoFingerHorizontalDragEnd;
var _currentState = CustomTouchGestureState.none;
Timer? _startEventDebounceTimer;
void _init() {
debugPrint("CustomTouchGestureRecognizer init");
onStart = (d) {
_startEventDebounceTimer?.cancel();
if (d.pointerCount == 1) {
_currentState = CustomTouchGestureState.oneFingerPan;
if (onOneFingerPanStart != null) {
onOneFingerPanStart!(DragStartDetails(
localPosition: d.localFocalPoint, globalPosition: d.focalPoint));
}
debugPrint("start pan");
debugPrint("start oneFingerPan");
} else if (d.pointerCount == 2) {
_currentState = CustomTouchGestureState.none;
startWatchTimer();
} else {
_currentState = CustomTouchGestureState.none;
_reset();
if (_currentState == CustomTouchGestureState.threeFingerVerticalDrag) {
// 3 -> 2 debounce
_startEventDebounceTimer = Timer(Duration(milliseconds: 200), () {
_currentState = CustomTouchGestureState.twoFingerScale;
if (onTwoFingerScaleStart != null) {
onTwoFingerScaleStart!(ScaleStartDetails(
localFocalPoint: d.localFocalPoint,
focalPoint: d.focalPoint));
}
debugPrint("debounce start twoFingerScale success");
});
}
_currentState = CustomTouchGestureState.twoFingerScale;
// startWatchTimer();
if (onTwoFingerScaleStart != null) {
onTwoFingerScaleStart!(ScaleStartDetails(
localFocalPoint: d.localFocalPoint, focalPoint: d.focalPoint));
}
debugPrint("start twoFingerScale");
} else if (d.pointerCount == 3) {
_currentState = CustomTouchGestureState.threeFingerVerticalDrag;
if (onThreeFingerVerticalDragStart != null) {
onThreeFingerVerticalDragStart!(
DragStartDetails(globalPosition: d.localFocalPoint));
}
debugPrint("start threeFingerScale");
// _reset();
}
};
onUpdate = (d) {
if (_isWatch) {
_updateCompute(d);
return;
}
if (_currentState != CustomTouchGestureState.none) {
switch (_currentState) {
case CustomTouchGestureState.oneFingerPan:
@ -79,14 +92,9 @@ class CustomTouchGestureRecognizer extends ScaleGestureRecognizer {
onTwoFingerScaleUpdate!(d);
}
break;
case CustomTouchGestureState.twoFingerHorizontalDrag:
if (onTwoFingerHorizontalDragUpdate != null) {
onTwoFingerHorizontalDragUpdate!(_getDragUpdateDetails(d));
}
break;
case CustomTouchGestureState.twoFingerVerticalDrag:
if (onTwoFingerVerticalDragUpdate != null) {
onTwoFingerVerticalDragUpdate!(_getDragUpdateDetails(d));
case CustomTouchGestureState.threeFingerVerticalDrag:
if (onThreeFingerVerticalDragUpdate != null) {
onThreeFingerVerticalDragUpdate!(_getDragUpdateDetails(d));
}
break;
default:
@ -111,85 +119,19 @@ class CustomTouchGestureRecognizer extends ScaleGestureRecognizer {
onTwoFingerScaleEnd!(d);
}
break;
case CustomTouchGestureState.twoFingerHorizontalDrag:
debugPrint("TwoFingerState.horizontal onEnd");
if (onTwoFingerHorizontalDragEnd != null) {
onTwoFingerHorizontalDragEnd!(_getDragEndDetails(d));
}
break;
case CustomTouchGestureState.twoFingerVerticalDrag:
debugPrint("TwoFingerState.vertical onEnd");
if (onTwoFingerVerticalDragEnd != null) {
onTwoFingerVerticalDragEnd!(_getDragEndDetails(d));
case CustomTouchGestureState.threeFingerVerticalDrag:
debugPrint("ThreeFingerState.vertical onEnd");
if (onThreeFingerVerticalDragEnd != null) {
onThreeFingerVerticalDragEnd!(_getDragEndDetails(d));
}
break;
default:
break;
}
_currentState = CustomTouchGestureState.none;
_reset();
};
}
var _currentState = CustomTouchGestureState.none;
var _isWatch = false;
Timer? _timer;
double _sumScale = 0;
double _sumVertical = 0;
double _sumHorizontal = 0;
void _clearSum() {
_sumScale = 0;
_sumVertical = 0;
_sumHorizontal = 0;
}
void _reset() {
_isWatch = false;
_clearSum();
if (_timer != null) _timer!.cancel();
}
void _updateCompute(ScaleUpdateDetails d) {
_sumScale += d.scale - 1;
_sumHorizontal += d.focalPointDelta.dx;
_sumVertical += d.focalPointDelta.dy;
// start , order is important
if (onTwoFingerScaleUpdate != null && _sumScale.abs() > kScaleSlop) {
debugPrint("start Scale");
_currentState = CustomTouchGestureState.twoFingerScale;
if (onTwoFingerScaleStart != null) {
onTwoFingerScaleStart!(ScaleStartDetails(
localFocalPoint: d.localFocalPoint, focalPoint: d.focalPoint));
}
_reset();
} else if (onTwoFingerVerticalDragUpdate != null &&
_sumVertical.abs() > kPrecisePointerPanSlop &&
_sumHorizontal.abs() < kPrecisePointerPanSlop) {
debugPrint("start Vertical");
if (onTwoFingerVerticalDragStart != null) {
onTwoFingerVerticalDragStart!(_getDragStartDetails(d));
}
_currentState = CustomTouchGestureState.twoFingerVerticalDrag;
_reset();
}
}
void startWatchTimer() {
debugPrint("startWatchTimer");
_isWatch = true;
_clearSum();
if (_timer != null) _timer!.cancel();
_timer = Timer(const Duration(milliseconds: 200), _reset);
}
DragStartDetails _getDragStartDetails(ScaleUpdateDetails d) =>
DragStartDetails(
globalPosition: d.focalPoint,
localPosition: d.localFocalPoint,
);
DragUpdateDetails _getDragUpdateDetails(ScaleUpdateDetails d) =>
DragUpdateDetails(
globalPosition: d.focalPoint,
@ -344,13 +286,16 @@ class HoldTapMoveGestureRecognizer extends GestureRecognizer {
}
void _reject(_TapTracker tracker) {
_checkCancel();
_isStart = false;
_trackers.remove(tracker.pointer);
tracker.entry.resolve(GestureDisposition.rejected);
_freezeTracker(tracker);
_reset();
try {
_checkCancel();
_isStart = false;
_trackers.remove(tracker.pointer);
tracker.entry.resolve(GestureDisposition.rejected);
_freezeTracker(tracker);
_reset();
} catch (e) {
debugPrint("Failed to _reject:$e");
}
}
@override
@ -729,10 +674,7 @@ RawGestureDetector getMixinGestureDetector({
GestureDragEndCallback? onOneFingerPanEnd,
GestureScaleUpdateCallback? onTwoFingerScaleUpdate,
GestureScaleEndCallback? onTwoFingerScaleEnd,
GestureDragUpdateCallback? onTwoFingerHorizontalDragUpdate,
GestureDragUpdateCallback? onTwoFingerVerticalDragUpdate,
GestureDragStartCallback? onTwoFingerPanStart,
GestureDragUpdateCallback? onTwoFingerPanUpdate,
GestureDragUpdateCallback? onThreeFingerVerticalDragUpdate,
}) {
return RawGestureDetector(
child: child,
@ -782,8 +724,7 @@ RawGestureDetector getMixinGestureDetector({
..onOneFingerPanEnd = onOneFingerPanEnd
..onTwoFingerScaleUpdate = onTwoFingerScaleUpdate
..onTwoFingerScaleEnd = onTwoFingerScaleEnd
..onTwoFingerHorizontalDragUpdate = onTwoFingerHorizontalDragUpdate
..onTwoFingerVerticalDragUpdate = onTwoFingerVerticalDragUpdate;
})
..onThreeFingerVerticalDragUpdate = onThreeFingerVerticalDragUpdate;
}),
});
}

View File

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "单指移动"),
("Double Tap & Move", "双击并移动"),
("Mouse Drag", "鼠标选中拖动"),
("Two-Finger vertically", "指垂直滑动"),
("Three-Finger vertically", "指垂直滑动"),
("Mouse Wheel", "鼠标滚轮"),
("Two-Finger Move", "双指移动"),
("Canvas Move", "移动画布"),

View File

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "Eine Fingerbewegung"),
("Double Tap & Move", "Doppeltippen und verschieben"),
("Mouse Drag", "Maus ziehen"),
("Two-Finger vertically", "Zwei Finger vertikal"),
("Three-Finger vertically", "Drei Finger vertikal"),
("Mouse Wheel", "Mausrad"),
("Two-Finger Move", "Zwei Finger Bewegung"),
("Canvas Move", "Leinwand bewegen"),
@ -266,6 +266,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("android_start_service_tip", "Tippen Sie auf [Dienst starten] oder ÖFFNEN Sie die Berechtigung [Bildschirmaufnahme], um den Bildschirmfreigabedienst zu starten."),
("Account", "Konto"),
("Quit", "Ausgang"),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("Help", "Hilfe"),
].iter().cloned().collect();
}

View File

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", ""),
("Double Tap & Move", ""),
("Mouse Drag", ""),
("Two-Finger vertically", ""),
("Three-Finger vertically", ""),
("Mouse Wheel", ""),
("Two-Finger Move", ""),
("Canvas Move", ""),
@ -265,5 +265,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("android_version_audio_tip", ""),
("android_start_service_tip", ""),
("Account", ""),
("Quit", ""),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("Help", ""),
].iter().cloned().collect();
}

View File

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "Mouvement à un doigt"),
("Double Tap & Move", "Appuyez deux fois et déplacez"),
("Mouse Drag", "Glissement de la souris"),
("Two-Finger vertically", "Deux doigts verticalement"),
("Three-Finger vertically", "Trois doigts verticalement"),
("Mouse Wheel", "Roulette de la souris"),
("Two-Finger Move", "Mouvement à deux doigts"),
("Canvas Move", "Déplacement de la toile"),
@ -266,6 +266,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("android_start_service_tip", "Appuyez sur [Démarrer le service] ou sur l'autorisation OUVRIR [Capture d'écran] pour démarrer le service de partage d'écran."),
("Account", "Compte"),
("Quit", "Quitter"),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("Help", "Aider"),
].iter().cloned().collect();
}

View File

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "Gerakan Satu Jari"),
("Double Tap & Move", "Ketuk Dua Kali & Pindah"),
("Mouse Drag", "Geser Mouse"),
("Two-Finger vertically", "Dua Jari secara vertikal"),
("Three-Finger vertically", "Tiga Jari secara vertikal"),
("Mouse Wheel", "Roda mouse"),
("Two-Finger Move", "Gerakan Dua Jari"),
("Canvas Move", "Gerakan Kanvas"),
@ -264,10 +264,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("android_stop_service_tip", "Menutup layanan akan secara otomatis menutup semua koneksi yang dibuat."),
("android_version_audio_tip", "Versi Android saat ini tidak mendukung pengambilan audio, harap tingkatkan ke Android 10 atau lebih tinggi."),
("android_start_service_tip", "Ketuk izin [Mulai Layanan] atau BUKA [Tangkapan Layar] untuk memulai layanan berbagi layar."),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("doc_fix_wayland", "https://rustdesk.com/docs/en/manual/linux/#x11-required"),
("Account", "Akun"),
("Quit", "Keluar"),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("Help", "Bantuan"),
].iter().cloned().collect();
}

View File

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "Movimento con un dito"),
("Double Tap & Move", "Tocca due volte e sposta"),
("Mouse Drag", "Trascina il mouse"),
("Two-Finger vertically", "Due dita in verticale"),
("Three-Finger vertically", "Tre dita in verticale"),
("Mouse Wheel", "Rotellina del mouse"),
("Two-Finger Move", "Movimento con due dita"),
("Canvas Move", "Sposta tela"),
@ -266,6 +266,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("android_start_service_tip", "Toccare [Avvia servizio] o APRI l'autorizzazione [Cattura schermo] per avviare il servizio di condivisione dello schermo."),
("Account", "Account"),
("Quit", "Esci"),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("Help", "Aiuto"),
].iter().cloned().collect();
}

View File

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "Mover com um dedo"),
("Double Tap & Move", "Toque duplo & mover"),
("Mouse Drag", "Arrastar com o mouse"),
("Two-Finger vertically", "Dois dedos verticalmente"),
("Three-Finger vertically", "Três dedos verticalmente"),
("Mouse Wheel", "Roda do Mouse"),
("Two-Finger Move", "Mover com dois dedos"),
("Canvas Move", "Mover Tela"),
@ -266,6 +266,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("android_start_service_tip", "Toque [Iniciar Serviço] ou ABRA a permissão [Captura de Tela] para iniciar o serviço de compartilhamento de tela."),
("Account", "Conta"),
("Quit", "Saída"),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("Help", "Ajuda"),
].iter().cloned().collect();
}

View File

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "Движение одним пальцем"),
("Double Tap & Move", "Двойное нажатие и перемещение"),
("Mouse Drag", "Перетаскивание мышью"),
("Two-Finger vertically", "Двумя пальцами по вертикали"),
("Three-Finger vertically", "Три пальца по вертикали"),
("Mouse Wheel", "Колесико мыши"),
("Two-Finger Move", "Движение двумя пальцами"),
("Canvas Move", "Перемещение холста"),
@ -266,6 +266,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("android_start_service_tip", "Коснитесь [Запуск промежуточного сервера] или ОТКРЫТЬ разрешение [Скриншот], чтобы запустить службу демонстрации экрана."),
("Account", "Аккаунт"),
("Quit", "Выйти"),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("Help", "Помощь"),
].iter().cloned().collect();
}

View File

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", ""),
("Double Tap & Move", ""),
("Mouse Drag", ""),
("Two-Finger vertically", ""),
("Three-Finger vertically", ""),
("Mouse Wheel", ""),
("Two-Finger Move", ""),
("Canvas Move", ""),
@ -265,5 +265,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("android_version_audio_tip", ""),
("android_start_service_tip", ""),
("Account", ""),
("Quit", ""),
("doc_mac_permission", ""),
("Help", ""),
].iter().cloned().collect();
}

View File

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "單指移動"),
("Double Tap & Move", "雙擊並移動"),
("Mouse Drag", "鼠標選中拖動"),
("Two-Finger vertically", "指垂直滑動"),
("Three-Finger vertically", "指垂直滑動"),
("Mouse Wheel", "鼠標滾輪"),
("Two-Finger Move", "雙指移動"),
("Canvas Move", "移動畫布"),