aboutsummaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorKunal Mohan <kunalmohan99@gmail.com>2021-02-12 11:39:02 +0530
committerKunal Mohan <kunalmohan99@gmail.com>2021-05-04 20:47:48 +0530
commit7beb24625015b9713b617b2070cca495707edcee (patch)
tree01938e7225d7c7d9dcbf0e719d48ad4a8940370c /src/server
parentIntroduce IpcSenderWithContext (diff)
downloadsl0ppij-7beb24625015b9713b617b2070cca495707edcee.tar.gz
sl0ppij-7beb24625015b9713b617b2070cca495707edcee.tar.xz
sl0ppij-7beb24625015b9713b617b2070cca495707edcee.zip
try fixes
Diffstat (limited to 'src/server')
-rw-r--r--src/server/mod.rs149
1 files changed, 83 insertions, 66 deletions
diff --git a/src/server/mod.rs b/src/server/mod.rs
index ada8826e..0ba19568 100644
--- a/src/server/mod.rs
+++ b/src/server/mod.rs
@@ -39,7 +39,7 @@ pub fn start_server(
let default_layout = Some(PathBuf::from("default"));
#[cfg(test)]
let default_layout = None;
- let maybe_layout = opts.layout.or(default_layout).map(Layout::new);
+ let maybe_layout = opts.layout.or(default_layout);
let send_server_instructions = IpcSenderWithContext::new();
@@ -90,15 +90,15 @@ pub fn start_server(
.unwrap();
}
PtyInstruction::NewTab => {
- if let Some(layout) = maybe_layout.clone() {
- pty_bus.spawn_terminals_for_layout(layout, err_ctx);
- } else {
- let pid = pty_bus.spawn_terminal(None);
- pty_bus
- .send_server_instructions
- .send(ApiCommand::ToScreen(ScreenInstruction::NewTab(pid)))
- .unwrap();
- }
+ //if let Some(layout) = maybe_layout.clone() {
+ // pty_bus.spawn_terminals_for_layout(layout, err_ctx);
+ //} else {
+ let pid = pty_bus.spawn_terminal(None);
+ pty_bus
+ .send_server_instructions
+ .send(ApiCommand::ToScreen(ScreenInstruction::NewTab(pid)))
+ .unwrap();
+ //}
}
PtyInstruction::ClosePane(id) => {
pty_bus.close_pane(id, err_ctx);
@@ -120,64 +120,15 @@ pub fn start_server(
.name("ipc_server".to_string())
.spawn({
move || {
+ let mut threads = vec![];
for stream in listener.incoming() {
match stream {
- Ok(mut stream) => {
- let mut buffer = [0; 65535]; // TODO: more accurate
- let _ = stream
- .read(&mut buffer)
- .expect("failed to parse ipc message");
- let (mut err_ctx, decoded): (ErrorContext, ApiCommand) =
- bincode::deserialize(&buffer)
- .expect("failed to deserialize ipc message");
- err_ctx.add_call(ContextType::IPCServer);
- send_pty_instructions.update(err_ctx);
- send_app_instructions.update(err_ctx);
-
- match decoded {
- ApiCommand::OpenFile(file_name) => {
- let path = PathBuf::from(file_name);
- send_pty_instructions
- .send(PtyInstruction::SpawnTerminal(Some(path)))
- .unwrap();
- }
- ApiCommand::SplitHorizontally => {
- send_pty_instructions
- .send(PtyInstruction::SpawnTerminalHorizontally(None))
- .unwrap();
- }
- ApiCommand::SplitVertically => {
- send_pty_instructions
- .send(PtyInstruction::SpawnTerminalVertically(None))
- .unwrap();
- }
- ApiCommand::MoveFocus => {
- send_app_instructions
- .send(AppInstruction::ToScreen(
- ScreenInstruction::MoveFocus,
- ))
- .unwrap();
- }
- ApiCommand::ToPty(instruction) => {
- send_pty_instructions.send(instruction).unwrap();
- }
- ApiCommand::ToScreen(instruction) => {
- send_app_instructions
- .send(AppInstruction::ToScreen(instruction))
- .unwrap();
- }
- ApiCommand::ClosePluginPane(pid) => {
- send_app_instructions
- .send(AppInstruction::ToPlugin(PluginInstruction::Unload(
- pid,
- )))
- .unwrap();
- }
- ApiCommand::Quit => {
- send_pty_instructions.send(PtyInstruction::Quit).unwrap();
- break;
- }
- }
+ Ok(stream) => {
+ let send_app_instructions = send_app_instructions.clone();
+ let send_pty_instructions = send_pty_instructions.clone();
+ threads.push(thread::spawn(move || {
+ handle_stream(send_pty_instructions, send_app_instructions, stream);
+ }));
}
Err(err) => {
panic!("err {:?}", err);
@@ -186,7 +137,73 @@ pub fn start_server(
}
let _ = pty_thread.join();
+ for t in threads {
+ t.join();
+ }
}
})
.unwrap()
}
+
+fn handle_stream(
+ mut send_pty_instructions: SenderWithContext<PtyInstruction>,
+ mut send_app_instructions: SenderWithContext<AppInstruction>,
+ mut stream: std::os::unix::net::UnixStream,
+) {
+ //let mut buffer = [0; 65535]; // TODO: more accurate
+ let mut buffer = String::new();
+ loop {
+ let bytes = stream
+ .read_to_string(&mut buffer)
+ .expect("failed to parse ipc message");
+ //let astream = stream.try_clone().unwrap();
+ let (mut err_ctx, decoded): (ErrorContext, ApiCommand) =
+ bincode::deserialize(buffer.as_bytes()).expect("failed to deserialize ipc message");
+ err_ctx.add_call(ContextType::IPCServer);
+ send_pty_instructions.update(err_ctx);
+ send_app_instructions.update(err_ctx);
+
+ eprintln!("Server received {:?}", decoded);
+
+ match decoded {
+ ApiCommand::OpenFile(file_name) => {
+ let path = PathBuf::from(file_name);
+ send_pty_instructions
+ .send(PtyInstruction::SpawnTerminal(Some(path)))
+ .unwrap();
+ }
+ ApiCommand::SplitHorizontally => {
+ send_pty_instructions
+ .send(PtyInstruction::SpawnTerminalHorizontally(None))
+ .unwrap();
+ }
+ ApiCommand::SplitVertically => {
+ send_pty_instructions
+ .send(PtyInstruction::SpawnTerminalVertically(None))
+ .unwrap();
+ }
+ ApiCommand::MoveFocus => {
+ send_app_instructions
+ .send(AppInstruction::ToScreen(ScreenInstruction::MoveFocus))
+ .unwrap();
+ }
+ ApiCommand::ToPty(instruction) => {
+ send_pty_instructions.send(instruction).unwrap();
+ }
+ ApiCommand::ToScreen(instruction) => {
+ send_app_instructions
+ .send(AppInstruction::ToScreen(instruction))
+ .unwrap();
+ }
+ ApiCommand::ClosePluginPane(pid) => {
+ send_app_instructions
+ .send(AppInstruction::ToPlugin(PluginInstruction::Unload(pid)))
+ .unwrap();
+ }
+ ApiCommand::Quit => {
+ let _ = send_pty_instructions.send(PtyInstruction::Quit);
+ break;
+ }
+ }
+ }
+}