我正在尝试在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。
“ LockedHint”不是信号,而是属性。信号在接口org.freedesktop.DBus.Properties
中为“ PropertiesChanged”。通常,最简单的方法是使用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以获得新代码。
[如果您想在用户会话中运行处理程序,并且只对自己的会话被锁定感兴趣,则可能不希望使用登录的API:请参阅org.freedesktop.ScreenSaver
(在会话总线中)另一种选择(因为名称众所周知,它会简单得多,并且可以使用“ ActiveChanged”信号)。我再次建议使用d-feet浏览API。