use std::time::Duration;
use dbus::blocking::Connection;
use dbus::channel::MatchingReceiver;
use dbus::message::MatchRule;
use dbus::Message;
fn main() {
let use_system_bus = std::env::args().into_iter().any(|a| a == "--system");
let conn = (if use_system_bus { Connection::new_system() } else { Connection::new_session() }).expect("D-Bus connection failed");
let rule = MatchRule::new();
let proxy = conn.with_proxy("org.freedesktop.DBus", "/org/freedesktop/DBus", Duration::from_millis(5000));
let result: Result<(), dbus::Error> =
proxy.method_call("org.freedesktop.DBus.Monitoring", "BecomeMonitor", (vec![rule.match_str()], 0u32));
match result {
Ok(_) => {
conn.start_receive(
rule,
Box::new(|msg, _| {
handle_message(&msg);
true
}),
);
}
Err(e) => {
eprintln!("Failed to BecomeMonitor: '{}', falling back to eavesdrop", e);
let rule_with_eavesdrop = {
let mut rule = rule.clone();
rule.eavesdrop = true;
rule
};
let result = conn.add_match(rule_with_eavesdrop, |_: (), _, msg| {
handle_message(&msg);
true
});
match result {
Ok(_) => {
}
Err(e) => {
eprintln!("Failed to eavesdrop: '{}', trying without it", e);
conn.add_match(rule, |_: (), _, msg| {
handle_message(&msg);
true
})
.expect("add_match failed");
}
}
}
}
loop {
conn.process(Duration::from_millis(1000)).unwrap();
}
}
fn handle_message(msg: &Message) {
println!("Got message: {:?}", msg);
}