等待dbus会话锁定/解锁消息

时间:2019-10-16 17:38:42

标签: python linux dbus lockscreen

我正在尝试在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。

1 个答案:

答案 0 :(得分:2)

“ LockedHint”不是信号,而是属性。该信号在接口org.freedesktop.ScreenSaver中为“ PropertiesChanged”。通常最简单的方法是使用d-feet(图形化D-Bus“调试器”)查找这些信息,但是我敢肯定API文档也显示了这一点。

以下是带有工作属性通知的代码:

{{1}}

这将为每次属性更改打印一行,而不仅仅是“ LockedHint”。另外,请注意,dbus模块现在是旧版:您可能需要查看pydbus中的新代码。

如果您想在用户会话中运行处理程序,并且只对自己的会话被锁定感兴趣,则可能不想使用登录的API:请看一下{{1}}(在会话中总线)作为替代方案(名称将是众所周知的,并且可以使用“ ActiveChanged”信号,它将变得更加简单)。再次,我建议使用d-feet浏览API。