From c929517b4918d9cf62a6b17f0f35a536c1f06d45 Mon Sep 17 00:00:00 2001 From: Breadway Date: Sun, 16 Aug 2026 00:26:07 +0800 Subject: [PATCH] Adopt bread_utils::screenshot_cli for --screenshot flags Use the crate for pair validation, settle delay, and canvas defaults in breadpad and breadman. breadman now depends on bread-utils v0.7.2 for screenshot_cli; existing hand-rolled argv parsing stays. --- Cargo.lock | 1 + breadman/Cargo.toml | 2 ++ breadman/src/main.rs | 25 +++++++++++++++---------- breadman/src/screenshot.rs | 8 ++------ breadpad/src/main.rs | 25 +++++++++++++++---------- breadpad/src/screenshot.rs | 8 ++------ 6 files changed, 37 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aad8b09..a56d75d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -353,6 +353,7 @@ dependencies = [ "anyhow", "bread-screenshots", "bread-theme", + "bread-utils", "breadpad-shared", "chrono", "dirs 5.0.1", diff --git a/breadman/Cargo.toml b/breadman/Cargo.toml index 553efa2..e1ae340 100644 --- a/breadman/Cargo.toml +++ b/breadman/Cargo.toml @@ -13,6 +13,8 @@ path = "src/main.rs" breadpad-shared = { path = "../breadpad-shared" } # Capture primitives for `--screenshot` mode — see src/screenshot.rs. bread-screenshots = { git = "https://git.breadway.dev/Breadway/bread-ecosystem", tag = "v0.7.2" } +# Shared `--screenshot` pair validation + settle delay (`screenshot_cli`). +bread-utils = { git = "https://git.breadway.dev/Breadway/bread-ecosystem", tag = "v0.7.2" } # `adw` implies `gtk`. Local chip/init shims remain in src/theme_widgets.rs. bread-theme = { git = "https://git.breadway.dev/Breadway/bread-ecosystem", tag = "v0.7.2", features = ["adw"] } libadwaita = { version = "0.9", features = ["v1_7"] } diff --git a/breadman/src/main.rs b/breadman/src/main.rs index 0a784f1..9ef3d86 100644 --- a/breadman/src/main.rs +++ b/breadman/src/main.rs @@ -20,6 +20,9 @@ mod views; // ── Args ───────────────────────────────────────────────────────────────────── mod args { + use bread_utils::screenshot_cli::{validate_pair, DEFAULT_HEIGHT, DEFAULT_WIDTH}; + use std::path::Path; + #[derive(Debug)] pub struct Args { pub view: Option, @@ -32,18 +35,20 @@ mod args { } impl Args { - /// `None` for a normal run. Exits the process with an error if - /// `--screenshot` was given without `--output`, before any GTK + /// `None` for a normal run. Exits the process with an error if the + /// `--screenshot` / `--output` pair is incomplete, before any GTK /// setup happens. pub fn screenshot_request(&self) -> Option { - let view = self.screenshot.clone()?; - let Some(output) = self.output.clone() else { - eprintln!("breadman: --screenshot requires --output"); + if let Err(e) = validate_pair( + self.screenshot.as_deref(), + self.output.as_deref().map(Path::new), + ) { + eprintln!("breadman: {e}"); std::process::exit(1); - }; + } Some(crate::screenshot::ScreenshotRequest { - view, - output: output.into(), + view: self.screenshot.clone()?, + output: self.output.clone()?.into(), width: self.width, height: self.height, }) @@ -57,8 +62,8 @@ mod args { upcoming_plain: false, screenshot: None, output: None, - width: 1920, - height: 1080, + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, }; let raw: Vec = std::env::args().skip(1).collect(); let mut i = 0; diff --git a/breadman/src/screenshot.rs b/breadman/src/screenshot.rs index 5b36c9d..a335369 100644 --- a/breadman/src/screenshot.rs +++ b/breadman/src/screenshot.rs @@ -19,6 +19,7 @@ //! the button/click-handler entirely), with no-op save/delete/error //! callbacks since nothing here should actually persist a change. +use bread_utils::screenshot_cli::SETTLE_DELAY; use gtk4::prelude::*; use libadwaita::prelude::*; use std::path::PathBuf; @@ -26,15 +27,10 @@ use std::rc::Rc; use std::sync::Arc; use std::time::Duration; -/// Extra settle time after `map` for the first frame to actually paint -/// before grim runs — `map` fires once the surface exists, not once -/// anything has been drawn into it. -const SETTLE_DELAY: Duration = Duration::from_millis(300); - /// Delay before popping the editor popover open — same reasoning as every /// other app's PRE_POPUP_DELAY: the parent window's own layout needs a beat /// to settle first. -const PRE_POPUP_DELAY: Duration = Duration::from_millis(300); +const PRE_POPUP_DELAY: Duration = SETTLE_DELAY; #[derive(Clone)] pub struct ScreenshotRequest { diff --git a/breadpad/src/main.rs b/breadpad/src/main.rs index def0c86..d61330b 100644 --- a/breadpad/src/main.rs +++ b/breadpad/src/main.rs @@ -51,6 +51,9 @@ fn init_ort_once(cfg: &Config) { } mod args { + use bread_utils::screenshot_cli::{validate_pair, DEFAULT_HEIGHT, DEFAULT_WIDTH}; + use std::path::Path; + #[derive(Debug)] pub struct Args { pub note_type: Option, @@ -69,18 +72,20 @@ mod args { } impl Args { - /// `None` for a normal run. Exits the process with an error if - /// `--screenshot` was given without `--output`, before any GTK + /// `None` for a normal run. Exits the process with an error if the + /// `--screenshot` / `--output` pair is incomplete, before any GTK /// setup happens. pub fn screenshot_request(&self) -> Option { - let view = self.screenshot.clone()?; - let Some(output) = self.output.clone() else { - eprintln!("breadpad: --screenshot requires --output"); + if let Err(e) = validate_pair( + self.screenshot.as_deref(), + self.output.as_deref().map(Path::new), + ) { + eprintln!("breadpad: {e}"); std::process::exit(1); - }; + } Some(crate::screenshot::ScreenshotRequest { - view, - output: output.into(), + view: self.screenshot.clone()?, + output: self.output.clone()?.into(), width: self.width, height: self.height, }) @@ -99,8 +104,8 @@ mod args { calendar_list_uid: None, screenshot: None, output: None, - width: 1920, - height: 1080, + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, listen: false, }; let raw: Vec = std::env::args().skip(1).collect(); diff --git a/breadpad/src/screenshot.rs b/breadpad/src/screenshot.rs index c90873e..98f5ab0 100644 --- a/breadpad/src/screenshot.rs +++ b/breadpad/src/screenshot.rs @@ -18,19 +18,15 @@ //! entirely), and "reminder-snooze" (the same window with its snooze //! popover open). +use bread_utils::screenshot_cli::SETTLE_DELAY; use gtk4::prelude::*; use std::path::PathBuf; use std::time::Duration; -/// Extra settle time after `map` for the first frame to actually paint -/// before grim runs — `map` fires once the surface exists, not once -/// anything has been drawn into it. -const SETTLE_DELAY: Duration = Duration::from_millis(300); - /// Delay before popping the snooze popover open — same reasoning as every /// other app's PRE_POPUP_DELAY: the parent window's own layout needs a beat /// to settle first. -const PRE_POPUP_DELAY: Duration = Duration::from_millis(300); +const PRE_POPUP_DELAY: Duration = SETTLE_DELAY; #[derive(Clone)] pub struct ScreenshotRequest {