Ожидание сообщений блокировки / разблокировки сеанса dbus - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь реализовать слушатель dbus в Python, который выполняет функцию, когда сеанс заблокирован, и другую функцию, когда сеанс разблокирован. По сути, я хочу превратить следующую команду в программу 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 [])

Питон 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()

Просто для справки, я запускаю xfce на Ubuntu 18.04 с XScreenSaver.

1 Ответ

2 голосов
/ 16 октября 2019

«LockedHint» - это не сигнал, это свойство. Сигнал «PropertiesChanged» в интерфейсе org.freedesktop.DBus.Properties. Обычно это проще всего найти с помощью d-футов (графический отладчик 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-интерфейс logind: взгляните на org.freedesktop.ScreenSaver (в сессионной шине) для альтернативы (это будет намного проще, так как имя хорошо известно и есть сигнал "ActiveChanged")вы можете использовать). Я снова предлагаю использовать d-foot для просмотра API.

...