summaryrefslogtreecommitdiffstats
path: root/futures/src/event.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector@hecrj.dev>2024-06-11 20:22:44 +0200
committerLibravatar GitHub <noreply@github.com>2024-06-11 20:22:44 +0200
commite6d0b3bda5042a1017a5944a5227c97e0ed6caf9 (patch)
tree916f837424c3baeacc1e0f43b02bc892a3445cbb /futures/src/event.rs
parentbda01567d59c00e42e5a208ee6d9ec4153d5c195 (diff)
parent6ea7846d88915f8d820c5126d7757f1346234522 (diff)
downloadiced-e6d0b3bda5042a1017a5944a5227c97e0ed6caf9.tar.gz
iced-e6d0b3bda5042a1017a5944a5227c97e0ed6caf9.tar.bz2
iced-e6d0b3bda5042a1017a5944a5227c97e0ed6caf9.zip
Merge pull request #2456 from iced-rs/window-id-in-event-subscriptions
Introduce `window::Id` to `Event` subscriptions
Diffstat (limited to 'futures/src/event.rs')
-rw-r--r--futures/src/event.rs54
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,
+ })
}