fix saving frame, maximized

Signed-off-by: dignow <linlong1265@gmail.com>
This commit is contained in:
dignow 2023-08-11 12:01:57 +08:00
parent e2fdd69524
commit 26cd24d92f

View File

@ -1394,14 +1394,26 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
late Offset position;
late Size sz;
late bool isMaximized;
setFrameIfMaximized() {
if (isMaximized) {
final pos = bind.getLocalFlutterOption(k: kWindowPrefix + type.name);
var lpos = LastWindowPosition.loadFromString(pos);
position = Offset(
lpos?.offsetWidth ?? position.dx, lpos?.offsetHeight ?? position.dy);
sz = Size(lpos?.width ?? sz.width, lpos?.height ?? sz.height);
}
}
switch (type) {
case WindowType.Main:
isMaximized = await windowManager.isMaximized();
position = await windowManager.getPosition();
sz = await windowManager.getSize();
isMaximized = await windowManager.isMaximized();
setFrameIfMaximized();
break;
default:
final wc = WindowController.fromWindowId(windowId!);
isMaximized = await wc.isMaximized();
final Rect frame;
try {
frame = await wc.getFrame();
@ -1411,7 +1423,7 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
}
position = frame.topLeft;
sz = frame.size;
isMaximized = await wc.isMaximized();
setFrameIfMaximized();
break;
}
if (Platform.isWindows) {
@ -1429,24 +1441,43 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
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}, isMaximized:${pos.isMaximized}");
await bind.setLocalFlutterOption(
k: kWindowPrefix + type.name, v: pos.toString());
if (type == WindowType.RemoteDesktop && windowId != null) {
await _saveSessionWindowPosition(type, windowId, pos);
await _saveSessionWindowPosition(type, windowId, isMaximized, pos);
}
}
Future _saveSessionWindowPosition(
WindowType windowType, int windowId, LastWindowPosition pos) async {
Future _saveSessionWindowPosition(WindowType windowType, int windowId,
bool isMaximized, LastWindowPosition pos) async {
final remoteList = await DesktopMultiWindow.invokeMethod(
windowId, kWindowEventGetRemoteList, null);
getPeerPos(String peerId) {
if (isMaximized) {
final peerPos = bind.mainGetPeerFlutterOptionSync(
id: peerId, k: kWindowPrefix + windowType.name);
var lpos = LastWindowPosition.loadFromString(peerPos);
return LastWindowPosition(
lpos?.width ?? pos.offsetWidth,
lpos?.height ?? pos.offsetHeight,
lpos?.offsetWidth ?? pos.offsetWidth,
lpos?.offsetHeight ?? pos.offsetHeight,
isMaximized)
.toString();
} else {
return pos.toString();
}
}
if (remoteList != null) {
for (final peerId in remoteList.split(',')) {
bind.mainSetPeerFlutterOptionSync(
id: peerId, k: kWindowPrefix + windowType.name, v: pos.toString());
id: peerId,
k: kWindowPrefix + windowType.name,
v: getPeerPos(peerId));
}
}
}
@ -1529,7 +1560,7 @@ Future<Offset?> _adjustRestoreMainWindowOffset(
if ((left + minWidth) > frameRight! ||
(top + minWidth) > frameBottom! ||
(left + width - minWidth) < frameLeft ||
(top - minWidth) < frameTop!) {
top < frameTop!) {
return null;
} else {
return Offset(left, top);
@ -1586,34 +1617,7 @@ Future<bool> restoreWindowPosition(WindowType type,
}
}
switch (type) {
case WindowType.Main:
if (lpos.isMaximized == true) {
await windowManager.maximize();
} else {
final size =
await _adjustRestoreMainWindowSize(lpos.width, lpos.height);
final offset = await _adjustRestoreMainWindowOffset(
lpos.offsetWidth,
lpos.offsetHeight,
size.width,
size.height,
);
await windowManager.setSize(size);
if (offset == null) {
await windowManager.center();
} else {
await windowManager.setPosition(offset);
}
}
return true;
default:
final wc = WindowController.fromWindowId(windowId!);
if (lpos.isMaximized == true) {
await wc.maximize();
} else {
final size =
await _adjustRestoreMainWindowSize(lpos.width, lpos.height);
final size = await _adjustRestoreMainWindowSize(lpos.width, lpos.height);
final offset = await _adjustRestoreMainWindowOffset(
lpos.offsetWidth,
lpos.offsetHeight,
@ -1622,6 +1626,27 @@ Future<bool> restoreWindowPosition(WindowType type,
);
debugPrint(
"restore lpos: ${size.width}/${size.height}, offset:${offset?.dx}/${offset?.dy}");
switch (type) {
case WindowType.Main:
restorePos() async {
if (offset == null) {
await windowManager.center();
} else {
await windowManager.setPosition(offset);
}
}
if (lpos.isMaximized == true) {
await restorePos();
await windowManager.maximize();
} else {
await windowManager.setSize(size);
await restorePos();
}
return true;
default:
final wc = WindowController.fromWindowId(windowId!);
restoreFrame() async {
if (offset == null) {
await wc.center();
} else {
@ -1630,6 +1655,12 @@ Future<bool> restoreWindowPosition(WindowType type,
await wc.setFrame(frame);
}
}
if (lpos.isMaximized == true) {
await restoreFrame();
await wc.maximize();
} else {
await restoreFrame();
}
break;
}
return false;