From 93a797be3fa747ccfc67dac697cb27c03a4ae724 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:15:47 +0000 Subject: [PATCH 01/24] build(deps): bump zbus from 5.7.1 to 5.8.0 Bumps [zbus](https://github.com/dbus2/zbus) from 5.7.1 to 5.8.0. - [Release notes](https://github.com/dbus2/zbus/releases) - [Commits](https://github.com/dbus2/zbus/compare/zbus-5.7.1...zbus-5.8.0) --- updated-dependencies: - dependency-name: zbus dependency-version: 5.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 10 +++++----- Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e6b8421..41d10b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -733,7 +733,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4479,9 +4479,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.7.1" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" +checksum = "597f45e98bc7e6f0988276012797855613cd8269e23b5be62cc4e5d28b7e515d" dependencies = [ "async-broadcast", "async-recursion", @@ -4507,9 +4507,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.7.1" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" +checksum = "e5c8e4e14dcdd9d97a98b189cd1220f30e8394ad271e8c987da84f73693862c2" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 06ec3ef..ec43d9a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -184,7 +184,7 @@ libpulse-binding = { version = "2.30.1", optional = true } # shared futures-lite = { version = "2.6.0", optional = true } # network_manager, upower, workspaces, keyboard -zbus = { version = "5.7.1", default-features = false, features = ["tokio"], optional = true } # network_manager, notifications, upower +zbus = { version = "5.8.0", default-features = false, features = ["tokio"], optional = true } # network_manager, notifications, upower swayipc-async = { version = "2.1.0", optional = true } # workspaces, keyboard hyprland = { version = "0.4.0-beta.2", optional = true } # workspaces, keyboard rustix = { version = "1.0.7", default-features = false, features = ["std", "fs", "pipe", "event"], optional = true } # clipboard, input From 1fbe6554802d3e42781f71331e6c038caa1f90e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:46:09 +0000 Subject: [PATCH 02/24] build(deps): bump sysinfo from 0.35.2 to 0.36.0 Bumps [sysinfo](https://github.com/GuillaumeGomez/sysinfo) from 0.35.2 to 0.36.0. - [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/master/CHANGELOG.md) - [Commits](https://github.com/GuillaumeGomez/sysinfo/compare/v0.35.2...v0.36.0) --- updated-dependencies: - dependency-name: sysinfo dependency-version: 0.36.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e6b8421..6c2c945 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -733,7 +733,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -3308,9 +3308,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.35.2" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3ffa3e4ff2b324a57f7aeb3c349656c7b127c3c189520251a648102a92496e" +checksum = "aab138f5c1bb35231de19049060a87977ad23e04f2303e953bc5c2947ac7dec4" dependencies = [ "libc", "memchr", diff --git a/Cargo.toml b/Cargo.toml index 06ec3ef..0a85bc6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -174,7 +174,7 @@ regex = { version = "1.11.1", default-features = false, features = [ futures-signals = { version = "0.3.34", optional = true } # sys_info -sysinfo = { version = "0.35.2", optional = true } +sysinfo = { version = "0.36.0", optional = true } # tray system-tray = { version = "0.7.0", features = ["dbusmenu-gtk3"], optional = true } From 98e9af68d97144d000c3812b8e100dc4eecd1c41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 18:24:12 +0000 Subject: [PATCH 03/24] build(deps): bump clap from 4.5.40 to 4.5.41 Bumps [clap](https://github.com/clap-rs/clap) from 4.5.40 to 4.5.41. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.40...clap_complete-v4.5.41) --- updated-dependencies: - dependency-name: clap dependency-version: 4.5.41 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 14 +++++++------- Cargo.toml | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e6b8421..a99c6b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -410,9 +410,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ "clap_builder", "clap_derive", @@ -420,9 +420,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstream", "anstyle", @@ -441,9 +441,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -733,7 +733,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 06ec3ef..47d0c3d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -146,7 +146,7 @@ ctrlc = "3.4.7" cfg-if = "1.0.1" # cli -clap = { version = "4.5.40", optional = true, features = ["derive"] } +clap = { version = "4.5.41", optional = true, features = ["derive"] } # http reqwest = { version = "0.12.22", default-features = false, features = ["default-tls", "http2"], optional = true } @@ -194,7 +194,7 @@ serde_json = { version = "1.0.140", optional = true } # ipc, niri schemars = { version = "0.8.22", optional = true } [build-dependencies] -clap = { version = "4.5.40", features = ["derive"] } +clap = { version = "4.5.41", features = ["derive"] } clap_complete = "4.5.54" serde = { version = "1.0.219", features = ["derive"] } serde_json = "1.0.140" \ No newline at end of file From b68e4b4af9ffe0b52f5f351b9f020769c927b196 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Mon, 14 Jul 2025 19:27:51 +0100 Subject: [PATCH 04/24] chore(deps): update `system-tray` --- Cargo.lock | 5 +++-- Cargo.toml | 2 +- src/modules/tray/icon.rs | 9 ++++----- src/modules/tray/mod.rs | 8 +++++--- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0bce5ae..ae54749 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3348,10 +3348,11 @@ dependencies = [ [[package]] name = "system-tray" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3397841ed755bf361606a845779e0f7333d35fb4e39627ef6f656d7cdad4c73" +checksum = "90d5d024b1573d22079347055d817863c21ea0903df404668095499c08800e4a" dependencies = [ + "cfg-if", "dbusmenu-gtk3-sys", "futures-lite", "gtk", diff --git a/Cargo.toml b/Cargo.toml index fc6c1cb..55fe78a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -177,7 +177,7 @@ futures-signals = { version = "0.3.34", optional = true } sysinfo = { version = "0.36.0", optional = true } # tray -system-tray = { version = "0.7.0", features = ["dbusmenu-gtk3"], optional = true } +system-tray = { version = "0.8.1", features = ["dbusmenu-gtk3"], optional = true } # volume libpulse-binding = { version = "2.30.1", optional = true } diff --git a/src/modules/tray/icon.rs b/src/modules/tray/icon.rs index 4586f23..e7932dd 100644 --- a/src/modules/tray/icon.rs +++ b/src/modules/tray/icon.rs @@ -11,6 +11,7 @@ use std::collections::HashSet; use std::ffi::CStr; use std::os::raw::{c_char, c_int}; use std::ptr; +use system_tray::item::IconPixmap; /// Gets the GTK icon theme search paths by calling the FFI function. /// Conveniently returns the result as a `HashSet`. @@ -45,10 +46,10 @@ pub fn get_image( icon_theme: &IconTheme, ) -> Result { if !prefer_icons && item.icon_pixmap.is_some() { - get_image_from_pixmap(item, size) + get_image_from_pixmap(item.icon_pixmap.as_deref(), size) } else { get_image_from_icon_name(item, size, icon_theme) - .or_else(|_| get_image_from_pixmap(item, size)) + .or_else(|_| get_image_from_pixmap(item.icon_pixmap.as_deref(), size)) } } @@ -81,12 +82,10 @@ fn get_image_from_icon_name(item: &TrayMenu, size: u32, icon_theme: &IconTheme) /// which has 8 bits per sample and a bit stride of `4*width`. /// The Pixbuf expects RGBA32 format, so some channel shuffling /// is required. -fn get_image_from_pixmap(item: &TrayMenu, size: u32) -> Result { +fn get_image_from_pixmap(item: Option<&[IconPixmap]>, size: u32) -> Result { const BITS_PER_SAMPLE: i32 = 8; let pixmap = item - .icon_pixmap - .as_ref() .and_then(|pixmap| pixmap.first()) .ok_or_else(|| Report::msg("Failed to get pixmap from tray icon"))?; diff --git a/src/modules/tray/mod.rs b/src/modules/tray/mod.rs index b0159f1..d42f7cb 100644 --- a/src/modules/tray/mod.rs +++ b/src/modules/tray/mod.rs @@ -181,9 +181,11 @@ fn on_update( UpdateEvent::AttentionIcon(_icon) => { warn!("received unimplemented NewAttentionIcon event"); } - UpdateEvent::Icon(icon) => { - if icon.as_ref() != menu_item.icon_name() { - menu_item.set_icon_name(icon); + UpdateEvent::Icon { icon_name, icon_pixmap} => { + menu_item.icon_pixmap = icon_pixmap; + + if icon_name.as_ref() != menu_item.icon_name() { + menu_item.set_icon_name(icon_name); match icon::get_image(menu_item, icon_size, prefer_icons, icon_theme) { Ok(image) => menu_item.set_image(&image), Err(_) => menu_item.show_label(), From 3a3888a2d605f528a659ad8a16615eb5530975a1 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Mon, 14 Jul 2025 19:55:25 +0100 Subject: [PATCH 05/24] chore: update deps --- Cargo.lock | 156 ++++++++++++++++++++++----------------------- Cargo.toml | 10 +-- src/config/impl.rs | 15 ++--- 3 files changed, 86 insertions(+), 95 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ae54749..700ac5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -265,9 +265,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -309,7 +309,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cairo-sys-rs", "glib", "libc", @@ -330,11 +330,11 @@ dependencies = [ [[package]] name = "calloop" -version = "0.12.4" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "log", "polling", "rustix 0.38.44", @@ -344,9 +344,9 @@ dependencies = [ [[package]] name = "calloop-wayland-source" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" dependencies = [ "calloop", "rustix 0.38.44", @@ -432,9 +432,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.54" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aad5b1b4de04fead402672b48897030eec1f3bfe1550776322f59f6d6e6a5677" +checksum = "a5abde44486daf70c5be8b8f8f1b66c49f86236edf6fa2abadb4d961c4c6229a" dependencies = [ "clap", ] @@ -827,11 +827,11 @@ dependencies = [ [[package]] name = "evdev-rs" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9812d5790fb6fcce449333eb6713dad335e8c979225ed98755c84a3987e06dba" +checksum = "53b9cb6084eed4e72c0306e1cbcd3fd4c8acb613044e66810f9f5d3c7896bfb7" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.1", "evdev-sys", "libc", "log", @@ -839,9 +839,9 @@ dependencies = [ [[package]] name = "evdev-sys" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14ead42b547b15d47089c1243d907bcf0eb94e457046d3b315a26ac9c9e9ea6d" +checksum = "cdcf0d489f4d9a80ac2b3b35b92fdd8fcf68d33bb67f947afe5cd36e482de576" dependencies = [ "cc", "libc", @@ -1237,7 +1237,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "futures-channel", "futures-core", "futures-executor", @@ -1337,7 +1337,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc759b3184830a547b31549ab40c4b54450ab702bba79ba23f049bc1d1e3ca98" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "gdk", "glib", "glib-sys 0.18.1", @@ -1789,7 +1789,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "inotify-sys", "libc", ] @@ -1809,7 +1809,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "libc", ] @@ -1876,7 +1876,7 @@ dependencies = [ "universal-config", "walkdir", "wayland-client", - "wayland-protocols-wlr 0.3.8", + "wayland-protocols-wlr", "zbus", ] @@ -1930,9 +1930,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.173" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libcorn" @@ -1963,7 +1963,7 @@ version = "2.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "909eb3049e16e373680fe65afe6e2a722ace06b671250cc4849557bc57d6a397" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "libc", "libpulse-sys", "num-derive", @@ -1990,7 +1990,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "libc", ] @@ -2024,9 +2024,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lua-src" @@ -2099,9 +2099,9 @@ dependencies = [ [[package]] name = "mlua" -version = "0.10.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f5f8fbebc7db5f671671134b9321c4b9aa9adeafccfd9a8c020ae45c6a35d0" +checksum = "22fe7d52e09b3229ee7a6dfc5ba77fa250d8cd3478d3a509cc17934571a7ea0b" dependencies = [ "bstr", "either", @@ -2114,9 +2114,9 @@ dependencies = [ [[package]] name = "mlua-sys" -version = "0.6.8" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380c1f7e2099cafcf40e51d3a9f20a346977587aa4d012eae1f043149a728a93" +checksum = "bcdf7c9e260ca82aaa32ac11148941952b856bb8c69aa5a9e65962f21fcb8637" dependencies = [ "cc", "cfg-if", @@ -2197,7 +2197,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "cfg_aliases", "libc", @@ -2220,7 +2220,7 @@ version = "8.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3163f59cd3fa0e9ef8c32f242966a7b9994fd7378366099593e0e73077cd8c97" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "inotify", "kqueue", "libc", @@ -2288,7 +2288,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -2322,7 +2322,7 @@ version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "foreign-types", "libc", @@ -2712,7 +2712,7 @@ version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -2726,6 +2726,26 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote 1.0.39", + "syn 2.0.99", +] + [[package]] name = "regex" version = "1.11.1" @@ -2829,7 +2849,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "beceb6f7bf81c73e73aeef6dd1356d9a1b2b4909e1f0fc3e59b034f9572d7b7f" dependencies = [ "base64", - "bitflags 2.9.0", + "bitflags 2.9.1", "serde", "serde_derive", "unicode-ident", @@ -2862,7 +2882,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -2875,7 +2895,7 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.3", @@ -2944,11 +2964,12 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.22" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" dependencies = [ "dyn-clone", + "ref-cast", "schemars_derive", "serde", "serde_json", @@ -2956,9 +2977,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.22" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +checksum = "33d020396d1d138dc19f1165df7545479dcd58d93810dc5d646a16e55abefa80" dependencies = [ "proc-macro2", "quote 1.0.39", @@ -2978,7 +2999,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation", "core-foundation-sys", "libc", @@ -3147,11 +3168,11 @@ checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "smithay-client-toolkit" -version = "0.18.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "calloop", "calloop-wayland-source", "cursor-icon", @@ -3164,8 +3185,8 @@ dependencies = [ "wayland-client", "wayland-csd-frame", "wayland-cursor", - "wayland-protocols 0.31.2", - "wayland-protocols-wlr 0.2.0", + "wayland-protocols", + "wayland-protocols-wlr", "wayland-scanner", "xkeysym", ] @@ -3615,7 +3636,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cc2d9e086a412a451384326f521c8123a99a466b329941a9403696bff9b0da2" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "bytes", "futures-util", "http", @@ -3999,7 +4020,7 @@ version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "rustix 0.38.44", "wayland-backend", "wayland-scanner", @@ -4011,7 +4032,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cursor-icon", "wayland-backend", ] @@ -4027,53 +4048,28 @@ dependencies = [ "xcursor", ] -[[package]] -name = "wayland-protocols" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" -dependencies = [ - "bitflags 2.9.0", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - [[package]] name = "wayland-protocols" version = "0.32.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "wayland-backend", "wayland-client", "wayland-scanner", ] -[[package]] -name = "wayland-protocols-wlr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" -dependencies = [ - "bitflags 2.9.0", - "wayland-backend", - "wayland-client", - "wayland-protocols 0.31.2", - "wayland-scanner", -] - [[package]] name = "wayland-protocols-wlr" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "wayland-backend", "wayland-client", - "wayland-protocols 0.32.8", + "wayland-protocols", "wayland-scanner", ] @@ -4427,7 +4423,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 55fe78a..a85aada 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -138,7 +138,7 @@ walkdir = "2.5.0" notify = { version = "8.1.0", default-features = false } wayland-client = "0.31.1" wayland-protocols-wlr = { version = "0.3.8", features = ["client"] } -smithay-client-toolkit = { version = "0.18.1", default-features = false, features = [ +smithay-client-toolkit = { version = "0.19.2", default-features = false, features = [ "calloop", ] } universal-config = { version = "0.5.1", default-features = false } @@ -153,7 +153,7 @@ reqwest = { version = "0.12.22", default-features = false, features = ["default- # cairo lua-src = { version = "548.1.1", optional = true } -mlua = { version = "0.10.5", optional = true, features = ["luajit", "send"] } +mlua = { version = "0.11.0", optional = true, features = ["luajit", "send"] } cairo-rs = { version = "0.18.5", optional = true, features = ["png"] } # clock @@ -161,7 +161,7 @@ chrono = { version = "0.4.41", optional = true, default-features = false, featur # keyboard colpetto = { version = "0.6.0", features = ["tokio", "tracing"], optional = true } -evdev-rs = { version = "0.6.1", optional = true } +evdev-rs = { version = "0.6.2", optional = true } # music mpd-utils = { version = "0.2.1", optional = true } @@ -191,10 +191,10 @@ rustix = { version = "1.0.7", default-features = false, features = ["std", "fs", serde_json = { version = "1.0.140", optional = true } # ipc, niri # schema -schemars = { version = "0.8.22", optional = true } +schemars = { version = "1.0.4", optional = true } [build-dependencies] clap = { version = "4.5.41", features = ["derive"] } -clap_complete = "4.5.54" +clap_complete = "4.5.55" serde = { version = "1.0.219", features = ["derive"] } serde_json = "1.0.140" \ No newline at end of file diff --git a/src/config/impl.rs b/src/config/impl.rs index dd64599..2f13c16 100644 --- a/src/config/impl.rs +++ b/src/config/impl.rs @@ -52,16 +52,11 @@ where } #[cfg(feature = "schema")] -pub fn schema_layer(generator: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema { - use schemars::JsonSchema; - let mut schema: schemars::schema::SchemaObject = ::json_schema(generator).into(); - schema.enum_values = Some(vec![ - "background".into(), - "bottom".into(), - "top".into(), - "overlay".into(), - ]); - schema.into() +pub fn schema_layer(_generator: &mut schemars::SchemaGenerator) -> schemars::Schema { + schemars::json_schema!({ + "type": "string", + "enum": ["background", "bottom", "top", "overlay"], + }) } impl BarPosition { From f1a8b42cfa29269e989ac92ff94cea8790f2d976 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Mon, 14 Jul 2025 19:55:46 +0100 Subject: [PATCH 06/24] chore: clippy/fmt --- src/desktop_file.rs | 2 +- src/modules/tray/mod.rs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/desktop_file.rs b/src/desktop_file.rs index 8b0a509..ce54730 100644 --- a/src/desktop_file.rs +++ b/src/desktop_file.rs @@ -328,7 +328,7 @@ fn files(dir: &Path) -> Vec { pub fn open_program(file_name: &str, str: &str) { let expanded = str.replace("{app_name}", file_name); let launch_command_parts: Vec<&str> = expanded.split_whitespace().collect(); - if let Err(err) = Command::new(&launch_command_parts[0]) + if let Err(err) = Command::new(launch_command_parts[0]) .args(&launch_command_parts[1..]) .stdout(Stdio::null()) .stderr(Stdio::null()) diff --git a/src/modules/tray/mod.rs b/src/modules/tray/mod.rs index d42f7cb..64893af 100644 --- a/src/modules/tray/mod.rs +++ b/src/modules/tray/mod.rs @@ -181,7 +181,10 @@ fn on_update( UpdateEvent::AttentionIcon(_icon) => { warn!("received unimplemented NewAttentionIcon event"); } - UpdateEvent::Icon { icon_name, icon_pixmap} => { + UpdateEvent::Icon { + icon_name, + icon_pixmap, + } => { menu_item.icon_pixmap = icon_pixmap; if icon_name.as_ref() != menu_item.icon_name() { From c4f5485d53834aaa9b2cff41f139723afc800a9f Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Tue, 24 Jun 2025 23:04:24 +0100 Subject: [PATCH 07/24] fix(ipc): message size limited to 1024 bytes Fixes #1065 --- docs/Controlling Ironbar.md | 6 ++---- src/ipc/client.rs | 12 +++++++----- src/ipc/server/mod.rs | 32 ++++++++++++++++++++++++-------- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/docs/Controlling Ironbar.md b/docs/Controlling Ironbar.md index 49d1f8c..a3e2662 100644 --- a/docs/Controlling Ironbar.md +++ b/docs/Controlling Ironbar.md @@ -35,13 +35,11 @@ All error responses will cause the CLI to exit code 3. The server listens on a Unix socket. The path is printed on startup, and can usually be found at `/run/user/$UID/ironbar-ipc.sock`. -Commands and responses are sent as JSON objects. +Commands and responses are sent as JSON objects. +The JSON should be minified and must NOT contain any `\n` characters. Commands will have a `command` key, and a `subcommand` key when part of a sub-command. -The message buffer is currently limited to `1024` bytes. -Particularly large messages will be truncated or cause an error. - The full spec can be found below. ## Libraries diff --git a/src/ipc/client.rs b/src/ipc/client.rs index 820ace5..6abf6d4 100644 --- a/src/ipc/client.rs +++ b/src/ipc/client.rs @@ -2,7 +2,7 @@ use super::Ipc; use crate::ipc::{Command, Response}; use color_eyre::Result; use color_eyre::{Help, Report}; -use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; use tokio::net::UnixStream; impl Ipc { @@ -16,18 +16,20 @@ impl Ipc { .suggestion("Is Ironbar running?")), }?; - let write_buffer = serde_json::to_vec(&command)?; + let mut write_buffer = serde_json::to_vec(&command)?; if debug { eprintln!("REQUEST JSON: {}", serde_json::to_string(&command)?); } + write_buffer.push(b'\n'); stream.write_all(&write_buffer).await?; - let mut read_buffer = vec![0; 1024]; - let bytes = stream.read(&mut read_buffer).await?; + let mut read_buffer = String::new(); + let mut reader = BufReader::new(stream); + let bytes = reader.read_line(&mut read_buffer).await?; - let response = serde_json::from_slice(&read_buffer[..bytes])?; + let response = serde_json::from_str(&read_buffer[..bytes])?; Ok(response) } } diff --git a/src/ipc/server/mod.rs b/src/ipc/server/mod.rs index 0f944b7..6e20404 100644 --- a/src/ipc/server/mod.rs +++ b/src/ipc/server/mod.rs @@ -8,10 +8,10 @@ use std::rc::Rc; use color_eyre::{Report, Result}; use gtk::Application; use gtk::prelude::*; -use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; use tokio::net::{UnixListener, UnixStream}; use tokio::sync::mpsc::{self, Receiver, Sender}; -use tracing::{debug, error, info, warn}; +use tracing::{debug, error, info, trace, warn}; use super::Ipc; use crate::channels::{AsyncSenderExt, MpscReceiverExt}; @@ -52,11 +52,13 @@ impl Ipc { loop { match listener.accept().await { Ok((stream, _addr)) => { + debug!("handling incoming connection"); if let Err(err) = Self::handle_connection(stream, &cmd_tx, &mut res_rx).await { error!("{err:?}"); } + debug!("done"); } Err(err) => { error!("{err:?}"); @@ -80,10 +82,16 @@ impl Ipc { cmd_tx: &Sender, res_rx: &mut Receiver, ) -> Result<()> { - let (mut stream_read, mut stream_write) = stream.split(); + trace!("awaiting readable state"); + stream.readable().await?; - let mut read_buffer = vec![0; 1024]; - let bytes = stream_read.read(&mut read_buffer).await?; + let mut read_buffer = Vec::with_capacity(1024); + + let mut reader = BufReader::new(&mut stream); + + trace!("reading bytes"); + let bytes = reader.read_until(b'\n', &mut read_buffer).await?; + debug!("read {} bytes", bytes); // FIXME: Error on invalid command let command = serde_json::from_slice::(&read_buffer[..bytes])?; @@ -95,10 +103,18 @@ impl Ipc { .recv() .await .unwrap_or(Response::Err { message: None }); - let res = serde_json::to_vec(&res)?; - stream_write.write_all(&res).await?; - stream_write.shutdown().await?; + let mut res = serde_json::to_vec(&res)?; + res.push(b'\n'); + + trace!("awaiting writable state"); + stream.writable().await?; + + debug!("writing {} bytes", res.len()); + stream.write_all(&res).await?; + + trace!("bytes written, shutting down stream"); + stream.shutdown().await?; Ok(()) } From 40adfaf81026507aa157528d3a742d6187d95d56 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Mon, 14 Jul 2025 21:42:11 +0100 Subject: [PATCH 08/24] fix: opening programs via `launcher` and `menu` leaving zombie processes Fixes #1020 --- src/desktop_file.rs | 13 +++++++++---- src/modules/launcher/mod.rs | 2 +- src/modules/menu/ui.rs | 8 +++++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/desktop_file.rs b/src/desktop_file.rs index ce54730..f5c285b 100644 --- a/src/desktop_file.rs +++ b/src/desktop_file.rs @@ -3,9 +3,10 @@ use color_eyre::{Help, Report, Result}; use std::collections::HashMap; use std::env; use std::path::{Path, PathBuf}; -use std::process::{Command, Stdio}; +use std::process::Stdio; use std::sync::Arc; use tokio::io::{AsyncBufReadExt, BufReader}; +use tokio::process::Command; use tokio::sync::Mutex; use tracing::{debug, error}; use walkdir::{DirEntry, WalkDir}; @@ -325,20 +326,24 @@ fn files(dir: &Path) -> Vec { } /// Starts a `.desktop` file with the provided formatted command. -pub fn open_program(file_name: &str, str: &str) { - let expanded = str.replace("{app_name}", file_name); +pub async fn open_program(file_name: &str, launch_command: &str) { + let expanded = launch_command.replace("{app_name}", file_name); let launch_command_parts: Vec<&str> = expanded.split_whitespace().collect(); + + debug!("running {launch_command_parts:?}"); if let Err(err) = Command::new(launch_command_parts[0]) .args(&launch_command_parts[1..]) + .stdin(Stdio::null()) .stdout(Stdio::null()) .stderr(Stdio::null()) + .kill_on_drop(true) .spawn() { error!( "{:?}", Report::new(err) .wrap_err("Failed to run launch command.") - .suggestion("Perhaps the applications file is invalid?") + .suggestion("Perhaps the desktop file is invalid or orphaned?") ); } } diff --git a/src/modules/launcher/mod.rs b/src/modules/launcher/mod.rs index 0bdfbb2..4420f40 100644 --- a/src/modules/launcher/mod.rs +++ b/src/modules/launcher/mod.rs @@ -388,7 +388,7 @@ impl Module for LauncherModule { if let ItemEvent::OpenItem(app_id) = event { match desktop_files.find(&app_id).await { Ok(Some(file)) => { - open_program(&file.file_name, &launch_command_str); + open_program(&file.file_name, &launch_command_str).await; } Ok(None) => warn!("Could not find applications file for {}", app_id), Err(err) => error!("Failed to find parse file for {}: {}", app_id, err), diff --git a/src/modules/menu/ui.rs b/src/modules/menu/ui.rs index 7c7cb1e..7f73871 100644 --- a/src/modules/menu/ui.rs +++ b/src/modules/menu/ui.rs @@ -100,7 +100,13 @@ where let tx = tx.clone(); button.connect_clicked(move |_button| { - open_program(&file_name, &command); + // TODO: this needs refactoring to call open from the controller + let file_name = file_name.clone(); + let command = command.clone(); + + glib::spawn_future_local(async move { + open_program(&file_name, &command).await + }); sub_menu.hide(); tx.send_spawn(ModuleUpdateEvent::ClosePopup); From 34da5edfe0ed42180a78441e4999d4b33de0c4aa Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Tue, 15 Jul 2025 22:45:49 +0100 Subject: [PATCH 09/24] docs(sysinfo): add info on querying values Resolves #1090 --- docs/modules/Sys-Info.md | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/docs/modules/Sys-Info.md b/docs/modules/Sys-Info.md index d26364d..18cc1b2 100644 --- a/docs/modules/Sys-Info.md +++ b/docs/modules/Sys-Info.md @@ -194,12 +194,12 @@ The list of available functions is shown below: It is also possible to get only a single value from the set by specifying a name instead of a function. -| Token category | Valid name | -|----------------|-------------------------------------------------------------------------| -| CPU | A CPU thread, eg `cpu0`, `cpu1`, ... | -| Temperature | A sensor name, eg `CPUTIN`. These line up with the output of `sensors`. | -| Disk | A disk mountpoint, eg `/`, `/home`, ... | -| Network | An adapter name, eg `eth0` or `enp30s0`. | +| Token category | Valid name | +|----------------|------------------------------------------| +| CPU | A CPU thread, eg `cpu0`, `cpu1`, ... | +| Temperature | A sensor name, eg `CPUTIN`. | +| Disk | A disk mountpoint, eg `/`, `/home`, ... | +| Network | An adapter name, eg `eth0` or `enp30s0`. | To specify a name or function, use a `@`. For example, to show disk percent for `/home`: @@ -214,6 +214,22 @@ To show total CPU utilization where each core represents 100% (like `htop` etc): "{cpu_percent@sum}%" ``` +> [!TIP] +> Available values can be queried over IPC using the CLI. +> This can be particularly useful for sensors, which tend not to have obvious names. +> +> ```shell +> ironbar var list sysinfo.temp_c +> ``` +> +> Some usual cases to look out for: +> +> - `k10temp` is an AMD CPU internal sensor +> - Motherboard chipsets tend to prefix their sensors accordingly. For example, `CPUTIN`, `nct6687 CPU`, `asusec AMD`. +> - `amdgpu` is as it suggests. +> +> Sensor names are pulled from `hwmon` and should vaguely line up with the output of `sensors` + #### Prefixes and units For tokens which return an appropriate unit, you can specify the SI prefix (or unit in some special cases). From ff185d0de9163412cf9e00180cc9d571e859d9b4 Mon Sep 17 00:00:00 2001 From: slowsage <84777606+slowsage@users.noreply.github.com> Date: Sat, 19 Jul 2025 03:59:20 -0400 Subject: [PATCH 10/24] fix(desktop_file): case-insensitive app_id -> desktop_file find --- src/desktop_file.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/desktop_file.rs b/src/desktop_file.rs index f5c285b..d194098 100644 --- a/src/desktop_file.rs +++ b/src/desktop_file.rs @@ -239,6 +239,7 @@ impl DesktopFiles { /// Checks file contents for an exact or partial match of the provided input. async fn find_by_file_contents(&self, app_id: &str) -> Result> { let mut files = self.files.lock().await; + let app_id_lower = app_id.to_lowercase(); // first pass - check name for exact match for (_, file_ref) in files.iter_mut() { @@ -254,7 +255,7 @@ impl DesktopFiles { for (_, file_ref) in files.iter_mut() { let file = file_ref.get().await?; if let Some(name) = &file.name { - if name.to_lowercase().contains(app_id) { + if name.to_lowercase().contains(&app_id_lower) { return Ok(Some(file)); } } @@ -265,19 +266,19 @@ impl DesktopFiles { let file = file_ref.get().await?; if let Some(name) = &file.exec { - if name.to_lowercase().contains(app_id) { + if name.to_lowercase().contains(&app_id_lower) { return Ok(Some(file)); } } if let Some(name) = &file.startup_wm_class { - if name.to_lowercase().contains(app_id) { + if name.to_lowercase().contains(&app_id_lower) { return Ok(Some(file)); } } if let Some(name) = &file.icon { - if name.to_lowercase().contains(app_id) { + if name.to_lowercase().contains(&app_id_lower) { return Ok(Some(file)); } } From feccc29fd139437c6136c17761ca8dff88fe6698 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Sun, 20 Jul 2025 16:21:31 +0100 Subject: [PATCH 11/24] fix: regression caused by #1089 This resolves an issue caused by a previous fix which broke launching applications with the `launcher` and `menu` modules --- src/desktop_file.rs | 26 +++++++++++++++++++------- src/modules/menu/ui.rs | 4 +--- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/desktop_file.rs b/src/desktop_file.rs index d194098..f6e9d61 100644 --- a/src/desktop_file.rs +++ b/src/desktop_file.rs @@ -332,7 +332,7 @@ pub async fn open_program(file_name: &str, launch_command: &str) { let launch_command_parts: Vec<&str> = expanded.split_whitespace().collect(); debug!("running {launch_command_parts:?}"); - if let Err(err) = Command::new(launch_command_parts[0]) + let exit_status = match Command::new(launch_command_parts[0]) .args(&launch_command_parts[1..]) .stdin(Stdio::null()) .stdout(Stdio::null()) @@ -340,12 +340,24 @@ pub async fn open_program(file_name: &str, launch_command: &str) { .kill_on_drop(true) .spawn() { - error!( - "{:?}", - Report::new(err) - .wrap_err("Failed to run launch command.") - .suggestion("Perhaps the desktop file is invalid or orphaned?") - ); + Ok(mut child) => Some(child.wait().await), + Err(err) => { + error!( + "{:?}", + Report::new(err) + .wrap_err("Failed to run launch command.") + .suggestion("Perhaps the desktop file is invalid or orphaned?") + ); + None + } + }; + + match exit_status { + Some(Ok(exit_status)) if !exit_status.success() => { + error!("received non-success exit status running {launch_command_parts:?}") + } + Some(Err(err)) => error!("{err:?}"), + _ => {} } } diff --git a/src/modules/menu/ui.rs b/src/modules/menu/ui.rs index 7f73871..ce47a7c 100644 --- a/src/modules/menu/ui.rs +++ b/src/modules/menu/ui.rs @@ -104,9 +104,7 @@ where let file_name = file_name.clone(); let command = command.clone(); - glib::spawn_future_local(async move { - open_program(&file_name, &command).await - }); + spawn(async move { open_program(&file_name, &command).await }); sub_menu.hide(); tx.send_spawn(ModuleUpdateEvent::ClosePopup); From 5520562a183c7c958e3c4e352e7906e2537e350d Mon Sep 17 00:00:00 2001 From: Alan Date: Mon, 21 Jul 2025 00:19:58 +0300 Subject: [PATCH 12/24] feat: support glob patterns for keyboard layout icons (#949) * Simplistic globbing for matching keyboard layout icons Update the logic for determining the display text for the current keyboard layout. Instead of a direct map lookup, iterate through the layout map to support wildcard matching. Patterns ending with `*` will match any language string starting with the characters before the `*`. This allows grouping similar layouts (e.g., `English`, `English (Colemak-DH ISO)`) under a single pattern like `English*`. * Use `IndexMap` instead of `HashMap` for keyboard layout icons map This enables users to choose which globs to prioritize via ordering in the config * Enable feature `serde` for `indexmap` * Document wildcard matching for keyboard layouts * Enable `indexmap2` feature flag for `schemars` * Add missing period * use string slices * Fix formatting --- Cargo.lock | 1 + Cargo.toml | 5 +++-- docs/modules/Keyboard.md | 2 +- src/modules/keyboard.rs | 21 ++++++++++++++++----- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 700ac5a..4543f1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2969,6 +2969,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" dependencies = [ "dyn-clone", + "indexmap", "ref-cast", "schemars_derive", "serde", diff --git a/Cargo.toml b/Cargo.toml index a85aada..c38bf0d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -132,7 +132,7 @@ tracing-appender = "0.2.3" strip-ansi-escapes = "0.2.0" color-eyre = "0.6.5" serde = { version = "1.0.219", features = ["derive"] } -indexmap = "2.10.0" +indexmap = { version = "2.10.0", features = ["serde"] } dirs = "6.0.0" walkdir = "2.5.0" notify = { version = "8.1.0", default-features = false } @@ -191,7 +191,8 @@ rustix = { version = "1.0.7", default-features = false, features = ["std", "fs", serde_json = { version = "1.0.140", optional = true } # ipc, niri # schema -schemars = { version = "1.0.4", optional = true } + +schemars = { version = "1.0.4", optional = true, features = ["indexmap2"] } [build-dependencies] clap = { version = "4.5.41", features = ["derive"] } diff --git a/docs/modules/Keyboard.md b/docs/modules/Keyboard.md index 3dbdebf..5afe07d 100644 --- a/docs/modules/Keyboard.md +++ b/docs/modules/Keyboard.md @@ -25,7 +25,7 @@ Displays the toggle state of the capslock, num lock and scroll lock keys, and th | `icons.num_off` | `string` or [image](images) | `''` | Icon to show for disabled num lock indicator. | | `icons.scroll_on` | `string` or [image](images) | `` | Icon to show for enabled scroll lock indicator. | | `icons.scroll_off` | `string` or [image](images) | `''` | Icon to show for disabled scroll lock indicator. | -| `icons.layout_map` | `Map` | `{}` | Map of icons or labels to show for a particular keyboard layout. Layouts use their actual name if not present in the map. | +| `icons.layout_map` | `Map` | `{}` | Map of icons or labels to show for a particular keyboard layout. Layouts use their actual name if not present in the map. Layouts are matched in the order they appear in the map. If a pattern to match ends with a `*`, it acts as a wildcard, matching any layout name that begins with the part before the `*`. | | `seat` | `string` | `seat0` | ID of the Wayland seat to attach to. |
diff --git a/src/modules/keyboard.rs b/src/modules/keyboard.rs index 145422f..2f1971f 100644 --- a/src/modules/keyboard.rs +++ b/src/modules/keyboard.rs @@ -1,8 +1,7 @@ -use std::collections::HashMap; - use color_eyre::Result; use color_eyre::eyre::Report; use gtk::prelude::*; +use indexmap::IndexMap; use serde::Deserialize; use tokio::sync::mpsc; use tracing::{debug, trace}; @@ -129,7 +128,7 @@ struct Icons { /// } /// ``` #[serde(default)] - layout_map: HashMap, + layout_map: IndexMap, } impl Default for Icons { @@ -141,7 +140,7 @@ impl Default for Icons { num_off: String::new(), scroll_on: default_icon_scroll(), scroll_off: String::new(), - layout_map: HashMap::new(), + layout_map: IndexMap::new(), } } } @@ -338,7 +337,19 @@ impl Module for KeyboardModule { } } KeyboardUpdate::Layout(KeyboardLayoutUpdate(language)) => { - let text = icons.layout_map.get(&language).unwrap_or(&language); + let text = icons + .layout_map + .iter() + .find_map(|(pattern, display_text)| { + let is_match = if pattern.ends_with("*") { + language.starts_with(&pattern[..pattern.len() - 1]) + } else { + pattern == &language + }; + + is_match.then(|| display_text) + }) + .unwrap_or(&language); layout_button.set_label(text); } }); From dd9a0c20653208fc9a2b2d1fa037992c06fc2a78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 15:25:58 +0000 Subject: [PATCH 13/24] build(deps): bump rustix from 1.0.7 to 1.0.8 Bumps [rustix](https://github.com/bytecodealliance/rustix) from 1.0.7 to 1.0.8. - [Release notes](https://github.com/bytecodealliance/rustix/releases) - [Changelog](https://github.com/bytecodealliance/rustix/blob/main/CHANGES.md) - [Commits](https://github.com/bytecodealliance/rustix/compare/v1.0.7...v1.0.8) --- updated-dependencies: - dependency-name: rustix dependency-version: 1.0.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4543f1b..480f7cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1859,7 +1859,7 @@ dependencies = [ "notify", "regex", "reqwest", - "rustix 1.0.7", + "rustix 1.0.8", "schemars", "serde", "serde_json", @@ -2891,15 +2891,15 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.3", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c38bf0d..3fb6e5a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -187,7 +187,7 @@ futures-lite = { version = "2.6.0", optional = true } # network_manager, upower, zbus = { version = "5.8.0", default-features = false, features = ["tokio"], optional = true } # network_manager, notifications, upower swayipc-async = { version = "2.1.0", optional = true } # workspaces, keyboard hyprland = { version = "0.4.0-beta.2", optional = true } # workspaces, keyboard -rustix = { version = "1.0.7", default-features = false, features = ["std", "fs", "pipe", "event"], optional = true } # clipboard, input +rustix = { version = "1.0.8", default-features = false, features = ["std", "fs", "pipe", "event"], optional = true } # clipboard, input serde_json = { version = "1.0.140", optional = true } # ipc, niri # schema From c3c3dab11b115d2350ae0e6c13f4ba3a65dc7da7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 15:29:37 +0000 Subject: [PATCH 14/24] build(deps): bump mlua from 0.11.0 to 0.11.1 Bumps [mlua](https://github.com/mlua-rs/mlua) from 0.11.0 to 0.11.1. - [Release notes](https://github.com/mlua-rs/mlua/releases) - [Changelog](https://github.com/mlua-rs/mlua/blob/main/CHANGELOG.md) - [Commits](https://github.com/mlua-rs/mlua/compare/v0.11.0...v0.11.1) --- updated-dependencies: - dependency-name: mlua dependency-version: 0.11.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4543f1b..2647fc8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2099,9 +2099,9 @@ dependencies = [ [[package]] name = "mlua" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fe7d52e09b3229ee7a6dfc5ba77fa250d8cd3478d3a509cc17934571a7ea0b" +checksum = "de25fc513588ac1273aa8c6dc0fffee6d32c12f38dc75f5cdc74547121a107ef" dependencies = [ "bstr", "either", diff --git a/Cargo.toml b/Cargo.toml index c38bf0d..e4c875c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -153,7 +153,7 @@ reqwest = { version = "0.12.22", default-features = false, features = ["default- # cairo lua-src = { version = "548.1.1", optional = true } -mlua = { version = "0.11.0", optional = true, features = ["luajit", "send"] } +mlua = { version = "0.11.1", optional = true, features = ["luajit", "send"] } cairo-rs = { version = "0.18.5", optional = true, features = ["png"] } # clock From eadc7a7bab6f0b3d4d93f40d4578205c6b581b3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 15:32:44 +0000 Subject: [PATCH 15/24] build(deps): bump sysinfo from 0.36.0 to 0.36.1 Bumps [sysinfo](https://github.com/GuillaumeGomez/sysinfo) from 0.36.0 to 0.36.1. - [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/master/CHANGELOG.md) - [Commits](https://github.com/GuillaumeGomez/sysinfo/compare/v0.36.0...v0.36.1) --- updated-dependencies: - dependency-name: sysinfo dependency-version: 0.36.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4543f1b..e497079 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3330,9 +3330,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.36.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aab138f5c1bb35231de19049060a87977ad23e04f2303e953bc5c2947ac7dec4" +checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d" dependencies = [ "libc", "memchr", diff --git a/Cargo.toml b/Cargo.toml index c38bf0d..1d51c51 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -174,7 +174,7 @@ regex = { version = "1.11.1", default-features = false, features = [ futures-signals = { version = "0.3.34", optional = true } # sys_info -sysinfo = { version = "0.36.0", optional = true } +sysinfo = { version = "0.36.1", optional = true } # tray system-tray = { version = "0.8.1", features = ["dbusmenu-gtk3"], optional = true } From 8c9673eb1fd31bdbbfcaa2fa1a632bf2b5740e13 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 15:35:25 +0000 Subject: [PATCH 16/24] build(deps): bump zbus from 5.8.0 to 5.9.0 Bumps [zbus](https://github.com/dbus2/zbus) from 5.8.0 to 5.9.0. - [Release notes](https://github.com/dbus2/zbus/releases) - [Commits](https://github.com/dbus2/zbus/compare/zbus-5.8.0...zbus-5.9.0) --- updated-dependencies: - dependency-name: zbus dependency-version: 5.9.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4543f1b..83a9352 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4477,9 +4477,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.8.0" +version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597f45e98bc7e6f0988276012797855613cd8269e23b5be62cc4e5d28b7e515d" +checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" dependencies = [ "async-broadcast", "async-recursion", @@ -4505,9 +4505,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.8.0" +version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c8e4e14dcdd9d97a98b189cd1220f30e8394ad271e8c987da84f73693862c2" +checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index c38bf0d..69edf4a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -184,7 +184,7 @@ libpulse-binding = { version = "2.30.1", optional = true } # shared futures-lite = { version = "2.6.0", optional = true } # network_manager, upower, workspaces, keyboard -zbus = { version = "5.8.0", default-features = false, features = ["tokio"], optional = true } # network_manager, notifications, upower +zbus = { version = "5.9.0", default-features = false, features = ["tokio"], optional = true } # network_manager, notifications, upower swayipc-async = { version = "2.1.0", optional = true } # workspaces, keyboard hyprland = { version = "0.4.0-beta.2", optional = true } # workspaces, keyboard rustix = { version = "1.0.7", default-features = false, features = ["std", "fs", "pipe", "event"], optional = true } # clipboard, input From dca0e07ce2f58cfe969b42315e5d1b17cd3d334c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 15:42:30 +0000 Subject: [PATCH 17/24] build(deps): bump serde_json from 1.0.140 to 1.0.141 Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.140 to 1.0.141. - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.140...v1.0.141) --- updated-dependencies: - dependency-name: serde_json dependency-version: 1.0.141 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 480f7cd..8ffe998 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3056,9 +3056,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" dependencies = [ "itoa", "memchr", diff --git a/Cargo.toml b/Cargo.toml index 3fb6e5a..dd19483 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -188,7 +188,7 @@ zbus = { version = "5.8.0", default-features = false, features = ["tokio"], opti swayipc-async = { version = "2.1.0", optional = true } # workspaces, keyboard hyprland = { version = "0.4.0-beta.2", optional = true } # workspaces, keyboard rustix = { version = "1.0.8", default-features = false, features = ["std", "fs", "pipe", "event"], optional = true } # clipboard, input -serde_json = { version = "1.0.140", optional = true } # ipc, niri +serde_json = { version = "1.0.141", optional = true } # ipc, niri # schema @@ -198,4 +198,4 @@ schemars = { version = "1.0.4", optional = true, features = ["indexmap2"] } clap = { version = "4.5.41", features = ["derive"] } clap_complete = "4.5.55" serde = { version = "1.0.219", features = ["derive"] } -serde_json = "1.0.140" \ No newline at end of file +serde_json = "1.0.141" \ No newline at end of file From bd5745f2eff5dbd1f897f815fe2e77c59314d59c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 1 Aug 2025 00:20:13 +0000 Subject: [PATCH 18/24] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'naersk': 'github:nix-community/naersk/38bc60bbc157ae266d4a0c96671c6c742ee17a5f?narHash=sha256-cyAAMal0aPrlb1NgzMxZqeN1mAJ2pJseDhm2m6Um8T0%3D' (2025-04-29) → 'github:nix-community/naersk/0e72363d0938b0208d6c646d10649164c43f4d64?narHash=sha256-uldUBFkZe/E7qbvxa3mH1ItrWZyT6w1dBKJQF/3ZSsc%3D' (2025-07-16) • Added input 'naersk/fenix': 'github:nix-community/fenix/bf0d6f70f4c9a9cf8845f992105652173f4b617f?narHash=sha256-z6QEu4ZFuHiqdOPbYss4/Q8B0BFhacR8ts6jO/F/aOU%3D' (2025-07-14) • Added input 'naersk/fenix/nixpkgs': follows 'naersk/nixpkgs' • Added input 'naersk/fenix/rust-analyzer-src': 'github:rust-lang/rust-analyzer/591e3b7624be97e4443ea7b5542c191311aa141d?narHash=sha256-EJcdxw3aXfP8Ex1Nm3s0awyH9egQvB2Gu%2BQEnJn2Sfg%3D' (2025-07-13) • Updated input 'naersk/nixpkgs': 'github:NixOS/nixpkgs/b95255df2360a45ddbb03817a68869d5cb01bf96?narHash=sha256-IJWIzZSkBsDzS7iS/iwSwur%2BxFkWqeLYC4kdf8ObtOM%3D' (2025-06-30) → 'github:NixOS/nixpkgs/be9e214982e20b8310878ac2baa063a961c1bdf6?narHash=sha256-HM791ZQtXV93xtCY%2BZxG1REzhQenSQO020cu6rHtAPk%3D' (2025-07-09) • Updated input 'nixpkgs': 'github:nixos/nixpkgs/30e2e2857ba47844aa71991daa6ed1fc678bcbb7?narHash=sha256-krGXKxvkBhnrSC/kGBmg5MyupUUT5R6IBCLEzx9jhMM%3D' (2025-06-27) → 'github:nixos/nixpkgs/dc9637876d0dcc8c9e5e22986b857632effeb727?narHash=sha256-cKgvtz6fKuK1Xr5LQW/zOUiAC0oSQoA9nOISB0pJZqM%3D' (2025-07-28) --- flake.lock | 58 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/flake.lock b/flake.lock index bd7abc9..8c4c1ce 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,27 @@ { "nodes": { + "fenix": { + "inputs": { + "nixpkgs": [ + "naersk", + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1752475459, + "narHash": "sha256-z6QEu4ZFuHiqdOPbYss4/Q8B0BFhacR8ts6jO/F/aOU=", + "owner": "nix-community", + "repo": "fenix", + "rev": "bf0d6f70f4c9a9cf8845f992105652173f4b617f", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, "flake-compat": { "locked": { "lastModified": 1747046372, @@ -17,14 +39,15 @@ }, "naersk": { "inputs": { + "fenix": "fenix", "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1745925850, - "narHash": "sha256-cyAAMal0aPrlb1NgzMxZqeN1mAJ2pJseDhm2m6Um8T0=", + "lastModified": 1752689277, + "narHash": "sha256-uldUBFkZe/E7qbvxa3mH1ItrWZyT6w1dBKJQF/3ZSsc=", "owner": "nix-community", "repo": "naersk", - "rev": "38bc60bbc157ae266d4a0c96671c6c742ee17a5f", + "rev": "0e72363d0938b0208d6c646d10649164c43f4d64", "type": "github" }, "original": { @@ -50,11 +73,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1751251929, - "narHash": "sha256-IJWIzZSkBsDzS7iS/iwSwur+xFkWqeLYC4kdf8ObtOM=", + "lastModified": 1752077645, + "narHash": "sha256-HM791ZQtXV93xtCY+ZxG1REzhQenSQO020cu6rHtAPk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b95255df2360a45ddbb03817a68869d5cb01bf96", + "rev": "be9e214982e20b8310878ac2baa063a961c1bdf6", "type": "github" }, "original": { @@ -66,11 +89,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1751011381, - "narHash": "sha256-krGXKxvkBhnrSC/kGBmg5MyupUUT5R6IBCLEzx9jhMM=", + "lastModified": 1753694789, + "narHash": "sha256-cKgvtz6fKuK1Xr5LQW/zOUiAC0oSQoA9nOISB0pJZqM=", "owner": "nixos", "repo": "nixpkgs", - "rev": "30e2e2857ba47844aa71991daa6ed1fc678bcbb7", + "rev": "dc9637876d0dcc8c9e5e22986b857632effeb727", "type": "github" }, "original": { @@ -87,6 +110,23 @@ "nix-systems": "nix-systems", "nixpkgs": "nixpkgs_2" } + }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1752428706, + "narHash": "sha256-EJcdxw3aXfP8Ex1Nm3s0awyH9egQvB2Gu+QEnJn2Sfg=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "591e3b7624be97e4443ea7b5542c191311aa141d", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } } }, "root": "root", From 0159c0155e96dae4d10090b539481418a5a34546 Mon Sep 17 00:00:00 2001 From: slowsage <84777606+slowsage@users.noreply.github.com> Date: Sun, 3 Aug 2025 16:17:19 -0400 Subject: [PATCH 19/24] fix: app_id StartupWMClass resolution in launcher --- src/modules/launcher/mod.rs | 61 ++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/src/modules/launcher/mod.rs b/src/modules/launcher/mod.rs index 4420f40..7c38100 100644 --- a/src/modules/launcher/mod.rs +++ b/src/modules/launcher/mod.rs @@ -244,21 +244,43 @@ impl Module for LauncherModule { let tx2 = context.tx.clone(); let wl = context.client::(); + let desktop_files = context.ironbar.desktop_files(); spawn(async move { let items = items2; let tx = tx2; + // Build app_id mapping once at startup + let mut app_id_map = IndexMap::::new(); + { + let favorites: Vec<_> = lock!(items).keys().cloned().collect(); + for fav in favorites { + if let Ok(Some(file)) = desktop_files.find(&fav).await { + if let Some(wm_class) = file.startup_wm_class { + app_id_map.insert(wm_class, fav); + } + } + } + } + + let resolve_app_id = |app_id: &str| { + app_id_map + .get(app_id) + .cloned() + .unwrap_or_else(|| app_id.to_string()) + }; + let mut wlrx = wl.subscribe_toplevels(); let handles = wl.toplevel_info_all(); for info in handles { let mut items = lock!(items); - let item = items.get_mut(&info.app_id); - if let Some(item) = item { + let app_id = resolve_app_id(&info.app_id); + if let Some(item) = items.get_mut(&app_id) { item.merge_toplevel(info.clone()); } else { - let item = Item::from(info.clone()); - items.insert(info.app_id.clone(), item); + let mut item = Item::from(info.clone()); + item.app_id = app_id.clone(); + items.insert(app_id, item); } } @@ -284,14 +306,14 @@ impl Module for LauncherModule { match event { ToplevelEvent::New(info) => { - let app_id = info.app_id.clone(); + let app_id = resolve_app_id(&info.app_id); let new_item = { let mut items = lock!(items); - let item = items.get_mut(&info.app_id); - match item { + match items.get_mut(&app_id) { None => { - let item: Item = info.into(); + let mut item: Item = info.into(); + item.app_id = app_id.clone(); items.insert(app_id.clone(), item.clone()); ItemOrWindow::Item(item) @@ -313,9 +335,10 @@ impl Module for LauncherModule { }?; } ToplevelEvent::Update(info) => { + let app_id = resolve_app_id(&info.app_id); // check if open, as updates can be sent as program closes // if it's a focused favourite closing, it otherwise incorrectly re-focuses. - let is_open = if let Some(item) = lock!(items).get_mut(&info.app_id) { + let is_open = if let Some(item) = lock!(items).get_mut(&app_id) { item.set_window_focused(info.id, info.focused); item.set_window_name(info.id, info.title.clone()); @@ -325,27 +348,27 @@ impl Module for LauncherModule { }; send_update(LauncherUpdate::Focus( - info.app_id.clone(), + app_id.clone(), is_open && info.focused, )) .await?; send_update(LauncherUpdate::Title( - info.app_id.clone(), + app_id.clone(), info.id, info.title.clone(), )) .await?; } ToplevelEvent::Remove(info) => { + let app_id = resolve_app_id(&info.app_id); let remove_item = { let mut items = lock!(items); - let item = items.get_mut(&info.app_id); - match item { + match items.get_mut(&app_id) { Some(item) => { item.unmerge_toplevel(&info); if item.windows.is_empty() { - items.shift_remove(&info.app_id); + items.shift_remove(&app_id); Some(ItemOrWindowId::Item) } else { Some(ItemOrWindowId::Window) @@ -357,15 +380,11 @@ impl Module for LauncherModule { match remove_item { Some(ItemOrWindowId::Item) => { - send_update(LauncherUpdate::RemoveItem(info.app_id.clone())) - .await?; + send_update(LauncherUpdate::RemoveItem(app_id.clone())).await?; } Some(ItemOrWindowId::Window) => { - send_update(LauncherUpdate::RemoveWindow( - info.app_id.clone(), - info.id, - )) - .await?; + send_update(LauncherUpdate::RemoveWindow(app_id.clone(), info.id)) + .await?; } None => {} } From 304b1d3e171ce0cdc411d94b3fe84e5ff819979f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 18:13:45 +0000 Subject: [PATCH 20/24] build(deps): bump notify from 8.1.0 to 8.2.0 Bumps [notify](https://github.com/notify-rs/notify) from 8.1.0 to 8.2.0. - [Release notes](https://github.com/notify-rs/notify/releases) - [Changelog](https://github.com/notify-rs/notify/blob/main/CHANGELOG.md) - [Commits](https://github.com/notify-rs/notify/compare/notify-8.1.0...notify-8.2.0) --- updated-dependencies: - dependency-name: notify dependency-version: 8.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3badd81..856fe44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2216,9 +2216,9 @@ dependencies = [ [[package]] name = "notify" -version = "8.1.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3163f59cd3fa0e9ef8c32f242966a7b9994fd7378366099593e0e73077cd8c97" +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ "bitflags 2.9.1", "inotify", diff --git a/Cargo.toml b/Cargo.toml index bb3aa05..5d4e3c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -135,7 +135,7 @@ serde = { version = "1.0.219", features = ["derive"] } indexmap = { version = "2.10.0", features = ["serde"] } dirs = "6.0.0" walkdir = "2.5.0" -notify = { version = "8.1.0", default-features = false } +notify = { version = "8.2.0", default-features = false } wayland-client = "0.31.1" wayland-protocols-wlr = { version = "0.3.8", features = ["client"] } smithay-client-toolkit = { version = "0.19.2", default-features = false, features = [ From 491e055aa136ae35b4a377244a8d2339122a11a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 18:35:36 +0000 Subject: [PATCH 21/24] build(deps): bump tokio from 1.46.1 to 1.47.1 Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.46.1 to 1.47.1. - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.46.1...tokio-1.47.1) --- updated-dependencies: - dependency-name: tokio dependency-version: 1.47.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 20 +++++++++++++++----- Cargo.toml | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3badd81..9dac05b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1559,7 +1559,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -3202,6 +3202,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -3498,9 +3508,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -3510,10 +3520,10 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2", + "socket2 0.6.0", "tokio-macros", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index bb3aa05..c4c0792 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -115,7 +115,7 @@ schema = ["dep:schemars"] gtk = "0.18.2" gtk-layer-shell = "0.8.2" glib = "0.18.5" -tokio = { version = "1.46.1", features = [ +tokio = { version = "1.47.1", features = [ "macros", "rt-multi-thread", "time", From 4041e080d03e39009d1f2b3309a5e75a807636a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 18:51:20 +0000 Subject: [PATCH 22/24] build(deps): bump clap from 4.5.41 to 4.5.42 Bumps [clap](https://github.com/clap-rs/clap) from 4.5.41 to 4.5.42. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.41...clap_complete-v4.5.42) --- updated-dependencies: - dependency-name: clap dependency-version: 4.5.42 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3badd81..501350b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -410,9 +410,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.41" +version = "4.5.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882" dependencies = [ "clap_builder", "clap_derive", @@ -420,9 +420,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.41" +version = "4.5.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966" dependencies = [ "anstream", "anstyle", diff --git a/Cargo.toml b/Cargo.toml index bb3aa05..2e6727d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -146,7 +146,7 @@ ctrlc = "3.4.7" cfg-if = "1.0.1" # cli -clap = { version = "4.5.41", optional = true, features = ["derive"] } +clap = { version = "4.5.42", optional = true, features = ["derive"] } # http reqwest = { version = "0.12.22", default-features = false, features = ["default-tls", "http2"], optional = true } @@ -195,7 +195,7 @@ serde_json = { version = "1.0.141", optional = true } # ipc, niri schemars = { version = "1.0.4", optional = true, features = ["indexmap2"] } [build-dependencies] -clap = { version = "4.5.41", features = ["derive"] } +clap = { version = "4.5.42", features = ["derive"] } clap_complete = "4.5.55" serde = { version = "1.0.219", features = ["derive"] } serde_json = "1.0.141" \ No newline at end of file From 279ef938d17cad3d16a8d0c2cd7fd4f1505f9888 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Aug 2025 08:12:51 +0000 Subject: [PATCH 23/24] build(deps): bump wayland-protocols-wlr from 0.3.8 to 0.3.9 Bumps [wayland-protocols-wlr](https://github.com/smithay/wayland-rs) from 0.3.8 to 0.3.9. - [Release notes](https://github.com/smithay/wayland-rs/releases) - [Changelog](https://github.com/Smithay/wayland-rs/blob/master/historical_changelog.md) - [Commits](https://github.com/smithay/wayland-rs/commits) --- updated-dependencies: - dependency-name: wayland-protocols-wlr dependency-version: 0.3.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 28 ++++++++++++++-------------- Cargo.toml | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6286a6a..83833ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4014,25 +4014,25 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.44", + "rustix 1.0.8", "smallvec", "wayland-sys", ] [[package]] name = "wayland-client" -version = "0.31.10" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" dependencies = [ "bitflags 2.9.1", - "rustix 0.38.44", + "rustix 1.0.8", "wayland-backend", "wayland-scanner", ] @@ -4061,9 +4061,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.8" +version = "0.32.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" dependencies = [ "bitflags 2.9.1", "wayland-backend", @@ -4073,9 +4073,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" +checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" dependencies = [ "bitflags 2.9.1", "wayland-backend", @@ -4086,9 +4086,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" dependencies = [ "proc-macro2", "quick-xml", @@ -4097,9 +4097,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" dependencies = [ "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index 4bac16c..b8ef046 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -137,7 +137,7 @@ dirs = "6.0.0" walkdir = "2.5.0" notify = { version = "8.2.0", default-features = false } wayland-client = "0.31.1" -wayland-protocols-wlr = { version = "0.3.8", features = ["client"] } +wayland-protocols-wlr = { version = "0.3.9", features = ["client"] } smithay-client-toolkit = { version = "0.19.2", default-features = false, features = [ "calloop", ] } From ca77a991f77512207460eab96d635e2071525dd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Aug 2025 08:12:55 +0000 Subject: [PATCH 24/24] build(deps): bump serde_json from 1.0.141 to 1.0.142 Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.141 to 1.0.142. - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.141...v1.0.142) --- updated-dependencies: - dependency-name: serde_json dependency-version: 1.0.142 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6286a6a..f16d9cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3056,9 +3056,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.141" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "itoa", "memchr", diff --git a/Cargo.toml b/Cargo.toml index 4bac16c..4ae3209 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -188,7 +188,7 @@ zbus = { version = "5.9.0", default-features = false, features = ["tokio"], opti swayipc-async = { version = "2.1.0", optional = true } # workspaces, keyboard hyprland = { version = "0.4.0-beta.2", optional = true } # workspaces, keyboard rustix = { version = "1.0.8", default-features = false, features = ["std", "fs", "pipe", "event"], optional = true } # clipboard, input -serde_json = { version = "1.0.141", optional = true } # ipc, niri +serde_json = { version = "1.0.142", optional = true } # ipc, niri # schema @@ -198,4 +198,4 @@ schemars = { version = "1.0.4", optional = true, features = ["indexmap2"] } clap = { version = "4.5.42", features = ["derive"] } clap_complete = "4.5.55" serde = { version = "1.0.219", features = ["derive"] } -serde_json = "1.0.141" \ No newline at end of file +serde_json = "1.0.142" \ No newline at end of file