Skip to main content

fude/
events.rs

1//! Event emitter: background threads push named events to the webview
2//! via the tao event loop proxy.
3
4use serde_json::Value;
5use tao::event_loop::EventLoopProxy;
6
7use crate::UserEvent;
8
9#[derive(Clone)]
10pub struct EventEmitter {
11    proxy: EventLoopProxy<UserEvent>,
12}
13
14impl EventEmitter {
15    pub(crate) fn new(proxy: EventLoopProxy<UserEvent>) -> Self {
16        Self { proxy }
17    }
18
19    /// Emit a named event. The frontend receives it via
20    /// `window.__shell_listen(name, fn)`.
21    pub fn emit(&self, name: &str, payload: Value) {
22        let payload_json = serde_json::to_string(&payload).unwrap_or_else(|_| "null".into());
23        let name_json = serde_json::to_string(name).unwrap_or_else(|_| "\"\"".into());
24        let js = format!(
25            "window.__shell_on_event && window.__shell_on_event({name_json}, {payload_json})"
26        );
27        let _ = self.proxy.send_event(UserEvent::Eval(js));
28    }
29}