我正在使用GTK 4和Rust,我正在寻找相当于QDBusConnection的东西。具体来说,我想连接到org.freedesktop.UDisks2,当一个驱动器被添加或删除时有一个信号触发。在Qt中,我可以做以下工作:
QDBusConnection::systemBus().connect("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "InterfacesAdded", this, SLOT(my_func(QDBusObjectPath,InterfacesAndProperties)));如何使用GTK完成这一任务?任何语言都很好,因为我可以使它适应锈蚀(Gtk-rs)。
发布于 2022-03-29 08:22:50
这个最小的示例程序应该在调试输出中获得信号:
use gio::prelude::*;
fn main() {
let dbus = gio::bus_get_sync(gio::BusType::System, gio::Cancellable::NONE).unwrap();
let udisks2 = gio::DBusProxy::new_sync(
&dbus,
gio::DBusProxyFlags::NONE,
None,
Some("org.freedesktop.UDisks2"),
"/org/freedesktop/UDisks2",
"org.freedesktop.DBus.ObjectManager",
gio::Cancellable::NONE
).unwrap();
udisks2.connect("g-signal", true, |x| {
dbg!(x);
let signal_name: &str = x[2].get().unwrap();
println!("signal '{signal_name}'");
let args: glib::Variant = x[3].get().unwrap();
let n = args.n_children();
for i in 0..n {
let v = args.child_value(i);
println!(" {i}: {v}");
}
None
});
glib::MainLoop::new(None, false).run();
}关于gio::DBusProxy的有趣之处在于,所有的dbus信号都是通过同一个g-signal glib信号来通知的。
在这个信号中,args参数是一个带有4个参数的&[glib::Value]:
DBusProxy值本身。H 214G 215https://stackoverflow.com/questions/71653605
复制相似问题