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 {