improve mac service
This commit is contained in:
		
							parent
							
								
									33c6095eca
								
							
						
					
					
						commit
						bbe902d92e
					
				
							
								
								
									
										11
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								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]); | ||||
|  | ||||
| @ -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; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										24
									
								
								src/ui.rs
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								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)] | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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(); | ||||
| } | ||||
|  | ||||
| @ -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; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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() { | ||||
|  | ||||
| @ -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<Mutex<Option<Box<dyn Fn() + Send>>>> = 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<Host> { | ||||
|     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<Host>) { | ||||
| pub fn make_menubar(host: Rc<Host>, 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<Host>) { | ||||
|         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<Host>) { | ||||
|         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, | ||||
|         ); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user