1use cef::{Browser, CefString, ImplBrowser, ImplFrame};
14
15pub fn emit_event(browser: &Browser, event: &str, payload: &serde_json::Value) {
21 if let Some(frame) = browser.main_frame() {
22 let payload_str = serde_json::to_string(payload).unwrap_or_else(|_| "null".to_string());
23 let js = format!(
24 "window.dispatchEvent(new CustomEvent('agentmux-event', {{ detail: {{ event: '{}', payload: {} }} }}));",
25 event, payload_str
26 );
27 let code = CefString::from(js.as_str());
28 let url = CefString::from("");
29 frame.execute_java_script(Some(&code), Some(&url), 0);
30 }
31}
32
33pub fn emit_event_from_state(state: &crate::state::AppState, event: &str, payload: &serde_json::Value) {
36 if let Some(browser) = state.get_browser("main") {
38 emit_event(&browser, event, payload);
39 } else if let Some((_label, browser)) = state.first_browser() {
40 emit_event(&browser, event, payload);
42 } else {
43 tracing::warn!("Cannot emit event '{}': no browser handle in state", event);
44 }
45}
46
47pub fn emit_event_all_windows(state: &crate::state::AppState, event: &str, payload: &serde_json::Value) {
49 let all = state.list_browsers();
51 if all.is_empty() {
52 tracing::warn!("Cannot broadcast event '{}': no browsers", event);
53 return;
54 }
55 for (_label, browser) in all {
56 emit_event(&browser, event, payload);
57 }
58}
59
60pub fn emit_event_to_top_level_windows(
67 state: &crate::state::AppState,
68 event: &str,
69 payload: &serde_json::Value,
70) {
71 let all = state.list_top_level_browsers();
72 if all.is_empty() {
73 tracing::warn!("Cannot broadcast event '{}': no top-level browsers", event);
74 return;
75 }
76 for (_label, browser) in all {
77 emit_event(&browser, event, payload);
78 }
79}
80
81pub fn emit_event_to_window(
85 state: &crate::state::AppState,
86 label: &str,
87 event: &str,
88 payload: &serde_json::Value,
89) -> bool {
90 match state.get_browser(label) {
92 Some(browser) => {
93 emit_event(&browser, event, payload);
94 true
95 }
96 None => {
97 tracing::warn!(
98 "Cannot emit event '{}' to label '{}': no such browser",
99 event,
100 label
101 );
102 false
103 }
104 }
105}