diff --git a/Cargo.lock b/Cargo.lock index aa34dc1..cb922a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -109,7 +109,7 @@ checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" [[package]] name = "bread-theme" version = "0.2.3" -source = "git+https://github.com/Breadway/bread-ecosystem?tag=v0.2.8#77417d552130281ff787e07d52541eb25e9d533b" +source = "git+https://github.com/Breadway/bread-ecosystem?tag=v0.2.6#0c8c5c00e435fedff4f81e36d603424c153519a9" dependencies = [ "dirs", "gtk4", diff --git a/Cargo.toml b/Cargo.toml index 0950f3a..f647dba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ keywords = ["wayland", "hyprland", "bar", "status-bar", "gtk4"] categories = ["gui"] [dependencies] -bread-theme = { git = "https://github.com/Breadway/bread-ecosystem", tag = "v0.2.8", features = ["gtk"] } +bread-theme = { git = "https://github.com/Breadway/bread-ecosystem", tag = "v0.2.6", features = ["gtk"] } gtk4 = { version = "0.11", features = ["v4_12"] } gtk4-layer-shell = "0.8" relm4 = { version = "0.11", features = ["macros"] } diff --git a/src/theme.rs b/src/theme.rs index e02ed01..820b69a 100644 --- a/src/theme.rs +++ b/src/theme.rs @@ -1,8 +1,9 @@ -use bread_theme::{gtk as bgtk, hex_to_rgba, ink_on, load_palette}; +use bread_theme::{gtk as bgtk, hex_to_rgba, load_palette}; use gtk4::CssProvider; use std::cell::RefCell; thread_local! { + static PROVIDER: RefCell> = const { RefCell::new(None) }; static USER_PROVIDER: RefCell> = const { RefCell::new(None) }; } @@ -10,59 +11,52 @@ fn load_css() -> String { let p = load_palette(); // breadbar-specific rules only — fonts, base colours, and generic widgets // come from the shared ecosystem stylesheet (applied first in `apply()`). - // Colour is set on each surface (bar, active workspace pill, notification - // card) and child labels inherit it, so text stays legible whatever lightness - // pywal hands a given slot. `on_*` are luminance-picked ink (black/white) for - // that background — the pywal hues themselves are untouched. format!( - "window.breadbar {{ background-color: {bg_rgba}; color: {on_bg}; border-radius: 0; }}\ - .workspace-btn {{ background: transparent; opacity: 0.45;\ + "window.breadbar {{ background-color: {bg_rgba}; border-radius: 0; }}\ + label {{ color: {fg}; }}\ + .workspace-btn {{ background: transparent; color: {fg}; opacity: 0.45;\ border-radius: 0; border: none; outline: none; box-shadow: none;\ min-width: 24px; padding: 4px 8px; }}\ .workspace-btn:hover {{ opacity: 0.8; }}\ - .workspace-btn.active {{ background: {accent}; color: {on_accent}; opacity: 1; }}\ + .workspace-btn.active {{ background: {accent}; opacity: 1; }}\ .stats-box {{ margin-right: 8px; }}\ .stat-pair {{ margin-right: 12px; }}\ .stat-icon {{ margin-right: 5px; }}\ .bt-icon {{ margin-right: 12px; }}\ - window.breadbar-notification {{ background-color: alpha({bg_plain}, 0.95); color: {on_bg}; }}\ - .notification-card {{ background: {surface}; color: {on_surface}; border-radius: 8px;\ + window.breadbar-notification {{ background-color: alpha({bg_plain}, 0.95); }}\ + .notification-card {{ background: {surface}; border-radius: 8px;\ padding: 12px; margin-bottom: 8px; }}\ - .notification-summary {{ font-weight: bold; }}\ - .notification-app {{ opacity: 0.6; }}\ - window.breadbar-osd {{ background-color: alpha({bg_plain}, 0.95); color: {on_bg}; border-radius: 8px; }}\ - .osd-kind {{ opacity: 0.75; font-size: 12px; }}\ - .osd-pct {{ font-weight: bold; font-size: 12px; }}\ + .notification-summary {{ font-weight: bold; color: {fg}; }}\ + .notification-app {{ color: {fg}; opacity: 0.6; }}\ + .notification-body {{ color: {fg}; }}\ + window.breadbar-osd {{ background-color: alpha({bg_plain}, 0.95); border-radius: 8px; }}\ + .osd-kind {{ color: {fg}; opacity: 0.75; font-size: 12px; }}\ + .osd-pct {{ color: {fg}; font-weight: bold; font-size: 12px; }}\ progressbar.osd-bar {{ min-height: 8px; }}\ progressbar.osd-bar trough {{ background-image: none; background-color: {trough}; border-radius: 4px; min-height: 8px; }}\ progressbar.osd-bar trough progress {{ background-image: none; background-color: {accent}; border-radius: 4px; min-height: 8px; }}", - bg_plain = p.background, - bg_rgba = hex_to_rgba(&p.background, 0.92), - surface = p.color0, - accent = p.color4, - on_bg = ink_on(&p.background), - on_surface = ink_on(&p.color0), - on_accent = ink_on(&p.color4), - trough = hex_to_rgba(&p.color4, 0.25), + bg_plain = p.background, + bg_rgba = hex_to_rgba(&p.background, 0.92), + surface = p.color0, + fg = p.foreground, + accent = p.color4, + trough = hex_to_rgba(&p.color4, 0.25), ) } -/// Returns the ink colour for icon tinting in the stats bar — the same -/// luminance-picked colour the bar's text uses, so icons stay legible on the bar -/// whatever lightness pywal gives the background. +/// Returns the current foreground colour (used for icon tinting in the stats bar). pub fn fg_color() -> String { - ink_on(&load_palette().background).to_string() + load_palette().foreground } /// Apply (or reload) the theme CSS. Safe to call from `glib::MainContext::invoke`. pub fn apply() { // Shared ecosystem base (fonts, palette, generic widgets) — applied first - // (and self-reloading) so breadbar's own rules below layer on top. + // so breadbar's own rules below layer on top. bgtk::apply_shared(); - // breadbar's own rules, hot-reloaded on `bread-theme reload`: the closure - // re-reads the pywal palette each time so the bar recolours without restart. - bgtk::apply_app_css(load_css); + let css = load_css(); + PROVIDER.with(|cell| bgtk::apply_css(&css, cell)); let home = std::env::var("HOME").unwrap_or_default(); let user_path = std::path::PathBuf::from(format!("{home}/.config/breadbar/style.css"));