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;
|
return;
|
||||||
} else if args[0] == "--server" {
|
} else if args[0] == "--server" {
|
||||||
log::info!("start --server");
|
log::info!("start --server");
|
||||||
start_server(true, true);
|
#[cfg(not(target_os = "macos"))]
|
||||||
return;
|
{
|
||||||
|
start_server(true, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
{
|
||||||
|
std::thread::spawn(move || start_server(true, true));
|
||||||
|
}
|
||||||
} else if args[0] == "--import-config" {
|
} else if args[0] == "--import-config" {
|
||||||
if args.len() == 2 {
|
if args.len() == 2 {
|
||||||
hbb_common::config::Config::import(&args[1]);
|
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")]
|
#[cfg(target_os = "macos")]
|
||||||
async fn sync_and_watch_config_dir() {
|
async fn sync_and_watch_config_dir() {
|
||||||
if crate::username() == "root" {
|
if crate::platform::is_root() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
24
src/ui.rs
24
src/ui.rs
@ -38,6 +38,17 @@ struct UI(
|
|||||||
struct UIHostHandler;
|
struct UIHostHandler;
|
||||||
|
|
||||||
pub fn start(args: &mut [String]) {
|
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"))]
|
#[cfg(all(target_os = "linux", feature = "inline"))]
|
||||||
sciter::set_library("/usr/lib/rustdesk/libsciter-gtk.so").ok();
|
sciter::set_library("/usr/lib/rustdesk/libsciter-gtk.so").ok();
|
||||||
// https://github.com/c-smile/sciter-sdk/blob/master/include/sciter-x-types.h
|
// 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)));
|
allow_err!(sciter::set_options(sciter::RuntimeOptions::UxTheming(true)));
|
||||||
frame.set_title(APP_NAME);
|
frame.set_title(APP_NAME);
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
macos::make_menubar(frame.get_host());
|
macos::make_menubar(frame.get_host(), is_index);
|
||||||
let page;
|
let page;
|
||||||
if args.len() > 1 && args[0] == "--play" {
|
if args.len() > 1 && args[0] == "--play" {
|
||||||
args[0] = "--connect".to_owned();
|
args[0] = "--connect".to_owned();
|
||||||
@ -83,7 +94,7 @@ pub fn start(args: &mut [String]) {
|
|||||||
.to_owned();
|
.to_owned();
|
||||||
args[1] = id;
|
args[1] = id;
|
||||||
}
|
}
|
||||||
if args.is_empty() {
|
if is_index {
|
||||||
let childs: Childs = Default::default();
|
let childs: Childs = Default::default();
|
||||||
let cloned = childs.clone();
|
let cloned = childs.clone();
|
||||||
std::thread::spawn(move || check_zombie(cloned));
|
std::thread::spawn(move || check_zombie(cloned));
|
||||||
@ -141,7 +152,14 @@ pub fn start(args: &mut [String]) {
|
|||||||
.unwrap_or("".to_owned()),
|
.unwrap_or("".to_owned()),
|
||||||
page
|
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)]
|
#[cfg(windows)]
|
||||||
|
@ -43,15 +43,6 @@ impl ConnectionManager {
|
|||||||
senders: HashMap::new(),
|
senders: HashMap::new(),
|
||||||
};
|
};
|
||||||
let cm = Self(Arc::new(RwLock::new(inner)));
|
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();
|
let cloned = cm.clone();
|
||||||
std::thread::spawn(move || start_ipc(cloned));
|
std::thread::spawn(move || start_ipc(cloned));
|
||||||
cm
|
cm
|
||||||
|
@ -317,11 +317,6 @@ handler.newMessage = function(id, text) {
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.awake = function() {
|
|
||||||
view.windowState = View.WINDOW_SHOWN;
|
|
||||||
view.focus = self;
|
|
||||||
}
|
|
||||||
|
|
||||||
view << event statechange {
|
view << event statechange {
|
||||||
adjustBorder();
|
adjustBorder();
|
||||||
}
|
}
|
||||||
|
@ -367,3 +367,8 @@ function isReasonableSize(r) {
|
|||||||
return !(x < -3200 || x > 3200 || y < -3200 || y > 3200);
|
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
|
// return false; // can prevent window close
|
||||||
var (x, y, w, h) = view.box(#rectw, #border, #screen);
|
var (x, y, w, h) = view.box(#rectw, #border, #screen);
|
||||||
handler.save_size(x, y, w, h);
|
handler.save_size(x, y, w, h);
|
||||||
|
if (is_osx) {
|
||||||
|
view.windowState = View.WINDOW_HIDDEN;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function self.ready() {
|
function self.ready() {
|
||||||
|
@ -12,11 +12,7 @@ use objc::{
|
|||||||
sel, sel_impl,
|
sel, sel_impl,
|
||||||
};
|
};
|
||||||
use sciter::{make_args, Host};
|
use sciter::{make_args, Host};
|
||||||
use std::{
|
use std::{ffi::c_void, rc::Rc};
|
||||||
ffi::c_void,
|
|
||||||
rc::Rc,
|
|
||||||
sync::{Arc, Mutex},
|
|
||||||
};
|
|
||||||
|
|
||||||
static APP_HANDLER_IVAR: &str = "GoDeskAppHandler";
|
static APP_HANDLER_IVAR: &str = "GoDeskAppHandler";
|
||||||
|
|
||||||
@ -24,10 +20,7 @@ const TERMINATE_TAG: u32 = 0;
|
|||||||
const SHOW_ABOUT_TAG: u32 = 1;
|
const SHOW_ABOUT_TAG: u32 = 1;
|
||||||
const SHOW_SETTINGS_TAG: u32 = 2;
|
const SHOW_SETTINGS_TAG: u32 = 2;
|
||||||
const RUN_ME_TAG: u32 = 3;
|
const RUN_ME_TAG: u32 = 3;
|
||||||
|
const AWAKE: u32 = 4;
|
||||||
lazy_static::lazy_static! {
|
|
||||||
pub static ref SHOULD_OPEN_UNTITLED_FILE_CALLBACK: Arc<Mutex<Option<Box<dyn Fn() + Send>>>> = Default::default();
|
|
||||||
}
|
|
||||||
|
|
||||||
trait AppHandler {
|
trait AppHandler {
|
||||||
fn command(&mut self, cmd: u32);
|
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> {
|
impl AppHandler for Rc<Host> {
|
||||||
fn command(&mut self, cmd: u32) {
|
fn command(&mut self, cmd: u32) {
|
||||||
if cmd == SHOW_ABOUT_TAG {
|
if cmd == SHOW_ABOUT_TAG {
|
||||||
|
let _ = self.call_function("awake", &make_args![]);
|
||||||
let _ = self.call_function("showAbout", &make_args![]);
|
let _ = self.call_function("showAbout", &make_args![]);
|
||||||
} else if cmd == SHOW_SETTINGS_TAG {
|
} else if cmd == SHOW_SETTINGS_TAG {
|
||||||
|
let _ = self.call_function("awake", &make_args![]);
|
||||||
let _ = self.call_function("showSettings", &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(
|
extern "C" fn application_should_handle_open_untitled_file(
|
||||||
_this: &mut Object,
|
this: &mut Object,
|
||||||
_: Sel,
|
_: Sel,
|
||||||
_sender: id,
|
_sender: id,
|
||||||
) -> BOOL {
|
) -> BOOL {
|
||||||
if let Some(callback) = SHOULD_OPEN_UNTITLED_FILE_CALLBACK.lock().unwrap().as_ref() {
|
unsafe {
|
||||||
callback();
|
let inner: *mut c_void = *this.get_ivar(APP_HANDLER_IVAR);
|
||||||
|
let inner = &mut *(inner as *mut DelegateState);
|
||||||
|
(*inner).command(AWAKE);
|
||||||
}
|
}
|
||||||
YES
|
YES
|
||||||
}
|
}
|
||||||
@ -131,7 +144,7 @@ unsafe fn make_menu_item(title: &str, key: &str, tag: u32) -> *mut Object {
|
|||||||
object
|
object
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn make_menubar(host: Rc<Host>) {
|
pub fn make_menubar(host: Rc<Host>, is_index: bool) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let _pool = NSAutoreleasePool::new(nil);
|
let _pool = NSAutoreleasePool::new(nil);
|
||||||
set_delegate(Some(Box::new(host)));
|
set_delegate(Some(Box::new(host)));
|
||||||
@ -140,7 +153,7 @@ pub fn make_menubar(host: Rc<Host>) {
|
|||||||
menubar.addItem_(app_menu_item);
|
menubar.addItem_(app_menu_item);
|
||||||
let app_menu = NSMenu::new(nil).autorelease();
|
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);
|
let new_item = make_menu_item("New Window", "n", RUN_ME_TAG);
|
||||||
app_menu.addItem_(new_item);
|
app_menu.addItem_(new_item);
|
||||||
} else {
|
} else {
|
||||||
@ -155,7 +168,7 @@ pub fn make_menubar(host: Rc<Host>) {
|
|||||||
let separator = NSMenuItem::separatorItem(nil).autorelease();
|
let separator = NSMenuItem::separatorItem(nil).autorelease();
|
||||||
app_menu.addItem_(separator);
|
app_menu.addItem_(separator);
|
||||||
let quit_item = make_menu_item(
|
let quit_item = make_menu_item(
|
||||||
&format!("Quit {}", hbb_common::config::APP_NAME),
|
&format!("Quit {}", crate::get_app_name()),
|
||||||
"q",
|
"q",
|
||||||
TERMINATE_TAG,
|
TERMINATE_TAG,
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user