diff --git a/flutter/lib/models/input_model.dart b/flutter/lib/models/input_model.dart index 640c4d79b..e7ce5c585 100644 --- a/flutter/lib/models/input_model.dart +++ b/flutter/lib/models/input_model.dart @@ -51,6 +51,9 @@ class InputModel { var _fling = false; Timer? _flingTimer; final _flingBaseDelay = 30; + // trackpad, peer linux + final _trackpadSpeed = 0.06; + var _trackpadScrollUnsent = Offset.zero; // mouse final isPhysicalMouse = false.obs; @@ -334,8 +337,24 @@ class InputModel { void onPointerPanZoomUpdate(PointerPanZoomUpdateEvent e) { final delta = e.panDelta; _trackpadLastDelta = delta; + var x = delta.dx.toInt(); var y = delta.dy.toInt(); + if (parent.target?.ffiModel.pi.platform == kPeerPlatformLinux) { + _trackpadScrollUnsent += (delta * _trackpadSpeed); + x = _trackpadScrollUnsent.dx.truncate(); + y = _trackpadScrollUnsent.dy.truncate(); + _trackpadScrollUnsent -= Offset(x.toDouble(), y.toDouble()); + } else { + if (x == 0 && y == 0) { + final thr = 0.1; + if (delta.dx.abs() > delta.dy.abs()) { + x = delta.dx > thr ? 1 : (delta.dx < -thr ? -1 : 0); + } else { + y = delta.dy > thr ? 1 : (delta.dy < -thr ? -1 : 0); + } + } + } if (x != 0 || y != 0) { bind.sessionSendMouse( sessionId: sessionId, @@ -362,6 +381,11 @@ class InputModel { // Try set delta (x,y) and delay. var dx = x.toInt(); var dy = y.toInt(); + if (parent.target?.ffiModel.pi.platform == kPeerPlatformLinux) { + dx = (x * _trackpadSpeed).toInt(); + dy = (y * _trackpadSpeed).toInt(); + } + var delay = _flingBaseDelay; if (dx == 0 && dy == 0) {