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