summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs43
1 files changed, 37 insertions, 6 deletions
diff --git a/src/main.rs b/src/main.rs
index 1afee8f..779c984 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -26,6 +26,10 @@ use crossbeam::channel::{bounded, tick};
use crossbeam::select;
use libc::c_int;
use std::io::Error;
+use std::sync::{
+ atomic::{AtomicBool, AtomicPtr},
+ Arc,
+};
use std::time::Duration;
//#[allow(dead_code)]
@@ -131,8 +135,24 @@ pub mod username {
}
}
-fn notify(signals: &[c_int]) -> Result<crossbeam::channel::Receiver<c_int>, Error> {
+fn notify(
+ signals: &[c_int],
+ exit_flag: Arc<AtomicBool>,
+ state: Arc<AtomicPtr<StateStdout>>,
+) -> Result<crossbeam::channel::Receiver<c_int>, Error> {
let (s, r) = bounded(100);
+ let _s = s.clone();
+ let sigint_handler = move |_info: &nix::libc::siginfo_t| {
+ if exit_flag.load(std::sync::atomic::Ordering::SeqCst) {
+ crate::state::restore_to_main_screen(state.clone());
+ std::process::exit(130);
+ }
+ exit_flag.store(true, std::sync::atomic::Ordering::SeqCst);
+ let _ = _s.send(signal_hook::SIGINT);
+ };
+ unsafe {
+ signal_hook_registry::register_sigaction(signal_hook::SIGINT, sigint_handler)?;
+ }
let signals = signal_hook::iterator::Signals::new(signals)?;
std::thread::spawn(move || {
for signal in signals.forever() {
@@ -143,21 +163,28 @@ fn notify(signals: &[c_int]) -> Result<crossbeam::channel::Receiver<c_int>, Erro
}
fn main() -> Result<(), Error> {
+ /* Create the application State */
+ let mut state = UIState::new();
+
let signals = &[
+ /*
signal_hook::SIGALRM,
signal_hook::SIGTERM,
signal_hook::SIGINT,
signal_hook::SIGQUIT,
+ */
/* Catch SIGWINCH to handle terminal resizing */
signal_hook::SIGWINCH,
];
let ticker = tick(Duration::from_millis(1600));
- let signal_recvr = notify(signals)?;
-
- /* Create the application State */
- let mut state = UIState::new();
+ let exit_flag: Arc<AtomicBool> = Arc::new(AtomicBool::new(false));
+ let signal_recvr = notify(
+ signals,
+ exit_flag.clone(),
+ state.stdout.as_ref().unwrap().clone(),
+ )?;
let receiver = state.receiver();
let window = Box::new(Window::new(
@@ -177,13 +204,17 @@ fn main() -> Result<(), Error> {
state.redraw(true);
},
recv(signal_recvr) -> sig => {
- eprintln!("got signal {:?}", sig);
match sig.unwrap() {
signal_hook::SIGWINCH => {
state.update_size();
state.render();
state.redraw(true);
},
+ signal_hook::SIGINT => {
+
+ drop(state);
+ break 'main;
+ }
_ => {}
}
},