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:convert';
import 'dart:io'; import 'dart:io';
import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'package:flutter/material.dart' hide MenuItem; import 'package:flutter/material.dart' hide MenuItem;
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_hbb/common.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:shared_preferences/shared_preferences.dart';
import 'package:tray_manager/tray_manager.dart'; import 'package:tray_manager/tray_manager.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
import 'package:window_manager/window_manager.dart';
class DesktopHomePage extends StatefulWidget { class DesktopHomePage extends StatefulWidget {
DesktopHomePage({Key? key}) : super(key: key); DesktopHomePage({Key? key}) : super(key: key);
@ -25,7 +27,24 @@ class DesktopHomePage extends StatefulWidget {
const borderColor = Color(0xFF2F65BA); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -448,6 +467,7 @@ class _DesktopHomePageState extends State<DesktopHomePage> with TrayListener {
void initState() { void initState() {
super.initState(); super.initState();
trayManager.addListener(this); trayManager.addListener(this);
windowManager.addListener(this);
rustDeskWinManager.setMethodHandler((call, fromWindowId) async { rustDeskWinManager.setMethodHandler((call, fromWindowId) async {
print( print(
"call ${call.method} with args ${call.arguments} from window ${fromWindowId}"); "call ${call.method} with args ${call.arguments} from window ${fromWindowId}");
@ -460,6 +480,7 @@ class _DesktopHomePageState extends State<DesktopHomePage> with TrayListener {
@override @override
void dispose() { void dispose() {
trayManager.removeListener(this); trayManager.removeListener(this);
windowManager.removeListener(this);
super.dispose(); 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/get.dart';
import 'package:get/route_manager.dart'; import 'package:get/route_manager.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:window_manager/window_manager.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; break;
} }
} else { } else {
await windowManager.ensureInitialized();
windowManager.setPreventClose(true);
runMainApp(true); runMainApp(true);
} }
} }

View File

@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:ui'; import 'dart:ui';
import 'package:desktop_multi_window/desktop_multi_window.dart'; import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
/// must keep the order /// must keep the order
@ -114,6 +115,31 @@ class RustDeskMultiWindowManager {
Future<dynamic> Function(MethodCall call, int fromWindowId)? handler) { Future<dynamic> Function(MethodCall call, int fromWindowId)? handler) {
DesktopMultiWindow.setMethodHandler(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; final rustDeskWinManager = RustDeskMultiWindowManager.instance;