commit
						853f49342f
					
				| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user