From 4272f0194e0b3ef168f01f5a09aebe66aaf51b85 Mon Sep 17 00:00:00 2001 From: fufesou Date: Fri, 4 Nov 2022 17:01:49 +0800 Subject: [PATCH 1/5] fix_cm: miminize window, mid commit Signed-off-by: fufesou --- flutter/lib/desktop/pages/remote_page.dart | 18 +++++++++++++++++- flutter/lib/models/chat_model.dart | 17 ++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 76395be9d..55cfcd643 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -8,6 +8,7 @@ import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:provider/provider.dart'; import 'package:wakelock/wakelock.dart'; +import 'package:window_manager/window_manager.dart'; import 'package:flutter_custom_cursor/flutter_custom_cursor.dart'; import 'package:flutter_improved_scrolling/flutter_improved_scrolling.dart'; @@ -46,7 +47,7 @@ class RemotePage extends StatefulWidget { } class _RemotePageState extends State - with AutomaticKeepAliveClientMixin { + with AutomaticKeepAliveClientMixin, WindowListener { Timer? _timer; String keyboardMode = "legacy"; final _cursorOverImage = false.obs; @@ -248,6 +249,21 @@ class _RemotePageState extends State ); } + @override + void onWindowMinimize() { + _ffi.chatModel.setWindowMinimized(true); + } + + @override + void onWindowMaximize() { + _ffi.chatModel.setWindowMinimized(false); + } + + @override + void onWindowRestore() { + _ffi.chatModel.setWindowMinimized(false); + } + @override bool get wantKeepAlive => true; } diff --git a/flutter/lib/models/chat_model.dart b/flutter/lib/models/chat_model.dart index 9aa1a23ce..aaa81382c 100644 --- a/flutter/lib/models/chat_model.dart +++ b/flutter/lib/models/chat_model.dart @@ -32,6 +32,8 @@ class ChatModel with ChangeNotifier { OverlayState? _overlayState; OverlayEntry? chatIconOverlayEntry; OverlayEntry? chatWindowOverlayEntry; + bool _showOnWindowRestore = false; + bool _isWindowMinimized = false; final ChatUser me = ChatUser( id: "", @@ -66,6 +68,14 @@ class ChatModel with ChangeNotifier { } } + setWindowMinimized(bool v) { + _isWindowMinimized = v; + if (!_isWindowMinimized && _showOnWindowRestore) { + showChatIconOverlay(); + _showOnWindowRestore = false; + } + } + setOverlayState(OverlayState? os) { _overlayState = os; } @@ -101,6 +111,7 @@ class ChatModel with ChangeNotifier { initPositionYInTop: false, initPositionYMarginBorder: 100, borderTopContainTopBar: true, + appBarHeight: 0, ), child: FloatingActionButton( onPressed: () { @@ -209,7 +220,11 @@ class ChatModel with ChangeNotifier { if (text.isEmpty) return; // mobile: first message show overlay icon if (chatIconOverlayEntry == null) { - showChatIconOverlay(); + if (_isWindowMinimized) { + showChatIconOverlay(); + } else { + _showOnWindowRestore = true; + } } // desktop: show chat page if (!_isShowChatPage) { From e7ac6eb0d21c27120fa5d2f6a3d645ff045fdcc2 Mon Sep 17 00:00:00 2001 From: fufesou Date: Fri, 4 Nov 2022 21:43:51 +0800 Subject: [PATCH 2/5] desktop cm chat page Signed-off-by: fufesou --- flutter/lib/desktop/pages/server_page.dart | 3 +- flutter/lib/models/chat_model.dart | 44 +++++++++++++--------- flutter/lib/models/server_model.dart | 4 +- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/flutter/lib/desktop/pages/server_page.dart b/flutter/lib/desktop/pages/server_page.dart index d04f7871f..884ac6441 100644 --- a/flutter/lib/desktop/pages/server_page.dart +++ b/flutter/lib/desktop/pages/server_page.dart @@ -101,6 +101,7 @@ class ConnectionManagerState extends State { gFFI.serverModel.updateClientState(); gFFI.serverModel.tabController.onSelected = (index, _) => gFFI.chatModel.changeCurrentID(gFFI.serverModel.clients[index].id); + gFFI.chatModel.isConnManager = true; super.initState(); } @@ -159,7 +160,7 @@ class ConnectionManagerState extends State { pageViewBuilder: (pageView) => Row(children: [ Expanded(child: pageView), Consumer( - builder: (_, model, child) => model.isShowChatPage + builder: (_, model, child) => model.isShowCMChatPage ? Expanded(child: Scaffold(body: ChatPage())) : Offstage()) ]))); diff --git a/flutter/lib/models/chat_model.dart b/flutter/lib/models/chat_model.dart index aaa81382c..2fdede718 100644 --- a/flutter/lib/models/chat_model.dart +++ b/flutter/lib/models/chat_model.dart @@ -34,6 +34,7 @@ class ChatModel with ChangeNotifier { OverlayEntry? chatWindowOverlayEntry; bool _showOnWindowRestore = false; bool _isWindowMinimized = false; + bool isConnManager = false; final ChatUser me = ChatUser( id: "", @@ -44,13 +45,13 @@ class ChatModel with ChangeNotifier { MessageBody(me, []); var _currentID = clientModeID; - late bool _isShowChatPage = false; + late bool _isShowCMChatPage = false; Map get messages => _messages; int get currentID => _currentID; - bool get isShowChatPage => _isShowChatPage; + bool get isShowCMChatPage => _isShowCMChatPage; final WeakReference parent; @@ -71,7 +72,6 @@ class ChatModel with ChangeNotifier { setWindowMinimized(bool v) { _isWindowMinimized = v; if (!_isWindowMinimized && _showOnWindowRestore) { - showChatIconOverlay(); _showOnWindowRestore = false; } } @@ -158,9 +158,11 @@ class ChatModel with ChangeNotifier { } } + _isChatOverlayHide() => ((!isDesktop && chatIconOverlayEntry == null) || + chatWindowOverlayEntry == null); + toggleChatOverlay() { - if ((!isDesktop && chatIconOverlayEntry == null) || - chatWindowOverlayEntry == null) { + if (_isChatOverlayHide()) { gFFI.invokeMethod("enable_soft_keyboard", true); if (!isDesktop) { showChatIconOverlay(); @@ -172,12 +174,24 @@ class ChatModel with ChangeNotifier { } } + showChatPage(int id) async { + if (isConnManager) { + if (!_isShowCMChatPage) { + await toggleCMChatPage(id); + } + } else { + if (_isChatOverlayHide()) { + await toggleChatOverlay(); + } + } + } + toggleCMChatPage(int id) async { if (gFFI.chatModel.currentID != id) { gFFI.chatModel.changeCurrentID(id); } - if (_isShowChatPage) { - _isShowChatPage = !_isShowChatPage; + if (_isShowCMChatPage) { + _isShowCMChatPage = !_isShowCMChatPage; notifyListeners(); await windowManager.setSize(Size(300, 400)); await windowManager.setAlignment(Alignment.topRight); @@ -185,7 +199,7 @@ class ChatModel with ChangeNotifier { await windowManager.setSize(Size(600, 400)); await Future.delayed(Duration(milliseconds: 100)); await windowManager.setAlignment(Alignment.topRight); - _isShowChatPage = !_isShowChatPage; + _isShowCMChatPage = !_isShowCMChatPage; notifyListeners(); } } @@ -219,17 +233,11 @@ class ChatModel with ChangeNotifier { } if (text.isEmpty) return; // mobile: first message show overlay icon - if (chatIconOverlayEntry == null) { - if (_isWindowMinimized) { - showChatIconOverlay(); - } else { - _showOnWindowRestore = true; - } - } - // desktop: show chat page - if (!_isShowChatPage) { - toggleCMChatPage(id); + if (!isDesktop && chatIconOverlayEntry == null) { + showChatIconOverlay(); } + // show chat page + await showChatPage(id); int toId = currentID; diff --git a/flutter/lib/models/server_model.dart b/flutter/lib/models/server_model.dart index 6671ec669..d407ca51b 100644 --- a/flutter/lib/models/server_model.dart +++ b/flutter/lib/models/server_model.dart @@ -407,9 +407,7 @@ class ServerModel with ChangeNotifier { if (client.hasUnreadChatMessage.value) { client.hasUnreadChatMessage.value = false; final chatModel = parent.target!.chatModel; - if (!chatModel.isShowChatPage) { - chatModel.toggleCMChatPage(client.id); - } + chatModel.showChatPage(client.id); } }, page: desktop.buildConnectionCard(client))); From 4f7af964c62db014745d041e0fd5c3e4b7386fd7 Mon Sep 17 00:00:00 2001 From: fufesou Date: Sat, 5 Nov 2022 10:35:56 +0800 Subject: [PATCH 3/5] desktop cm: auto focus & merge setSizeAlignment Signed-off-by: fufesou --- flutter/lib/common/widgets/chat_page.dart | 1 + flutter/lib/main.dart | 11 +++-------- flutter/lib/models/chat_model.dart | 7 ++----- flutter/pubspec.yaml | 2 +- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/flutter/lib/common/widgets/chat_page.dart b/flutter/lib/common/widgets/chat_page.dart index 3b4e06a6f..510ce1f73 100644 --- a/flutter/lib/common/widgets/chat_page.dart +++ b/flutter/lib/common/widgets/chat_page.dart @@ -54,6 +54,7 @@ class ChatPage extends StatelessWidget implements PageShape { return DashChat( onSend: (chatMsg) { chatModel.send(chatMsg); + chatModel.inputNode.requestFocus(); }, currentUser: chatModel.me, messages: chatModel diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index 3621a3bf8..afc98a1e1 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -160,15 +160,10 @@ void runConnectionManagerScreen() async { ); windowManager.waitUntilReadyToShow(windowOptions, () async { await windowManager.show(); + await Future.wait([windowManager.focus(), windowManager.setOpacity(1)]); // ensure initial window size to be changed - await windowManager.setSize(kConnectionManagerWindowSize); - await Future.wait([ - windowManager.setAlignment(Alignment.topRight), - windowManager.focus(), - windowManager.setOpacity(1) - ]); - // ensure - windowManager.setAlignment(Alignment.topRight); + await windowManager.setSizeAlignment( + kConnectionManagerWindowSize, Alignment.topRight); }); } diff --git a/flutter/lib/models/chat_model.dart b/flutter/lib/models/chat_model.dart index 2fdede718..590a92a4a 100644 --- a/flutter/lib/models/chat_model.dart +++ b/flutter/lib/models/chat_model.dart @@ -193,12 +193,9 @@ class ChatModel with ChangeNotifier { if (_isShowCMChatPage) { _isShowCMChatPage = !_isShowCMChatPage; notifyListeners(); - await windowManager.setSize(Size(300, 400)); - await windowManager.setAlignment(Alignment.topRight); + await windowManager.setSizeAlignment(Size(300, 400), Alignment.topRight); } else { - await windowManager.setSize(Size(600, 400)); - await Future.delayed(Duration(milliseconds: 100)); - await windowManager.setAlignment(Alignment.topRight); + await windowManager.setSizeAlignment(Size(600, 400), Alignment.topRight); _isShowCMChatPage = !_isShowCMChatPage; notifyListeners(); } diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index 7dfb53538..3cbb1fc21 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -60,7 +60,7 @@ dependencies: window_manager: git: url: https://github.com/Kingtous/rustdesk_window_manager - ref: 88487257cbafc501599ab4f82ec343b46acec020 + ref: d1e4b40f4a1ffeb8630696be6883dd31bf307998 desktop_multi_window: git: url: https://github.com/Kingtous/rustdesk_desktop_multi_window From fed699b4ef9f9cd47cc118dcb12a2bf460deb447 Mon Sep 17 00:00:00 2001 From: fufesou Date: Sat, 5 Nov 2022 10:46:29 +0800 Subject: [PATCH 4/5] Remove unused logic Signed-off-by: fufesou --- flutter/lib/desktop/pages/remote_page.dart | 18 +----------------- flutter/lib/models/chat_model.dart | 9 --------- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 55cfcd643..76395be9d 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -8,7 +8,6 @@ import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:provider/provider.dart'; import 'package:wakelock/wakelock.dart'; -import 'package:window_manager/window_manager.dart'; import 'package:flutter_custom_cursor/flutter_custom_cursor.dart'; import 'package:flutter_improved_scrolling/flutter_improved_scrolling.dart'; @@ -47,7 +46,7 @@ class RemotePage extends StatefulWidget { } class _RemotePageState extends State - with AutomaticKeepAliveClientMixin, WindowListener { + with AutomaticKeepAliveClientMixin { Timer? _timer; String keyboardMode = "legacy"; final _cursorOverImage = false.obs; @@ -249,21 +248,6 @@ class _RemotePageState extends State ); } - @override - void onWindowMinimize() { - _ffi.chatModel.setWindowMinimized(true); - } - - @override - void onWindowMaximize() { - _ffi.chatModel.setWindowMinimized(false); - } - - @override - void onWindowRestore() { - _ffi.chatModel.setWindowMinimized(false); - } - @override bool get wantKeepAlive => true; } diff --git a/flutter/lib/models/chat_model.dart b/flutter/lib/models/chat_model.dart index 590a92a4a..696831e42 100644 --- a/flutter/lib/models/chat_model.dart +++ b/flutter/lib/models/chat_model.dart @@ -32,8 +32,6 @@ class ChatModel with ChangeNotifier { OverlayState? _overlayState; OverlayEntry? chatIconOverlayEntry; OverlayEntry? chatWindowOverlayEntry; - bool _showOnWindowRestore = false; - bool _isWindowMinimized = false; bool isConnManager = false; final ChatUser me = ChatUser( @@ -69,13 +67,6 @@ class ChatModel with ChangeNotifier { } } - setWindowMinimized(bool v) { - _isWindowMinimized = v; - if (!_isWindowMinimized && _showOnWindowRestore) { - _showOnWindowRestore = false; - } - } - setOverlayState(OverlayState? os) { _overlayState = os; } From ecf6cff57512601b8dbc190addff412f2825d81c Mon Sep 17 00:00:00 2001 From: fufesou Date: Sat, 5 Nov 2022 10:52:39 +0800 Subject: [PATCH 5/5] chat floating icon Signed-off-by: fufesou --- flutter/lib/models/chat_model.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/flutter/lib/models/chat_model.dart b/flutter/lib/models/chat_model.dart index 696831e42..bc6582617 100644 --- a/flutter/lib/models/chat_model.dart +++ b/flutter/lib/models/chat_model.dart @@ -102,7 +102,6 @@ class ChatModel with ChangeNotifier { initPositionYInTop: false, initPositionYMarginBorder: 100, borderTopContainTopBar: true, - appBarHeight: 0, ), child: FloatingActionButton( onPressed: () {