From c5a78ce107eade7e79bd82d1101f8507b7920b8f Mon Sep 17 00:00:00 2001 From: fufesou Date: Tue, 13 Sep 2022 19:10:55 -0700 Subject: [PATCH] flutter_desktop: update custom cursor lib & menubar margin & better callback for pinning menubar Signed-off-by: fufesou --- flutter/lib/desktop/pages/remote_page.dart | 31 ++++++++++--- .../lib/desktop/pages/remote_tab_page.dart | 2 +- .../lib/desktop/widgets/remote_menubar.dart | 46 +++++++++++-------- flutter/pubspec.yaml | 2 +- 4 files changed, 54 insertions(+), 27 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 43d48740e..d8243700c 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -18,6 +18,8 @@ import '../../models/model.dart'; import '../../models/platform_model.dart'; import '../../common/shared_state.dart'; +bool _isCustomCursorInited = false; + class RemotePage extends StatefulWidget { const RemotePage({ Key? key, @@ -45,7 +47,7 @@ class _RemotePageState extends State var _isPhysicalMouse = false; var _imageFocused = false; - final _onEnterOrLeaveImage = []; + Function(bool)? _onEnterOrLeaveImage4Menubar; late FFI _ffi; @@ -95,6 +97,14 @@ class _RemotePageState extends State _ffi.qualityMonitorModel.checkShowQualityMonitor(widget.id); _showRemoteCursor.value = bind.sessionGetToggleOptionSync( id: widget.id, arg: 'show-remote-cursor'); + + if (!_isCustomCursorInited) { + customCursorController.registerNeedUpdateCursorCallback( + (String? lastKey, String? currentKey) async { + return lastKey == null || lastKey != currentKey; + }); + _isCustomCursorInited = true; + } } @override @@ -327,16 +337,24 @@ class _RemotePageState extends State _rawKeyFocusNode.requestFocus(); } _cursorOverImage.value = true; - for (var f in _onEnterOrLeaveImage) { - f(true); + if (_onEnterOrLeaveImage4Menubar != null) { + try { + _onEnterOrLeaveImage4Menubar!(true); + } catch (e) { + // + } } _ffi.enterOrLeave(true); } void leaveView(PointerExitEvent evt) { _cursorOverImage.value = false; - for (var f in _onEnterOrLeaveImage) { - f(false); + if (_onEnterOrLeaveImage4Menubar != null) { + try { + _onEnterOrLeaveImage4Menubar!(false); + } catch (e) { + // + } } _ffi.enterOrLeave(false); } @@ -381,7 +399,8 @@ class _RemotePageState extends State paints.add(RemoteMenubar( id: widget.id, ffi: _ffi, - onEnterOrLeaveImage: _onEnterOrLeaveImage, + onEnterOrLeaveImageSetter: (func) => _onEnterOrLeaveImage4Menubar = func, + onEnterOrLeaveImageCleaner: () => _onEnterOrLeaveImage4Menubar = null, )); return Stack( children: paints, diff --git a/flutter/lib/desktop/pages/remote_tab_page.dart b/flutter/lib/desktop/pages/remote_tab_page.dart index 2f87c51fb..4d4c7e6e1 100644 --- a/flutter/lib/desktop/pages/remote_tab_page.dart +++ b/flutter/lib/desktop/pages/remote_tab_page.dart @@ -98,7 +98,7 @@ class _ConnectionTabPageState extends State { controller: tabController, showTabBar: fullscreen.isFalse, onWindowCloseButton: handleWindowCloseButton, - tail: AddButton().paddingOnly(left: 10), + tail: const AddButton().paddingOnly(left: 10), pageViewBuilder: (pageView) { WindowController.fromWindowId(windowId()) .setFullscreen(fullscreen.isTrue); diff --git a/flutter/lib/desktop/widgets/remote_menubar.dart b/flutter/lib/desktop/widgets/remote_menubar.dart index 7c8fd20b5..ef20352dc 100644 --- a/flutter/lib/desktop/widgets/remote_menubar.dart +++ b/flutter/lib/desktop/widgets/remote_menubar.dart @@ -26,13 +26,15 @@ class _MenubarTheme { class RemoteMenubar extends StatefulWidget { final String id; final FFI ffi; - final List onEnterOrLeaveImage; + final Function(Function(bool)) onEnterOrLeaveImageSetter; + final Function() onEnterOrLeaveImageCleaner; const RemoteMenubar({ Key? key, required this.id, required this.ffi, - required this.onEnterOrLeaveImage, + required this.onEnterOrLeaveImageSetter, + required this.onEnterOrLeaveImageCleaner, }) : super(key: key); @override @@ -52,10 +54,10 @@ class _RemoteMenubarState extends State { } @override - void initState() { + initState() { super.initState(); - widget.onEnterOrLeaveImage.add((enter) { + widget.onEnterOrLeaveImageSetter((enter) { if (enter) { _rxHideReplay.add(0); _isCursorOverImage = true; @@ -74,6 +76,13 @@ class _RemoteMenubarState extends State { }); } + @override + dispose() { + super.dispose(); + + widget.onEnterOrLeaveImageCleaner(); + } + @override Widget build(BuildContext context) { return Align( @@ -85,21 +94,20 @@ class _RemoteMenubarState extends State { Widget _buildShowHide(BuildContext context) { return Obx(() => Tooltip( - message: translate(_show.value ? "Hide Menubar" : "Show Menubar"), - child: SizedBox( - width: 100, - height: 5, - child: TextButton( - onHover: (bool v) { - _hideColor.value = v ? Colors.white60 : Colors.white24; - }, - onPressed: () { - _show.value = !_show.value; - }, - child: Obx(() => Container( - color: _hideColor.value, - )))), - )); + message: translate(_show.value ? "Hide Menubar" : "Show Menubar"), + child: SizedBox( + width: 100, + height: 13, + child: TextButton( + onHover: (bool v) { + _hideColor.value = v ? Colors.white60 : Colors.white24; + }, + onPressed: () { + _show.value = !_show.value; + }, + child: Obx(() => Container( + color: _hideColor.value, + ).marginOnly(bottom: 8.0)))))); } Widget _buildMenubar(BuildContext context) { diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index 5556b0dd5..e3b1c883a 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -71,7 +71,7 @@ dependencies: flutter_custom_cursor: git: url: https://github.com/Kingtous/rustdesk_flutter_custom_cursor - ref: 9021e21de36c84edf01d5034f38eda580463163b + ref: 47179378523c993092f70d95f93d53f40af01f02 get: ^4.6.5 visibility_detector: ^0.3.3 contextmenu: ^3.0.0