diff --git a/src/platform/macos.rs b/src/platform/macos.rs
index 798b2b112..2eab0bc1a 100644
--- a/src/platform/macos.rs
+++ b/src/platform/macos.rs
@@ -131,7 +131,7 @@ pub fn is_installed_daemon(prompt: bool) -> bool {
.arg(daemon_plist_body)
.arg(agent_plist_body)
.arg(&get_active_username())
- .output()
+ .status()
{
Err(e) => {
log::error!("run osascript failed: {}", e);
@@ -148,9 +148,8 @@ pub fn is_installed_daemon(prompt: bool) -> bool {
.unwrap(),
)
.arg(&format!(
- "sleep 0.5; launchctl load -w {}; sleep 0.5; open /Applications/{}.app",
+ "sleep 0.5; launchctl load -w {};",
agent_plist_file,
- crate::get_app_name()
))
.spawn()
.ok();
@@ -177,7 +176,7 @@ pub fn uninstall() -> bool {
.arg("-e")
.arg(script_body)
.arg(&get_active_username())
- .output()
+ .status()
{
Err(e) => {
log::error!("run osascript failed: {}", e);
@@ -401,21 +400,40 @@ pub fn lock_screen() {
}
pub fn start_os_service() {
+ let exe = std::env::current_exe().unwrap_or_default();
+ let tm0 = hbb_common::get_modified_time(&exe);
log::info!("{}", crate::username());
std::thread::spawn(move || loop {
- let exe = std::env::current_exe().unwrap_or_default();
- let tm0 = hbb_common::get_modified_time(&exe);
-
loop {
std::thread::sleep(std::time::Duration::from_millis(300));
- if hbb_common::get_modified_time(&exe) != tm0 {
- log::info!("{:?} updated, will restart", exe);
+ let now = hbb_common::get_modified_time(&exe);
+ if now != tm0 && now != std::time::UNIX_EPOCH {
+ // sleep a while to wait for resources file ready
+ std::thread::sleep(std::time::Duration::from_millis(300));
+ println!("{:?} updated, will restart", exe);
+ // this won't kill myself
std::process::Command::new("pkill")
- .args(&["-f", exe.to_str().unwrap_or("")])
- .output()
+ .args(&["-f", &crate::get_app_name()])
+ .status()
.ok();
- std::process::exit(0); // self not killed by above pkill
+ println!("The others killed");
+ // launchctl load/unload/start agent not work in daemon, show not priviledged.
+ // sudo launchctl asuser 501 open -n also not allowed.
+ std::process::Command::new("launchctl")
+ .args(&[
+ "asuser",
+ &get_active_userid(),
+ "open",
+ "-a",
+ &exe.to_str().unwrap_or(""),
+ "--args",
+ "--server",
+ ])
+ .status()
+ .ok();
+ // if above spawn, we may need sleep for a while here.
+ std::process::exit(0);
}
}
});
@@ -493,10 +511,10 @@ pub fn block_input(_v: bool) -> bool {
pub fn is_installed() -> bool {
if let Ok(p) = std::env::current_exe() {
- return p.to_str().unwrap_or_default().contains(&format!(
- "/Applications/{}.app",
- crate::get_app_name(),
- ));
+ return p
+ .to_str()
+ .unwrap_or_default()
+ .contains(&format!("/Applications/{}.app", crate::get_app_name()));
}
false
}
diff --git a/src/platform/privileges_scripts/com.carriez.RustDesk_service.plist b/src/platform/privileges_scripts/com.carriez.RustDesk_service.plist
index 9502e953a..830938b76 100644
--- a/src/platform/privileges_scripts/com.carriez.RustDesk_service.plist
+++ b/src/platform/privileges_scripts/com.carriez.RustDesk_service.plist
@@ -15,5 +15,9 @@
WorkingDirectory
/Applications/RustDesk.app/Contents/MacOS/
+ StandardErrorPath
+ /tmp/rustdesk_service.err
+ StandardOutPath
+ /tmp/rustdesk_service.out
diff --git a/src/platform/privileges_scripts/uninstall.scpt b/src/platform/privileges_scripts/uninstall.scpt
index e6414c814..3d91e61f9 100644
--- a/src/platform/privileges_scripts/uninstall.scpt
+++ b/src/platform/privileges_scripts/uninstall.scpt
@@ -3,7 +3,4 @@ set sh2 to "/bin/rm /Library/LaunchDaemons/com.carriez.RustDesk_service.plist;"
set sh3 to "/bin/rm /Library/LaunchAgents/com.carriez.RustDesk_server.plist;"
set sh to sh1 & sh2 & sh3
-do shell script sh with prompt "RustDesk want to unload daemon" with administrator privileges
-
-set sh5 to "[ ! -f /Library/LaunchAgents/com.carriez.RustDesk_server.plist ] && launchctl remove com.carriez.RustDesk_server && sleep 1 && open /Applications/RustDesk.app"
-do shell script sh5
+do shell script sh with prompt "RustDesk want to unload daemon" with administrator privileges
\ No newline at end of file
diff --git a/src/server.rs b/src/server.rs
index a19fe37b6..a1108ff1c 100644
--- a/src/server.rs
+++ b/src/server.rs
@@ -333,36 +333,41 @@ async fn sync_and_watch_config_dir() {
return;
}
- for i in 1..=6 {
+ let mut cfg0 = (Config::get(), Config2::get());
+ let mut synced = false;
+ for i in 1..=30 {
sleep(i as f32 * 0.3).await;
match crate::ipc::connect(1000, "_service").await {
Ok(mut conn) => {
- if conn.send(&Data::SyncConfig(None)).await.is_ok() {
- if let Ok(Some(data)) = conn.next_timeout(1000).await {
- match data {
- Data::SyncConfig(Some((config, config2))) => {
- let _chk = crate::ipc::CheckIfRestart::new();
- Config::set(config);
- Config2::set(config2);
- log::info!("sync config from root");
- }
- _ => {}
+ if !synced {
+ if conn.send(&Data::SyncConfig(None)).await.is_ok() {
+ if let Ok(Some(data)) = conn.next_timeout(1000).await {
+ match data {
+ Data::SyncConfig(Some((config, config2))) => {
+ let _chk = crate::ipc::CheckIfRestart::new();
+ Config::set(config);
+ Config2::set(config2);
+ log::info!("sync config from root");
+ synced = true;
+ }
+ _ => {}
+ };
};
- };
+ }
}
- let mut cfg0 = (Config::get(), Config2::get());
loop {
sleep(0.3).await;
let cfg = (Config::get(), Config2::get());
if cfg != cfg0 {
- cfg0 = cfg;
log::info!("config updated, sync to root");
match conn.send(&Data::SyncConfig(Some(cfg0.clone()))).await {
Err(e) => {
log::error!("sync config to root failed: {}", e);
+ break;
}
_ => {
+ cfg0 = cfg;
conn.next_timeout(1000).await.ok();
}
}
diff --git a/src/ui.rs b/src/ui.rs
index f5eb3fb7c..ade1fa6d8 100644
--- a/src/ui.rs
+++ b/src/ui.rs
@@ -153,8 +153,6 @@ pub fn start(args: &mut [String]) {
page
));
if is_server {
- #[cfg(target_os = "macos")]
- macos::ignore_first_time_awake();
frame.collapse(true);
frame.run_loop();
} else {
diff --git a/src/ui/macos.rs b/src/ui/macos.rs
index 411ffba58..73a4cfeda 100644
--- a/src/ui/macos.rs
+++ b/src/ui/macos.rs
@@ -42,12 +42,8 @@ impl DelegateState {
}
}
-static mut IGNORE_FIRST_TIME: bool = false;
-
-pub fn ignore_first_time_awake() {
- unsafe {
- IGNORE_FIRST_TIME = true;
- }
+lazy_static::lazy_static! {
+ static ref START_TM: std::sync::Mutex = std::sync::Mutex::new(std::time::Instant::now());
}
impl AppHandler for Rc {
@@ -59,11 +55,9 @@ impl AppHandler for Rc {
let _ = self.call_function("awake", &make_args![]);
let _ = self.call_function("showSettings", &make_args![]);
} else if cmd == AWAKE {
- unsafe {
- if IGNORE_FIRST_TIME {
- IGNORE_FIRST_TIME = false;
- return;
- }
+ if START_TM.lock().unwrap().elapsed().as_millis() < 1000 {
+ hbb_common::log::debug!("First click on docker icon {:?}", START_TM.lock().unwrap().elapsed());
+ return;
}
let _ = self.call_function("awake", &make_args![]);
}
@@ -72,6 +66,7 @@ impl AppHandler for Rc {
// https://github.com/xi-editor/druid/blob/master/druid-shell/src/platform/mac/application.rs
unsafe fn set_delegate(handler: Option>) {
+ *START_TM.lock().unwrap() = std::time::Instant::now();
let mut decl =
ClassDecl::new("AppDelegate", class!(NSObject)).expect("App Delegate definition failed");
decl.add_ivar::<*mut c_void>(APP_HANDLER_IVAR);