use cnx::{ text::{Attributes, Font, Padding, PagerAttributes}, widgets::{ActiveWindowTitle, Clock, Pager}, Cnx, }; use thiserror::Error; use crate::{ config::Config, hlwm::{ color::{Color, X11Color}, command::CommandError, }, }; type Result = std::result::Result; #[derive(Debug, Error)] pub enum PanelError { #[error("command error: [{0}]")] CommandError(#[from] CommandError), #[error("io lib error: [{0}]")] IoError(#[from] std::io::Error), #[error("cnx panel error: [{0}]")] CnxPanelError(#[from] anyhow::Error), } pub fn panel(config: &Config) -> Result<()> { let font = Font::new(&config.font_pango); let font_bold = Font::new(&config.font_pango_bold); let (active, normal, text) = ( config .theme .active_color() .expect("could not get theme's active color"), config .theme .normal_color() .expect("could not get theme's normal color"), config .theme .text_color() .expect("could not get theme's text color"), ); let attr = Attributes { font: font.clone(), fg_color: text.into(), bg_color: Some(Color::BLACK.into()), padding: Padding::new(10.0, 10.0, 0.0, 0.0), }; let pager_attr = PagerAttributes { active_attr: Attributes { font: font_bold.clone(), fg_color: text.into(), bg_color: Some(active.into()), padding: Padding::new(8.0, 8.0, 0.0, 0.0), }, inactive_attr: Attributes { font: font.clone(), fg_color: Color::X11(X11Color::DimGray).into(), bg_color: Some(Color::BLACK.into()), padding: Padding::new(5.0, 5.0, 0.0, 0.0), }, non_empty_attr: Attributes { font: font.clone(), fg_color: text.into(), bg_color: Some(normal.into()), padding: Padding::new(5.0, 5.0, 0.0, 0.0), }, }; let mut cnx = Cnx::new(cnx::Position::Top); cnx.add_widget(Pager::new(pager_attr)); cnx.add_widget(ActiveWindowTitle::new(attr.clone())); cnx.add_widget(Clock::new( attr.clone(), Some(String::from("%H:%M %a %Y-%m-%d")), )); cnx.run()?; Ok(()) }