From 7fba1800ec5e5770addb7d3089b983b1a40585be Mon Sep 17 00:00:00 2001 From: rustdesk Date: Sat, 10 Jun 2023 18:24:03 +0800 Subject: [PATCH] fix linux uni (url) and tray exit --- flutter/lib/common.dart | 1 + flutter/lib/models/model.dart | 39 ++++++++++++++--------------------- src/core_main.rs | 37 +++++++++++++++++++++------------ src/platform/linux.rs | 2 +- src/platform/windows.rs | 2 +- src/server/dbus.rs | 5 +++-- src/tray.rs | 10 ++++++--- 7 files changed, 52 insertions(+), 44 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 102ee6e66..9247a87c6 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -549,6 +549,7 @@ void window_on_top(int? id) { return; } if (id == null) { + print("Bring window on top"); // main window windowManager.restore(); windowManager.show(); diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 8043d5287..b78001a3f 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -198,11 +198,6 @@ class FfiModel with ChangeNotifier { updateBlockInputState(evt, peerId); } else if (name == 'update_privacy_mode') { updatePrivacyMode(evt, sessionId, peerId); - } else if (name == 'new_connection') { - var uni_links = evt['uni_links'].toString(); - if (uni_links.startsWith(kUniLinksPrefix)) { - parseRustdeskUri(uni_links); - } } else if (name == 'alias') { handleAliasChanged(evt); } else if (name == 'show_elevation') { @@ -217,6 +212,7 @@ class FfiModel with ChangeNotifier { } else if (name == 'portable_service_running') { parent.target?.elevationModel.onPortableServiceRunning(evt); } else if (name == 'on_url_scheme_received') { + // currently comes from "_url" ipc of mac and dbus of linux onUrlSchemeReceived(evt); } else if (name == 'on_voice_call_waiting') { // Waiting for the response from the peer. @@ -252,25 +248,20 @@ class FfiModel with ChangeNotifier { onUrlSchemeReceived(Map 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; - } + if (url.startsWith(kUniLinksPrefix) && parseRustdeskUri(url)) { + return; + } + switch (url) { + case kUrlActionClose: + debugPrint("closing all instances"); + Future.microtask(() async { + await rustDeskWinManager.closeAllSubWindows(); + windowManager.close(); + }); + break; + default: + window_on_top(null); + break; } } diff --git a/src/core_main.rs b/src/core_main.rs index 6aa7d7db7..aa9069bbf 100644 --- a/src/core_main.rs +++ b/src/core_main.rs @@ -94,6 +94,13 @@ pub fn core_main() -> Option> { } } hbb_common::init_log(false, &log_name); + + // linux uni (url) go here. + #[cfg(all(target_os = "linux", feature = "flutter"))] + if args.len() > 0 && args[0].starts_with("rustdesk:") { + return try_send_by_dbus(args[0].clone()); + } + #[cfg(windows)] if !crate::platform::is_installed() && args.is_empty() @@ -343,20 +350,8 @@ fn core_main_invoke_new_connection(mut args: std::env::Args) -> Option { - return None; - } - Err(err) => { - log::error!("{}", err.as_ref()); - // return Some to invoke this new connection by self - return Some(Vec::new()); - } - } - } #[cfg(windows)] { use winapi::um::winuser::WM_USER; @@ -378,3 +373,19 @@ fn core_main_invoke_new_connection(mut args: std::env::Args) -> Option Option> { + use crate::dbus::invoke_new_connection; + + match invoke_new_connection(uni_links) { + Ok(()) => { + return None; + } + Err(err) => { + log::error!("{}", err.as_ref()); + // return Some to invoke this url by self + return Some(Vec::new()); + } + } +} diff --git a/src/platform/linux.rs b/src/platform/linux.rs index fa8acef48..acd23b4ed 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -1145,7 +1145,7 @@ pub fn uninstall_service(show_new_window: bool) -> bool { if show_new_window { run_me_with(2); } - true + std::process::exit(0); } pub fn install_service() -> bool { diff --git a/src/platform/windows.rs b/src/platform/windows.rs index 0ca1d4d73..df783b781 100644 --- a/src/platform/windows.rs +++ b/src/platform/windows.rs @@ -2171,7 +2171,7 @@ pub fn uninstall_service(show_new_window: bool) -> bool { return true; } run_after_run_cmds(!show_new_window); - true + std::process::exit(0); } pub fn install_service() -> bool { diff --git a/src/server/dbus.rs b/src/server/dbus.rs index b01b11c9d..8eb44472c 100644 --- a/src/server/dbus.rs +++ b/src/server/dbus.rs @@ -36,6 +36,7 @@ impl Error for DbusError {} /// - use dbus-send command: /// `dbus-send --session --print-reply --dest=org.rustdesk.rustdesk /dbus org.rustdesk.rustdesk.NewConnection string:'PEER_ID'` pub fn invoke_new_connection(uni_links: String) -> Result<(), Box> { + log::info!("Starting dbus service for uni"); let conn = Connection::new_session()?; let proxy = conn.with_proxy(DBUS_NAME, DBUS_PREFIX, DBUS_TIMEOUT); let (ret,): (String,) = @@ -73,8 +74,8 @@ fn handle_client_message(builder: &mut IfaceBuilder<()>) { { use crate::flutter; let data = HashMap::from([ - ("name", "new_connection"), - ("uni_links", _uni_links.as_str()), + ("name", "on_url_scheme_received"), + ("url", _uni_links.as_str()), ]); let event = serde_json::ser::to_string(&data).unwrap_or("".to_string()); match crate::flutter::push_global_event(flutter::APP_TYPE_MAIN, event) { diff --git a/src/tray.rs b/src/tray.rs index 2aa3a85e5..8e14eddb0 100644 --- a/src/tray.rs +++ b/src/tray.rs @@ -74,9 +74,14 @@ pub fn make_tray() -> hbb_common::ResultType<()> { .spawn() .ok(); } - // xdg-open? #[cfg(target_os = "linux")] - crate::run_me::<&str>(vec![]).ok(); + if !std::process::Command::new("xdg-open") + .arg("rustdesk://") + .spawn() + .is_ok() + { + crate::run_me::<&str>(vec![]).ok(); + } }; event_loop.run(move |_event, _, control_flow| { @@ -92,7 +97,6 @@ pub fn make_tray() -> hbb_common::ResultType<()> { if let Ok(event) = menu_channel.try_recv() { if event.id == quit_i.id() { crate::platform::uninstall_service(false); - *control_flow = ControlFlow::Exit; } else if event.id == open_i.id() { open_func(); }