From efae627263468390f22bc6b237895ac625f4ac69 Mon Sep 17 00:00:00 2001 From: mars Date: Wed, 16 Nov 2022 22:20:30 -0700 Subject: [PATCH] Forward script messages from window to IPC --- apps/magpie/src/service/window.rs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/apps/magpie/src/service/window.rs b/apps/magpie/src/service/window.rs index 3834224..01cea07 100644 --- a/apps/magpie/src/service/window.rs +++ b/apps/magpie/src/service/window.rs @@ -35,6 +35,8 @@ pub enum WindowMessage { pub type WindowMessageSender = EventLoopProxy; pub struct Window { + pub ipc_sender: IpcMessageSender, + pub ipc_id: usize, pub graphics: Graphics, pub panel: Panel, pub last_update: Instant, @@ -44,6 +46,8 @@ pub struct Window { impl Window { pub fn new( + ipc_sender: IpcMessageSender, + ipc_id: usize, panel: Panel, event_loop: &EventLoopWindowTarget, ) -> Result { @@ -53,6 +57,8 @@ impl Window { let graphics = Graphics::new(display); let last_update = Instant::now(); Ok(Self { + ipc_sender, + ipc_id, graphics, panel, last_update, @@ -69,24 +75,38 @@ impl Window { self.graphics.display.gl_window().window().request_redraw(); } + /// Receives all messages from the script and forwards them to IPC. + pub fn recv_messages(&mut self) { + for message in self.panel.recv_messages() { + self.ipc_sender.send(IpcMessage::PanelMessage { + window: self.ipc_id, + message, + }); + } + } + pub fn update(&mut self) { let now = Instant::now(); let dt = now.duration_since(self.last_update).as_secs_f32(); self.panel.update(dt); self.last_update = now; + self.recv_messages(); } pub fn draw(&mut self) { let commands = self.panel.draw(); self.graphics.draw(&commands); + self.recv_messages(); } pub fn send_message(&mut self, msg: Vec) { self.panel.on_message(msg); + self.recv_messages(); } pub fn resize(&mut self, new_size: Vec2) { self.panel.on_resize(new_size); + self.recv_messages(); } pub fn on_event(&mut self, event: WindowEvent) { @@ -107,6 +127,7 @@ impl Window { }; self.panel.on_cursor_event(event, self.cursor_pos); + self.recv_messages(); } WindowEvent::MouseInput { state, @@ -125,6 +146,7 @@ impl Window { }; self.panel.on_cursor_event(event, self.cursor_pos); + self.recv_messages(); } _ => {} } @@ -164,12 +186,16 @@ impl WindowStore { message: WindowMessage, ) -> anyhow::Result { match message { - WindowMessage::OpenWindow { id, protocol, script } => { + WindowMessage::OpenWindow { + id, + protocol, + script, + } => { println!("Opening window {} with script {:?}", id, script); let module = std::fs::read(script)?; let mut script = self.runtime.load_module(&module)?; let panel = script.create_panel(&protocol, vec![])?; - let window = Window::new(panel, &event_loop)?; + let window = Window::new(self.ipc_sender.to_owned(), id, panel, &event_loop)?; let window_id = window.get_id(); self.windows.insert(window_id, window); self.ipc_to_window.insert(id, window_id);