diff options
author | rabite <rabite@posteo.de> | 2019-02-21 21:41:52 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-02-22 00:46:41 +0100 |
commit | 3b38143f9bc758b10d76ebae39bca5a15350622b (patch) | |
tree | 687dfb1df38bb46d775623579e90ef00f46076ed /src/window.rs | |
parent | fe542047c231cff6c1959fe05cb51e177ddfbcc6 (diff) |
added on_ready support
Diffstat (limited to 'src/window.rs')
-rw-r--r-- | src/window.rs | 64 |
1 files changed, 59 insertions, 5 deletions
diff --git a/src/window.rs b/src/window.rs index 7535dbf..b31058d 100644 --- a/src/window.rs +++ b/src/window.rs @@ -1,5 +1,6 @@ use std::io::{stdin, stdout, Stdout, Write}; use std::sync::{Arc, Mutex}; +use std::sync::mpsc::{Sender, Receiver, channel}; use termion::event::{Event, Key}; use termion::input::TermRead; @@ -10,6 +11,18 @@ use crate::term::ScreenExt; use crate::coordinates::{Coordinates, Position, Size}; use crate::widget::Widget; +use crate::fail::HResult; + +lazy_static! { + static ref TX_EVENT: Arc<Mutex<Option<Sender<Events>>>> = { Arc::new(Mutex::new(None)) }; +} + + +#[derive(Debug)] +pub enum Events { + InputEvent(Event), + WidgetReady +} pub struct Window<T> where @@ -69,17 +82,58 @@ where // Self::show_status(""); // } + pub fn handle_input(&mut self) { - for event in stdin().events() { + let (tx_event_internal, rx_event_internal) = channel(); + let (tx_event, rx_event) = channel(); + *TX_EVENT.try_lock().unwrap() = Some(tx_event); + + event_thread(rx_event, tx_event_internal.clone()); + input_thread(tx_event_internal); + + for event in rx_event_internal.iter() { //Self::clear_status(); - let event = event.unwrap(); - self.widget.on_event(event); - self.screen.cursor_hide(); - self.draw(); + //let event = event.unwrap(); + dbg!(&event); + match event { + Events::InputEvent(event) => { + self.widget.on_event(event); + self.screen.cursor_hide(); + self.draw(); + } + _ => { + self.widget.refresh(); + self.draw(); + }, + } } } } +fn event_thread(rx: Receiver<Events>, tx: Sender<Events>) { + std::thread::spawn(move || { + for event in rx.iter() { + dbg!(&event); + tx.send(event).unwrap(); + } + }); +} + +fn input_thread(tx: Sender<Events>) { + std::thread::spawn(move || { + for input in stdin().events() { + let input = input.unwrap(); + tx.send(Events::InputEvent(input)).unwrap(); + } + }); +} + +pub fn send_event(event: Events) -> HResult<()> { + let tx = TX_EVENT.lock()?.clone()?.clone(); + tx.send(event)?; + Ok(()) +} + impl<T> Drop for Window<T> where T: Widget, |