fix linux uni (url) and tray exit

This commit is contained in:
rustdesk 2023-06-10 18:24:03 +08:00
parent 9799758c96
commit 7fba1800ec
7 changed files with 52 additions and 44 deletions

View File

@ -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();

View File

@ -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<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;
}
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;
}
}

View File

@ -94,6 +94,13 @@ pub fn core_main() -> Option<Vec<String>> {
}
}
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<Vec<Strin
);
#[cfg(target_os = "linux")]
{
use crate::dbus::invoke_new_connection;
return try_send_by_dbus(uni_links);
match invoke_new_connection(uni_links) {
Ok(()) => {
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<Vec<Strin
};
}
}
#[cfg(all(target_os = "linux", feature = "flutter"))]
fn try_send_by_dbus(uni_links: String) -> Option<Vec<String>> {
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());
}
}
}

View File

@ -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 {

View File

@ -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 {

View File

@ -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<dyn Error>> {
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) {

View File

@ -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();
}