gpt4 book ai didi

python - 等待 dbus session 锁定/解锁消息

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:11 27 4
gpt4 key购买 nike

我正在尝试在 Python 中实现一个 dbus 监听器,它在 session 锁定时执行一个函数,在 session 解锁时执行另一个函数。基本上,我想将以下命令转换为 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。

最佳答案

“LockedHint”不是一个信号,它是一个属性。信号是接口(interface) 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 以获取新代码。

如果你想在你的用户 session 中运行你的处理程序并且只对你自己的 session 被锁定感兴趣,你可能不想使用 logind API:看看 org.freedesktop.ScreenSaver(在 session 总线中)作为替代方案(它会简单得多,因为名称众所周知并且可以使用“ActiveChanged”信号)。我再次建议使用 d-feet 浏览 API。

关于python - 等待 dbus session 锁定/解锁消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58418885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com