Merge pull request #4258 from Kingtous/feat/plugins
opt: close main window when exit from tray on macOS
This commit is contained in:
		
						commit
						595d2ee0ee
					
				| @ -31,6 +31,7 @@ const String kWindowEventShow = "show"; | ||||
| const String kWindowConnect = "connect"; | ||||
| 
 | ||||
| const String kUniLinksPrefix = "rustdesk://"; | ||||
| const String kUrlActionClose = "close"; | ||||
| 
 | ||||
| const String kTabLabelHomePage = "Home"; | ||||
| const String kTabLabelSettingPage = "Settings"; | ||||
|  | ||||
| @ -20,11 +20,13 @@ import 'package:flutter_hbb/plugin/event.dart'; | ||||
| import 'package:flutter_hbb/plugin/desc.dart'; | ||||
| import 'package:flutter_hbb/plugin/widget.dart'; | ||||
| import 'package:flutter_hbb/common/shared_state.dart'; | ||||
| import 'package:flutter_hbb/utils/multi_window_manager.dart'; | ||||
| import 'package:tuple/tuple.dart'; | ||||
| import 'package:image/image.dart' as img2; | ||||
| import 'package:flutter_custom_cursor/cursor_manager.dart'; | ||||
| import 'package:flutter_svg/flutter_svg.dart'; | ||||
| import 'package:get/get.dart'; | ||||
| import 'package:window_manager/window_manager.dart'; | ||||
| 
 | ||||
| import '../common.dart'; | ||||
| import '../utils/image.dart' as img; | ||||
| @ -210,13 +212,7 @@ class FfiModel with ChangeNotifier { | ||||
|       } else if (name == 'portable_service_running') { | ||||
|         parent.target?.elevationModel.onPortableServiceRunning(evt); | ||||
|       } else if (name == 'on_url_scheme_received') { | ||||
|         final url = evt['url'].toString(); | ||||
|         // If we invoke uri with blank path, we just bring the main window to the top. | ||||
|         if (url.isEmpty) { | ||||
|           window_on_top(null); | ||||
|         } else { | ||||
|           parseRustdeskUri(url); | ||||
|         } | ||||
|         onUrlSchemeReceived(evt); | ||||
|       } else if (name == 'on_voice_call_waiting') { | ||||
|         // Waiting for the response from the peer. | ||||
|         parent.target?.chatModel.onVoiceCallWaiting(); | ||||
| @ -249,6 +245,30 @@ class FfiModel with ChangeNotifier { | ||||
|     }; | ||||
|   } | ||||
| 
 | ||||
|   onUrlSchemeReceived(Map<String, dynamic> evt) { | ||||
|     final url = evt['url'].toString().trim(); | ||||
|     // If we invoke uri with blank path, we just bring the main window to the top. | ||||
|     if (url.isEmpty) { | ||||
|       window_on_top(null); | ||||
|     } else if (url.startsWith(kUniLinksPrefix)) { | ||||
|       parseRustdeskUri(url); | ||||
|     } else { | ||||
|       // action | ||||
|       switch (url) { | ||||
|         case kUrlActionClose: | ||||
|           debugPrint("closing all instances"); | ||||
|           Future.microtask(() async { | ||||
|             await rustDeskWinManager.closeAllSubWindows(); | ||||
|             windowManager.close(); | ||||
|           }); | ||||
|           break; | ||||
|         default: | ||||
|           debugPrint("Unknown url received: $url"); | ||||
|           break; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /// Bind the event listener to receive events from the Rust core. | ||||
|   updateEventListener(String peerId) { | ||||
|     platformFFI.setEventCallback(startEventListener(peerId)); | ||||
|  | ||||
| @ -218,6 +218,8 @@ class RustDeskMultiWindowManager { | ||||
|         } | ||||
|         await WindowController.fromWindowId(wId).setPreventClose(false); | ||||
|         await WindowController.fromWindowId(wId).close(); | ||||
|         // unregister the sub window in the main window. | ||||
|         unregisterActiveWindow(wId); | ||||
|       } catch (e) { | ||||
|         debugPrint("$e"); | ||||
|         return; | ||||
|  | ||||
							
								
								
									
										10
									
								
								src/ipc.rs
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/ipc.rs
									
									
									
									
									
								
							| @ -36,6 +36,8 @@ pub enum PrivacyModeState { | ||||
|     OffByPeer, | ||||
|     OffUnknown, | ||||
| } | ||||
| // IPC actions here.
 | ||||
| pub const IPC_ACTION_CLOSE: &str = "close"; | ||||
| 
 | ||||
| #[derive(Debug, Serialize, Deserialize, Clone)] | ||||
| #[serde(tag = "t", content = "c")] | ||||
| @ -871,6 +873,14 @@ pub async fn send_url_scheme(url: String) -> ResultType<()> { | ||||
|     Ok(()) | ||||
| } | ||||
| 
 | ||||
| // Emit `close` events to ipc.
 | ||||
| pub fn close_all_instances() -> ResultType<bool> { | ||||
|     match crate::ipc::send_url_scheme(IPC_ACTION_CLOSE.to_owned()) { | ||||
|         Ok(_) => Ok(true), | ||||
|         Err(err) => Err(err), | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod test { | ||||
|     use super::*; | ||||
|  | ||||
| @ -211,6 +211,7 @@ pub fn uninstall(show_new_window: bool) -> bool { | ||||
|                 ); | ||||
|                 if uninstalled { | ||||
|                     crate::ipc::set_option("stop-service", "Y"); | ||||
|                     let _ = crate::ipc::close_all_instances(); | ||||
|                     // leave ipc a little time
 | ||||
|                     std::thread::sleep(std::time::Duration::from_millis(300)); | ||||
|                     std::process::Command::new("launchctl") | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user