我正在尝试在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()
仅供参考,我使用XScreenSaver在Ubuntu 18.04上运行xfce。
答案 0 :(得分:2)
“ LockedHint”不是信号,而是属性。该信号在接口org.freedesktop.ScreenSaver
中为“ PropertiesChanged”。通常最简单的方法是使用d-feet(图形化D-Bus“调试器”)查找这些信息,但是我敢肯定API文档也显示了这一点。
以下是带有工作属性通知的代码:
{{1}}
这将为每次属性更改打印一行,而不仅仅是“ LockedHint”。另外,请注意,dbus模块现在是旧版:您可能需要查看pydbus中的新代码。
如果您想在用户会话中运行处理程序,并且只对自己的会话被锁定感兴趣,则可能不想使用登录的API:请看一下{{1}}(在会话中总线)作为替代方案(名称将是众所周知的,并且可以使用“ ActiveChanged”信号,它将变得更加简单)。再次,我建议使用d-feet浏览API。