diff --git a/examples/pane_grid/src/main.rs b/examples/pane_grid/src/main.rs index e786eadd..f986cc8d 100644 --- a/examples/pane_grid/src/main.rs +++ b/examples/pane_grid/src/main.rs @@ -3,7 +3,7 @@ use iced::{ Button, Column, Command, Container, Element, HorizontalAlignment, Length, PaneGrid, Scrollable, Settings, Subscription, Text, }; -use iced_native::{subscription, Event}; +use iced_native::{event, subscription, Event}; pub fn main() -> iced::Result { Example::run(Settings::default()) @@ -119,12 +119,18 @@ impl Application for Example { } fn subscription(&self) -> Subscription { - subscription::events_with(|event| match event { - Event::Keyboard(keyboard::Event::KeyPressed { - modifiers, - key_code, - }) if modifiers.is_command_pressed() => handle_hotkey(key_code), - _ => None, + subscription::events_with(|event, status| { + if let event::Status::Captured = status { + return None; + } + + match event { + Event::Keyboard(keyboard::Event::KeyPressed { + modifiers, + key_code, + }) if modifiers.is_command_pressed() => handle_hotkey(key_code), + _ => None, + } }) } diff --git a/glutin/src/application.rs b/glutin/src/application.rs index bc590912..663654b1 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -277,7 +277,7 @@ async fn run_instance( state.scale_factor(), state.modifiers(), ) { - let _ = user_interface.update( + let event_status = user_interface.update( event.clone(), state.cursor_position(), clipboard.as_ref().map(|c| c as _), @@ -285,7 +285,7 @@ async fn run_instance( &mut messages, ); - runtime.broadcast(event); + runtime.broadcast((event, event_status)); is_clean = false; } diff --git a/native/src/runtime.rs b/native/src/runtime.rs index 9fa031f4..bd814a0b 100644 --- a/native/src/runtime.rs +++ b/native/src/runtime.rs @@ -1,5 +1,6 @@ //! Run commands and subscriptions. -use crate::{Event, Hasher}; +use crate::event::{self, Event}; +use crate::Hasher; /// A native runtime with a generic executor and receiver of results. /// @@ -8,5 +9,10 @@ use crate::{Event, Hasher}; /// /// [`Command`]: ../struct.Command.html /// [`Subscription`]: ../struct.Subscription.html -pub type Runtime = - iced_futures::Runtime; +pub type Runtime = iced_futures::Runtime< + Hasher, + (Event, event::Status), + Executor, + Receiver, + Message, +>; diff --git a/native/src/subscription.rs b/native/src/subscription.rs index 18750abf..3cc04188 100644 --- a/native/src/subscription.rs +++ b/native/src/subscription.rs @@ -1,5 +1,6 @@ //! Listen to external events in your application. -use crate::{Event, Hasher}; +use crate::event::{self, Event}; +use crate::Hasher; use iced_futures::futures::stream::BoxStream; /// A request to listen to external events. @@ -15,19 +16,21 @@ use iced_futures::futures::stream::BoxStream; /// /// [`Command`]: ../struct.Command.html /// [`Subscription`]: struct.Subscription.html -pub type Subscription = iced_futures::Subscription; +pub type Subscription = + iced_futures::Subscription; /// A stream of runtime events. /// /// It is the input of a [`Subscription`] in the native runtime. /// /// [`Subscription`]: type.Subscription.html -pub type EventStream = BoxStream<'static, Event>; +pub type EventStream = BoxStream<'static, (Event, event::Status)>; /// A native [`Subscription`] tracker. /// /// [`Subscription`]: type.Subscription.html -pub type Tracker = iced_futures::subscription::Tracker; +pub type Tracker = + iced_futures::subscription::Tracker; pub use iced_futures::subscription::Recipe; @@ -37,13 +40,18 @@ use events::Events; /// Returns a [`Subscription`] to all the runtime events. /// -/// This subscription will notify your application of any [`Event`] handled by -/// the runtime. +/// This subscription will notify your application of any [`Event`] that was +/// not captured by any widget. /// /// [`Subscription`]: type.Subscription.html /// [`Event`]: ../enum.Event.html pub fn events() -> Subscription { - Subscription::from_recipe(Events { f: Some }) + Subscription::from_recipe(Events { + f: |event, status| match status { + event::Status::Ignored => Some(event), + event::Status::Captured => None, + }, + }) } /// Returns a [`Subscription`] that filters all the runtime events with the @@ -58,7 +66,7 @@ pub fn events() -> Subscription { /// [`Subscription`]: type.Subscription.html /// [`Event`]: ../enum.Event.html pub fn events_with( - f: fn(Event) -> Option, + f: fn(Event, event::Status) -> Option, ) -> Subscription where Message: 'static + Send, diff --git a/native/src/subscription/events.rs b/native/src/subscription/events.rs index a1ae6051..f689f3af 100644 --- a/native/src/subscription/events.rs +++ b/native/src/subscription/events.rs @@ -1,16 +1,15 @@ -use crate::{ - subscription::{EventStream, Recipe}, - Event, Hasher, -}; +use crate::event::{self, Event}; +use crate::subscription::{EventStream, Recipe}; +use crate::Hasher; use iced_futures::futures::future; use iced_futures::futures::StreamExt; use iced_futures::BoxStream; pub struct Events { - pub(super) f: fn(Event) -> Option, + pub(super) f: fn(Event, event::Status) -> Option, } -impl Recipe for Events +impl Recipe for Events where Message: 'static + Send, { @@ -29,7 +28,9 @@ where event_stream: EventStream, ) -> BoxStream { event_stream - .filter_map(move |event| future::ready((self.f)(event))) + .filter_map(move |(event, status)| { + future::ready((self.f)(event, status)) + }) .boxed() } } diff --git a/winit/src/application.rs b/winit/src/application.rs index 5f51a0cb..5c48fb32 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -359,7 +359,7 @@ async fn run_instance( state.scale_factor(), state.modifiers(), ) { - let _ = user_interface.update( + let event_status = user_interface.update( event.clone(), state.cursor_position(), clipboard.as_ref().map(|c| c as _), @@ -367,7 +367,7 @@ async fn run_instance( &mut messages, ); - runtime.broadcast(event); + runtime.broadcast((event, event_status)); is_clean = false; }