Implement ServerMsg::SendMessage

This commit is contained in:
mars 2022-10-30 19:11:24 -06:00
parent bf2b8360c0
commit ea1631d24d
2 changed files with 25 additions and 3 deletions

View File

@ -5,7 +5,7 @@ use std::sync::mpsc::{channel, Receiver, Sender};
use std::sync::Arc;
use std::time::Duration;
use magpie_types::{CreatePanel, MagpieServerMsg, ServerMessenger};
use magpie_types::{CreatePanel, MagpieServerMsg, SendMessage, ServerMessenger};
use mio::net::{UnixListener, UnixStream};
use mio::{Events, Interest, Poll, Token, Waker};
use mio_signals::{Signal, Signals};
@ -107,7 +107,12 @@ impl Client {
let msg = WindowMessage::OpenWindow { id: window, script };
let _ = self.window_sender.send_event(msg);
}
_ => unimplemented!(),
MagpieServerMsg::SendMessage(SendMessage { id, msg }) => {
if let Some(id) = self.id_to_window.get(&id).cloned() {
let msg = WindowMessage::SendMessage { id, msg };
let _ = self.window_sender.send_event(msg);
}
}
}
}

View File

@ -16,6 +16,7 @@ pub enum WindowMessage {
OpenWindow { id: usize, script: PathBuf },
CloseWindow { id: usize },
Quit,
SendMessage { id: usize, msg: Vec<u8> },
}
pub type WindowMessageSender = EventLoopProxy<WindowMessage>;
@ -53,7 +54,7 @@ impl Window {
pub fn request_redraw(&mut self) {
self.graphics.display.gl_window().window().request_redraw();
}
pub fn update(&mut self) {
let now = Instant::now();
let dt = now.duration_since(self.last_update).as_secs_f32();
@ -65,6 +66,10 @@ impl Window {
self.graphics.draw(commands);
});
}
pub fn send_message(&mut self, msg: Vec<u8>) {
self.script.on_message(self.panel, msg);
}
}
pub struct WindowStore {
@ -84,6 +89,13 @@ impl WindowStore {
}
}
pub fn get_ipc_window(&mut self, id: usize) -> Option<&mut Window> {
self.ipc_to_window
.get(&id)
.map(|id| self.windows.get_mut(id))
.flatten()
}
pub fn run(mut self, event_loop: EventLoop<WindowMessage>) -> ! {
event_loop.run(move |event, event_loop, control_flow| match event {
Event::WindowEvent { window_id, event } => {
@ -123,6 +135,11 @@ impl WindowStore {
}
}
WindowMessage::Quit => *control_flow = ControlFlow::Exit,
WindowMessage::SendMessage { id, msg } => {
if let Some(window) = self.get_ipc_window(id) {
window.send_message(msg);
}
}
},
_ => {}
});