首页 > 解决方案 > 等待 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。

标签: pythonlinuxdbuslockscreen

解决方案


“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。


推荐阅读