Forward script messages from IPC to client
This commit is contained in:
parent
e1ebfab247
commit
f81f55485b
|
@ -91,7 +91,8 @@ pub struct Client {
|
||||||
impl Drop for Client {
|
impl Drop for Client {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
println!("Client #{} disconnected", self.token.0);
|
println!("Client #{} disconnected", self.token.0);
|
||||||
let data = self.data.write();
|
|
||||||
|
let mut data = self.data.write();
|
||||||
let _ = data
|
let _ = data
|
||||||
.poll
|
.poll
|
||||||
.registry()
|
.registry()
|
||||||
|
@ -100,13 +101,16 @@ impl Drop for Client {
|
||||||
for (_id, window) in self.id_to_window.drain() {
|
for (_id, window) in self.id_to_window.drain() {
|
||||||
let msg = WindowMessage::CloseWindow { id: window };
|
let msg = WindowMessage::CloseWindow { id: window };
|
||||||
let _ = self.window_sender.send_event(msg);
|
let _ = self.window_sender.send_event(msg);
|
||||||
|
data.window_to_client_panel.remove(&window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Client {
|
impl Client {
|
||||||
pub fn on_readable(&mut self) -> std::io::Result<bool> {
|
pub fn on_readable(&mut self) -> std::io::Result<bool> {
|
||||||
self.messenger.flush_recv()?;
|
if let Err(err) = self.messenger.flush_recv() {
|
||||||
|
eprintln!("flush_recv() error: {:?}", err);
|
||||||
|
}
|
||||||
|
|
||||||
while let Some(msg) = self.messenger.recv() {
|
while let Some(msg) = self.messenger.recv() {
|
||||||
println!("Client #{}: {:?}", self.token.0, msg);
|
println!("Client #{}: {:?}", self.token.0, msg);
|
||||||
|
@ -116,7 +120,11 @@ impl Client {
|
||||||
protocol,
|
protocol,
|
||||||
script,
|
script,
|
||||||
}) => {
|
}) => {
|
||||||
let window = self.data.write().new_window_id();
|
let mut data = self.data.write();
|
||||||
|
|
||||||
|
let window = data.new_window_id();
|
||||||
|
data.window_to_client_panel
|
||||||
|
.insert(window, (self.token.0, id));
|
||||||
|
|
||||||
if let Some(old_id) = self.id_to_window.insert(id, window) {
|
if let Some(old_id) = self.id_to_window.insert(id, window) {
|
||||||
let msg = WindowMessage::CloseWindow { id: old_id };
|
let msg = WindowMessage::CloseWindow { id: old_id };
|
||||||
|
@ -147,7 +155,6 @@ pub struct Ipc {
|
||||||
pub data: Arc<RwLock<IpcData>>,
|
pub data: Arc<RwLock<IpcData>>,
|
||||||
pub window_sender: WindowMessageSender,
|
pub window_sender: WindowMessageSender,
|
||||||
pub message_recv: Receiver<IpcMessage>,
|
pub message_recv: Receiver<IpcMessage>,
|
||||||
pub events: Events,
|
|
||||||
pub quit: bool,
|
pub quit: bool,
|
||||||
pub listener: Listener,
|
pub listener: Listener,
|
||||||
pub signals: Signals,
|
pub signals: Signals,
|
||||||
|
@ -171,7 +178,6 @@ impl Ipc {
|
||||||
|
|
||||||
let mut signals = Signals::new(Signal::Interrupt | Signal::Quit)?;
|
let mut signals = Signals::new(Signal::Interrupt | Signal::Quit)?;
|
||||||
|
|
||||||
let events = Events::with_capacity(128);
|
|
||||||
let poll = Poll::new()?;
|
let poll = Poll::new()?;
|
||||||
let listener_token = Token(usize::MAX);
|
let listener_token = Token(usize::MAX);
|
||||||
let signals_token = Token(listener_token.0 - 1);
|
let signals_token = Token(listener_token.0 - 1);
|
||||||
|
@ -199,7 +205,6 @@ impl Ipc {
|
||||||
data: Arc::new(RwLock::new(data)),
|
data: Arc::new(RwLock::new(data)),
|
||||||
window_sender,
|
window_sender,
|
||||||
message_recv,
|
message_recv,
|
||||||
events,
|
|
||||||
quit: false,
|
quit: false,
|
||||||
listener,
|
listener,
|
||||||
signals,
|
signals,
|
||||||
|
@ -212,10 +217,29 @@ impl Ipc {
|
||||||
Ok((ipc, sender))
|
Ok((ipc, sender))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn poll(&mut self, timeout: Option<Duration>) -> std::io::Result<()> {
|
pub fn on_message(&mut self, msg: IpcMessage) -> std::io::Result<()> {
|
||||||
self.data.write().poll.poll(&mut self.events, timeout)?;
|
match msg {
|
||||||
|
IpcMessage::PanelMessage { window, message } => {
|
||||||
|
let data = self.data.read();
|
||||||
|
let (client, panel) = *data.window_to_client_panel.get(&window).unwrap();
|
||||||
|
let client = self.clients.get_mut(client).unwrap();
|
||||||
|
let reply = RecvMessage {
|
||||||
|
id: panel,
|
||||||
|
msg: message,
|
||||||
|
};
|
||||||
|
client
|
||||||
|
.messenger
|
||||||
|
.send(&MagpieClientMsg::RecvMessage(reply))?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for event in self.events.iter() {
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn poll(&mut self, events: &mut Events, timeout: Option<Duration>) -> std::io::Result<()> {
|
||||||
|
self.data.write().poll.poll(events, timeout)?;
|
||||||
|
|
||||||
|
for event in events.iter() {
|
||||||
if event.token() == self.listener_token {
|
if event.token() == self.listener_token {
|
||||||
loop {
|
loop {
|
||||||
match self.listener.accept() {
|
match self.listener.accept() {
|
||||||
|
@ -251,6 +275,10 @@ impl Ipc {
|
||||||
let _ = self.window_sender.send_event(WindowMessage::Quit);
|
let _ = self.window_sender.send_event(WindowMessage::Quit);
|
||||||
self.quit = true;
|
self.quit = true;
|
||||||
}
|
}
|
||||||
|
} else if event.token() == self.message_recv_token {
|
||||||
|
while let Ok(received) = self.message_recv.try_recv() {
|
||||||
|
self.on_message(received)?;
|
||||||
|
}
|
||||||
} else if let Some(client) = self.clients.get_mut(event.token().0) {
|
} else if let Some(client) = self.clients.get_mut(event.token().0) {
|
||||||
let disconnected = client.on_readable()?;
|
let disconnected = client.on_readable()?;
|
||||||
if disconnected {
|
if disconnected {
|
||||||
|
@ -265,9 +293,10 @@ impl Ipc {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run(mut self) {
|
pub fn run(mut self) {
|
||||||
|
let mut events = Events::with_capacity(128);
|
||||||
while !self.quit {
|
while !self.quit {
|
||||||
let wait = Duration::from_millis(100);
|
let wait = Duration::from_millis(100);
|
||||||
match self.poll(Some(wait)) {
|
match self.poll(&mut events, Some(wait)) {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
eprintln!("IPC poll error: {:?}", e);
|
eprintln!("IPC poll error: {:?}", e);
|
||||||
|
|
Loading…
Reference in New Issue