Use Action enum for Quit and detach instead of separate messages under ClientToServerMsg

This commit is contained in:
Kunal Mohan 2021-05-21 01:32:58 +05:30
parent 61aa104576
commit b8acf19071
6 changed files with 26 additions and 16 deletions

View File

@ -132,7 +132,9 @@ impl InputHandler {
let mut should_break = false;
match action {
Action::Quit => {
Action::Quit | Action::Detach => {
self.os_input
.send_to_server(ClientToServerMsg::Action(action));
self.exit();
should_break = true;
}

View File

@ -19,8 +19,7 @@ use zellij_utils::{
channels::{SenderType, SenderWithContext, SyncChannelWithContext},
consts::{SESSION_NAME, ZELLIJ_IPC_PIPE},
errors::{ClientContext, ContextType, ErrorInstruction},
input::config::Config,
input::options::Options,
input::{actions::Action, config::Config, options::Options},
ipc::{ClientAttributes, ClientToServerMsg, ServerToClientMsg},
};
@ -226,7 +225,7 @@ pub fn start_client(mut os_input: Box<dyn ClientOsApi>, opts: CliArgs, config: C
match client_instruction {
ClientInstruction::Exit => break,
ClientInstruction::Error(backtrace) => {
let _ = os_input.send_to_server(ClientToServerMsg::ClientExit);
let _ = os_input.send_to_server(ClientToServerMsg::Action(Action::Quit));
handle_error(backtrace);
}
ClientInstruction::ServerError(backtrace) => {
@ -248,7 +247,6 @@ pub fn start_client(mut os_input: Box<dyn ClientOsApi>, opts: CliArgs, config: C
}
}
let _ = os_input.send_to_server(ClientToServerMsg::ClientExit);
router_thread.join().unwrap();
// cleanup();

View File

@ -49,11 +49,9 @@ pub(crate) enum ServerInstruction {
impl From<ClientToServerMsg> for ServerInstruction {
fn from(instruction: ClientToServerMsg) -> Self {
match instruction {
ClientToServerMsg::ClientExit => ServerInstruction::ClientExit,
ClientToServerMsg::NewClient(pos, opts, options) => {
ServerInstruction::NewClient(pos, opts, options)
}
ClientToServerMsg::DetachSession => ServerInstruction::DetachSession,
_ => unreachable!(),
}
}

View File

@ -15,7 +15,13 @@ use zellij_utils::{
ipc::ClientToServerMsg,
};
fn route_action(action: Action, session: &SessionMetaData, os_input: &dyn ServerOsApi) {
fn route_action(
action: Action,
session: &SessionMetaData,
os_input: &dyn ServerOsApi,
to_server: &SenderWithContext<ServerInstruction>,
) -> bool {
let mut should_break = false;
match action {
Action::Write(val) => {
session
@ -182,9 +188,17 @@ fn route_action(action: Action, session: &SessionMetaData, os_input: &dyn Server
.send_to_screen(ScreenInstruction::UpdateTabName(c))
.unwrap();
}
Action::Quit => {
to_server.send(ServerInstruction::ClientExit).unwrap();
should_break = true;
}
Action::Detach => {
to_server.send(ServerInstruction::DetachSession).unwrap();
should_break = true;
}
Action::NoOp => {}
Action::Quit => panic!("Received unexpected action"),
}
should_break
}
pub(crate) fn route_thread_main(
@ -197,13 +211,11 @@ pub(crate) fn route_thread_main(
err_ctx.update_thread_ctx();
let rlocked_sessions = session_data.read().unwrap();
match instruction {
ClientToServerMsg::ClientExit | ClientToServerMsg::DetachSession => {
to_server.send(instruction.into()).unwrap();
break;
}
ClientToServerMsg::Action(action) => {
if let Some(rlocked_sessions) = rlocked_sessions.as_ref() {
route_action(action, rlocked_sessions, &*os_input);
if route_action(action, rlocked_sessions, &*os_input, &to_server) {
break;
}
}
}
ClientToServerMsg::TerminalResize(new_size) => {

View File

@ -65,4 +65,6 @@ pub enum Action {
CloseTab,
GoToTab(u32),
TabNameInput(Vec<u8>),
/// Detach session and exit
Detach,
}

View File

@ -54,11 +54,9 @@ pub enum ClientToServerMsg {
DetachSession(SessionId),
// Disconnect from the session we're connected to
DisconnectFromSession,*/
ClientExit,
TerminalResize(PositionAndSize),
NewClient(ClientAttributes, Box<CliArgs>, Box<Options>),
Action(Action),
DetachSession,
}
// Types of messages sent from the server to the client