commit
853f49342f
@ -21,7 +21,7 @@ const String kTabLabelSettingPage = "Settings";
|
||||
|
||||
const String kWindowPrefix = "wm_";
|
||||
|
||||
// the executable name of the portable version
|
||||
// the executable name of the portable version
|
||||
const String kEnvPortableExecutable = "RUSTDESK_APPNAME";
|
||||
|
||||
const Color kColorWarn = Color.fromARGB(255, 245, 133, 59);
|
||||
@ -60,6 +60,12 @@ const kInvalidValueStr = "InvalidValueStr";
|
||||
|
||||
const kMobilePageConstraints = BoxConstraints(maxWidth: 600);
|
||||
|
||||
/// [kMouseControlDistance] indicates the distance that self-side move to get control of mouse.
|
||||
const kMouseControlDistance = 12;
|
||||
|
||||
/// [kMouseControlTimeoutMSec] indicates the timeout (in milliseconds) that self-side can get control of mouse.
|
||||
const kMouseControlTimeoutMSec = 1000;
|
||||
|
||||
/// flutter/packages/flutter/lib/src/services/keyboard_key.dart -> _keyLabels
|
||||
/// see [LogicalKeyboardKey.keyLabel]
|
||||
const Map<int, String> logicalKeyMap = <int, String>{
|
||||
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hbb/models/platform_model.dart';
|
||||
import 'package:window_manager/window_manager.dart';
|
||||
|
||||
import '../consts.dart';
|
||||
import '../common.dart';
|
||||
import '../common/widgets/overlay.dart';
|
||||
import 'model.dart';
|
||||
@ -183,8 +184,11 @@ class ChatModel with ChangeNotifier {
|
||||
if (_isShowCMChatPage) {
|
||||
_isShowCMChatPage = !_isShowCMChatPage;
|
||||
notifyListeners();
|
||||
await windowManager.setSizeAlignment(Size(300, 400), Alignment.topRight);
|
||||
await windowManager.show();
|
||||
await windowManager.setSizeAlignment(
|
||||
kConnectionManagerWindowSize, Alignment.topRight);
|
||||
} else {
|
||||
await windowManager.show();
|
||||
await windowManager.setSizeAlignment(Size(600, 400), Alignment.topRight);
|
||||
_isShowCMChatPage = !_isShowCMChatPage;
|
||||
notifyListeners();
|
||||
|
@ -42,6 +42,7 @@ class InputModel {
|
||||
// mouse
|
||||
final isPhysicalMouse = false.obs;
|
||||
int _lastMouseDownButtons = 0;
|
||||
Offset last_mouse_pos = Offset.zero;
|
||||
|
||||
get id => parent.target?.id ?? "";
|
||||
|
||||
@ -303,6 +304,28 @@ class InputModel {
|
||||
}
|
||||
|
||||
void handleMouse(Map<String, dynamic> evt) {
|
||||
double x = evt['x'];
|
||||
double y = max(0.0, evt['y']);
|
||||
final cursorModel = parent.target!.cursorModel;
|
||||
|
||||
if (cursorModel.is_peer_control_protected) {
|
||||
last_mouse_pos = ui.Offset(x, y);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cursorModel.got_mouse_control) {
|
||||
bool self_get_control =
|
||||
(x - last_mouse_pos.dx).abs() > kMouseControlDistance ||
|
||||
(y - last_mouse_pos.dy).abs() > kMouseControlDistance;
|
||||
if (self_get_control) {
|
||||
cursorModel.got_mouse_control = true;
|
||||
} else {
|
||||
last_mouse_pos = ui.Offset(x, y);
|
||||
return;
|
||||
}
|
||||
}
|
||||
last_mouse_pos = ui.Offset(x, y);
|
||||
|
||||
var type = '';
|
||||
var isMove = false;
|
||||
switch (evt['type']) {
|
||||
@ -319,8 +342,6 @@ class InputModel {
|
||||
return;
|
||||
}
|
||||
evt['type'] = type;
|
||||
double x = evt['x'];
|
||||
double y = max(0.0, evt['y']);
|
||||
if (isDesktop) {
|
||||
y = y - stateGlobal.tabBarHeight;
|
||||
}
|
||||
|
@ -740,6 +740,9 @@ class CursorModel with ChangeNotifier {
|
||||
double _hoty = 0;
|
||||
double _displayOriginX = 0;
|
||||
double _displayOriginY = 0;
|
||||
bool got_mouse_control = true;
|
||||
DateTime _last_peer_mouse = DateTime.now()
|
||||
.subtract(Duration(milliseconds: 2 * kMouseControlTimeoutMSec));
|
||||
String id = '';
|
||||
WeakReference<FFI> parent;
|
||||
|
||||
@ -748,15 +751,17 @@ class CursorModel with ChangeNotifier {
|
||||
CursorData? get defaultCache => _getDefaultCache();
|
||||
|
||||
double get x => _x - _displayOriginX;
|
||||
|
||||
double get y => _y - _displayOriginY;
|
||||
|
||||
Offset get offset => Offset(_x, _y);
|
||||
|
||||
double get hotx => _hotx;
|
||||
|
||||
double get hoty => _hoty;
|
||||
|
||||
bool get is_peer_control_protected =>
|
||||
DateTime.now().difference(_last_peer_mouse).inMilliseconds <
|
||||
kMouseControlTimeoutMSec;
|
||||
|
||||
CursorModel(this.parent);
|
||||
|
||||
Set<String> get cachedKeys => _cacheKeys;
|
||||
@ -918,7 +923,7 @@ class CursorModel with ChangeNotifier {
|
||||
if (parent.target?.id != pid) return;
|
||||
_image = image;
|
||||
_images[id] = Tuple3(image, _hotx, _hoty);
|
||||
await _updateCacheLinux(image, id, width, height);
|
||||
await _updateCache(image, id, width, height);
|
||||
try {
|
||||
// my throw exception, because the listener maybe already dispose
|
||||
notifyListeners();
|
||||
@ -927,7 +932,7 @@ class CursorModel with ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
_updateCacheLinux(ui.Image image, int id, int w, int h) async {
|
||||
_updateCache(ui.Image image, int id, int w, int h) async {
|
||||
Uint8List? data;
|
||||
img2.Image? image2;
|
||||
if (Platform.isWindows) {
|
||||
@ -981,6 +986,8 @@ class CursorModel with ChangeNotifier {
|
||||
|
||||
/// Update the cursor position.
|
||||
updateCursorPosition(Map<String, dynamic> evt, String id) async {
|
||||
got_mouse_control = false;
|
||||
_last_peer_mouse = DateTime.now();
|
||||
_x = double.parse(evt['x']);
|
||||
_y = double.parse(evt['y']);
|
||||
try {
|
||||
|
Loading…
Reference in New Issue
Block a user