11use std:: io;
22use std:: path;
33use std:: sync:: mpsc;
4+ use std:: sync:: mpsc:: Sender ;
45use std:: thread;
56
6- use signal_hook:: consts:: signal;
7- use signal_hook:: iterator:: exfiltrator:: SignalOnly ;
8- use signal_hook:: iterator:: SignalsInfo ;
9-
10- use termion:: event:: Event ;
11- use termion:: input:: TermRead ;
7+ use ratatui:: termion:: event:: Event ;
128
9+ use crate :: event:: input_listener:: TerminalInputListener ;
10+ use crate :: event:: SignalListener ;
1311use crate :: fs:: JoshutoDirList ;
1412
13+ pub type AppEventSender = Sender < AppEvent > ;
14+
1515#[ derive( Debug ) ]
1616pub enum AppEvent {
17- Termion ( Event ) ,
17+ TerminalEvent ( Event ) ,
1818 // preview thread events
1919 PreviewDir {
2020 path : path:: PathBuf ,
@@ -24,55 +24,36 @@ pub enum AppEvent {
2424 Server ( String ) ,
2525}
2626
27- #[ derive( Debug , Default , Clone , Copy ) ]
28- pub struct Config { }
29-
30- pub struct Events {
27+ pub struct AppEventListener {
3128 pub event_tx : mpsc:: Sender < AppEvent > ,
3229 event_rx : mpsc:: Receiver < AppEvent > ,
3330 pub input_tx : mpsc:: Sender < ( ) > ,
3431}
3532
36- impl Events {
33+ impl AppEventListener {
3734 pub fn new ( ) -> Self {
38- Events :: with_config ( )
35+ AppEventListener :: with_config ( )
3936 }
4037
4138 pub fn with_config ( ) -> Self {
4239 let ( input_tx, input_rx) = mpsc:: channel ( ) ;
4340 let ( event_tx, event_rx) = mpsc:: channel ( ) ;
4441
45- // edge case that starts off the input thread
46- let _ = input_tx. send ( ( ) ) ;
47-
4842 // signal thread
49- let event_tx2 = event_tx. clone ( ) ;
43+ let signal_listener = SignalListener :: new ( event_tx. clone ( ) ) ;
5044 let _ = thread:: spawn ( move || {
51- let sigs = vec ! [ signal:: SIGWINCH ] ;
52- let mut signals = SignalsInfo :: < SignalOnly > :: new ( & sigs) . unwrap ( ) ;
53- for signal in & mut signals {
54- if let Err ( e) = event_tx2. send ( AppEvent :: Signal ( signal) ) {
55- eprintln ! ( "Signal thread send err: {:#?}" , e) ;
56- return ;
57- }
58- }
45+ signal_listener. run ( ) ;
5946 } ) ;
6047
48+ // edge case that starts off the input thread
49+ let _ = input_tx. send ( ( ) ) ;
6150 // input thread
62- let event_tx2 = event_tx. clone ( ) ;
51+ let input_listener = TerminalInputListener :: new ( event_tx. clone ( ) , input_rx ) ;
6352 let _ = thread:: spawn ( move || {
64- let stdin = io:: stdin ( ) ;
65- let mut events = stdin. events ( ) ;
66-
67- loop {
68- let _ = input_rx. recv ( ) ;
69- if let Some ( Ok ( event) ) = events. next ( ) {
70- let _ = event_tx2. send ( AppEvent :: Termion ( event) ) ;
71- }
72- }
53+ input_listener. run ( ) ;
7354 } ) ;
7455
75- Events {
56+ AppEventListener {
7657 event_tx,
7758 event_rx,
7859 input_tx,
0 commit comments