summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcashmere <cashmere1337@riseup.net>2026-10-23 12:08:32 +0200
committercashmere <cashmere1337@riseup.net>2026-10-23 12:08:32 +0200
commitedd7d36cdc6f6e4be6d2b1e78ce8fd5b66485b92 (patch)
tree7e510ebd2ea83ea14846a2bde62e724b296acb67 /src
parent4901b5d77d73db59f0c1545719ec6d1404aad979 (diff)
downloadi3bar-mango-edd7d36cdc6f6e4be6d2b1e78ce8fd5b66485b92.tar.gz
display custom logo by userHEADmain
Diffstat (limited to 'src')
-rw-r--r--src/bar.rs21
-rw-r--r--src/config.rs2
-rw-r--r--src/icon.rs7
3 files changed, 30 insertions, 0 deletions
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<String>,
// 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<ca
fn resolve_icon(app_id: &str, bar_height: u32) -> Option<cairo::ImageSurface> {
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)
{