From ab4d5828d5fd83109d679d618433bd892b108933 Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Thu, 26 Feb 2026 14:12:20 +0100 Subject: [PATCH] implemented tui for multiple fans --- src/sal/dell_xps_9380.rs | 3 ++- src/ui/dashboard.rs | 43 ++++++++++++++++++++++++++-------------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/sal/dell_xps_9380.rs b/src/sal/dell_xps_9380.rs index d167348..59c45a1 100644 --- a/src/sal/dell_xps_9380.rs +++ b/src/sal/dell_xps_9380.rs @@ -136,9 +136,10 @@ impl DellXps9380Guard { impl EnvironmentGuard for DellXps9380Guard { fn suppress(&mut self) -> Result<()> { - let services = ["tlp", "thermald"]; + let services = ["tlp", "thermald", "i8kmon"]; for s in services { if Command::new("systemctl").args(["is-active", "--quiet", s]).status()?.success() { + debug!("Suppressing service: {}", s); Command::new("systemctl").args(["stop", s]).status()?; self.stopped_services.push(s.to_string()); } diff --git a/src/ui/dashboard.rs b/src/ui/dashboard.rs index e6c93ee..9df3041 100644 --- a/src/ui/dashboard.rs +++ b/src/ui/dashboard.rs @@ -58,7 +58,7 @@ pub fn draw_dashboard( .direction(Direction::Vertical) .constraints([ Constraint::Length(10), // Gauges - Constraint::Length(3), // Cooling + Constraint::Min(4), // Cooling (Increased for multiple fans) Constraint::Length(3), // CPU State Constraint::Min(4), // Metadata ]) @@ -182,22 +182,35 @@ fn draw_cooling(f: &mut Frame, area: Rect, state: &TelemetryState) { let inner = block.inner(area); f.render_widget(block, area); - let fan_info = if state.fans.is_empty() { - "N/A".to_string() - } else { - state.fans.iter() - .map(|rpm| format!("{} RPM", rpm)) - .collect::>() - .join(" | ") - }; - - let info = Line::from(vec![ + let mut lines = Vec::new(); + + // Line 1: Tier + lines.push(Line::from(vec![ Span::styled(" Tier: ", Style::default().fg(C_LAVENDER)), Span::styled(&state.fan_tier, Style::default().fg(C_TEAL)), - Span::styled(" | ", Style::default().fg(C_LAVENDER)), - Span::styled(fan_info, Style::default().fg(C_TEXT)), - ]); - f.render_widget(Paragraph::new(info), inner); + ])); + + // Line 2+: Fans + if state.fans.is_empty() { + lines.push(Line::from(vec![ + Span::styled(" Fans: ", Style::default().fg(C_LAVENDER)), + Span::styled("N/A", Style::default().fg(C_SUBTEXT)), + ])); + } else if state.fans.len() == 1 { + lines.push(Line::from(vec![ + Span::styled(" Fan: ", Style::default().fg(C_LAVENDER)), + Span::styled(format!("{} RPM", state.fans[0]), Style::default().fg(C_TEXT)), + ])); + } else { + for (i, rpm) in state.fans.iter().enumerate() { + lines.push(Line::from(vec![ + Span::styled(format!(" Fan {}: ", i + 1), Style::default().fg(C_LAVENDER)), + Span::styled(format!("{} RPM", rpm), Style::default().fg(C_TEXT)), + ])); + } + } + + f.render_widget(Paragraph::new(lines), inner); } fn draw_cpu_state(f: &mut Frame, area: Rect, state: &TelemetryState) {