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

问题描述 投票:1回答:1

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

python linux dbus lockscreen
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.