From 2c5704dcd0be53a0920ff371e83d15e057371c84 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Mon, 16 Jul 2018 13:36:28 +0300 Subject: [PATCH] Add resize on SIGWINCH --- Cargo.toml | 2 + src/bin.rs | 111 ++++++++++++++++++++------------- src/ui/components/mail.rs | 6 ++ src/ui/components/utilities.rs | 6 ++ src/ui/mod.rs | 2 + 5 files changed, 82 insertions(+), 45 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index aa7c19e1..9a809162 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,8 @@ encoding = "0.2.33" bitflags = "1.0" notify = "4.0.1" termion = "1.5.1" +chan = "0.1.21" +chan-signal = "0.3.1" [profile.release] #lto = true diff --git a/src/bin.rs b/src/bin.rs index 2c7a148b..e8f8a25f 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -31,6 +31,13 @@ use std::sync::mpsc::{sync_channel, SyncSender, Receiver}; use std::thread; use std::io::{stdout, stdin, }; +#[macro_use] +extern crate chan; +extern crate chan_signal; + +use chan_signal::Signal; + + fn main() { /* Lock all stdios */ let _stdout = stdout(); @@ -44,11 +51,14 @@ fn main() { - let (sender, receiver): (SyncSender, Receiver) = sync_channel(::std::mem::size_of::()); + let signal = chan_signal::notify(&[Signal::WINCH]); + + let (sender, receiver) = chan::sync(::std::mem::size_of::()); + { let sender = sender.clone(); thread::Builder::new().name("input-thread".to_string()).spawn(move || { - get_events(stdin, move | k| { sender.send(ThreadEvent::Input(k)).unwrap(); + get_events(stdin, move | k| { sender.send(ThreadEvent::Input(k)); })}).unwrap(); } @@ -73,18 +83,18 @@ fn main() { state.register_entity(status_bar); /* - let mut idxa = 0; - let mut idxm = 0; - let account_length = state.context.accounts.len(); - */ + let mut idxa = 0; + let mut idxm = 0; + let account_length = state.context.accounts.len(); + */ let mut mode: UIMode = UIMode::Normal; 'main: loop { /* - state.refresh_mailbox(idxa,idxm); - */ + state.refresh_mailbox(idxa,idxm); + */ /* - let folder_length = state.context.accounts[idxa].len(); - */ + let folder_length = state.context.accounts[idxa].len(); + */ state.render(); 'inner: loop { @@ -93,48 +103,59 @@ fn main() { state.rcv_event(e); } state.redraw(); - match receiver.recv().unwrap() { - ThreadEvent::Input(k) => { - match mode { - UIMode::Normal => { - match k { - Key::Char('q') | Key::Char('Q') => { - break 'main; + chan_select! { + receiver.recv() -> r => { + match r.unwrap() { + ThreadEvent::Input(k) => { + match mode { + UIMode::Normal => { + match k { + Key::Char('q') | Key::Char('Q') => { + break 'main; + }, + Key::Char(';') => { + mode = UIMode::Execute; + state.rcv_event(UIEvent { id: 0, event_type: UIEventType::ChangeMode(mode)}); + state.redraw(); + } + key => { + state.rcv_event(UIEvent { id: 0, event_type: UIEventType::Input(key)}); + state.redraw(); + }, + _ => {} + } }, - Key::Char(';') => { - mode = UIMode::Execute; - state.rcv_event(UIEvent { id: 0, event_type: UIEventType::ChangeMode(mode)}); - state.redraw(); - } - key => { - state.rcv_event(UIEvent { id: 0, event_type: UIEventType::Input(key)}); - state.redraw(); + UIMode::Execute => { + match k { + Key::Char('\n') | Key::Esc => { + mode = UIMode::Normal; + state.rcv_event(UIEvent { id: 0, event_type: UIEventType::ChangeMode(mode)}); + state.redraw(); + }, + k @ Key::Char(_) => { + state.rcv_event(UIEvent { id: 0, event_type: UIEventType::ExInput(k)}); + state.redraw(); + }, + _ => {}, + } }, - _ => {} } }, - UIMode::Execute => { - match k { - Key::Char('\n') | Key::Esc => { - mode = UIMode::Normal; - state.rcv_event(UIEvent { id: 0, event_type: UIEventType::ChangeMode(mode)}); - state.redraw(); - }, - k @ Key::Char(_) => { - state.rcv_event(UIEvent { id: 0, event_type: UIEventType::ExInput(k)}); - state.redraw(); - }, - _ => {}, - } + ThreadEvent::RefreshMailbox { name : n } => { + eprintln!("Refresh mailbox {}", n); + }, + ThreadEvent::UIEventType(e) => { + state.rcv_event(UIEvent { id: 0, event_type: e}); + state.render(); }, } }, - ThreadEvent::RefreshMailbox { name : n } => { - eprintln!("Refresh mailbox {}", n); - }, - ThreadEvent::UIEventType(e) => { - state.rcv_event(UIEvent { id: 0, event_type: e}); - state.render(); + signal.recv() -> signal => { + if let Some(Signal::WINCH) = signal { + state.update_size(); + state.render(); + state.redraw(); + } }, } } diff --git a/src/ui/components/mail.rs b/src/ui/components/mail.rs index 0b4a2e29..9d783d1c 100644 --- a/src/ui/components/mail.rs +++ b/src/ui/components/mail.rs @@ -373,6 +373,9 @@ impl Component for MailListing { UIEventType::ChangeMode(UIMode::Normal) => { self.dirty = true; }, + UIEventType::Resize => { + self.dirty = true; + }, _ => { }, } @@ -524,6 +527,9 @@ impl Component for AccountMenu { UIEventType::ChangeMode(UIMode::Normal) => { self.dirty = true; }, + UIEventType::Resize => { + self.dirty = true; + }, _ => { }, } diff --git a/src/ui/components/utilities.rs b/src/ui/components/utilities.rs index 9ef245c1..b7c33fb8 100644 --- a/src/ui/components/utilities.rs +++ b/src/ui/components/utilities.rs @@ -191,6 +191,9 @@ impl Component for Pager { UIEventType::ChangeMode(UIMode::Normal) => { self.dirty = true; }, + UIEventType::Resize => { + self.dirty = true; + }, _ => { }, } @@ -301,6 +304,9 @@ impl Component for StatusBar { self.dirty = true; self.ex_buffer.push(c); }, + UIEventType::Resize => { + self.dirty = true; + }, _ => {}, } } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index b22d0af1..f349df27 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -198,6 +198,8 @@ impl State { self.cols = termcols.unwrap_or(72) as usize; self.rows = termrows.unwrap_or(120) as usize; self.grid.resize(self.cols, self.rows, Cell::with_char(' ')); + + self.rcv_event(UIEvent { id: 0, event_type: UIEventType::Resize }); } pub fn redraw(&mut self) {