fix: multi window close issue

This commit is contained in:
kingtous 2022-08-09 13:39:30 +08:00
parent 6638cd2a4a
commit 5a953cc8df
3 changed files with 51 additions and 1 deletions

View File

@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'package:flutter/material.dart' hide MenuItem;
import 'package:flutter/services.dart';
import 'package:flutter_hbb/common.dart';
@ -15,6 +16,7 @@ import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tray_manager/tray_manager.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:window_manager/window_manager.dart';
class DesktopHomePage extends StatefulWidget {
DesktopHomePage({Key? key}) : super(key: key);
@ -25,7 +27,24 @@ class DesktopHomePage extends StatefulWidget {
const borderColor = Color(0xFF2F65BA);
class _DesktopHomePageState extends State<DesktopHomePage> with TrayListener {
class _DesktopHomePageState extends State<DesktopHomePage> with TrayListener, WindowListener {
@override
void onWindowClose() async {
super.onWindowClose();
// close all sub windows
if (await windowManager.isPreventClose()) {
try {
await rustDeskWinManager.closeAllSubWindows();
} catch (err) {
debugPrint("$err");
} finally {
await windowManager.setPreventClose(false);
await windowManager.close();
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
@ -448,6 +467,7 @@ class _DesktopHomePageState extends State<DesktopHomePage> with TrayListener {
void initState() {
super.initState();
trayManager.addListener(this);
windowManager.addListener(this);
rustDeskWinManager.setMethodHandler((call, fromWindowId) async {
print(
"call ${call.method} with args ${call.arguments} from window ${fromWindowId}");
@ -460,6 +480,7 @@ class _DesktopHomePageState extends State<DesktopHomePage> with TrayListener {
@override
void dispose() {
trayManager.removeListener(this);
windowManager.removeListener(this);
super.dispose();
}

View File

@ -9,6 +9,7 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:get/route_manager.dart';
import 'package:provider/provider.dart';
import 'package:window_manager/window_manager.dart';
// import 'package:window_manager/window_manager.dart';
@ -47,6 +48,8 @@ Future<Null> main(List<String> args) async {
break;
}
} else {
await windowManager.ensureInitialized();
windowManager.setPreventClose(true);
runMainApp(true);
}
}

View File

@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:ui';
import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
/// must keep the order
@ -114,6 +115,31 @@ class RustDeskMultiWindowManager {
Future<dynamic> Function(MethodCall call, int fromWindowId)? handler) {
DesktopMultiWindow.setMethodHandler(handler);
}
Future<void> closeAllSubWindows() async {
await Future.wait(WindowType.values.map((e) => closeWindows(e)));
}
Future<void> closeWindows(WindowType type) async {
if (type == WindowType.Main) {
// skip main window, use window manager instead
return;
}
int? wId = findWindowByType(type);
if (wId != null) {
debugPrint("closing multi window: ${type.toString()}");
try {
final ids = await DesktopMultiWindow.getAllSubWindowIds();
if (!ids.contains(wId)) {
// no such window already
return;
}
await WindowController.fromWindowId(wId).close();
} on Error {
return;
}
}
}
}
final rustDeskWinManager = RustDeskMultiWindowManager.instance;