我使用DBus与logind进行通信以获取有关活动会话的信息等。我使用session.userData
创建了代码。我可以使用gdbus-codegen
和call
方法获取信息,但我没有收到通知(我有get
正在运行!)。
我像这样创建会话对象:
g_main_loop
GError *error;
session_ = ::login1_session_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
"org.freedesktop.login1",
object_path,
NULL,
&error);
使用上述路径并使用调试器进行验证。
我不知道这与未收到通知的问题有关。
我注册了这样的回调:
object_path
(我使用::g_signal_connect_data(proxy, "notify::active", G_CALLBACK(&cb_thunk), this, 0, (GConnectFlags)0);
将g_signal_connect_data
设置为我当前的类,因为我用C ++编写并使用回调thunks)。
回调函数具有以下签名:
userdata
将static void cb_thunk(proxy_t *proxy, first_data_t param1, second_data_t param2, gpointer userdata);
定义为proxy_t
(由Login1Session
生成)。
我在这里弄错了吗?我不明白为什么我没有收到任何通知。
通过DBus进行回调是有效的,但不是属性,只有dbus中有真正的回调函数。
答案 0 :(得分:0)
gdbus是dbus协议之上的更高级语言。很难说为什么你没有在更高层次上获得信号,但我认为最好的方法是确保下层工作。这意味着dbus信号以dbus协议级别发出。为此,我会窥探dbus消息总线(系统总线)。作为特权进程(root)执行busctl monitor
并查看流量。