Timeout-guard hyprctl JSON queries
hyprctl_json used a bare Command::new("hyprctl").output() with no timeout,
used by every geometry_* helper (region/output/window/active_window/
active_output selection) — an unresponsive hyprctl could block screenshot
capture indefinitely. Switched to bread_utils::proc::run_json (path
dependency for now, see the TODO in Cargo.toml).
grim/slurp/wl-copy calls deliberately left untouched: several pipe binary
image data through stdin/stdout (e.g. grim -> wl-copy), which
bread_utils::proc's current run_with_stdin only accepts as &str — adapting
those safely would need a bytes-flavored variant, out of scope for this
pass to avoid risking a regression in image piping.
This commit is contained in:
parent
08c27d1b22
commit
5e4cbc83c9
3 changed files with 15 additions and 6 deletions
10
Cargo.lock
generated
10
Cargo.lock
generated
|
|
@ -82,11 +82,21 @@ version = "1.5.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
|
checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bread-utils"
|
||||||
|
version = "0.2.3"
|
||||||
|
dependencies = [
|
||||||
|
"dirs",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "breadshot"
|
name = "breadshot"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
"bread-utils",
|
||||||
"chrono",
|
"chrono",
|
||||||
"clap",
|
"clap",
|
||||||
"dirs",
|
"dirs",
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@ serde_json = "1"
|
||||||
toml = "0.8"
|
toml = "0.8"
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||||
|
# TODO(owner): switch to tag-pinned git dependency once bread-utils is merged and tagged, matching the bread-theme pattern
|
||||||
|
bread-utils = { path = "../bread-ecosystem-fix-worktree/bread-utils" }
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
lto = "thin"
|
lto = "thin"
|
||||||
|
|
|
||||||
|
|
@ -303,12 +303,9 @@ fn send_notification(title: &str, msg: &str, timeout: u32, path: &Path) {
|
||||||
// --- helpers ---
|
// --- helpers ---
|
||||||
|
|
||||||
fn hyprctl_json(subcmd: &str) -> Result<Value> {
|
fn hyprctl_json(subcmd: &str) -> Result<Value> {
|
||||||
let out = Command::new("hyprctl")
|
// Was a bare Command::new("hyprctl").output() with no timeout.
|
||||||
.args(["-j", subcmd])
|
bread_utils::proc::run_json("hyprctl", &["-j", subcmd], std::time::Duration::from_secs(3))
|
||||||
.output()
|
.with_context(|| format!("running/parsing hyprctl {subcmd}"))
|
||||||
.context("running hyprctl")?;
|
|
||||||
serde_json::from_slice(&out.stdout)
|
|
||||||
.with_context(|| format!("parsing hyprctl {subcmd} output"))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn slurp(args: &[&str]) -> Result<String> {
|
fn slurp(args: &[&str]) -> Result<String> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue