From 5be2aa29e5d8ea799e04bd062de9a4180b1974e9 Mon Sep 17 00:00:00 2001 From: eatradish Date: Thu, 4 Dec 2025 18:03:57 +0800 Subject: [PATCH] feat(pb): use latency to render progress bar --- src/main.rs | 3 +++ src/pb.rs | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index e6daa6612..a7a54d583 100644 --- a/src/main.rs +++ b/src/main.rs @@ -75,6 +75,7 @@ static HTTP_CLIENT: LazyLock = LazyLock::new(|| { }); static WRITER: LazyLock = LazyLock::new(Writer::default); static LOCK: OnceLock = OnceLock::new(); +static LATENCY: OnceLock = OnceLock::new(); #[derive(Debug, Args)] pub struct GlobalOptions { @@ -526,6 +527,8 @@ fn init_color_formatter(oma: &OhManagerAilurus, config: &Config) { follow_term_color = true; } else if let Ok(latency) = termbg::latency(Duration::from_millis(1000)) { debug!("latency: {:?}", latency); + LATENCY.set(latency).expect("LATENCY must no set."); + if latency * 2 > timeout { debug!( "Terminal latency is too long, falling back to default terminal colors, latency: {:?}.", diff --git a/src/pb.rs b/src/pb.rs index f925604ca..037ea0d67 100644 --- a/src/pb.rs +++ b/src/pb.rs @@ -15,7 +15,9 @@ use oma_console::{ use oma_fetch::{Event, SingleDownloadError}; use reqwest::StatusCode; -use crate::{WRITER, error::Chain, fl, install_progress::osc94_progress, msg, utils::is_root}; +use crate::{ + LATENCY, WRITER, error::Chain, fl, install_progress::osc94_progress, msg, utils::is_root, +}; use crate::{color_formatter, error::OutputError}; use oma_refresh::db::Event as RefreshEvent; use oma_utils::human_bytes::HumanBytes; @@ -281,6 +283,12 @@ impl OmaMultiProgressBar { .insert(index + 1, ProgressBar::new(size).with_style(sty)); let total_width = total_width(total); pb.set_message(format!("({:>total_width$}/{total}) {msg}", index + 1)); + pb.enable_steady_tick( + LATENCY + .get() + .copied() + .unwrap_or_else(|| Duration::from_millis(100)), + ); self.pb_map.insert(index + 1, pb); } Event::ProgressInc { index, size } => { @@ -313,6 +321,12 @@ impl OmaMultiProgressBar { let pb = self .mb .insert(0, ProgressBar::new(total_size).with_style(sty)); + pb.enable_steady_tick( + LATENCY + .get() + .copied() + .unwrap_or_else(|| Duration::from_millis(100)), + ); self.pb_map.insert(0, pb); } Event::Failed { file_name, error } => {