In Iced, when using `iced::daemon` to start the application, how can I use F8 to open a window?

My code is here, but it doesn’t work:

use iced::{
    Alignment::Center,
    Event, Subscription, Task, event,
    keyboard::{self, Key, key::Named},
    widget::{Column, button, column, text},
    window::{self, Settings},
};

#[derive(Default, Clone)]
pub struct Counter {
    val: i32,
}

#[derive(Debug, Clone, Copy)]
pub enum Message {
    Increment,
    Decrement,
    OpenWindow,
    Opened(window::Id),
    Nothing,
}

impl Counter {
    pub fn update(&mut self, message: Message) -> Task<Message> {
        match message {
            Message::Increment => {
                self.val += 1;
                Task::none()
            }
            Message::Decrement => {
                self.val -= 1;
                Task::none()
            }
            Message::OpenWindow => {
                let (_id, open) = window::open(Settings::default());
                open.map(Message::Opened)
            }
            _ => Task::none(),
        }
    }

    pub fn view(&self, _window_id: window::Id) -> Column<Message> {
        let increment_button = button("increment").on_press(Message::Increment);
        let value = text(self.val).size(50);
        let decrement_button = button("decrement").on_press(Message::Decrement);

        column![increment_button, value, decrement_button].align_x(Center)
    }

    pub fn subscription(&self) -> Subscription<Message> {
        event::listen().map(|event| match event {
            Event::Keyboard(keyboard::Event::KeyReleased {
                key: Key::Named(Named::F8),
                ..
            }) => Message::OpenWindow,
            _ => Message::Nothing,
        })
    }
}

the main function:

use anyhow::Result;

fn main() -> Result<()> {
    iced::daemon("a test", Counter::update, Counter::view)
        .subscription(Counter::subscription)
        .run()?;
    Ok(())
}

I haven’t tried the daemon mode myself, but think an application running in the background is not going to react to any keyboard events because there is no window capturing them. You will need some sort of IPC.

1 Like