Files
nwg-panel/nwg_panel/modules/sni_system_tray/item.py
2022-02-01 08:49:50 +11:00

97 lines
3.2 KiB
Python

from dasbus.connection import SessionMessageBus
from dasbus.client.observer import DBusObserver
from dasbus.client.proxy import disconnect_proxy
PROPERTIES = [
"Id",
"Category",
"Title",
"Status",
"WindowId",
"IconName",
"IconPixmap",
"OverlayIconName",
"OverlayIconPixmap",
"AttentionIconName",
"AttentionIconPixmap",
"AttentionMovieName",
"ToolTip",
"IconThemePath",
"ItemIsMenu",
"Menu"
]
class StatusNotifierItem(object):
def __init__(self, service_name, object_path):
self.service_name = service_name
self.object_path = object_path
self.on_loaded_callback = None
self.on_updated_callback = None
self.session_bus = SessionMessageBus()
self.properties = {
"ItemIsMenu": True
}
self.item_proxy = None
self.item_observer = DBusObserver(
message_bus=self.session_bus,
service_name=self.service_name
)
self.item_observer.service_available.connect(
self.item_available_handler
)
self.item_observer.service_unavailable.connect(
self.item_unavailable_handler
)
self.item_observer.connect_once_available()
def __del__(self):
if self.item_proxy is not None:
disconnect_proxy(self.item_proxy)
self.item_observer.disconnect()
self.session_bus.disconnect()
def item_available_handler(self, _observer):
self.item_proxy = self.session_bus.get_proxy(self.service_name, self.object_path)
self.item_proxy.PropertiesChanged.connect(
lambda _if, changed_properties, _invalid: self.change_handler(list(changed_properties))
)
self.item_proxy.NewTitle.connect(
lambda _title: self.change_handler(["Title"])
)
self.item_proxy.NewIcon.connect(
lambda _icon_name, _icon_pixmap: self.change_handler(["IconName", "IconPixmap"])
)
self.item_proxy.NewAttentionIcon.connect(
lambda _icon_name, _icon_pixmap: self.change_handler(["AttentionIconName", "AttentionIconPixmap"])
)
self.item_proxy.NewIconThemePath.connect(
lambda _icon_theme_path: self.change_handler(["IconThemePath"])
)
self.item_proxy.NewStatus.connect(
lambda _status: self.change_handler(["Status"])
)
for name in PROPERTIES:
if hasattr(self.item_proxy, name):
self.properties[name] = getattr(self.item_proxy, name)
if self.on_loaded_callback is not None:
self.on_loaded_callback(self)
def item_unavailable_handler(self, _observer):
disconnect_proxy(self.item_proxy)
self.item_proxy = None
def change_handler(self, changed_properties: list[str]):
if len(changed_properties) > 0:
for name, value in changed_properties:
self.properties[name] = value
if self.on_updated_callback is not None:
self.on_updated_callback(self, changed_properties)
def set_on_loaded_callback(self, callback):
self.on_loaded_callback = callback
def set_on_updated_callback(self, callback):
self.on_updated_callback = callback