Skip to content

Commit 48c4bbd

Browse files
committed
Support for disabling the cursor in the pretty line renderer
1 parent 1f1b725 commit 48c4bbd

File tree

5 files changed

+69
-8
lines changed

5 files changed

+69
-8
lines changed

Diff for: Cargo.lock

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ doctest = false
2323

2424
[features]
2525
default = ["max"]
26+
2627
max = ["fast", "pretty-cli", "prodash/tui-renderer-crossterm", "prodash-line-renderer-crossterm"]
2728
max-termion = ["fast", "pretty-cli", "prodash/tui-renderer-termion", "prodash-line-renderer-termion"]
2829
lean = ["fast", "lean-cli", "prodash-line-renderer-crossterm"]
@@ -37,6 +38,7 @@ pretty-cli = ["structopt",
3738
"prodash/log-renderer",
3839
"prodash-tui-renderer",
3940
"prodash-line-renderer",
41+
"ctrlc",
4042
"prodash/localtime",
4143
"env_logger",
4244
"smol"]
@@ -63,6 +65,7 @@ smol = { version = "0.1.18", optional = true, default-features = false }
6365
atty = { version = "0.2.14", optional = true, default-features = false }
6466
env_logger = { version = "0.7.1", optional = true, default-features = false, features = ["humantime", "termcolor", "atty"] }
6567
crosstermion = { version = "0.1.5", optional = true, default-features = false }
68+
ctrlc = { version = "3.1.4", optional = true, default-features = false, features = ['termination'] }
6669

6770
[profile.release]
6871
overflow-checks = false

Diff for: src/plumbing/lean.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ fn prepare(verbose: bool, name: &str) -> (Option<prodash::line::JoinHandle>, Opt
5959
if verbose {
6060
let progress = prodash::Tree::new();
6161
let sub_progress = progress.add_child(name);
62-
let handle = crate::shared::setup_line_renderer(progress, 2);
62+
let handle = crate::shared::setup_line_renderer(progress, 2, false);
6363
(Some(handle), Some(sub_progress))
6464
} else {
6565
(None, None)

Diff for: src/plumbing/pretty.rs

+29-6
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,34 @@ fn prepare_and_run<T: Send + 'static>(
7070
match (verbose, progress) {
7171
(false, false) => run(None, &mut stdout(), &mut stderr()),
7272
(true, false) => {
73+
enum Event<T> {
74+
UIDone,
75+
ComputationDone(Result<T>),
76+
};
7377
let progress = prodash::Tree::new();
7478
let sub_progress = progress.add_child(name);
75-
let _handle = crate::shared::setup_line_renderer(progress, 2);
76-
run(Some(sub_progress), &mut stdout(), &mut stderr())
79+
let (tx, rx) = std::sync::mpsc::sync_channel::<Event<T>>(1);
80+
let ui_handle = crate::shared::setup_line_renderer(progress, 2, true);
81+
ctrlc::set_handler({
82+
let tx = tx.clone();
83+
move || {
84+
tx.send(Event::UIDone).ok();
85+
}
86+
})?;
87+
std::thread::spawn(move || {
88+
let res = run(Some(sub_progress), &mut stdout(), &mut stderr());
89+
tx.send(Event::ComputationDone(res)).ok();
90+
});
91+
match rx.recv()? {
92+
Event::UIDone => {
93+
ui_handle.shutdown_and_wait();
94+
Err(anyhow!("Operation cancelled by user"))
95+
}
96+
Event::ComputationDone(res) => {
97+
ui_handle.shutdown_and_wait();
98+
res
99+
}
100+
}
77101
}
78102
(true, true) | (false, true) => {
79103
enum Event<T> {
@@ -109,15 +133,14 @@ fn prepare_and_run<T: Send + 'static>(
109133
let res = run(Some(sub_progress), &mut out, &mut err);
110134
tx.send(Event::ComputationDone(res, out, err)).ok();
111135
});
112-
match rx.recv() {
113-
Ok(Event::UIDone) => Err(anyhow!("Operation cancelled by user")),
114-
Ok(Event::ComputationDone(res, out, err)) => {
136+
match rx.recv()? {
137+
Event::UIDone => Err(anyhow!("Operation cancelled by user")),
138+
Event::ComputationDone(res, out, err) => {
115139
ui_handle.join().ok();
116140
stdout().write_all(&out)?;
117141
stderr().write_all(&err)?;
118142
res
119143
}
120-
_ => Err(anyhow!("Error communicating with threads")),
121144
}
122145
}
123146
}

Diff for: src/shared.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
pub const DEFAULT_FRAME_RATE: f32 = 6.0;
33

44
#[cfg(feature = "prodash-line-renderer")]
5-
pub fn setup_line_renderer(progress: prodash::Tree, level: prodash::tree::Level) -> prodash::line::JoinHandle {
5+
pub fn setup_line_renderer(
6+
progress: prodash::Tree,
7+
level: prodash::tree::Level,
8+
hide_cursor: bool,
9+
) -> prodash::line::JoinHandle {
610
let output_is_terminal = atty::is(atty::Stream::Stderr);
711
prodash::line::render(
812
std::io::stderr(),
@@ -14,6 +18,7 @@ pub fn setup_line_renderer(progress: prodash::Tree, level: prodash::tree::Level)
1418
output_is_terminal,
1519
colored: output_is_terminal && crosstermion::color::allowed(),
1620
timestamp: true,
21+
hide_cursor,
1722
..prodash::line::Options::default()
1823
},
1924
)

0 commit comments

Comments
 (0)