Merge pull request #5347 from dignow/fix/save_frame_maximized
Fix/save frame maximized
This commit is contained in:
commit
8b82db1220
@ -1394,14 +1394,26 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
|
|||||||
late Offset position;
|
late Offset position;
|
||||||
late Size sz;
|
late Size sz;
|
||||||
late bool isMaximized;
|
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) {
|
switch (type) {
|
||||||
case WindowType.Main:
|
case WindowType.Main:
|
||||||
|
isMaximized = await windowManager.isMaximized();
|
||||||
position = await windowManager.getPosition();
|
position = await windowManager.getPosition();
|
||||||
sz = await windowManager.getSize();
|
sz = await windowManager.getSize();
|
||||||
isMaximized = await windowManager.isMaximized();
|
setFrameIfMaximized();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
final wc = WindowController.fromWindowId(windowId!);
|
final wc = WindowController.fromWindowId(windowId!);
|
||||||
|
isMaximized = await wc.isMaximized();
|
||||||
final Rect frame;
|
final Rect frame;
|
||||||
try {
|
try {
|
||||||
frame = await wc.getFrame();
|
frame = await wc.getFrame();
|
||||||
@ -1411,7 +1423,7 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
|
|||||||
}
|
}
|
||||||
position = frame.topLeft;
|
position = frame.topLeft;
|
||||||
sz = frame.size;
|
sz = frame.size;
|
||||||
isMaximized = await wc.isMaximized();
|
setFrameIfMaximized();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (Platform.isWindows) {
|
if (Platform.isWindows) {
|
||||||
@ -1429,24 +1441,43 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
|
|||||||
final pos = LastWindowPosition(
|
final pos = LastWindowPosition(
|
||||||
sz.width, sz.height, position.dx, position.dy, isMaximized);
|
sz.width, sz.height, position.dx, position.dy, isMaximized);
|
||||||
debugPrint(
|
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(
|
await bind.setLocalFlutterOption(
|
||||||
k: kWindowPrefix + type.name, v: pos.toString());
|
k: kWindowPrefix + type.name, v: pos.toString());
|
||||||
|
|
||||||
if (type == WindowType.RemoteDesktop && windowId != null) {
|
if (type == WindowType.RemoteDesktop && windowId != null) {
|
||||||
await _saveSessionWindowPosition(type, windowId, pos);
|
await _saveSessionWindowPosition(type, windowId, isMaximized, pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future _saveSessionWindowPosition(
|
Future _saveSessionWindowPosition(WindowType windowType, int windowId,
|
||||||
WindowType windowType, int windowId, LastWindowPosition pos) async {
|
bool isMaximized, LastWindowPosition pos) async {
|
||||||
final remoteList = await DesktopMultiWindow.invokeMethod(
|
final remoteList = await DesktopMultiWindow.invokeMethod(
|
||||||
windowId, kWindowEventGetRemoteList, null);
|
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) {
|
if (remoteList != null) {
|
||||||
for (final peerId in remoteList.split(',')) {
|
for (final peerId in remoteList.split(',')) {
|
||||||
bind.mainSetPeerFlutterOptionSync(
|
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! ||
|
if ((left + minWidth) > frameRight! ||
|
||||||
(top + minWidth) > frameBottom! ||
|
(top + minWidth) > frameBottom! ||
|
||||||
(left + width - minWidth) < frameLeft ||
|
(left + width - minWidth) < frameLeft ||
|
||||||
(top - minWidth) < frameTop!) {
|
top < frameTop!) {
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
return Offset(left, top);
|
return Offset(left, top);
|
||||||
@ -1586,42 +1617,36 @@ Future<bool> restoreWindowPosition(WindowType type,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final size = await _adjustRestoreMainWindowSize(lpos.width, lpos.height);
|
||||||
|
final offset = await _adjustRestoreMainWindowOffset(
|
||||||
|
lpos.offsetWidth,
|
||||||
|
lpos.offsetHeight,
|
||||||
|
size.width,
|
||||||
|
size.height,
|
||||||
|
);
|
||||||
|
debugPrint(
|
||||||
|
"restore lpos: ${size.width}/${size.height}, offset:${offset?.dx}/${offset?.dy}");
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case WindowType.Main:
|
case WindowType.Main:
|
||||||
if (lpos.isMaximized == true) {
|
restorePos() async {
|
||||||
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) {
|
if (offset == null) {
|
||||||
await windowManager.center();
|
await windowManager.center();
|
||||||
} else {
|
} else {
|
||||||
await windowManager.setPosition(offset);
|
await windowManager.setPosition(offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (lpos.isMaximized == true) {
|
||||||
|
await restorePos();
|
||||||
|
await windowManager.maximize();
|
||||||
|
} else {
|
||||||
|
await windowManager.setSize(size);
|
||||||
|
await restorePos();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
final wc = WindowController.fromWindowId(windowId!);
|
final wc = WindowController.fromWindowId(windowId!);
|
||||||
if (lpos.isMaximized == true) {
|
restoreFrame() async {
|
||||||
await wc.maximize();
|
|
||||||
} else {
|
|
||||||
final size =
|
|
||||||
await _adjustRestoreMainWindowSize(lpos.width, lpos.height);
|
|
||||||
final offset = await _adjustRestoreMainWindowOffset(
|
|
||||||
lpos.offsetWidth,
|
|
||||||
lpos.offsetHeight,
|
|
||||||
size.width,
|
|
||||||
size.height,
|
|
||||||
);
|
|
||||||
debugPrint(
|
|
||||||
"restore lpos: ${size.width}/${size.height}, offset:${offset?.dx}/${offset?.dy}");
|
|
||||||
if (offset == null) {
|
if (offset == null) {
|
||||||
await wc.center();
|
await wc.center();
|
||||||
} else {
|
} else {
|
||||||
@ -1630,6 +1655,12 @@ Future<bool> restoreWindowPosition(WindowType type,
|
|||||||
await wc.setFrame(frame);
|
await wc.setFrame(frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (lpos.isMaximized == true) {
|
||||||
|
await restoreFrame();
|
||||||
|
await wc.maximize();
|
||||||
|
} else {
|
||||||
|
await restoreFrame();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -1668,7 +1699,7 @@ StreamSubscription? listenUniLinks({handleByFlutter = true}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final sub = uriLinkStream.listen((Uri? uri) {
|
final sub = uriLinkStream.listen((Uri? uri) {
|
||||||
debugPrint("A uri was received: $uri.");
|
debugPrint("A uri was received: $uri. handleByFlutter $handleByFlutter");
|
||||||
if (uri != null) {
|
if (uri != null) {
|
||||||
if (handleByFlutter) {
|
if (handleByFlutter) {
|
||||||
handleUriLink(uri: uri);
|
handleUriLink(uri: uri);
|
||||||
@ -1711,7 +1742,14 @@ bool handleUriLink({List<String>? cmdArgs, Uri? uri, String? uriString}) {
|
|||||||
args = urlLinkToCmdArgs(uri);
|
args = urlLinkToCmdArgs(uri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (args == null) return false;
|
if (args == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.isEmpty) {
|
||||||
|
windowOnTop(null);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
UriLinkType? type;
|
UriLinkType? type;
|
||||||
String? id;
|
String? id;
|
||||||
@ -1795,7 +1833,10 @@ bool handleUriLink({List<String>? cmdArgs, Uri? uri, String? uriString}) {
|
|||||||
List<String>? urlLinkToCmdArgs(Uri uri) {
|
List<String>? urlLinkToCmdArgs(Uri uri) {
|
||||||
String? command;
|
String? command;
|
||||||
String? id;
|
String? id;
|
||||||
if (uri.authority == "connection" && uri.path.startsWith("/new/")) {
|
if (uri.authority.isEmpty &&
|
||||||
|
uri.path.split('').every((char) => char == '/')) {
|
||||||
|
return [];
|
||||||
|
} else if (uri.authority == "connection" && uri.path.startsWith("/new/")) {
|
||||||
// For compatibility
|
// For compatibility
|
||||||
command = '--connect';
|
command = '--connect';
|
||||||
id = uri.path.substring("/new/".length);
|
id = uri.path.substring("/new/".length);
|
||||||
|
@ -13,7 +13,6 @@ import 'package:flutter_hbb/consts.dart';
|
|||||||
import 'package:flutter_hbb/main.dart';
|
import 'package:flutter_hbb/main.dart';
|
||||||
import 'package:flutter_hbb/models/platform_model.dart';
|
import 'package:flutter_hbb/models/platform_model.dart';
|
||||||
import 'package:flutter_hbb/models/state_model.dart';
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
import 'package:flutter_hbb/models/desktop_render_texture.dart';
|
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:get/get_rx/src/rx_workers/utils/debouncer.dart';
|
import 'package:get/get_rx/src/rx_workers/utils/debouncer.dart';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user