Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

The Message Enum

The Message enum in src/app.rs is the central event type for the entire application. Every state change flows through it.

All Variants

#![allow(unused)]
fn main() {
pub enum Message {
    // Config file changed (hot-reload)
    ConfigChanged(Box<Config>),

    // Menu management
    ToggleMenu(MenuType, Id, ButtonUIRef),   // Open/close a menu at a specific position
    CloseMenu(Id),                            // Close menu on a specific output
    CloseAllMenus,                            // Close menus on all outputs

    // Module-specific messages
    Custom(String, custom_module::Message),    // Custom module (keyed by name)
    Updates(modules::updates::Message),
    Workspaces(modules::workspaces::Message),
    WindowTitle(modules::window_title::Message),
    SystemInfo(modules::system_info::Message),
    KeyboardLayout(modules::keyboard_layout::Message),
    KeyboardSubmap(modules::keyboard_submap::Message),
    Tray(modules::tray::Message),
    Clock(modules::clock::Message),
    Tempo(modules::tempo::Message),
    Privacy(modules::privacy::Message),
    Settings(modules::settings::Message),
    MediaPlayer(modules::media_player::Message),

    // System events
    OutputEvent((OutputEvent, WlOutput)),      // Wayland monitor added/removed
    ResumeFromSleep,                           // System woke from sleep
    ToggleVisibility,                          // SIGUSR1 signal received
    None,                                      // No-op
}
}

Routing Pattern

In App::update(), each message variant is matched and delegated to the appropriate handler:

#![allow(unused)]
fn main() {
fn update(&mut self, message: Message) -> Task<Message> {
    match message {
        Message::ConfigChanged(config) => {
            self.refesh_config(config);
            // ...
        }
        Message::Settings(msg) => {
            match self.settings.update(msg) {
                settings::Action::None => Task::none(),
                settings::Action::CloseMenu => { /* close menu */ }
                settings::Action::Command(task) => task,
                // ...
            }
        }
        Message::Workspaces(msg) => {
            self.workspaces.update(msg)
        }
        // ... one arm per variant
    }
}
}

Special Messages

ConfigChanged

Emitted by the config file watcher subscription when the TOML file is modified. Triggers a full config reload across all modules.

OutputEvent

Emitted by Wayland when monitors are connected or disconnected. Triggers creation or destruction of layer surfaces.

ToggleVisibility

Emitted when the process receives a SIGUSR1 signal. Toggles the visible field, which controls whether the bar is shown or hidden.

ResumeFromSleep

Emitted by the logind service when the system wakes from sleep. Used to refresh stale data (e.g., re-check network status, update clock).

CloseAllMenus

Emitted when all menus should close (e.g., when the ESC key is pressed with enable_esc_key = true).