Source code for i3pystatus.core.desktop
import logging
[docs]class BaseDesktopNotification:
"""
Class to display a desktop notification
:param title: Title of the notification
:param body: Body text of the notification, depending on the users system configuration HTML may be used, but is not recommended
:param icon: A XDG icon name, see http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
:param urgency: A value between 1 and 3 with 1 meaning low urgency and 3 high urgency.
:param timeout: Timeout in seconds for the notification. Zero means it needs to be dismissed by the user.
"""
def __init__(self, title, body, icon="dialog-information", urgency=1,
timeout=-1, log_level=logging.WARNING):
self.title = title
self.body = body
self.icon = icon
self.urgency = urgency
self.timeout = timeout
self.log_level = log_level
if self.__class__.__name__.startswith("i3pystatus"):
self.logger = logging.getLogger(self.__class__.__name__)
else:
self.logger = logging.getLogger("i3pystatus." + self.__class__.__name__)
self.logger.setLevel(self.log_level)
[docs] def display(self):
"""
Display this notification
:returns: boolean indicating success
"""
return False
[docs] def update(self, title=None, body=None, icon=None):
"""
Update this notification.
:param title: Title of the notification
:param body: Body text of the notification, depending on the users system configuration HTML may be used, but is not recommended
:param icon: A XDG icon name, see http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
:return boolean indicating success
"""
return False
class DesktopNotification(BaseDesktopNotification):
pass
try:
import gi
gi.require_version('Notify', '0.7')
from gi.repository import Notify
except (ImportError, ValueError, AttributeError):
pass
else:
if not Notify.init("i3pystatus"):
raise ImportError("Couldn't initialize libnotify")
# List of some useful icon names:
# battery, battery-caution, battery-low
# …
[docs] class DesktopNotification(DesktopNotification):
URGENCY_LUT = (
Notify.Urgency.LOW,
Notify.Urgency.NORMAL,
Notify.Urgency.CRITICAL,
)
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.notification = Notify.Notification.new(self.title, self.body, self.icon)
[docs] def display(self):
if self.timeout:
self.notification.set_timeout(self.timeout)
self.notification.set_urgency(self.URGENCY_LUT[self.urgency])
try:
return self.notification.show()
except Exception:
self.logger.exception(
'Failed to display desktop notification (is a '
'notification daemon running?)'
)
return False
[docs] def update(self, title=None, body=None, icon=None):
self.notification.update(title or self.title, body or self.body, icon or self.icon)
return self.notification.show()