7 releases (breaking)
new 0.6.0 | Jan 5, 2025 |
---|---|
0.5.0 | Dec 15, 2024 |
0.4.0 | Nov 16, 2024 |
0.3.0 | Nov 8, 2024 |
0.1.4 | Aug 13, 2023 |
#196 in GUI
832 downloads per month
Used in ironbar
78KB
1.5K
SLoC
System Tray
An async implementation of the StatusNotifierItem
and DbusMenu
protocols for building system trays.
Requires Tokio.
Example
use system_tray::client::Client;
#[tokio::main]
async fn main() {
let client = Client::new().await.unwrap();
let mut tray_rx = client.subscribe();
let initial_items = client.items();
// do something with initial items...
while let Ok(ev) = tray_rx.recv().await {
println!("{ev:?}"); // do something with event...
}
}
dbusmenu-gtk3
Although the library provides a built-in Rust-native implementation of the DBusMenu
protocol,
this has a few issues:
- There are some known bugs. For example, opening a file in VLC will break its menu.
- If you are creating a menu UI, you need to parse the whole tree set up each element, and track all changes manually.
To circumvent this, bindings to the dbusmenu-gtk3
system library are included.
When the feature of the same name is enabled, you can listen for UpdateEvent::MenuConnect
and create the GTK element based on that:
fn on_update(update: system_tray::Event) {
match update {
Event::Update(address, UpdateEvent::MenuConnect(menu)) => {
let menu: gtk::auto::Menu = system_tray::gtk_menu::Menu::new(&address, &menu);
// do something with the menu element
}
}
}
[!NOTE] This feature is disabled by default to reduce compilation times.
Attributions
Some of the code in this repository, namely the SNI host, is taken from eww under MIT. Many thanks to elkowar.
Dependencies
~15–29MB
~480K SLoC