improve mac service

This commit is contained in:
rustdesk 2022-04-27 19:21:38 +08:00
parent 33c6095eca
commit bbe902d92e
8 changed files with 68 additions and 35 deletions

View File

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

View File

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

View File

@ -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)]

View File

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

View File

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

View File

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

View File

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

View File

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