2015-04-22 21 views
6

würde Ich mag Desktop-Benachrichtigungen über D-Bus senden https://crates.io/crates/dbus verwenden.D-Bus-Desktop-Benachrichtigung mit dbus-rs

Mein aktueller Ansatz ist:

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 

]); 

Ich kann nicht glauben, von einer sinnvollen Art und Weise der Schnittstelle des Notify Verfahrens gerecht zu werden. Laut D-Feet, sieht es wie folgt aus:

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

Vor allem die Array of [String], Dict of {String, Variant} mir ein Rätsel.

+0

Ich denke, 'Array von [Zeichenfolge]' wird von 'MessageItem bedeckt :: Array' Enum-Variante, aber ich bin über' Dict' nicht sicher. Es gibt 'MessageItem :: DictEntry', aber ich kann nicht sagen, wie es verwendet werden soll. –

+0

Es gibt ein ['from_dict'] (http://diwic.github.io/dbus-rs-docs/dbus/enum.MessageItem.html#method.from_dict) ... vielleicht wird' Dict' als ein Array dargestellt von Schlüssel/Wert-Tupel, und 'DictEntry' ist nur ein einziger ... – Shepmaster

Antwort

1

Nach einer Weile dachte ich, diese

mit @payload aus
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 
       ]); 

Mein little fun project, wo ich diese verwenden.