1
0
Fork 0
This repository has been archived on 2024-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
qtile-config/widget_custom/notify.py
2020-02-10 11:09:07 +01:00

118 lines
3.4 KiB
Python

from . import base
from .. import bar, utils, pangocffi
from libqtile.notify import notifier
from os import path
class Notify(base._TextBox):
"""A notify widget"""
orientations = base.ORIENTATION_HORIZONTAL
defaults = [
("foreground_urgent", "ff0000", "Foreground urgent priority colour"),
("foreground_low", "dddddd", "Foreground low priority colour"),
(
"default_timeout",
None,
"Default timeout (seconds) for notifications"
),
("audiofile", None, "Audiofile played during notifications"),
]
def __init__(self, width=bar.CALCULATED, **config):
base._TextBox.__init__(self, "", width, **config)
self.add_defaults(Notify.defaults)
notifier.register(self.update)
self.current_id = 0
def _configure(self, qtile, bar):
base._TextBox._configure(self, qtile, bar)
self.layout = self.drawer.textlayout(
self.text,
self.foreground,
self.font,
self.fontsize,
self.fontshadow,
markup=True
)
def set_notif_text(self, notif):
self.text = pangocffi.markup_escape_text(notif.summary)
urgency = notif.hints.get('urgency', 1)
if urgency != 1:
self.text = '<span color="%s">%s</span>' % (
utils.hex(
self.foreground_urgent if urgency == 2
else self.foreground_low
),
self.text
)
if notif.body:
self.text = '<span weight="bold">%s</span> - %s' % (
self.text, pangocffi.markup_escape_text(notif.body)
)
if self.audiofile and path.exists(self.audiofile):
self.qtile.cmd_spawn("aplay -q '%s'" % self.audiofile)
def update(self, notif):
self.qtile.call_soon_threadsafe(self.real_update, notif)
def real_update(self, notif):
self.set_notif_text(notif)
self.current_id = notif.id - 1
if notif.timeout and notif.timeout > 0:
self.timeout_add(notif.timeout / 1000, self.clear)
elif self.default_timeout:
self.timeout_add(self.default_timeout, self.clear)
self.bar.draw()
return True
def display(self):
self.set_notif_text(notifier.notifications[self.current_id])
self.bar.draw()
def clear(self):
self.text = ''
self.current_id = len(notifier.notifications) - 1
self.bar.draw()
def prev(self):
if self.current_id > 0:
self.current_id -= 1
self.display()
def next(self):
if self.current_id < len(notifier.notifications) - 1:
self.current_id += 1
self.display()
def button_press(self, x, y, button):
if button == 1:
self.clear()
elif button == 4:
self.prev()
elif button == 5:
self.next()
def cmd_display(self):
"""Display the notifcication"""
self.display()
def cmd_clear(self):
"""Clear the notification"""
self.clear()
def cmd_toggle(self):
"""Toggle showing/clearing the notification"""
if self.text == '':
self.display()
else:
self.clear()
def cmd_prev(self):
"""Show previous notification"""
self.prev()
def cmd_next(self):
"""Show next notification"""
self.next()