Compare commits

..

4 commits
v0.3.3 ... main

Author SHA1 Message Date
Breadway
297207a7aa notifications: stop toast popups from stealing focus or blocking clicks
All checks were successful
dev release / build (push) Successful in 1m42s
Toasts never grab keyboard focus and pass every pointer event through
to whatever's underneath, via an empty layer-shell input region.
2026-08-24 13:11:20 +08:00
Breadway
3049a20be3 gitignore: exclude graphify-out local tool cache
All checks were successful
dev release / build (push) Successful in 1m7s
2026-08-23 15:07:51 +08:00
Breadway
700fc3ed16 Unify bread-ecosystem crate pins at v0.7.4
bread-theme was already pinned to v0.7.4 while bread-utils and
bread-screenshots trailed at v0.7.2, even though bread-ecosystem locks
all workspace packages together as of a9754d9. Bump the two lagging
pins so all three crates from that repo resolve to the same tag/commit.

(cherry picked from commit f0de82aafb547134e0edc9dac8d72c01586db57c)
2026-08-23 15:07:51 +08:00
Breadway
9c4205b1b2 clippy: fix char-comparison and map_or lints
All checks were successful
dev release / build (push) Successful in 1m52s
(cherry picked from commit 2e393082a744fe85f1ca1f8c6af48ce288e64b6c)
2026-08-23 14:57:51 +08:00
6 changed files with 21 additions and 11 deletions

3
.gitignore vendored
View file

@ -35,3 +35,6 @@ logs/
# Internal design documents (not for distribution)
aster-brief.md
# graphify knowledge-graph output (local tool cache, not for commit)
graphify-out/

8
Cargo.lock generated
View file

@ -152,8 +152,8 @@ checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
[[package]]
name = "bread-screenshots"
version = "0.7.2"
source = "git+https://git.breadway.dev/Breadway/bread-ecosystem?tag=v0.7.2#30517f161724132cdeb658c04cf5e490be07ee73"
version = "0.7.4"
source = "git+https://git.breadway.dev/Breadway/bread-ecosystem?tag=v0.7.4#a9754d90ed32efcc26765abd01c9f441bfb01b1e"
dependencies = [
"anyhow",
"bread-utils",
@ -196,8 +196,8 @@ dependencies = [
[[package]]
name = "bread-utils"
version = "0.7.2"
source = "git+https://git.breadway.dev/Breadway/bread-ecosystem?tag=v0.7.2#30517f161724132cdeb658c04cf5e490be07ee73"
version = "0.7.4"
source = "git+https://git.breadway.dev/Breadway/bread-ecosystem?tag=v0.7.4#a9754d90ed32efcc26765abd01c9f441bfb01b1e"
dependencies = [
"bread-shared 0.7.0",
"dirs 5.0.1",

View file

@ -15,12 +15,12 @@ bread-theme = { git = "https://git.breadway.dev/Breadway/bread-ecosystem", tag =
# for talking to breadd's IPC socket, and bread-shared purely for the
# WidgetSpec/WidgetNode wire types so we deserialize into real structs
# instead of hand-parsing serde_json::Value. See src/widgets/.
bread-utils = { git = "https://git.breadway.dev/Breadway/bread-ecosystem", tag = "v0.7.2", features = ["bread-client"] }
bread-utils = { git = "https://git.breadway.dev/Breadway/bread-ecosystem", tag = "v0.7.4", features = ["bread-client"] }
# v0.8.0-rc.1 carries bread_shared::widget; keep this bread tag even if
# ecosystem crates move independently.
bread-shared = { git = "https://git.breadway.dev/Breadway/bread", tag = "v0.8.0-rc.1" }
# Capture primitives for `--screenshot` mode — see src/screenshot.rs.
bread-screenshots = { git = "https://git.breadway.dev/Breadway/bread-ecosystem", tag = "v0.7.2" }
bread-screenshots = { git = "https://git.breadway.dev/Breadway/bread-ecosystem", tag = "v0.7.4" }
gtk4 = { version = "0.11", features = ["v4_12"] }
gtk4-layer-shell = "0.8"
relm4 = { version = "0.11", features = ["macros"] }

View file

@ -402,7 +402,7 @@ fn read_crumbs_profile() -> Option<String> {
for line in text.lines() {
if let Some(rest) = line.trim().strip_prefix("profile") {
let val = rest
.trim_start_matches(|c: char| c == ' ' || c == '=')
.trim_start_matches([' ', '='])
.trim_matches('"');
if !val.is_empty() {
return Some(val.to_string());

View file

@ -1023,7 +1023,7 @@ impl SimpleComponent for App {
let within_linger = self
.media_paused_at
.map_or(true, |t| t.elapsed().as_secs() < 30 * 60);
.is_none_or(|t| t.elapsed().as_secs() < 30 * 60);
self.media_last = Some(state);
reveal_media(&self.media_widget, within_linger);
} else {

View file

@ -177,9 +177,16 @@ fn create_window() -> gtk4::Window {
window.set_margin(Edge::Top, crate::BAR_MARGIN_TOP + crate::BAR_HEIGHT + 8);
window.set_margin(Edge::Right, crate::BAR_MARGIN_SIDES);
window.set_default_width(320);
// OnDemand so an inline-reply GtkEntry can take keys without the popup
// stealing every keystroke the rest of the time.
window.set_keyboard_mode(KeyboardMode::OnDemand);
// Toasts are purely informational for now: never grab keyboard focus...
window.set_keyboard_mode(KeyboardMode::None);
// ...and click through entirely — an empty input region means every
// pointer event passes straight to whatever's underneath instead of
// hitting the toast.
window.connect_map(|win| {
if let Some(surface) = win.surface() {
surface.set_input_region(Some(&gtk4::cairo::Region::create()));
}
});
crate::theme::bind_auto(&window);
window
}