feat: add event handler on rust macos
This commit is contained in:
parent
8197f47d1b
commit
3a1b978112
41
Cargo.lock
generated
41
Cargo.lock
generated
@ -1137,7 +1137,7 @@ checksum = "413487ef345ab5cdfbf23e66070741217a701bce70f2f397a54221b4f2b6056a"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"dconf_rs",
|
"dconf_rs",
|
||||||
"detect-desktop-environment",
|
"detect-desktop-environment",
|
||||||
"dirs",
|
"dirs 4.0.0",
|
||||||
"objc",
|
"objc",
|
||||||
"rust-ini",
|
"rust-ini",
|
||||||
"web-sys",
|
"web-sys",
|
||||||
@ -1401,6 +1401,16 @@ dependencies = [
|
|||||||
"dirs-sys-next",
|
"dirs-sys-next",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dirs"
|
||||||
|
version = "2.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if 0.1.10",
|
||||||
|
"dirs-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dirs"
|
name = "dirs"
|
||||||
version = "4.0.0"
|
version = "4.0.0"
|
||||||
@ -1873,6 +1883,19 @@ dependencies = [
|
|||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fruitbasket"
|
||||||
|
version = "0.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "898289b8e0528c84fb9b88f15ac9d5109bcaf23e0e49bb6f64deee0d86b6a351"
|
||||||
|
dependencies = [
|
||||||
|
"dirs 2.0.2",
|
||||||
|
"objc",
|
||||||
|
"objc-foundation",
|
||||||
|
"objc_id",
|
||||||
|
"time 0.1.45",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fuchsia-cprng"
|
name = "fuchsia-cprng"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
@ -3657,6 +3680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
|
checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"malloc_buf",
|
"malloc_buf",
|
||||||
|
"objc_exception",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -3670,6 +3694,15 @@ dependencies = [
|
|||||||
"objc_id",
|
"objc_id",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "objc_exception"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "objc_id"
|
name = "objc_id"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
@ -4655,6 +4688,7 @@ dependencies = [
|
|||||||
"flexi_logger",
|
"flexi_logger",
|
||||||
"flutter_rust_bridge",
|
"flutter_rust_bridge",
|
||||||
"flutter_rust_bridge_codegen",
|
"flutter_rust_bridge_codegen",
|
||||||
|
"fruitbasket",
|
||||||
"glib 0.16.5",
|
"glib 0.16.5",
|
||||||
"gtk",
|
"gtk",
|
||||||
"hbb_common",
|
"hbb_common",
|
||||||
@ -4673,6 +4707,7 @@ dependencies = [
|
|||||||
"mouce",
|
"mouce",
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
"objc",
|
"objc",
|
||||||
|
"objc_id",
|
||||||
"parity-tokio-ipc",
|
"parity-tokio-ipc",
|
||||||
"rdev",
|
"rdev",
|
||||||
"repng",
|
"repng",
|
||||||
@ -4713,7 +4748,7 @@ name = "rustdesk-portable-packer"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"brotli",
|
"brotli",
|
||||||
"dirs",
|
"dirs 4.0.0",
|
||||||
"embed-resource",
|
"embed-resource",
|
||||||
"md5",
|
"md5",
|
||||||
]
|
]
|
||||||
@ -6591,7 +6626,7 @@ dependencies = [
|
|||||||
"async-trait",
|
"async-trait",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
"derivative",
|
"derivative",
|
||||||
"dirs",
|
"dirs 4.0.0",
|
||||||
"enumflags2",
|
"enumflags2",
|
||||||
"event-listener",
|
"event-listener",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
|
@ -106,6 +106,8 @@ core-graphics = "0.22"
|
|||||||
include_dir = "0.7.2"
|
include_dir = "0.7.2"
|
||||||
tray-item = "0.7" # looks better than trayicon
|
tray-item = "0.7" # looks better than trayicon
|
||||||
dark-light = "0.2"
|
dark-light = "0.2"
|
||||||
|
fruitbasket = "0.10.0"
|
||||||
|
objc_id = "0.1.1"
|
||||||
|
|
||||||
[target.'cfg(target_os = "linux")'.dependencies]
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
psimple = { package = "libpulse-simple-binding", version = "2.25" }
|
psimple = { package = "libpulse-simple-binding", version = "2.25" }
|
||||||
|
@ -227,7 +227,7 @@
|
|||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
33CC10EC2044A3C60003C045 = {
|
33CC10EC2044A3C60003C045 = {
|
||||||
CreatedOnToolsVersion = 9.2;
|
CreatedOnToolsVersion = 9.2;
|
||||||
LastSwiftMigration = 1100;
|
LastSwiftMigration = 1420;
|
||||||
ProvisioningStyle = Automatic;
|
ProvisioningStyle = Automatic;
|
||||||
SystemCapabilities = {
|
SystemCapabilities = {
|
||||||
com.apple.Sandbox = {
|
com.apple.Sandbox = {
|
||||||
@ -463,6 +463,7 @@
|
|||||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.rustdesk;
|
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.rustdesk;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
};
|
};
|
||||||
name = Profile;
|
name = Profile;
|
||||||
@ -607,6 +608,7 @@
|
|||||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.rustdesk;
|
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.rustdesk;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
"SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = Runner/bridge_generated.h;
|
"SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = Runner/bridge_generated.h;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@ -643,6 +645,7 @@
|
|||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.rustdesk;
|
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.rustdesk;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
"SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = Runner/bridge_generated.h;
|
"SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = Runner/bridge_generated.h;
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
};
|
};
|
||||||
|
@ -87,4 +87,3 @@ class MainFlutterWindow: NSWindow {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::{ffi::c_void, rc::Rc};
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
use cocoa::{
|
use cocoa::{
|
||||||
appkit::{NSApp, NSApplication, NSApplicationActivationPolicy::*, NSMenu, NSMenuItem},
|
appkit::{NSApp, NSApplication, NSApplicationActivationPolicy::*, NSMenu, NSMenuItem},
|
||||||
@ -8,11 +10,14 @@ use objc::{
|
|||||||
class,
|
class,
|
||||||
declare::ClassDecl,
|
declare::ClassDecl,
|
||||||
msg_send,
|
msg_send,
|
||||||
runtime::{Object, Sel, BOOL},
|
runtime::{BOOL, Object, Sel},
|
||||||
sel, sel_impl,
|
sel, sel_impl,
|
||||||
};
|
};
|
||||||
use sciter::{make_args, Host};
|
use objc::runtime::Class;
|
||||||
use std::{ffi::c_void, rc::Rc};
|
use objc_id::WeakId;
|
||||||
|
use sciter::{Host, make_args};
|
||||||
|
|
||||||
|
use hbb_common::log;
|
||||||
|
|
||||||
static APP_HANDLER_IVAR: &str = "GoDeskAppHandler";
|
static APP_HANDLER_IVAR: &str = "GoDeskAppHandler";
|
||||||
|
|
||||||
@ -98,12 +103,21 @@ unsafe fn set_delegate(handler: Option<Box<dyn AppHandler>>) {
|
|||||||
sel!(handleMenuItem:),
|
sel!(handleMenuItem:),
|
||||||
handle_menu_item as extern "C" fn(&mut Object, Sel, id),
|
handle_menu_item as extern "C" fn(&mut Object, Sel, id),
|
||||||
);
|
);
|
||||||
|
decl.add_method(sel!(handleEvent:withReplyEvent:), handle_apple_event as extern fn(&Object, Sel, u64, u64));
|
||||||
let decl = decl.register();
|
let decl = decl.register();
|
||||||
let delegate: id = msg_send![decl, alloc];
|
let delegate: id = msg_send![decl, alloc];
|
||||||
let () = msg_send![delegate, init];
|
let () = msg_send![delegate, init];
|
||||||
let state = DelegateState { handler };
|
let state = DelegateState { handler };
|
||||||
let handler_ptr = Box::into_raw(Box::new(state));
|
let handler_ptr = Box::into_raw(Box::new(state));
|
||||||
(*delegate).set_ivar(APP_HANDLER_IVAR, handler_ptr as *mut c_void);
|
(*delegate).set_ivar(APP_HANDLER_IVAR, handler_ptr as *mut c_void);
|
||||||
|
// Set the url scheme handler
|
||||||
|
let cls = Class::get("NSAppleEventManager").unwrap();
|
||||||
|
let manager: *mut Object = msg_send![cls, sharedAppleEventManager];
|
||||||
|
let _: () = msg_send![manager,
|
||||||
|
setEventHandler: delegate
|
||||||
|
andSelector: sel!(handleEvent:withReplyEvent:)
|
||||||
|
forEventClass: fruitbasket::kInternetEventClass
|
||||||
|
andEventID: fruitbasket::kAEGetURL];
|
||||||
let () = msg_send![NSApp(), setDelegate: delegate];
|
let () = msg_send![NSApp(), setDelegate: delegate];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,6 +181,13 @@ extern "C" fn handle_menu_item(this: &mut Object, _: Sel, item: id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern fn handle_apple_event(this: &Object, _cmd: Sel, event: u64, _reply: u64) {
|
||||||
|
let event = event as *mut Object;
|
||||||
|
let url = fruitbasket::parse_url_event(event);
|
||||||
|
log::debug!("event found {}", url);
|
||||||
|
let _ = crate::run_me(vec![url]);
|
||||||
|
}
|
||||||
|
|
||||||
unsafe fn make_menu_item(title: &str, key: &str, tag: u32) -> *mut Object {
|
unsafe fn make_menu_item(title: &str, key: &str, tag: u32) -> *mut Object {
|
||||||
let title = NSString::alloc(nil).init_str(title);
|
let title = NSString::alloc(nil).init_str(title);
|
||||||
let action = sel!(handleMenuItem:);
|
let action = sel!(handleMenuItem:);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user