//! Listen to keyboard events. use crate::core; use crate::core::event; use crate::core::keyboard::{Event, Key, Modifiers}; use crate::core::MaybeSend; use crate::subscription::{self, Subscription}; /// Listens to keyboard key presses and calls the given function /// map them into actual messages. /// /// If the function returns `None`, the key press will be simply /// ignored. pub fn on_key_press( f: fn(Key, Modifiers) -> Option, ) -> Subscription where Message: MaybeSend + 'static, { #[derive(Hash)] struct OnKeyPress; subscription::filter_map((OnKeyPress, f), move |event| match event { subscription::Event::Interaction { event: core::Event::Keyboard(Event::KeyPressed { key, modifiers, .. }), status: event::Status::Ignored, .. } => f(key, modifiers), _ => None, }) } /// Listens to keyboard key releases and calls the given function /// map them into actual messages. /// /// If the function returns `None`, the key release will be simply /// ignored. pub fn on_key_release( f: fn(Key, Modifiers) -> Option, ) -> Subscription where Message: MaybeSend + 'static, { #[derive(Hash)] struct OnKeyRelease; subscription::filter_map((OnKeyRelease, f), move |event| match event { subscription::Event::Interaction { event: core::Event::Keyboard(Event::KeyReleased { key, modifiers, .. }), status: event::Status::Ignored, .. } => f(key, modifiers), _ => None, }) }