Merge pull request 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.

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

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

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

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

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

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

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

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

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "Gerakan Satu Jari"), ("One-Finger Move", "Gerakan Satu Jari"),
("Double Tap & Move", "Ketuk Dua Kali & Pindah"), ("Double Tap & Move", "Ketuk Dua Kali & Pindah"),
("Mouse Drag", "Geser Mouse"), ("Mouse Drag", "Geser Mouse"),
("Two-Finger vertically", "Dua Jari secara vertikal"), ("Three-Finger vertically", "Tiga Jari secara vertikal"),
("Mouse Wheel", "Roda mouse"), ("Mouse Wheel", "Roda mouse"),
("Two-Finger Move", "Gerakan Dua Jari"), ("Two-Finger Move", "Gerakan Dua Jari"),
("Canvas Move", "Gerakan Kanvas"), ("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_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_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."), ("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"), ("Account", "Akun"),
("Quit", "Keluar"), ("Quit", "Keluar"),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("Help", "Bantuan"), ("Help", "Bantuan"),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

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

@ -231,7 +231,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "Mover com um dedo"), ("One-Finger Move", "Mover com um dedo"),
("Double Tap & Move", "Toque duplo & mover"), ("Double Tap & Move", "Toque duplo & mover"),
("Mouse Drag", "Arrastar com o mouse"), ("Mouse Drag", "Arrastar com o mouse"),
("Two-Finger vertically", "Dois dedos verticalmente"), ("Three-Finger vertically", "Três dedos verticalmente"),
("Mouse Wheel", "Roda do Mouse"), ("Mouse Wheel", "Roda do Mouse"),
("Two-Finger Move", "Mover com dois dedos"), ("Two-Finger Move", "Mover com dois dedos"),
("Canvas Move", "Mover Tela"), ("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."), ("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"), ("Account", "Conta"),
("Quit", "Saída"), ("Quit", "Saída"),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("Help", "Ajuda"), ("Help", "Ajuda"),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

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

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

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