notificationsrustdbusfreedesktop.org

D-Bus Desktop Notification using dbus-rs


I would like to send desktop notifications through D-BUS using https://crates.io/crates/dbus.

My current approach is:

    let c = Connection::get_private(BusType::Session).unwrap();
//let m = Message::new_method_call("org.freedesktop.DBus", "/", "org.freedesktop.DBus", "ListNames").unwrap();
let mut m = Message::new_method_call(
    "org.freedesktop.Notifications",
    "/org/freedesktop/Notifications",
    "org.freedesktop.Notifications",
    "Notify"
    ).unwrap();
m.append_items(&[
       MessageItem::Str("appname".to_string()),         // appname
       MessageItem::UInt32(0),                          // notification to update
       MessageItem::Str("icon".to_string()),            // icon
       MessageItem::Str("summary".to_string()),         // summary (title)
       MessageItem::Str("body".to_string()),            // body
       ???,                                             // actions
       ???,                                             // hints
       MessageItem::UInt32(9000),                       // timeout

]);

I can't think of a meaningful way to satisfy the interface of the Notify method. According to D-Feet, it looks like this:

Notify(
    String app_name,
    UInt32 replaces_id,
    String app_icon,
    String summary,
    String body,
    Array of [String] actions,
    Dict of {String, Variant} hints,
    Int32
)

Especially the Array of [String], Dict of {String, Variant} puzzles me.


Solution

  • After a while I figured this out with @payload

        m.append_items(&[
                       MessageItem::Str(appname.to_string()),         // appname
                       MessageItem::UInt32(0),                        // notification to update
                       MessageItem::Str(icon.to_string()),            // icon
                       MessageItem::Str(summary.to_string()),         // summary (title)
                       MessageItem::Str(body.to_string()),            // body
                       MessageItem::new_array(                        // actions
                           vec!( MessageItem::Str("".to_string()))),
                       MessageItem::new_array(                        // hints
                           vec!(
                               MessageItem::DictEntry(
                                   Box::new(MessageItem::Str("".to_string())),
                                   Box::new(MessageItem::Variant(
                                           Box::new(MessageItem::Str("".to_string()))
                                           ))
                               ),
                           )
                       ),
                       MessageItem::Int32(9000),                       // timeout
                   ]);
    

    My little fun project where I use this.