diff --git a/bread-theme/src/bin/bread-theme.rs b/bread-theme/src/bin/bread-theme.rs
index e79d5c0..266ea9c 100644
--- a/bread-theme/src/bin/bread-theme.rs
+++ b/bread-theme/src/bin/bread-theme.rs
@@ -5,11 +5,26 @@
//!
//! bread-theme # same as `generate`
//! bread-theme generate # render + write the shared stylesheet
+//! bread-theme reload # re-render from the current pywal palette and
+//! # signal every running bread GUI to recolour
//! bread-theme path # print the stylesheet path
//! bread-theme print # render to stdout (no write)
use std::process::ExitCode;
+fn write_and_report(verb: &str) -> ExitCode {
+ match bread_theme::write_shared_css() {
+ Ok(path) => {
+ eprintln!("bread-theme: {verb} {}", path.display());
+ ExitCode::SUCCESS
+ }
+ Err(e) => {
+ eprintln!("bread-theme: failed to write stylesheet: {e}");
+ ExitCode::FAILURE
+ }
+ }
+}
+
fn main() -> ExitCode {
let cmd = std::env::args().nth(1).unwrap_or_else(|| "generate".into());
match cmd.as_str() {
@@ -21,21 +36,18 @@ fn main() -> ExitCode {
print!("{}", bread_theme::render());
ExitCode::SUCCESS
}
- "generate" => match bread_theme::write_shared_css() {
- Ok(path) => {
- eprintln!("bread-theme: wrote {}", path.display());
- ExitCode::SUCCESS
- }
- Err(e) => {
- eprintln!("bread-theme: failed to write stylesheet: {e}");
- ExitCode::FAILURE
- }
- },
+ "generate" => write_and_report("wrote"),
+ // `reload` is `generate` from the caller's view, but it's the verb to use
+ // after changing pywal colours: rewriting the file (atomic rename) trips
+ // the file monitor in every running bread GUI, so they all re-read the
+ // palette and recolour live — shared widgets *and* each app's own rules.
+ "reload" => write_and_report("reloaded"),
"-h" | "--help" | "help" => {
eprintln!(
"bread-theme — shared stylesheet generator\n\n\
- USAGE:\n bread-theme [generate|path|print]\n\n\
+ USAGE:\n bread-theme [generate|reload|path|print]\n\n\
generate render the pywal palette to the shared stylesheet (default)\n\
+ reload re-render and signal running bread GUIs to recolour live\n\
path print the stylesheet path ({})\n\
print render to stdout without writing",
bread_theme::shared_css_path().display()
@@ -43,7 +55,7 @@ fn main() -> ExitCode {
ExitCode::SUCCESS
}
other => {
- eprintln!("bread-theme: unknown command '{other}' (try generate|path|print)");
+ eprintln!("bread-theme: unknown command '{other}' (try generate|reload|path|print)");
ExitCode::FAILURE
}
}
diff --git a/bread-theme/src/gtk.rs b/bread-theme/src/gtk.rs
index 71f5306..aab7d01 100644
--- a/bread-theme/src/gtk.rs
+++ b/bread-theme/src/gtk.rs
@@ -7,6 +7,10 @@ use std::path::Path;
thread_local! {
static SHARED_PROVIDER: RefCell