Listen to events
Often you want to do something when the user presses some key, if a file is dropped on your window or general mouse events.
For that, you can use the iced::event::listen subscription. It runs in the background and emits a message with/on every Event.
NOTE: If you just want to get mouse events in a specific widget area you should use the
MouseAreawidget.
Here is a practical example how to listen to an arbitrary event in form of a keyboard event.
In the example, the subscription always runs as defined in the Application::subscription method:
use iced::widget;
#[derive(Debug, Clone)]
enum Message {
Event(iced::event::Event),
}
fn update(state: &mut u32, message: Message) {
// handle emitted messages
match message {
Message::Event(event) => {
if let iced::event::Event::Keyboard(iced::keyboard::Event::KeyReleased {
key, ..
}) = event
{
println!("Key {key:?} was pressed");
*state += 1;
}
}
}
}
fn view(state: &u32) -> iced::Element<'_, Message> {
widget::text!("Keys pressed: {}", state).into()
}
fn main() -> iced::Result {
// run the app from main function
iced::application(|| 0, update, view)
.subscription(|_state| iced::event::listen().map(Message::Event))
.run()
}
It emits a message containing the event:
use iced::widget;
#[derive(Debug, Clone)]
enum Message {
Event(iced::event::Event),
}
fn update(state: &mut u32, message: Message) {
// handle emitted messages
match message {
Message::Event(event) => {
if let iced::event::Event::Keyboard(iced::keyboard::Event::KeyReleased {
key, ..
}) = event
{
println!("Key {key:?} was pressed");
*state += 1;
}
}
}
}
fn view(state: &u32) -> iced::Element<'_, Message> {
widget::text!("Keys pressed: {}", state).into()
}
fn main() -> iced::Result {
// run the app from main function
iced::application(|| 0, update, view)
.subscription(|_state| iced::event::listen().map(Message::Event))
.run()
}
In the update method we can use that event and react to it:
use iced::widget;
#[derive(Debug, Clone)]
enum Message {
Event(iced::event::Event),
}
fn update(state: &mut u32, message: Message) {
// handle emitted messages
match message {
Message::Event(event) => {
if let iced::event::Event::Keyboard(iced::keyboard::Event::KeyReleased {
key, ..
}) = event
{
println!("Key {key:?} was pressed");
*state += 1;
}
}
}
}
fn view(state: &u32) -> iced::Element<'_, Message> {
widget::text!("Keys pressed: {}", state).into()
}
fn main() -> iced::Result {
// run the app from main function
iced::application(|| 0, update, view)
.subscription(|_state| iced::event::listen().map(Message::Event))
.run()
}
Important Note: The example uses
iced::event::listenthat reacts to all kind of events. There are specific subscriptions for special event kinds, such as window, and keyboard events.
Full Code
use iced::widget;
#[derive(Debug, Clone)]
enum Message {
Event(iced::event::Event),
}
fn update(state: &mut u32, message: Message) {
// handle emitted messages
match message {
Message::Event(event) => {
if let iced::event::Event::Keyboard(iced::keyboard::Event::KeyReleased {
key, ..
}) = event
{
println!("Key {key:?} was pressed");
*state += 1;
}
}
}
}
fn view(state: &u32) -> iced::Element<'_, Message> {
widget::text!("Keys pressed: {}", state).into()
}
fn main() -> iced::Result {
// run the app from main function
iced::application(|| 0, update, view)
.subscription(|_state| iced::event::listen().map(Message::Event))
.run()
}