diff --git a/src/main.rs b/src/main.rs index fdab63353..919e8732d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -84,8 +84,15 @@ fn main() { return; } else if args[0] == "--server" { log::info!("start --server"); - start_server(true, true); - return; + #[cfg(not(target_os = "macos"))] + { + start_server(true, true); + return; + } + #[cfg(target_os = "macos")] + { + std::thread::spawn(move || start_server(true, true)); + } } else if args[0] == "--import-config" { if args.len() == 2 { hbb_common::config::Config::import(&args[1]); diff --git a/src/server.rs b/src/server.rs index 1e00b2c18..a19fe37b6 100644 --- a/src/server.rs +++ b/src/server.rs @@ -329,7 +329,7 @@ pub async fn start_server(is_server: bool, _tray: bool) { #[cfg(target_os = "macos")] async fn sync_and_watch_config_dir() { - if crate::username() == "root" { + if crate::platform::is_root() { return; } diff --git a/src/ui.rs b/src/ui.rs index 75d3b5189..f5eb3fb7c 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -38,6 +38,17 @@ struct UI( struct UIHostHandler; pub fn start(args: &mut [String]) { + let is_server = args.len() == 1 && args[0] == "--server"; + let is_index = args.is_empty() || is_server; + if is_server { + // wait a moment for server's ipc check to avoid sciter crash + std::thread::sleep(std::time::Duration::from_millis(300)); + if crate::platform::is_prelogin() { + loop { + std::thread::sleep(std::time::Duration::from_secs(3)); + } + } + } #[cfg(all(target_os = "linux", feature = "inline"))] sciter::set_library("/usr/lib/rustdesk/libsciter-gtk.so").ok(); // https://github.com/c-smile/sciter-sdk/blob/master/include/sciter-x-types.h @@ -71,7 +82,7 @@ pub fn start(args: &mut [String]) { allow_err!(sciter::set_options(sciter::RuntimeOptions::UxTheming(true))); frame.set_title(APP_NAME); #[cfg(target_os = "macos")] - macos::make_menubar(frame.get_host()); + macos::make_menubar(frame.get_host(), is_index); let page; if args.len() > 1 && args[0] == "--play" { args[0] = "--connect".to_owned(); @@ -83,7 +94,7 @@ pub fn start(args: &mut [String]) { .to_owned(); args[1] = id; } - if args.is_empty() { + if is_index { let childs: Childs = Default::default(); let cloned = childs.clone(); std::thread::spawn(move || check_zombie(cloned)); @@ -141,7 +152,14 @@ pub fn start(args: &mut [String]) { .unwrap_or("".to_owned()), page )); - frame.run_app(); + if is_server { + #[cfg(target_os = "macos")] + macos::ignore_first_time_awake(); + frame.collapse(true); + frame.run_loop(); + } else { + frame.run_app(); + } } #[cfg(windows)] diff --git a/src/ui/cm.rs b/src/ui/cm.rs index 4b787371b..17c0cf34b 100644 --- a/src/ui/cm.rs +++ b/src/ui/cm.rs @@ -43,15 +43,6 @@ impl ConnectionManager { senders: HashMap::new(), }; let cm = Self(Arc::new(RwLock::new(inner))); - #[cfg(target_os = "macos")] - { - let cloned = cm.clone(); - *super::macos::SHOULD_OPEN_UNTITLED_FILE_CALLBACK - .lock() - .unwrap() = Some(Box::new(move || { - cloned.call("awake", &make_args!()); - })); - } let cloned = cm.clone(); std::thread::spawn(move || start_ipc(cloned)); cm diff --git a/src/ui/cm.tis b/src/ui/cm.tis index 1b95e6806..4cf306e50 100644 --- a/src/ui/cm.tis +++ b/src/ui/cm.tis @@ -317,11 +317,6 @@ handler.newMessage = function(id, text) { update(); } -handler.awake = function() { - view.windowState = View.WINDOW_SHOWN; - view.focus = self; -} - view << event statechange { adjustBorder(); } diff --git a/src/ui/common.tis b/src/ui/common.tis index 3ff0cd73c..4f0e699a4 100644 --- a/src/ui/common.tis +++ b/src/ui/common.tis @@ -367,3 +367,8 @@ function isReasonableSize(r) { return !(x < -3200 || x > 3200 || y < -3200 || y > 3200); } +function awake() { + view.windowState = View.WINDOW_SHOWN; + view.focus = self; +} + diff --git a/src/ui/index.tis b/src/ui/index.tis index 32d1f609a..312a85142 100644 --- a/src/ui/index.tis +++ b/src/ui/index.tis @@ -745,6 +745,10 @@ function self.closing() { // return false; // can prevent window close var (x, y, w, h) = view.box(#rectw, #border, #screen); handler.save_size(x, y, w, h); + if (is_osx) { + view.windowState = View.WINDOW_HIDDEN; + return false; + } } function self.ready() { diff --git a/src/ui/macos.rs b/src/ui/macos.rs index cd48a4fc1..411ffba58 100644 --- a/src/ui/macos.rs +++ b/src/ui/macos.rs @@ -12,11 +12,7 @@ use objc::{ sel, sel_impl, }; use sciter::{make_args, Host}; -use std::{ - ffi::c_void, - rc::Rc, - sync::{Arc, Mutex}, -}; +use std::{ffi::c_void, rc::Rc}; static APP_HANDLER_IVAR: &str = "GoDeskAppHandler"; @@ -24,10 +20,7 @@ const TERMINATE_TAG: u32 = 0; const SHOW_ABOUT_TAG: u32 = 1; const SHOW_SETTINGS_TAG: u32 = 2; const RUN_ME_TAG: u32 = 3; - -lazy_static::lazy_static! { - pub static ref SHOULD_OPEN_UNTITLED_FILE_CALLBACK: Arc>>> = Default::default(); -} +const AWAKE: u32 = 4; trait AppHandler { fn command(&mut self, cmd: u32); @@ -49,12 +42,30 @@ impl DelegateState { } } +static mut IGNORE_FIRST_TIME: bool = false; + +pub fn ignore_first_time_awake() { + unsafe { + IGNORE_FIRST_TIME = true; + } +} + impl AppHandler for Rc { fn command(&mut self, cmd: u32) { if cmd == SHOW_ABOUT_TAG { + let _ = self.call_function("awake", &make_args![]); let _ = self.call_function("showAbout", &make_args![]); } else if cmd == SHOW_SETTINGS_TAG { + 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; + } + } + let _ = self.call_function("awake", &make_args![]); } } } @@ -95,12 +106,14 @@ extern "C" fn application_did_finish_launching(_this: &mut Object, _: Sel, _noti } extern "C" fn application_should_handle_open_untitled_file( - _this: &mut Object, + this: &mut Object, _: Sel, _sender: id, ) -> BOOL { - if let Some(callback) = SHOULD_OPEN_UNTITLED_FILE_CALLBACK.lock().unwrap().as_ref() { - callback(); + unsafe { + let inner: *mut c_void = *this.get_ivar(APP_HANDLER_IVAR); + let inner = &mut *(inner as *mut DelegateState); + (*inner).command(AWAKE); } YES } @@ -131,7 +144,7 @@ unsafe fn make_menu_item(title: &str, key: &str, tag: u32) -> *mut Object { object } -pub fn make_menubar(host: Rc) { +pub fn make_menubar(host: Rc, is_index: bool) { unsafe { let _pool = NSAutoreleasePool::new(nil); set_delegate(Some(Box::new(host))); @@ -140,7 +153,7 @@ pub fn make_menubar(host: Rc) { menubar.addItem_(app_menu_item); let app_menu = NSMenu::new(nil).autorelease(); - if std::env::args().len() > 1 { + if !is_index { let new_item = make_menu_item("New Window", "n", RUN_ME_TAG); app_menu.addItem_(new_item); } else { @@ -155,7 +168,7 @@ pub fn make_menubar(host: Rc) { let separator = NSMenuItem::separatorItem(nil).autorelease(); app_menu.addItem_(separator); let quit_item = make_menu_item( - &format!("Quit {}", hbb_common::config::APP_NAME), + &format!("Quit {}", crate::get_app_name()), "q", TERMINATE_TAG, );