fix linux uni (url) and tray exit
This commit is contained in:
parent
9799758c96
commit
7fba1800ec
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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) {
|
||||
|
10
src/tray.rs
10
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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user