diff options
Diffstat (limited to 'futures/src/event.rs')
-rw-r--r-- | futures/src/event.rs | 54 |
1 files changed, 43 insertions, 11 deletions
diff --git a/futures/src/event.rs b/futures/src/event.rs index 97224506..72ea78ad 100644 --- a/futures/src/event.rs +++ b/futures/src/event.rs @@ -9,7 +9,7 @@ use crate::MaybeSend; /// This subscription will notify your application of any [`Event`] that was /// not captured by any widget. pub fn listen() -> Subscription<Event> { - listen_with(|event, status| match status { + listen_with(|event, status, _window| match status { event::Status::Ignored => Some(event), event::Status::Captured => None, }) @@ -24,7 +24,7 @@ pub fn listen() -> Subscription<Event> { /// - Returns `None`, the [`Event`] will be discarded. /// - Returns `Some` message, the `Message` will be produced. pub fn listen_with<Message>( - f: fn(Event, event::Status) -> Option<Message>, + f: fn(Event, event::Status, window::Id) -> Option<Message>, ) -> Subscription<Message> where Message: 'static + MaybeSend, @@ -32,13 +32,18 @@ where #[derive(Hash)] struct EventsWith; - subscription::filter_map( - (EventsWith, f), - move |event, status| match event { - Event::Window(_, window::Event::RedrawRequested(_)) => None, - _ => f(event, status), - }, - ) + subscription::filter_map((EventsWith, f), move |event| match event { + subscription::Event::Interaction { + event: Event::Window(window::Event::RedrawRequested(_)), + .. + } + | subscription::Event::PlatformSpecific(_) => None, + subscription::Event::Interaction { + window, + event, + status, + } => f(event, status, window), + }) } /// Creates a [`Subscription`] that produces a message for every runtime event, @@ -47,7 +52,7 @@ where /// **Warning:** This [`Subscription`], if unfiltered, may produce messages in /// an infinite loop. pub fn listen_raw<Message>( - f: fn(Event, event::Status) -> Option<Message>, + f: fn(Event, event::Status, window::Id) -> Option<Message>, ) -> Subscription<Message> where Message: 'static + MaybeSend, @@ -55,5 +60,32 @@ where #[derive(Hash)] struct RawEvents; - subscription::filter_map((RawEvents, f), f) + subscription::filter_map((RawEvents, f), move |event| match event { + subscription::Event::Interaction { + window, + event, + status, + } => f(event, status, window), + subscription::Event::PlatformSpecific(_) => None, + }) +} + +/// Creates a [`Subscription`] that notifies of custom application URL +/// received from the system. +/// +/// _**Note:** Currently, it only triggers on macOS and the executable needs to be properly [bundled]!_ +/// +/// [bundled]: https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW19 +pub fn listen_url() -> Subscription<String> { + #[derive(Hash)] + struct ListenUrl; + + subscription::filter_map(ListenUrl, move |event| match event { + subscription::Event::PlatformSpecific( + subscription::PlatformSpecific::MacOS( + subscription::MacOS::ReceivedUrl(url), + ), + ) => Some(url), + _ => None, + }) } |