Код: Выделить всё
org.freedesktop.ScreenSaverКод: Выделить всё
$ dbus-monitor "interface='org.freedesktop.ScreenSaver'"
...
signal time=1761396762.341364 sender=:1.21 -> destination=(null destination) serial=94408 path=/ScreenSaver; interface=org.freedesktop.ScreenSaver; member=ActiveChanged
boolean true
...
signal time=1761396765.026613 sender=:1.21 -> destination=(null destination) serial=94464 path=/ScreenSaver; interface=org.freedesktop.ScreenSaver; member=ActiveChanged
boolean false
Код: Выделить всё
from __future__ import annotations
from PySide6 import QtDBus, QtCore
from PySide6.QtCore import Slot, QObject
from typing import Annotated, get_type_hints
class DBusEventDispatcher(QtCore.QObject):
def __init__(self):
super().__init__()
sessionBus = QtDBus.QDBusConnection.sessionBus()
if not sessionBus.isConnected():
errorMessage = sessionBus.lastError().message()
raise Exception("Cannot connect to DBUS: " + errorMessage)
success = sessionBus.registerService("my_app")
print(success)
success = sessionBus.registerObject(
'/',
'org.freedesktop.ScreenSaver',
self,
QtDBus.QDBusConnection.ExportAllSlots
)
print(success)
#for path in ['org.freedesktop.ScreenSaver', 'org.gnome.ScreenSaver']:
# interface = QtDBus.QDBusInterface(path, '/ScreenSaver', '', sessionBus)
# if interface != None:
# interface.ActiveChanged.connect(self._onActiveChanged)
mo = self.metaObject()
for m in range(mo.methodOffset(), mo.methodCount()):
print(mo.method(m).methodSignature())
self.iface = QtDBus.QDBusInterface(
"org.freedesktop.ScreenSaver", # Service
"/ScreenSaver", # Path
"org.freedesktop.ScreenSaver", # Interface
sessionBus
)
print(self.iface.isValid())
self.iface.connect(
QtCore.SIGNAL("ActiveChanged(bool)"),
self.ActiveChanged
)
QtCore.QObject.connect(
self.iface,
QtCore.SIGNAL("ActiveChanged(bool)"),
self.ActiveChanged
)
# for service in ['org.freedesktop.ScreenSaver']: # 'org.gnome.ScreenSaver'
success = sessionBus.connect(
'org.freedesktop.ScreenSaver', # service,
'/ScreenSaver',
'org.freedesktop.ScreenSaver',
'ActiveChanged',
self,
QtCore.SLOT('ActiveChanged(bool)')
)
print(success)
@QtCore.Slot(bool)
def ActiveChanged(self, active: bool):
print("ActiveChanged")
print(active)
Код: Выделить всё
$ python3 my_app.py
True
True
b'ActiveChanged(bool)'
True
True
Когда я блокирую экран, я вижу сообщение от dbus-monitor сверху, но ничего от сценария Python.
Кто-нибудь знает, что может быть не так со сценарием?
Может ли это быть системной проблемой, например, каким-то правилом systemd, блокирующим доступ?
Может быть, есть какой-нибудь флаг отладки, который я мог бы установить, чтобы видеть, что происходит внутри библиотеки Python/DBUS?
Есть еще идеи?
Спасибо за любую помощь.
Код: Выделить всё
$ python3 --version
Python 3.12.3
$ pip3 list
Package Version
------------------ -------
cysystemd 2.0.1
pip 24.0
PySide6_Essentials 6.10.0
shiboken6 6.10.0
systemd 0.17.1
systemd-python 235
$ uname -a
Linux gerrit-framework 6.14.0-112033-tuxedo #33~24.04.1tux1 SMP PREEMPT_DYNAMIC Tue Sep 30 19:33:36 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/issue
TUXEDO OS 24.04.3 LTS \l
KDE-Frameworks-Vernion: 6.17Qt-Cersion: 6.8.8.2[*]Графическая платформа: Wayland
Подробнее здесь: https://stackoverflow.com/questions/797 ... r-not-work