python - 等待 dbus 会话锁定/解锁消息
问题描述
我正在尝试在 Python 中实现一个 dbus 侦听器,它在会话被锁定时执行一个函数,在会话解锁时执行另一个函数。基本上,我想将以下命令转换为 Python 程序(显然,该命令没有回调):
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
此命令返回以下内容:
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
Python MWE 在这里。但是,它没有收到任何消息(尝试使用 sudo 并作为用户本身启动它):
#!/usr/bin/env python
from datetime import datetime
import dbus
import gobject
from dbus.mainloop.glib import DBusGMainLoop
def locker_callback(*args):
print "%s Lock%s" % (datetime.now().ctime(), args)
DBusGMainLoop(set_as_default=True) # integrate into gobject main loop
bus = dbus.SystemBus() # connect to system wide dbus
bus.add_signal_receiver( # define the signal to listen to
locker_callback, # callback function
'LockedHint', # signal name
'org.freedesktop.DBus.Properties.PropertiesChanged', # interface
'org.freedesktop.login1' # bus name
)
loop = gobject.MainLoop()
loop.run()
仅供参考,我在 Ubuntu 18.04 上使用 XScreenSaver 运行 xfce。
解决方案
“LockedHint”不是一个信号,它是一个属性。信号是接口中的“PropertiesChanged” org.freedesktop.DBus.Properties
。使用 d-feet(图形 D-Bus '调试器')查找这些通常最容易,但我确信 API 文档也显示了这一点。
这是与工作属性通知相同的代码:
#!/usr/bin/env python
from datetime import datetime
import dbus
import gobject
from dbus.mainloop.glib import DBusGMainLoop
def properties_changed_callback(*args):
print "%s %s" % (datetime.now().ctime(), args)
DBusGMainLoop(set_as_default=True)
dbus.SystemBus().add_signal_receiver(
properties_changed_callback,
'PropertiesChanged',
'org.freedesktop.DBus.Properties',
'org.freedesktop.login1'
)
gobject.MainLoop().run()
当然,这将为每个属性更改打印一行,而不仅仅是“LockedHint”。另外,请注意 dbus 模块现在是遗留的:您可能想查看 pydbus 以获取新代码。
如果你想在你的用户会话中运行你的处理程序并且只对你自己的会话被锁定感兴趣,你可能不想使用 logind API:看看org.freedesktop.ScreenSaver
(在会话总线中)一个替代方案(它'会简单得多,因为名称众所周知并且您可以使用“ActiveChanged”信号)。我再次建议使用 d-feet 来浏览 API。
推荐阅读
- android - 将图像从自定义键盘发送到特定聊天
- android - Android P onStart 在 onActivityResult 之前调用
- c++ - 为什么 C++17 destroy()/destroy_n() 函数向前(而不是向后)运行?
- ios - NSLayoutConstraint:针对stackview中的视图进行布局是否是一种好习惯?
- angular - 删除查询错误(空)(.net核心,角度5)
- json - 如何在 React Js 中根据 json 类型的 aaray 显示 3 个或更多表单以构建动态表单
- r - 如何使用 knitr 在 RMD 中循环渲染传单地图
- python - 合并多个列表并找到最大值
- ios - 如何在 Swift3 iOS 中显示和隐藏表格视图的自定义 UITableView 标题单元格
- enterprise-architect - 如何在 Enterprise Architect 中创建报表图表?