1
- #![ forbid( unsafe_code) ]
1
+ // #![forbid(unsafe_code)]
2
2
#![ deny( clippy:: cargo) ]
3
3
//TODO: remove once crossterm upgraded to current mio:
4
4
//https://github.com/crossterm-rs/crossterm/issues/432
@@ -29,7 +29,7 @@ use clap::{
29
29
crate_authors, crate_description, crate_name, crate_version,
30
30
App as ClapApp , Arg ,
31
31
} ;
32
- use crossbeam_channel:: { tick, unbounded, Receiver , Select } ;
32
+ use crossbeam_channel:: { tick, unbounded, Receiver , Select , Sender } ;
33
33
use crossterm:: {
34
34
terminal:: {
35
35
disable_raw_mode, enable_raw_mode, EnterAlternateScreen ,
@@ -58,6 +58,8 @@ use tui::{
58
58
static TICK_INTERVAL : Duration = Duration :: from_secs ( 5 ) ;
59
59
static SPINNER_INTERVAL : Duration = Duration :: from_millis ( 50 ) ;
60
60
61
+ static mut COMMANDS_CHANNEL : Option < Sender < QueueEvent > > = None ;
62
+
61
63
fn main ( ) -> Result < ( ) > {
62
64
process_cmdline ( ) ?;
63
65
@@ -75,6 +77,12 @@ fn main() -> Result<()> {
75
77
76
78
let mut terminal = start_terminal ( io:: stdout ( ) ) ?;
77
79
80
+ let ( tx_commands, rx_commands) = unbounded ( ) ;
81
+ // safety: the app hasn't started running yet, so this variable is not yet in use
82
+ unsafe {
83
+ COMMANDS_CHANNEL = Some ( tx_commands) ;
84
+ }
85
+
78
86
let ( tx_git, rx_git) = unbounded ( ) ;
79
87
80
88
let mut app = App :: new ( & tx_git) ;
@@ -94,6 +102,7 @@ fn main() -> Result<()> {
94
102
& rx_git,
95
103
& ticker,
96
104
& spinner_ticker,
105
+ & rx_commands,
97
106
) ?;
98
107
99
108
{
@@ -110,6 +119,9 @@ fn main() -> Result<()> {
110
119
needs_draw = false ;
111
120
spinner. update ( )
112
121
}
122
+ QueueEvent :: FullRedraw => {
123
+ terminal. resize ( terminal. size ( ) ?) ?
124
+ }
113
125
}
114
126
}
115
127
@@ -161,6 +173,7 @@ fn select_event(
161
173
rx_git : & Receiver < AsyncNotification > ,
162
174
rx_ticker : & Receiver < Instant > ,
163
175
rx_spinner : & Receiver < Instant > ,
176
+ rx_commands : & Receiver < QueueEvent > ,
164
177
) -> Result < Vec < QueueEvent > > {
165
178
let mut events: Vec < QueueEvent > = Vec :: new ( ) ;
166
179
@@ -170,6 +183,7 @@ fn select_event(
170
183
sel. recv ( rx_git) ;
171
184
sel. recv ( rx_ticker) ;
172
185
sel. recv ( rx_spinner) ;
186
+ sel. recv ( rx_commands) ;
173
187
174
188
let oper = sel. select ( ) ;
175
189
let index = oper. index ( ) ;
@@ -185,6 +199,7 @@ fn select_event(
185
199
3 => oper
186
200
. recv ( rx_spinner)
187
201
. map ( |_| events. push ( QueueEvent :: SpinnerUpdate ) ) ,
202
+ 4 => oper. recv ( rx_commands) . map ( |ev| events. push ( ev) ) ,
188
203
_ => return Err ( anyhow ! ( "unknown select source" ) ) ,
189
204
} ?;
190
205
0 commit comments