From 5e9841e7abe10b1838cd66ff72899ee64f8ec444 Mon Sep 17 00:00:00 2001 From: dignow Date: Wed, 26 Jul 2023 00:40:03 +0800 Subject: [PATCH 1/3] fix window save pos, debug win Signed-off-by: dignow --- flutter/lib/common.dart | 12 +++++----- .../lib/desktop/widgets/tabbar_widget.dart | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 71194b42a..eef98179a 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1383,12 +1383,17 @@ Future saveWindowPosition(WindowType type, {int? windowId}) async { return; } final position = frame.topLeft; + if (position.dx < 0 || position.dy < 0) { + debugPrint("Window $windowId is hidden, ignoring position restoration"); + return; + } + final sz = frame.size; final isMaximized = await wc.isMaximized(); final pos = LastWindowPosition( sz.width, sz.height, position.dx, position.dy, isMaximized); debugPrint( - "saving frame: $windowId: ${pos.width}/${pos.height}, offset:${pos.offsetWidth}/${pos.offsetHeight}"); + "Saving frame: $windowId: ${pos.width}/${pos.height}, offset:${pos.offsetWidth}/${pos.offsetHeight}"); await bind.setLocalFlutterConfig( k: kWindowPrefix + type.name, v: pos.toString()); break; @@ -1864,10 +1869,7 @@ Future onActiveWindowChanged() async { if (rustDeskWinManager.getActiveWindows().isEmpty) { // close all sub windows try { - await Future.wait([ - saveWindowPosition(WindowType.Main), - rustDeskWinManager.closeAllSubWindows() - ]); + await rustDeskWinManager.closeAllSubWindows(); } catch (err) { debugPrintStack(label: "$err"); } finally { diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index 72adc42da..c3ef95c75 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -478,6 +478,8 @@ class WindowActionPanel extends StatefulWidget { class WindowActionPanelState extends State with MultiWindowListener, WindowListener { + final _saveFrameDebounce = Debouncer(delay: Duration(seconds: 1)); + @override void initState() { super.initState(); @@ -537,6 +539,26 @@ class WindowActionPanelState extends State super.onWindowUnmaximize(); } + _saveFrame() async { + if (widget.tabType == DesktopTabType.main) { + await saveWindowPosition(WindowType.Main); + } else if (kWindowType != null && kWindowId != null) { + await saveWindowPosition(kWindowType!, windowId: kWindowId); + } + } + + @override + void onWindowMoved() { + _saveFrameDebounce.call(_saveFrame); + super.onWindowMoved(); + } + + @override + void onWindowResized() { + _saveFrameDebounce.call(_saveFrame); + super.onWindowMoved(); + } + @override void onWindowClose() async { // hide window on close From b7123c5be81eba2b5d40876db8f4784cbde1f226 Mon Sep 17 00:00:00 2001 From: dignow Date: Wed, 26 Jul 2023 07:52:40 +0800 Subject: [PATCH 2/3] fix, window save pos, debug Signed-off-by: dignow --- flutter/lib/common.dart | 47 +++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index eef98179a..9668f5c26 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1363,15 +1363,19 @@ Future saveWindowPosition(WindowType type, {int? windowId}) async { debugPrint( "Error: windowId cannot be null when saving positions for sub window"); } + + late Offset position; + late Size sz; + late bool isMaximized; switch (type) { case WindowType.Main: - final position = await windowManager.getPosition(); - final sz = await windowManager.getSize(); - final isMaximized = await windowManager.isMaximized(); - final pos = LastWindowPosition( - sz.width, sz.height, position.dx, position.dy, isMaximized); - await bind.setLocalFlutterConfig( - k: kWindowPrefix + type.name, v: pos.toString()); + position = await windowManager.getPosition(); + if (position.dx < 0 || position.dy < 0) { + debugPrint("Main window is hidden, ignoring position restoration"); + return; + } + sz = await windowManager.getSize(); + isMaximized = await windowManager.isMaximized(); break; default: final wc = WindowController.fromWindowId(windowId!); @@ -1382,22 +1386,22 @@ Future saveWindowPosition(WindowType type, {int? windowId}) async { debugPrint("Failed to get frame of window $windowId, it may be hidden"); return; } - final position = frame.topLeft; + position = frame.topLeft; if (position.dx < 0 || position.dy < 0) { debugPrint("Window $windowId is hidden, ignoring position restoration"); return; } - - final sz = frame.size; - final isMaximized = await wc.isMaximized(); - final pos = LastWindowPosition( - sz.width, sz.height, position.dx, position.dy, isMaximized); - debugPrint( - "Saving frame: $windowId: ${pos.width}/${pos.height}, offset:${pos.offsetWidth}/${pos.offsetHeight}"); - await bind.setLocalFlutterConfig( - k: kWindowPrefix + type.name, v: pos.toString()); + sz = frame.size; + isMaximized = await wc.isMaximized(); break; } + + final pos = LastWindowPosition( + sz.width, sz.height, position.dx, position.dy, isMaximized); + debugPrint( + "Saving frame: $windowId: ${pos.width}/${pos.height}, offset:${pos.offsetWidth}/${pos.offsetHeight}"); + await bind.setLocalFlutterConfig( + k: kWindowPrefix + type.name, v: pos.toString()); } Future _adjustRestoreMainWindowSize(double? width, double? height) async { @@ -1869,7 +1873,14 @@ Future onActiveWindowChanged() async { if (rustDeskWinManager.getActiveWindows().isEmpty) { // close all sub windows try { - await rustDeskWinManager.closeAllSubWindows(); + if (Platform.isLinux) { + await Future.wait([ + saveWindowPosition(WindowType.Main), + rustDeskWinManager.closeAllSubWindows() + ]); + } else { + await rustDeskWinManager.closeAllSubWindows(); + } } catch (err) { debugPrintStack(label: "$err"); } finally { From 6c0ca4cec8f207f2eee4b8396724724b7f83de60 Mon Sep 17 00:00:00 2001 From: dignow Date: Wed, 26 Jul 2023 10:13:37 +0800 Subject: [PATCH 3/3] update pubspec.lock Signed-off-by: dignow --- flutter/pubspec.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/pubspec.lock b/flutter/pubspec.lock index ead34415f..f09f565c9 100644 --- a/flutter/pubspec.lock +++ b/flutter/pubspec.lock @@ -327,7 +327,7 @@ packages: description: path: "." ref: HEAD - resolved-ref: aee670819f5fe7e8b0f05e0239dafb5c62f7a84b + resolved-ref: 6c4181330f4ed80c1cb5670bd61aa75115f9f748 url: "https://github.com/rustdesk-org/rustdesk_desktop_multi_window" source: git version: "0.1.0"