Source code for i3pystatus.mail

from i3pystatus import SettingsBase, IntervalModule
from i3pystatus.core.command import run_through_shell

class Backend(SettingsBase):
    """Handles the details of checking for mail"""

    unread = 0
    settings = (("account", "Account name"),)

    account = "Default account"

    """Number of unread mails

    You'll probably implement that as a property"""

[docs]class Mail(IntervalModule): """ Generic mail checker The `backends` setting determines the backends to use. For available backends see :ref:`mailbackends`. """ settings = ( ("backends", "List of backends (instances of ````, e.g. :py:class:`.imap.IMAP`)"), "color", "color_unread", "format", "format_plural", ("hide_if_null", "Don't output anything if there are no new mails"), ("email_client", "The command to run on left click. " "For example, to launch Thunderbird set ``email_client` to ``thunderbird``. " "Alternatively, to bring Thunderbird into focus, " "set ``email_client`` to ``i3-msg -q [class=\"^Thunderbird$\"] focus``. " "Hint: To discover the X window class of your email client run 'xprop | grep -i class' " "and click on it's window\n"), ) required = ("backends",) color = "#ffffff" color_unread = "#ff0000" format = "{unread} new email" format_plural = "{account} : {current_unread}/{unread} new emails" hide_if_null = True email_client = None on_leftclick = "open_client" on_upscroll = ["scroll_backend", 1] on_downscroll = ["scroll_backend", -1] current_backend = 0 def init(self): for backend in self.backends: pass
[docs] def run(self): """ Returns the sum of unread messages across all registered backends """ unread = 0 current_unread = 0 for id, backend in enumerate(self.backends): temp = backend.unread or 0 unread = unread + temp if id == self.current_backend: current_unread = temp if not unread: color = self.color urgent = "false" if self.hide_if_null: self.output = None return else: color = self.color_unread urgent = "true" format = self.format if unread > 1: format = self.format_plural account_name = getattr(self.backends[self.current_backend], "account", "No name") self.output = { "full_text": format.format(unread=unread, current_unread=current_unread, account=account_name), "urgent": urgent, "color": color, }
def scroll_backend(self, step): self.current_backend = (self.current_backend + step) % len(self.backends) def open_client(self): if self.email_client: retcode, _, stderr = run_through_shell(self.email_client) if retcode != 0 and stderr: self.logger.error(stderr)