summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKunal Mohan <kunalmohan99@gmail.com>2021-05-13 18:37:59 +0530
committerKunal Mohan <kunalmohan99@gmail.com>2021-05-15 22:18:29 +0530
commit050d846b5e41851d4ff5e8a4bbd7f24c72754507 (patch)
treece50f8ab9e6e514e8503b2a52a37f0b640af236a
parent07ca0cbb11bbc0491e134c863cd8a6133c2a9cf1 (diff)
clean and exit on window close
-rw-r--r--.gitignore3
-rw-r--r--src/client/mod.rs27
-rw-r--r--src/common/os_input_output.rs11
-rw-r--r--src/main.rs8
-rw-r--r--src/tests/fakes.rs4
5 files changed, 29 insertions, 24 deletions
diff --git a/.gitignore b/.gitignore
index 541370214..433d02d7a 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 2fada5929..862c13ccf 100644
--- a/src/client/mod.rs
+++ b/src/client/mod.rs
@@ -132,15 +132,26 @@ pub fn start_client(mut os_input: Box<dyn ClientOsApi>, 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 5e7b3ce22..adde6fdff 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<dyn Fn()>);
+ fn handle_signals(&self, sigwinch_cb: Box<dyn Fn()>, quit_cb: Box<dyn Fn()>);
/// 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<dyn Fn()>) {
- let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap();
+ fn handle_signals(&self, sigwinch_cb: Box<dyn Fn()>, quit_cb: Box<dyn Fn()>) {
+ 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 2430d84a7..49e42ffbf 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 62375914f..98ec694a7 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<dyn Fn()>) {
+ fn handle_signals(&self, sigwinch_cb: Box<dyn Fn()>, _quit_cb: Box<dyn Fn()>) {
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) {}