From 050d846b5e41851d4ff5e8a4bbd7f24c72754507 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 13 May 2021 18:37:59 +0530 Subject: [PATCH] clean and exit on window close --- .gitignore | 3 ++- src/client/mod.rs | 27 +++++++++++++++++++-------- src/common/os_input_output.rs | 11 ++++++----- src/main.rs | 8 -------- src/tests/fakes.rs | 4 ++-- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 541370214a..433d02d7a1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ .vscode .vim .DS_Store -/assets/man/zellij.1 \ No newline at end of file +/assets/man/zellij.1 +**/target \ No newline at end of file diff --git a/src/client/mod.rs b/src/client/mod.rs index 2fada59292..862c13ccf0 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -132,15 +132,26 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C .name("signal_listener".to_string()) .spawn({ let os_input = os_input.clone(); + let send_client_instructions = send_client_instructions.clone(); move || { - os_input.receive_sigwinch(Box::new({ - let os_api = os_input.clone(); - move || { - os_api.send_to_server(ClientToServerMsg::TerminalResize( - os_api.get_terminal_size_using_fd(0), - )); - } - })); + os_input.handle_signals( + Box::new({ + let os_api = os_input.clone(); + move || { + os_api.send_to_server(ClientToServerMsg::TerminalResize( + os_api.get_terminal_size_using_fd(0), + )); + } + }), + Box::new({ + let send_client_instructions = send_client_instructions.clone(); + move || { + send_client_instructions + .send(ClientInstruction::Exit) + .unwrap() + } + }), + ); } }) .unwrap(); diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 5e7b3ce221..adde6fdff2 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -314,7 +314,7 @@ pub trait ClientOsApi: Send + Sync { /// Receives a message on client-side IPC channel // This should be called from the client-side router thread only. fn recv_from_server(&self) -> (ServerToClientMsg, ErrorContext); - fn receive_sigwinch(&self, cb: Box); + fn handle_signals(&self, sigwinch_cb: Box, quit_cb: Box); /// Establish a connection with the server socket. fn connect_to_server(&self, path: &Path); } @@ -362,14 +362,15 @@ impl ClientOsApi for ClientOsInputOutput { .unwrap() .recv() } - fn receive_sigwinch(&self, cb: Box) { - let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap(); + fn handle_signals(&self, sigwinch_cb: Box, quit_cb: Box) { + let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT, SIGHUP]).unwrap(); for signal in signals.forever() { match signal { SIGWINCH => { - cb(); + sigwinch_cb(); } - SIGTERM | SIGINT | SIGQUIT => { + SIGTERM | SIGINT | SIGQUIT | SIGHUP => { + quit_cb(); break; } _ => unreachable!(), diff --git a/src/main.rs b/src/main.rs index 2430d84a7f..49e42ffbfa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,13 +24,6 @@ use std::convert::TryFrom; pub fn main() { let opts = CliArgs::from_args(); - let config = match Config::try_from(&opts) { - Ok(config) => config, - Err(e) => { - eprintln!("There was an error in the config file:\n{}", e); - std::process::exit(1); - } - }; if let Some(crate::cli::ConfigCli::Setup(setup)) = opts.option.clone() { Setup::from_cli(&setup, opts).expect("Failed to print to stdout"); @@ -43,7 +36,6 @@ pub fn main() { std::process::exit(1); } }; - let config_options = Options::from_cli(&config.options, opts.option.clone()); atomic_create_dir(&*ZELLIJ_TMP_DIR).unwrap(); atomic_create_dir(&*ZELLIJ_TMP_LOG_DIR).unwrap(); if let Some(path) = opts.server { diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 62375914f8..98ec694a7f 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -204,7 +204,7 @@ impl ClientOsApi for FakeInputOutput { .recv() .unwrap() } - fn receive_sigwinch(&self, cb: Box) { + fn handle_signals(&self, sigwinch_cb: Box, _quit_cb: Box) { if self.sigwinch_event.is_some() { let (lock, cvar) = &*self.should_trigger_sigwinch; { @@ -213,7 +213,7 @@ impl ClientOsApi for FakeInputOutput { should_trigger_sigwinch = cvar.wait(should_trigger_sigwinch).unwrap(); } } - cb(); + sigwinch_cb(); } } fn connect_to_server(&self, _path: &std::path::Path) {}