fix: multi window close issue
This commit is contained in:
parent
6638cd2a4a
commit
5a953cc8df
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user