mirror of
https://github.com/rustdesk/rustdesk.git
synced 2025-12-14 12:07:35 +00:00
fix: multi-window, click-move (#7844)
Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
@@ -1729,6 +1729,8 @@ class CursorModel with ChangeNotifier {
|
||||
double _displayOriginX = 0;
|
||||
double _displayOriginY = 0;
|
||||
DateTime? _firstUpdateMouseTime;
|
||||
Rect? _windowRect;
|
||||
List<RemoteWindowCoords> _remoteWindowCoords = [];
|
||||
bool gotMouseControl = true;
|
||||
DateTime _lastPeerMouse = DateTime.now()
|
||||
.subtract(Duration(milliseconds: 3000 * kMouseControlTimeoutMSec));
|
||||
@@ -1741,6 +1743,8 @@ class CursorModel with ChangeNotifier {
|
||||
double get x => _x - _displayOriginX;
|
||||
double get y => _y - _displayOriginY;
|
||||
|
||||
double get devicePixelRatio => parent.target!.canvasModel.devicePixelRatio;
|
||||
|
||||
Offset get offset => Offset(_x, _y);
|
||||
|
||||
double get hotx => _hotx;
|
||||
@@ -1810,15 +1814,13 @@ class CursorModel with ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
updatePan(double dx, double dy, bool touchMode) {
|
||||
updatePan(Offset delta, Offset localPosition, bool touchMode) {
|
||||
if (touchMode) {
|
||||
final scale = parent.target?.canvasModel.scale ?? 1.0;
|
||||
_x += dx / scale;
|
||||
_y += dy / scale;
|
||||
parent.target?.inputModel.moveMouse(_x, _y);
|
||||
notifyListeners();
|
||||
_handleTouchMode(delta, localPosition);
|
||||
return;
|
||||
}
|
||||
double dx = delta.dx;
|
||||
double dy = delta.dy;
|
||||
if (parent.target?.imageModel.image == null) return;
|
||||
final scale = parent.target?.canvasModel.scale ?? 1.0;
|
||||
dx /= scale;
|
||||
@@ -1885,6 +1887,41 @@ class CursorModel with ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
bool _isInCurrentWindow(double x, double y) {
|
||||
final w = _windowRect!.width / devicePixelRatio;
|
||||
final h = _windowRect!.width / devicePixelRatio;
|
||||
return x >= 0 && y >= 0 && x <= w && y <= h;
|
||||
}
|
||||
|
||||
_handleTouchMode(Offset delta, Offset localPosition) {
|
||||
bool isMoved = false;
|
||||
if (_remoteWindowCoords.isNotEmpty &&
|
||||
_windowRect != null &&
|
||||
!_isInCurrentWindow(localPosition.dx, localPosition.dy)) {
|
||||
final coords = InputModel.findRemoteCoords(localPosition.dx,
|
||||
localPosition.dy, _remoteWindowCoords, devicePixelRatio);
|
||||
if (coords != null) {
|
||||
double x2 =
|
||||
(localPosition.dx - coords.relativeOffset.dx / devicePixelRatio) /
|
||||
coords.canvas.scale;
|
||||
double y2 =
|
||||
(localPosition.dy - coords.relativeOffset.dy / devicePixelRatio) /
|
||||
coords.canvas.scale;
|
||||
x2 += coords.cursor.offset.dx;
|
||||
y2 += coords.cursor.offset.dy;
|
||||
parent.target?.inputModel.moveMouse(x2, y2);
|
||||
isMoved = true;
|
||||
}
|
||||
}
|
||||
if (!isMoved) {
|
||||
final scale = parent.target?.canvasModel.scale ?? 1.0;
|
||||
_x += delta.dx / scale;
|
||||
_y += delta.dy / scale;
|
||||
parent.target?.inputModel.moveMouse(_x, _y);
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
updateCursorData(Map<String, dynamic> evt) async {
|
||||
final id = int.parse(evt['id']);
|
||||
final hotx = double.parse(evt['hotx']);
|
||||
@@ -2024,6 +2061,18 @@ class CursorModel with ChangeNotifier {
|
||||
deleteCustomCursor(k);
|
||||
}
|
||||
}
|
||||
|
||||
trySetRemoteWindowCoords() {
|
||||
Future.delayed(Duration.zero, () async {
|
||||
_windowRect =
|
||||
await InputModel.fillRemoteCoordsAndGetCurFrame(_remoteWindowCoords);
|
||||
});
|
||||
}
|
||||
|
||||
clearRemoteWindowCoords() {
|
||||
_windowRect = null;
|
||||
_remoteWindowCoords.clear();
|
||||
}
|
||||
}
|
||||
|
||||
class QualityMonitorData {
|
||||
|
||||
Reference in New Issue
Block a user