diff --git a/src/app.rs b/src/app.rs
index 981869e..df4260b 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -54,6 +54,11 @@ impl VoidApp {
// Start IPC server for receiving deep-links from other instances
let ipc_server = IpcServer::start(ctx.clone());
+ // On macOS, store the egui context so Apple Event callbacks can
+ // trigger repaints when a void:// URL arrives.
+ #[cfg(target_os = "macos")]
+ crate::deeplink::macos::set_egui_context(cc.egui_ctx.clone());
+
let brand_texture = {
let png = include_bytes!("../assets/brand.png");
let img = image::load_from_memory(png)
@@ -368,6 +373,14 @@ impl VoidApp {
}
}
+ // On macOS, also check for URLs delivered via Apple Events
+ #[cfg(target_os = "macos")]
+ if self.pending_deeplink.is_none() {
+ if let Some(url) = crate::deeplink::macos::take_pending_url() {
+ self.pending_deeplink = Some(url);
+ }
+ }
+
// Process pending deep-link
if let Some(url) = self.pending_deeplink.take() {
match crate::deeplink::parse(&url) {
diff --git a/src/deeplink/macos.rs b/src/deeplink/macos.rs
new file mode 100644
index 0000000..1635cb7
--- /dev/null
+++ b/src/deeplink/macos.rs
@@ -0,0 +1,128 @@
+//! macOS deep-link handler via Apple Events.
+//!
+//! On macOS, `void://` URL activations are delivered through Apple Events
+//! (`kAEGetURL`), not as command-line arguments. This module installs a
+//! Carbon Apple Event handler that captures the URL and stores it for the
+//! next frame's deep-link processing.
+
+use std::ffi::c_void;
+use std::sync::Mutex;
+
+static PENDING_URL: Mutex