summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2019-09-09 12:53:39 +0300
committerManos Pitsidianakis <el13635@mail.ntua.gr>2019-09-15 13:21:14 +0300
commit81a55abc7c106ce3dfbef8ab98b7532a722edb00 (patch)
tree320182d76bcd3da0407b8cc3c8809f606e5dfbe4 /src
parentecb3fd7f3d5bab2a6f0f7592d2f45928d90fdf56 (diff)
Update crossbeam to 0.7.2 and remove chan
Diffstat (limited to 'src')
-rw-r--r--src/bin.rs53
1 files changed, 35 insertions, 18 deletions
diff --git a/src/bin.rs b/src/bin.rs
index f5883a42..5c159fbb 100644
--- a/src/bin.rs
+++ b/src/bin.rs
@@ -39,15 +39,23 @@ use ui;
pub use melib::*;
pub use ui::*;
-#[macro_use]
-extern crate chan;
-use chan_signal;
-
-use chan_signal::Signal;
-
use nix;
+use std::os::raw::c_int;
use xdg;
+fn notify(
+ signals: &[c_int],
+) -> std::result::Result<crossbeam::channel::Receiver<c_int>, std::io::Error> {
+ let (s, r) = crossbeam::channel::bounded(100);
+ let signals = signal_hook::iterator::Signals::new(signals)?;
+ std::thread::spawn(move || {
+ for signal in signals.forever() {
+ s.send(signal).unwrap();
+ }
+ });
+ Ok(r)
+}
+
macro_rules! error_and_exit {
($($err:expr),*) => {{
eprintln!($($err),*);
@@ -63,7 +71,7 @@ struct CommandLineArguments {
version: bool,
}
-fn main() {
+fn main() -> std::result::Result<(), std::io::Error> {
enum CommandLineFlags {
CreateConfig,
Config,
@@ -168,7 +176,12 @@ fn main() {
}
/* Catch SIGWINCH to handle terminal resizing */
- let signal = chan_signal::notify(&[Signal::WINCH]);
+ let signals = &[
+ /* Catch SIGWINCH to handle terminal resizing */
+ signal_hook::SIGWINCH,
+ ];
+
+ let signal_recvr = notify(signals)?;
/* Create the application State. This is the 'System' part of an ECS architecture */
let mut state = State::new();
@@ -206,8 +219,8 @@ fn main() {
state.redraw();
/* Poll on all channels. Currently we have the input channel for stdin, watching events and the signal watcher. */
- chan_select! {
- receiver.recv() -> r => {
+ crossbeam::select! {
+ recv(receiver) -> r => {
match debug!(r.unwrap()) {
ThreadEvent::Input(Key::Ctrl('z')) => {
state.switch_to_main_screen();
@@ -290,16 +303,19 @@ fn main() {
},
}
},
- signal.recv() -> signal => {
- if state.mode != UIMode::Fork {
- if let Some(Signal::WINCH) = signal {
- state.update_size();
- state.render();
- state.redraw();
- }
+ recv(signal_recvr) -> sig => {
+ match sig.unwrap() {
+ signal_hook::SIGWINCH => {
+ if state.mode != UIMode::Fork {
+ state.update_size();
+ state.render();
+ state.redraw();
+ }
+ },
+ _ => {}
}
},
- worker_receiver.recv() -> _ => {
+ recv(worker_receiver) -> _ => {
/* Some worker thread finished their job, acknowledge
* it and move on*/
},
@@ -327,4 +343,5 @@ fn main() {
}
}
}
+ Ok(())
}