https://github.com/jakestanger/system-tray
Async Rust implementation of the StatusNotifierItem and DbusMenu protocols for building system trays.
https://github.com/jakestanger/system-tray
async dbusmenu rust statusnotifieritem tokio tray zbus
Last synced: about 1 month ago
JSON representation
Async Rust implementation of the StatusNotifierItem and DbusMenu protocols for building system trays.
- Host: GitHub
- URL: https://github.com/jakestanger/system-tray
- Owner: JakeStanger
- Created: 2024-03-28T23:58:57.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2025-02-08T01:49:49.000Z (8 months ago)
- Last Synced: 2025-02-08T01:51:19.531Z (8 months ago)
- Topics: async, dbusmenu, rust, statusnotifieritem, tokio, tray, zbus
- Language: Rust
- Homepage: https://docs.rs/system-tray
- Size: 68.4 KB
- Stars: 10
- Watchers: 3
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# System Tray
An async implementation of the `StatusNotifierItem` and `DbusMenu` protocols for building system trays.
Requires Tokio.
## Example
```rust
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:```rust
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](https://github.com/elkowar/eww/blob/50ec181fc7ff2a68d6330e8897de2c5179575935/crates/notifier_host/src/host.rs)
under [MIT](https://github.com/elkowar/eww/blob/master/LICENSE).
Many thanks to elkowar.