| 
									
										
										
										
											2023-02-07 01:31:11 +08:00
										 |  |  | import 'dart:async'; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  | import 'dart:convert'; | 
					
						
							| 
									
										
										
										
											2022-11-05 23:41:22 +08:00
										 |  |  | import 'dart:io'; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-03 17:08:40 +08:00
										 |  |  | import 'package:bot_toast/bot_toast.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-18 17:25:47 +08:00
										 |  |  | import 'package:desktop_multi_window/desktop_multi_window.dart'; | 
					
						
							| 
									
										
										
										
											2020-11-06 18:04:04 +08:00
										 |  |  | import 'package:flutter/material.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-11 16:03:04 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart'; | 
					
						
							| 
									
										
										
										
											2022-10-09 20:32:28 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/pages/install_page.dart'; | 
					
						
							| 
									
										
										
										
											2023-02-03 17:08:40 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/pages/server_page.dart'; | 
					
						
							| 
									
										
										
										
											2022-06-17 22:57:41 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/screen/desktop_file_transfer_screen.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-26 11:35:28 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/screen/desktop_port_forward_screen.dart'; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/screen/desktop_remote_screen.dart'; | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/widgets/refresh_wrapper.dart'; | 
					
						
							| 
									
										
										
										
											2023-02-03 17:08:40 +08:00
										 |  |  | import 'package:flutter_hbb/models/state_model.dart'; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  | import 'package:flutter_hbb/utils/multi_window_manager.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-19 15:46:09 +08:00
										 |  |  | import 'package:flutter_localizations/flutter_localizations.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-29 16:47:24 +08:00
										 |  |  | import 'package:get/get.dart'; | 
					
						
							| 
									
										
										
										
											2020-11-15 20:04:05 +08:00
										 |  |  | import 'package:provider/provider.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 13:39:30 +08:00
										 |  |  | import 'package:window_manager/window_manager.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-27 14:29:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-27 09:48:35 +08:00
										 |  |  | // import 'package:window_manager/window_manager.dart';
 | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-07 22:54:34 +08:00
										 |  |  | import 'common.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  | import 'consts.dart'; | 
					
						
							| 
									
										
										
										
											2022-05-24 23:33:00 +08:00
										 |  |  | import 'mobile/pages/home_page.dart'; | 
					
						
							|  |  |  | import 'mobile/pages/server_page.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 13:50:26 +08:00
										 |  |  | import 'models/platform_model.dart'; | 
					
						
							| 
									
										
										
										
											2022-02-02 17:25:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  | /// Basic window and launch properties.
 | 
					
						
							|  |  |  | int? kWindowId; | 
					
						
							|  |  |  | WindowType? kWindowType; | 
					
						
							|  |  |  | late List<String> kBootArgs; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 01:31:11 +08:00
										 |  |  | /// Uni links.
 | 
					
						
							|  |  |  | StreamSubscription? _uniLinkSubscription; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-16 17:14:32 +08:00
										 |  |  | Future<void> main(List<String> args) async { | 
					
						
							| 
									
										
										
										
											2020-11-29 14:00:59 +08:00
										 |  |  |   WidgetsFlutterBinding.ensureInitialized(); | 
					
						
							| 
									
										
										
										
											2022-09-16 17:14:32 +08:00
										 |  |  |   debugPrint("launch args: $args"); | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |   kBootArgs = List.from(args); | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (!isDesktop) { | 
					
						
							| 
									
										
										
										
											2022-08-23 14:12:30 +08:00
										 |  |  |     runMobileApp(); | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-05-31 12:09:47 +08:00
										 |  |  |   // main window
 | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  |   if (args.isNotEmpty && args.first == 'multi_window') { | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |     kWindowId = int.parse(args[1]); | 
					
						
							|  |  |  |     stateGlobal.setWindowId(kWindowId!); | 
					
						
							| 
									
										
										
										
											2022-11-22 23:01:42 +08:00
										 |  |  |     if (!Platform.isMacOS) { | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |       WindowController.fromWindowId(kWindowId!).showTitleBar(false); | 
					
						
							| 
									
										
										
										
											2022-11-22 23:01:42 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  |     final argument = args[2].isEmpty | 
					
						
							| 
									
										
										
										
											2022-09-16 17:14:32 +08:00
										 |  |  |         ? <String, dynamic>{} | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  |         : jsonDecode(args[2]) as Map<String, dynamic>; | 
					
						
							|  |  |  |     int type = argument['type'] ?? -1; | 
					
						
							| 
									
										
										
										
											2022-11-01 17:01:43 +08:00
										 |  |  |     // to-do: No need to parse window id ?
 | 
					
						
							|  |  |  |     // Because stateGlobal.windowId is a global value.
 | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |     argument['windowId'] = kWindowId; | 
					
						
							|  |  |  |     kWindowType = type.windowType; | 
					
						
							|  |  |  |     final windowName = getWindowName(); | 
					
						
							|  |  |  |     switch (kWindowType) { | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  |       case WindowType.RemoteDesktop: | 
					
						
							| 
									
										
										
										
											2022-09-05 16:01:53 +08:00
										 |  |  |         desktopType = DesktopType.remote; | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |         runMultiWindow( | 
					
						
							|  |  |  |           argument, | 
					
						
							|  |  |  |           kAppTypeDesktopRemote, | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |           windowName, | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2022-06-17 22:57:41 +08:00
										 |  |  |       case WindowType.FileTransfer: | 
					
						
							| 
									
										
										
										
											2022-09-05 16:01:53 +08:00
										 |  |  |         desktopType = DesktopType.fileTransfer; | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |         runMultiWindow( | 
					
						
							|  |  |  |           argument, | 
					
						
							|  |  |  |           kAppTypeDesktopFileTransfer, | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |           windowName, | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-06-17 22:57:41 +08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2022-08-26 11:35:28 +08:00
										 |  |  |       case WindowType.PortForward: | 
					
						
							| 
									
										
										
										
											2022-09-08 17:22:24 +08:00
										 |  |  |         desktopType = DesktopType.portForward; | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |         runMultiWindow( | 
					
						
							|  |  |  |           argument, | 
					
						
							|  |  |  |           kAppTypeDesktopPortForward, | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |           windowName, | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-08-26 11:35:28 +08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  |       default: | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-08-11 18:59:26 +08:00
										 |  |  |   } else if (args.isNotEmpty && args.first == '--cm') { | 
					
						
							| 
									
										
										
										
											2022-09-16 17:14:32 +08:00
										 |  |  |     debugPrint("--cm started"); | 
					
						
							| 
									
										
										
										
											2022-09-05 16:01:53 +08:00
										 |  |  |     desktopType = DesktopType.cm; | 
					
						
							| 
									
										
										
										
											2022-08-11 18:59:26 +08:00
										 |  |  |     await windowManager.ensureInitialized(); | 
					
						
							| 
									
										
										
										
											2022-11-23 09:41:05 +08:00
										 |  |  |     runConnectionManagerScreen(args.contains('--hide')); | 
					
						
							| 
									
										
										
										
											2022-10-09 20:32:28 +08:00
										 |  |  |   } else if (args.contains('--install')) { | 
					
						
							|  |  |  |     runInstallPage(); | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2022-09-05 16:01:53 +08:00
										 |  |  |     desktopType = DesktopType.main; | 
					
						
							| 
									
										
										
										
											2022-08-09 13:39:30 +08:00
										 |  |  |     await windowManager.ensureInitialized(); | 
					
						
							|  |  |  |     windowManager.setPreventClose(true); | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  |     runMainApp(true); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Future<void> initEnv(String appType) async { | 
					
						
							| 
									
										
										
										
											2022-09-16 12:14:03 +08:00
										 |  |  |   // global shared preference
 | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  |   await platformFFI.init(appType); | 
					
						
							|  |  |  |   // global FFI, use this **ONLY** for global configuration
 | 
					
						
							|  |  |  |   // for convenience, use global FFI on mobile platform
 | 
					
						
							|  |  |  |   // focus on multi-ffi on desktop first
 | 
					
						
							|  |  |  |   await initGlobalFFI(); | 
					
						
							|  |  |  |   // await Firebase.initializeApp();
 | 
					
						
							| 
									
										
										
										
											2022-09-08 08:52:56 +08:00
										 |  |  |   _registerEventHandler(); | 
					
						
							| 
									
										
										
										
											2023-02-02 13:57:20 +08:00
										 |  |  |   // Update the system theme.
 | 
					
						
							|  |  |  |   updateSystemWindowTheme(); | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void runMainApp(bool startService) async { | 
					
						
							| 
									
										
										
										
											2022-10-18 10:29:33 +08:00
										 |  |  |   // register uni links
 | 
					
						
							| 
									
										
										
										
											2022-08-30 20:48:03 +08:00
										 |  |  |   await initEnv(kAppTypeMain); | 
					
						
							| 
									
										
										
										
											2022-08-30 16:50:25 +08:00
										 |  |  |   // trigger connection status updater
 | 
					
						
							|  |  |  |   await bind.mainCheckConnectStatus(); | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  |   if (startService) { | 
					
						
							| 
									
										
										
										
											2022-06-27 09:48:35 +08:00
										 |  |  |     // await windowManager.ensureInitialized();
 | 
					
						
							| 
									
										
										
										
											2022-06-13 21:07:26 +08:00
										 |  |  |     gFFI.serverModel.startService(); | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-12-11 21:40:35 +08:00
										 |  |  |   gFFI.userModel.refreshCurrentUser(); | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  |   runApp(App()); | 
					
						
							| 
									
										
										
										
											2023-02-01 14:03:55 +08:00
										 |  |  |   // Set window option.
 | 
					
						
							| 
									
										
										
										
											2022-09-16 12:14:03 +08:00
										 |  |  |   WindowOptions windowOptions = getHiddenTitleBarWindowOptions(); | 
					
						
							| 
									
										
										
										
											2022-08-30 20:48:03 +08:00
										 |  |  |   windowManager.waitUntilReadyToShow(windowOptions, () async { | 
					
						
							| 
									
										
										
										
											2023-02-01 14:03:55 +08:00
										 |  |  |     // Restore the location of the main window before window hide or show.
 | 
					
						
							|  |  |  |     await restoreWindowPosition(WindowType.Main); | 
					
						
							|  |  |  |     // Check the startup argument, if we successfully handle the argument, we keep the main window hidden.
 | 
					
						
							| 
									
										
										
										
											2023-02-03 18:52:22 +08:00
										 |  |  |     final handledByUniLinks = await initUniLinks(); | 
					
						
							|  |  |  |     final handledByCli = checkArguments(); | 
					
						
							|  |  |  |     debugPrint( | 
					
						
							|  |  |  |         "handled by uni links: $handledByUniLinks, handled by cli: $handledByCli"); | 
					
						
							|  |  |  |     if (handledByUniLinks || handledByCli) { | 
					
						
							| 
									
										
										
										
											2023-02-01 14:03:55 +08:00
										 |  |  |       windowManager.hide(); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       windowManager.show(); | 
					
						
							|  |  |  |       windowManager.focus(); | 
					
						
							|  |  |  |       // Move registration of active main window here to prevent from async visible check.
 | 
					
						
							|  |  |  |       rustDeskWinManager.registerActiveWindow(kWindowMainId); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-11-26 11:40:13 +08:00
										 |  |  |     windowManager.setOpacity(1); | 
					
						
							| 
									
										
										
										
											2023-02-03 17:08:40 +08:00
										 |  |  |     windowManager.setTitle(getWindowName()); | 
					
						
							| 
									
										
										
										
											2022-08-30 20:48:03 +08:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-23 14:12:30 +08:00
										 |  |  | void runMobileApp() async { | 
					
						
							|  |  |  |   await initEnv(kAppTypeMain); | 
					
						
							|  |  |  |   if (isAndroid) androidChannelInit(); | 
					
						
							| 
									
										
										
										
											2023-03-01 00:05:06 +09:00
										 |  |  |   platformFFI.syncAndroidServiceAppDirConfigPath(); | 
					
						
							| 
									
										
										
										
											2022-08-23 14:12:30 +08:00
										 |  |  |   runApp(App()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  | void runMultiWindow( | 
					
						
							|  |  |  |   Map<String, dynamic> argument, | 
					
						
							|  |  |  |   String appType, | 
					
						
							|  |  |  |   String title, | 
					
						
							|  |  |  | ) async { | 
					
						
							|  |  |  |   await initEnv(appType); | 
					
						
							| 
									
										
										
										
											2022-11-06 17:39:19 +08:00
										 |  |  |   // set prevent close to true, we handle close event manually
 | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |   WindowController.fromWindowId(kWindowId!).setPreventClose(true); | 
					
						
							| 
									
										
										
										
											2022-11-05 23:41:22 +08:00
										 |  |  |   late Widget widget; | 
					
						
							|  |  |  |   switch (appType) { | 
					
						
							|  |  |  |     case kAppTypeDesktopRemote: | 
					
						
							|  |  |  |       widget = DesktopRemoteScreen( | 
					
						
							|  |  |  |         params: argument, | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case kAppTypeDesktopFileTransfer: | 
					
						
							|  |  |  |       widget = DesktopFileTransferScreen( | 
					
						
							|  |  |  |         params: argument, | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case kAppTypeDesktopPortForward: | 
					
						
							|  |  |  |       widget = DesktopPortForwardScreen( | 
					
						
							|  |  |  |         params: argument, | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       // no such appType
 | 
					
						
							|  |  |  |       exit(0); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |   _runApp( | 
					
						
							|  |  |  |     title, | 
					
						
							| 
									
										
										
										
											2022-11-05 23:41:22 +08:00
										 |  |  |     widget, | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |     MyTheme.currentThemeMode(), | 
					
						
							| 
									
										
										
										
											2022-08-26 11:35:28 +08:00
										 |  |  |   ); | 
					
						
							| 
									
										
										
										
											2022-11-29 23:03:16 +08:00
										 |  |  |   // we do not hide titlebar on win7 because of the frame overflow.
 | 
					
						
							| 
									
										
										
										
											2022-11-30 13:56:02 +08:00
										 |  |  |   if (kUseCompatibleUiMode) { | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |     WindowController.fromWindowId(kWindowId!).showTitleBar(true); | 
					
						
							| 
									
										
										
										
											2022-11-29 23:03:16 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-11-09 15:14:11 +08:00
										 |  |  |   switch (appType) { | 
					
						
							|  |  |  |     case kAppTypeDesktopRemote: | 
					
						
							| 
									
										
										
										
											2022-11-22 23:01:42 +08:00
										 |  |  |       await restoreWindowPosition(WindowType.RemoteDesktop, | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |           windowId: kWindowId!); | 
					
						
							| 
									
										
										
										
											2022-11-09 15:14:11 +08:00
										 |  |  |       break; | 
					
						
							|  |  |  |     case kAppTypeDesktopFileTransfer: | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |       await restoreWindowPosition(WindowType.FileTransfer, | 
					
						
							|  |  |  |           windowId: kWindowId!); | 
					
						
							| 
									
										
										
										
											2022-11-09 15:14:11 +08:00
										 |  |  |       break; | 
					
						
							|  |  |  |     case kAppTypeDesktopPortForward: | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |       await restoreWindowPosition(WindowType.PortForward, windowId: kWindowId!); | 
					
						
							| 
									
										
										
										
											2022-11-09 15:14:11 +08:00
										 |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							| 
									
										
										
										
											2023-02-07 01:35:38 +08:00
										 |  |  |       // no such appType
 | 
					
						
							| 
									
										
										
										
											2022-11-09 15:14:11 +08:00
										 |  |  |       exit(0); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-01-06 20:40:29 -08:00
										 |  |  |   // show window from hidden status
 | 
					
						
							| 
									
										
										
										
											2023-01-23 22:07:50 +08:00
										 |  |  |   WindowController.fromWindowId(kWindowId!).show(); | 
					
						
							| 
									
										
										
										
											2022-08-26 11:35:28 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-23 09:41:05 +08:00
										 |  |  | void runConnectionManagerScreen(bool hide) async { | 
					
						
							| 
									
										
										
										
											2023-02-04 11:23:36 +08:00
										 |  |  |   await initEnv(kAppTypeConnectionManager); | 
					
						
							| 
									
										
										
										
											2023-02-07 19:33:58 +08:00
										 |  |  |   await bind.cmStartListenIpcThread(); | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |   _runApp( | 
					
						
							|  |  |  |     '', | 
					
						
							|  |  |  |     const DesktopServerPage(), | 
					
						
							|  |  |  |     MyTheme.currentThemeMode(), | 
					
						
							|  |  |  |   ); | 
					
						
							| 
									
										
										
										
											2022-11-23 09:41:05 +08:00
										 |  |  |   if (hide) { | 
					
						
							|  |  |  |     hideCmWindow(); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     showCmWindow(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-02-07 01:31:11 +08:00
										 |  |  |   // Start the uni links handler and redirect links to Native, not for Flutter.
 | 
					
						
							|  |  |  |   _uniLinkSubscription = listenUniLinks(handleByFlutter: false); | 
					
						
							| 
									
										
										
										
											2022-11-23 09:41:05 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void showCmWindow() { | 
					
						
							|  |  |  |   WindowOptions windowOptions = | 
					
						
							|  |  |  |       getHiddenTitleBarWindowOptions(size: kConnectionManagerWindowSize); | 
					
						
							| 
									
										
										
										
											2022-09-16 16:19:15 +08:00
										 |  |  |   windowManager.waitUntilReadyToShow(windowOptions, () async { | 
					
						
							| 
									
										
										
										
											2023-02-01 17:36:05 +08:00
										 |  |  |     bind.mainHideDocker(); | 
					
						
							| 
									
										
										
										
											2022-10-17 11:53:15 +08:00
										 |  |  |     await windowManager.show(); | 
					
						
							| 
									
										
										
										
											2022-11-05 10:35:56 +08:00
										 |  |  |     await Future.wait([windowManager.focus(), windowManager.setOpacity(1)]); | 
					
						
							| 
									
										
										
										
											2022-10-17 11:53:15 +08:00
										 |  |  |     // ensure initial window size to be changed
 | 
					
						
							| 
									
										
										
										
											2022-11-05 10:35:56 +08:00
										 |  |  |     await windowManager.setSizeAlignment( | 
					
						
							|  |  |  |         kConnectionManagerWindowSize, Alignment.topRight); | 
					
						
							| 
									
										
										
										
											2022-09-19 15:46:09 +08:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2022-08-18 11:07:53 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-23 09:41:05 +08:00
										 |  |  | void hideCmWindow() { | 
					
						
							|  |  |  |   WindowOptions windowOptions = | 
					
						
							|  |  |  |       getHiddenTitleBarWindowOptions(size: kConnectionManagerWindowSize); | 
					
						
							|  |  |  |   windowManager.setOpacity(0); | 
					
						
							|  |  |  |   windowManager.waitUntilReadyToShow(windowOptions, () async { | 
					
						
							| 
									
										
										
										
											2023-02-01 17:36:05 +08:00
										 |  |  |     bind.mainHideDocker(); | 
					
						
							| 
									
										
										
										
											2022-11-23 09:41:05 +08:00
										 |  |  |     await windowManager.hide(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  | void _runApp( | 
					
						
							|  |  |  |   String title, | 
					
						
							|  |  |  |   Widget home, | 
					
						
							|  |  |  |   ThemeMode themeMode, | 
					
						
							|  |  |  | ) { | 
					
						
							|  |  |  |   final botToastBuilder = BotToastInit(); | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  |   runApp(RefreshWrapper( | 
					
						
							|  |  |  |     builder: (context) => GetMaterialApp( | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |       navigatorKey: globalKey, | 
					
						
							|  |  |  |       debugShowCheckedModeBanner: false, | 
					
						
							|  |  |  |       title: title, | 
					
						
							|  |  |  |       theme: MyTheme.lightTheme, | 
					
						
							|  |  |  |       darkTheme: MyTheme.darkTheme, | 
					
						
							|  |  |  |       themeMode: themeMode, | 
					
						
							|  |  |  |       home: home, | 
					
						
							|  |  |  |       localizationsDelegates: const [ | 
					
						
							|  |  |  |         GlobalMaterialLocalizations.delegate, | 
					
						
							|  |  |  |         GlobalWidgetsLocalizations.delegate, | 
					
						
							|  |  |  |         GlobalCupertinoLocalizations.delegate, | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       supportedLocales: supportedLocales, | 
					
						
							|  |  |  |       navigatorObservers: [ | 
					
						
							|  |  |  |         // FirebaseAnalyticsObserver(analytics: analytics),
 | 
					
						
							|  |  |  |         BotToastNavigatorObserver(), | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       builder: (context, child) { | 
					
						
							|  |  |  |         child = _keepScaleBuilder(context, child); | 
					
						
							|  |  |  |         child = botToastBuilder(context, child); | 
					
						
							|  |  |  |         return child; | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ), | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  |   )); | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void runInstallPage() async { | 
					
						
							|  |  |  |   await windowManager.ensureInitialized(); | 
					
						
							|  |  |  |   await initEnv(kAppTypeMain); | 
					
						
							| 
									
										
										
										
											2023-02-27 17:54:18 +08:00
										 |  |  |   _runApp('', const InstallPage(), MyTheme.currentThemeMode()); | 
					
						
							| 
									
										
										
										
											2023-03-01 14:18:46 +08:00
										 |  |  |   WindowOptions windowOptions = | 
					
						
							|  |  |  |       getHiddenTitleBarWindowOptions(size: Size(800, 600), center: true); | 
					
						
							|  |  |  |   windowManager.waitUntilReadyToShow(windowOptions, () async { | 
					
						
							| 
									
										
										
										
											2022-10-09 20:32:28 +08:00
										 |  |  |     windowManager.show(); | 
					
						
							|  |  |  |     windowManager.focus(); | 
					
						
							|  |  |  |     windowManager.setOpacity(1); | 
					
						
							|  |  |  |     windowManager.setAlignment(Alignment.center); // ensure
 | 
					
						
							| 
									
										
										
										
											2023-03-01 14:18:46 +08:00
										 |  |  |     windowManager.setTitle(getWindowName()); | 
					
						
							| 
									
										
										
										
											2022-10-09 20:32:28 +08:00
										 |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-01 14:18:46 +08:00
										 |  |  | WindowOptions getHiddenTitleBarWindowOptions( | 
					
						
							|  |  |  |     {Size? size, bool center = false}) { | 
					
						
							| 
									
										
										
										
											2022-11-29 23:03:16 +08:00
										 |  |  |   var defaultTitleBarStyle = TitleBarStyle.hidden; | 
					
						
							|  |  |  |   // we do not hide titlebar on win7 because of the frame overflow.
 | 
					
						
							| 
									
										
										
										
											2022-11-30 13:56:02 +08:00
										 |  |  |   if (kUseCompatibleUiMode) { | 
					
						
							| 
									
										
										
										
											2022-11-29 23:03:16 +08:00
										 |  |  |     defaultTitleBarStyle = TitleBarStyle.normal; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-08-18 11:07:53 +08:00
										 |  |  |   return WindowOptions( | 
					
						
							|  |  |  |     size: size, | 
					
						
							| 
									
										
										
										
											2023-03-01 14:18:46 +08:00
										 |  |  |     center: center, | 
					
						
							| 
									
										
										
										
											2022-08-18 11:07:53 +08:00
										 |  |  |     backgroundColor: Colors.transparent, | 
					
						
							|  |  |  |     skipTaskbar: false, | 
					
						
							| 
									
										
										
										
											2022-11-29 23:03:16 +08:00
										 |  |  |     titleBarStyle: defaultTitleBarStyle, | 
					
						
							| 
									
										
										
										
											2022-08-18 11:07:53 +08:00
										 |  |  |   ); | 
					
						
							| 
									
										
										
										
											2022-08-11 18:59:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-06 22:34:01 +08:00
										 |  |  | class App extends StatefulWidget { | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   State<App> createState() => _AppState(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _AppState extends State<App> { | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void initState() { | 
					
						
							|  |  |  |     super.initState(); | 
					
						
							|  |  |  |     WidgetsBinding.instance.window.onPlatformBrightnessChanged = () { | 
					
						
							| 
									
										
										
										
											2022-09-21 23:32:59 +08:00
										 |  |  |       final userPreference = MyTheme.getThemeModePreference(); | 
					
						
							|  |  |  |       if (userPreference != ThemeMode.system) return; | 
					
						
							| 
									
										
										
										
											2022-09-06 22:34:01 +08:00
										 |  |  |       WidgetsBinding.instance.handlePlatformBrightnessChanged(); | 
					
						
							| 
									
										
										
										
											2022-09-21 23:32:59 +08:00
										 |  |  |       final systemIsDark = | 
					
						
							|  |  |  |           WidgetsBinding.instance.platformDispatcher.platformBrightness == | 
					
						
							|  |  |  |               Brightness.dark; | 
					
						
							|  |  |  |       final ThemeMode to; | 
					
						
							|  |  |  |       if (systemIsDark) { | 
					
						
							|  |  |  |         to = ThemeMode.dark; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         to = ThemeMode.light; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       Get.changeThemeMode(to); | 
					
						
							| 
									
										
										
										
											2023-02-02 13:57:20 +08:00
										 |  |  |       // Synchronize the window theme of the system.
 | 
					
						
							|  |  |  |       updateSystemWindowTheme(); | 
					
						
							| 
									
										
										
										
											2022-09-21 23:32:59 +08:00
										 |  |  |       if (desktopType == DesktopType.main) { | 
					
						
							|  |  |  |         bind.mainChangeTheme(dark: to.toShortString()); | 
					
						
							| 
									
										
										
										
											2022-09-06 22:34:01 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-06 18:04:04 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-05-23 16:24:56 +08:00
										 |  |  |     // final analytics = FirebaseAnalytics.instance;
 | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |     final botToastBuilder = BotToastInit(); | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  |     return RefreshWrapper(builder: (context) { | 
					
						
							|  |  |  |       return MultiProvider( | 
					
						
							|  |  |  |         providers: [ | 
					
						
							|  |  |  |           // global configuration
 | 
					
						
							|  |  |  |           // use session related FFI when in remote control or file transfer page
 | 
					
						
							|  |  |  |           ChangeNotifierProvider.value(value: gFFI.ffiModel), | 
					
						
							|  |  |  |           ChangeNotifierProvider.value(value: gFFI.imageModel), | 
					
						
							|  |  |  |           ChangeNotifierProvider.value(value: gFFI.cursorModel), | 
					
						
							|  |  |  |           ChangeNotifierProvider.value(value: gFFI.canvasModel), | 
					
						
							| 
									
										
										
										
											2023-02-03 15:07:45 +08:00
										 |  |  |           ChangeNotifierProvider.value(value: gFFI.peerTabModel), | 
					
						
							| 
									
										
										
										
											2022-09-19 15:46:09 +08:00
										 |  |  |         ], | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  |         child: GetMaterialApp( | 
					
						
							|  |  |  |           navigatorKey: globalKey, | 
					
						
							|  |  |  |           debugShowCheckedModeBanner: false, | 
					
						
							|  |  |  |           title: 'RustDesk', | 
					
						
							|  |  |  |           theme: MyTheme.lightTheme, | 
					
						
							|  |  |  |           darkTheme: MyTheme.darkTheme, | 
					
						
							|  |  |  |           themeMode: MyTheme.currentThemeMode(), | 
					
						
							|  |  |  |           home: isDesktop | 
					
						
							|  |  |  |               ? const DesktopTabPage() | 
					
						
							|  |  |  |               : !isAndroid | 
					
						
							|  |  |  |                   ? WebHomePage() | 
					
						
							|  |  |  |                   : HomePage(), | 
					
						
							|  |  |  |           localizationsDelegates: const [ | 
					
						
							|  |  |  |             GlobalMaterialLocalizations.delegate, | 
					
						
							|  |  |  |             GlobalWidgetsLocalizations.delegate, | 
					
						
							|  |  |  |             GlobalCupertinoLocalizations.delegate, | 
					
						
							|  |  |  |           ], | 
					
						
							|  |  |  |           supportedLocales: supportedLocales, | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |           navigatorObservers: [ | 
					
						
							|  |  |  |             // FirebaseAnalyticsObserver(analytics: analytics),
 | 
					
						
							|  |  |  |             BotToastNavigatorObserver(), | 
					
						
							|  |  |  |           ], | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  |           builder: isAndroid | 
					
						
							|  |  |  |               ? (context, child) => AccessibilityListener( | 
					
						
							|  |  |  |                     child: MediaQuery( | 
					
						
							|  |  |  |                       data: MediaQuery.of(context).copyWith( | 
					
						
							|  |  |  |                         textScaleFactor: 1.0, | 
					
						
							|  |  |  |                       ), | 
					
						
							|  |  |  |                       child: child ?? Container(), | 
					
						
							| 
									
										
										
										
											2022-08-28 22:28:19 +08:00
										 |  |  |                     ), | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  |                   ) | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  |               : (context, child) { | 
					
						
							|  |  |  |                   child = _keepScaleBuilder(context, child); | 
					
						
							|  |  |  |                   child = botToastBuilder(context, child); | 
					
						
							|  |  |  |                   return child; | 
					
						
							|  |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  |         ), | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-11-06 18:04:04 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-08-23 19:47:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-02 22:23:23 +08:00
										 |  |  | Widget _keepScaleBuilder(BuildContext context, Widget? child) { | 
					
						
							|  |  |  |   return MediaQuery( | 
					
						
							|  |  |  |     data: MediaQuery.of(context).copyWith( | 
					
						
							|  |  |  |       textScaleFactor: 1.0, | 
					
						
							|  |  |  |     ), | 
					
						
							|  |  |  |     child: child ?? Container(), | 
					
						
							|  |  |  |   ); | 
					
						
							| 
									
										
										
										
											2022-08-23 19:47:56 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-09-08 08:52:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | _registerEventHandler() { | 
					
						
							| 
									
										
										
										
											2022-09-15 16:09:07 +08:00
										 |  |  |   if (isDesktop && desktopType != DesktopType.main) { | 
					
						
							| 
									
										
										
										
											2022-09-11 19:52:38 -07:00
										 |  |  |     platformFFI.registerEventHandler('theme', 'theme', (evt) async { | 
					
						
							| 
									
										
										
										
											2022-09-08 08:52:56 +08:00
										 |  |  |       String? dark = evt['dark']; | 
					
						
							|  |  |  |       if (dark != null) { | 
					
						
							| 
									
										
										
										
											2022-09-21 23:32:59 +08:00
										 |  |  |         MyTheme.changeDarkMode(MyTheme.themeModeFromString(dark)); | 
					
						
							| 
									
										
										
										
											2022-09-08 08:52:56 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2022-09-11 19:52:38 -07:00
										 |  |  |     platformFFI.registerEventHandler('language', 'language', (_) async { | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  |       reloadAllWindows(); | 
					
						
							| 
									
										
										
										
											2022-09-08 08:52:56 +08:00
										 |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |