From edd7d36cdc6f6e4be6d2b1e78ce8fd5b66485b92 Mon Sep 17 00:00:00 2001 From: cashmere Date: Fri, 23 Oct 2026 12:08:32 +0200 Subject: display custom logo by user --- src/bar.rs | 21 +++++++++++++++++++++ src/config.rs | 2 ++ src/icon.rs | 7 +++++++ 3 files changed, 30 insertions(+) (limited to 'src') diff --git a/src/bar.rs b/src/bar.rs index 7530f2e..78b8e2e 100644 --- a/src/bar.rs +++ b/src/bar.rs @@ -297,6 +297,27 @@ impl Bar { // Display tags let mut offset_left = 0.0; + + // display custom logo set by user + if let Some(name) = &ss.config.logo && let Some(icon) = ss.icon_cache.get(name, self.height) + { + offset_left += 8.0; + let icon_size = height_f - 4.0; + let scale = icon_size / (icon.width() as f64).max(icon.height() as f64); + + let icon_w = icon.width() as f64 * scale; + let icon_h = icon.height() as f64 * scale; + cairo_ctx.save().unwrap(); + cairo_ctx.translate( + offset_left + (icon_size - icon_w) / 2.0, + (height_f - icon_h) / 2.0, + ); + cairo_ctx.scale(scale, scale); + cairo_ctx.set_source_surface(icon, 0.0, 0.0).unwrap(); + cairo_ctx.paint().unwrap(); + cairo_ctx.restore().unwrap(); + offset_left += icon_size + 8.0; + } self.tags_btns.clear(); for (i, (id, color, computed)) in self.tags_computed.iter().enumerate() { let left_joined = i != 0 && self.tags_computed[i - 1].1 == *color; diff --git a/src/config.rs b/src/config.rs index d354839..56b0e84 100644 --- a/src/config.rs +++ b/src/config.rs @@ -53,6 +53,7 @@ pub struct Config { pub blend: bool, pub show_mode: bool, pub start_hidden: bool, + pub logo: Option, // focused window pub focused_window: FocusedWindowConfig, // tray @@ -105,6 +106,7 @@ impl Default for Config { start_hidden: false, focused_window: FocusedWindowConfig::default(), + logo: None, tray: TrayConfig::default(), wm: WmConfig { diff --git a/src/icon.rs b/src/icon.rs index 1173629..a9b9769 100644 --- a/src/icon.rs +++ b/src/icon.rs @@ -49,6 +49,13 @@ fn resolve_tray_icon(name: &str, theme_path: &str, bar_height: u32) -> Option Option { let mut candidates = vec![app_id.to_string()]; + + if std::path::Path::new(app_id).is_file() + && let Ok(mut file) = std::fs::File::open(app_id) + && let Ok(surface) = cairo::ImageSurface::create_from_png(&mut file) + { + return Some(surface); + } if let Some(desktop_icon) = desktop_file_icon(app_id) && !candidates.contains(&desktop_icon) { -- cgit v1.3.1