summaryrefslogtreecommitdiffstats
path: root/futures
diff options
context:
space:
mode:
Diffstat (limited to 'futures')
-rw-r--r--futures/src/event.rs19
-rw-r--r--futures/src/keyboard.rs11
-rw-r--r--futures/src/runtime.rs10
-rw-r--r--futures/src/subscription.rs11
-rw-r--r--futures/src/subscription/tracker.rs16
5 files changed, 43 insertions, 24 deletions
diff --git a/futures/src/event.rs b/futures/src/event.rs
index 97224506..4f3342ca 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,12 @@ 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, status, window| {
+ match event {
+ Event::Window(window::Event::RedrawRequested(_)) => None,
+ _ => f(event, status, window),
+ }
+ })
}
/// Creates a [`Subscription`] that produces a message for every runtime event,
@@ -47,7 +46,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,
diff --git a/futures/src/keyboard.rs b/futures/src/keyboard.rs
index 8e7da38f..43ed7742 100644
--- a/futures/src/keyboard.rs
+++ b/futures/src/keyboard.rs
@@ -18,7 +18,7 @@ where
#[derive(Hash)]
struct OnKeyPress;
- subscription::filter_map((OnKeyPress, f), move |event, status| {
+ subscription::filter_map((OnKeyPress, f), move |event, status, _window| {
match (event, status) {
(
core::Event::Keyboard(Event::KeyPressed {
@@ -45,8 +45,9 @@ where
#[derive(Hash)]
struct OnKeyRelease;
- subscription::filter_map((OnKeyRelease, f), move |event, status| {
- match (event, status) {
+ subscription::filter_map(
+ (OnKeyRelease, f),
+ move |event, status, _window| match (event, status) {
(
core::Event::Keyboard(Event::KeyReleased {
key,
@@ -56,6 +57,6 @@ where
core::event::Status::Ignored,
) => f(key, modifiers),
_ => None,
- }
- })
+ },
+ )
}
diff --git a/futures/src/runtime.rs b/futures/src/runtime.rs
index cac7b7e1..ae55f814 100644
--- a/futures/src/runtime.rs
+++ b/futures/src/runtime.rs
@@ -1,5 +1,6 @@
//! Run commands and keep track of subscriptions.
use crate::core::event::{self, Event};
+use crate::core::window;
use crate::subscription;
use crate::{BoxFuture, BoxStream, Executor, MaybeSend};
@@ -127,7 +128,12 @@ where
/// See [`Tracker::broadcast`] to learn more.
///
/// [`Tracker::broadcast`]: subscription::Tracker::broadcast
- pub fn broadcast(&mut self, event: Event, status: event::Status) {
- self.subscriptions.broadcast(event, status);
+ pub fn broadcast(
+ &mut self,
+ event: Event,
+ status: event::Status,
+ window: window::Id,
+ ) {
+ self.subscriptions.broadcast(event, status, window);
}
}
diff --git a/futures/src/subscription.rs b/futures/src/subscription.rs
index 93e35608..79cea6ed 100644
--- a/futures/src/subscription.rs
+++ b/futures/src/subscription.rs
@@ -4,6 +4,7 @@ mod tracker;
pub use tracker::Tracker;
use crate::core::event::{self, Event};
+use crate::core::window;
use crate::futures::{Future, Stream};
use crate::{BoxStream, MaybeSend};
@@ -15,7 +16,7 @@ use std::hash::Hash;
/// A stream of runtime events.
///
/// It is the input of a [`Subscription`].
-pub type EventStream = BoxStream<(Event, event::Status)>;
+pub type EventStream = BoxStream<(Event, event::Status, window::Id)>;
/// The hasher used for identifying subscriptions.
pub type Hasher = rustc_hash::FxHasher;
@@ -289,7 +290,9 @@ where
pub(crate) fn filter_map<I, F, Message>(id: I, f: F) -> Subscription<Message>
where
I: Hash + 'static,
- F: Fn(Event, event::Status) -> Option<Message> + MaybeSend + 'static,
+ F: Fn(Event, event::Status, window::Id) -> Option<Message>
+ + MaybeSend
+ + 'static,
Message: 'static + MaybeSend,
{
Subscription::from_recipe(Runner {
@@ -298,8 +301,8 @@ where
use futures::future;
use futures::stream::StreamExt;
- events.filter_map(move |(event, status)| {
- future::ready(f(event, status))
+ events.filter_map(move |(event, status, window)| {
+ future::ready(f(event, status, window))
})
},
})
diff --git a/futures/src/subscription/tracker.rs b/futures/src/subscription/tracker.rs
index 277a446b..086b0f09 100644
--- a/futures/src/subscription/tracker.rs
+++ b/futures/src/subscription/tracker.rs
@@ -1,4 +1,5 @@
use crate::core::event::{self, Event};
+use crate::core::window;
use crate::subscription::{Hasher, Recipe};
use crate::{BoxFuture, MaybeSend};
@@ -23,7 +24,9 @@ pub struct Tracker {
#[derive(Debug)]
pub struct Execution {
_cancel: futures::channel::oneshot::Sender<()>,
- listener: Option<futures::channel::mpsc::Sender<(Event, event::Status)>>,
+ listener: Option<
+ futures::channel::mpsc::Sender<(Event, event::Status, window::Id)>,
+ >,
}
impl Tracker {
@@ -139,12 +142,19 @@ impl Tracker {
/// currently open.
///
/// [`Recipe::stream`]: crate::subscription::Recipe::stream
- pub fn broadcast(&mut self, event: Event, status: event::Status) {
+ pub fn broadcast(
+ &mut self,
+ event: Event,
+ status: event::Status,
+ window: window::Id,
+ ) {
self.subscriptions
.values_mut()
.filter_map(|connection| connection.listener.as_mut())
.for_each(|listener| {
- if let Err(error) = listener.try_send((event.clone(), status)) {
+ if let Err(error) =
+ listener.try_send((event.clone(), status, window))
+ {
log::warn!(
"Error sending event to subscription: {error:?}"
);