From 5a953cc8df41d975e3510f24fc9cbd770a96f0ba Mon Sep 17 00:00:00 2001 From: kingtous Date: Tue, 9 Aug 2022 13:39:30 +0800 Subject: [PATCH 1/2] fix: multi window close issue --- .../lib/desktop/pages/desktop_home_page.dart | 23 +++++++++++++++- flutter/lib/main.dart | 3 +++ flutter/lib/utils/multi_window_manager.dart | 26 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index 6854027ee..a8f2e51af 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -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 with TrayListener { +class _DesktopHomePageState extends State 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 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 with TrayListener { @override void dispose() { trayManager.removeListener(this); + windowManager.removeListener(this); super.dispose(); } diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index bceb8fa8a..b11ccb628 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -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 main(List args) async { break; } } else { + await windowManager.ensureInitialized(); + windowManager.setPreventClose(true); runMainApp(true); } } diff --git a/flutter/lib/utils/multi_window_manager.dart b/flutter/lib/utils/multi_window_manager.dart index 4da0dca7f..9b26870c0 100644 --- a/flutter/lib/utils/multi_window_manager.dart +++ b/flutter/lib/utils/multi_window_manager.dart @@ -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 Function(MethodCall call, int fromWindowId)? handler) { DesktopMultiWindow.setMethodHandler(handler); } + + Future closeAllSubWindows() async { + await Future.wait(WindowType.values.map((e) => closeWindows(e))); + } + + Future 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; From fa8514aefeb7a8ac5bc6b70803907a9025c03368 Mon Sep 17 00:00:00 2001 From: Kingtous Date: Tue, 9 Aug 2022 13:50:26 +0800 Subject: [PATCH 2/2] fix: currentTheme Signed-off-by: Kingtous --- flutter/lib/main.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index b11ccb628..168d9e1e3 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -15,10 +15,10 @@ import 'package:window_manager/window_manager.dart'; import 'common.dart'; import 'consts.dart'; -import 'models/platform_model.dart'; import 'mobile/pages/home_page.dart'; import 'mobile/pages/server_page.dart'; import 'mobile/pages/settings_page.dart'; +import 'models/platform_model.dart'; int? windowId; @@ -55,7 +55,7 @@ Future main(List args) async { } ThemeData getCurrentTheme() { - return isDarkTheme() ? MyTheme.darkTheme : MyTheme.darkTheme; + return isDarkTheme() ? MyTheme.darkTheme : MyTheme.lightTheme; } Future initEnv(String appType) async {