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

Wait for dbus session lock / unlock messages

我正在尝试在 Python 中实现一个 dbus 侦听器,它在会话锁定时执行一个函数,在会话解锁时执行另一个函数。基本上,我想将以下命令变成 Python 程序(显然,该命令没有回调):

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint

此命令returns以下:

/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" 不是信号,而是 属性。接口org.freedesktop.DBus.Properties中的信号是"PropertiesChanged"。使用 d-feet(图形化 D-Bus 'debugger')查找这些内容通常最简单,但我确信 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.