Merge pull request #5125 from dignow/fix/window_save_pos

Fix/window save pos
This commit is contained in:
RustDesk 2023-07-26 10:21:43 +08:00 committed by GitHub
commit 88efd13acb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 21 deletions

View File

@ -1363,15 +1363,19 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
debugPrint( debugPrint(
"Error: windowId cannot be null when saving positions for sub window"); "Error: windowId cannot be null when saving positions for sub window");
} }
late Offset position;
late Size sz;
late bool isMaximized;
switch (type) { switch (type) {
case WindowType.Main: case WindowType.Main:
final position = await windowManager.getPosition(); position = await windowManager.getPosition();
final sz = await windowManager.getSize(); if (position.dx < 0 || position.dy < 0) {
final isMaximized = await windowManager.isMaximized(); debugPrint("Main window is hidden, ignoring position restoration");
final pos = LastWindowPosition( return;
sz.width, sz.height, position.dx, position.dy, isMaximized); }
await bind.setLocalFlutterConfig( sz = await windowManager.getSize();
k: kWindowPrefix + type.name, v: pos.toString()); isMaximized = await windowManager.isMaximized();
break; break;
default: default:
final wc = WindowController.fromWindowId(windowId!); final wc = WindowController.fromWindowId(windowId!);
@ -1382,17 +1386,22 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
debugPrint("Failed to get frame of window $windowId, it may be hidden"); debugPrint("Failed to get frame of window $windowId, it may be hidden");
return; return;
} }
final position = frame.topLeft; position = frame.topLeft;
final sz = frame.size; if (position.dx < 0 || position.dy < 0) {
final isMaximized = await wc.isMaximized(); debugPrint("Window $windowId is hidden, ignoring position restoration");
final pos = LastWindowPosition( return;
sz.width, sz.height, position.dx, position.dy, isMaximized); }
debugPrint( sz = frame.size;
"saving frame: $windowId: ${pos.width}/${pos.height}, offset:${pos.offsetWidth}/${pos.offsetHeight}"); isMaximized = await wc.isMaximized();
await bind.setLocalFlutterConfig(
k: kWindowPrefix + type.name, v: pos.toString());
break; 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<Size> _adjustRestoreMainWindowSize(double? width, double? height) async { Future<Size> _adjustRestoreMainWindowSize(double? width, double? height) async {
@ -1864,10 +1873,14 @@ Future<void> onActiveWindowChanged() async {
if (rustDeskWinManager.getActiveWindows().isEmpty) { if (rustDeskWinManager.getActiveWindows().isEmpty) {
// close all sub windows // close all sub windows
try { try {
await Future.wait([ if (Platform.isLinux) {
saveWindowPosition(WindowType.Main), await Future.wait([
rustDeskWinManager.closeAllSubWindows() saveWindowPosition(WindowType.Main),
]); rustDeskWinManager.closeAllSubWindows()
]);
} else {
await rustDeskWinManager.closeAllSubWindows();
}
} catch (err) { } catch (err) {
debugPrintStack(label: "$err"); debugPrintStack(label: "$err");
} finally { } finally {

View File

@ -478,6 +478,8 @@ class WindowActionPanel extends StatefulWidget {
class WindowActionPanelState extends State<WindowActionPanel> class WindowActionPanelState extends State<WindowActionPanel>
with MultiWindowListener, WindowListener { with MultiWindowListener, WindowListener {
final _saveFrameDebounce = Debouncer(delay: Duration(seconds: 1));
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -537,6 +539,26 @@ class WindowActionPanelState extends State<WindowActionPanel>
super.onWindowUnmaximize(); 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 @override
void onWindowClose() async { void onWindowClose() async {
// hide window on close // hide window on close

View File

@ -327,7 +327,7 @@ packages:
description: description:
path: "." path: "."
ref: HEAD ref: HEAD
resolved-ref: aee670819f5fe7e8b0f05e0239dafb5c62f7a84b resolved-ref: 6c4181330f4ed80c1cb5670bd61aa75115f9f748
url: "https://github.com/rustdesk-org/rustdesk_desktop_multi_window" url: "https://github.com/rustdesk-org/rustdesk_desktop_multi_window"
source: git source: git
version: "0.1.0" version: "0.1.0"