Source code for i3pystatus.clock

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import locale
import datetime

from i3pystatus import IntervalModule


[docs]class Clock(IntervalModule): """ This class shows a clock """ settings = ( ("format", "list of tuple (stftime format string, optional timezone), `None` means to use the default, locale-dependent format. Can cycle between formats with mousewheel"), ("color", "RGB hexadecimal code color specifier, default to #ffffff, set to `i3Bar` to use i3 bar default"), ) format = None color = "#ffffff" interval = 1 current_format_id = 0 def init(self): if self.format is None: lang = os.environ.get('LANG', None) if lang: locale.setlocale(locale.LC_ALL, lang) lang = locale.getlocale()[0] if lang == 'en_US': # MDY format - United States of America self.format = ["%a %b %-d %X"] else: # DMY format - almost all other countries self.format = ["%a %-d %b %X"] elif isinstance(self.format, str): self.format = [self.format] self.format = self.expand_formats(self.format) @staticmethod def expand_formats(formats): def expand_format(format_): if isinstance(format_, tuple): return (format_[0], format_[1] if len(format_) > 1 else None) return (format_, None) return [expand_format(format_) for format_ in formats] def run(self): # Safest way is to work from utc and localize afterwards if self.format[self.current_format_id][1]: try: import pytz except ImportError as e: raise RuntimeError("Need pytz for timezones") from e utc_dt = pytz.utc.localize(datetime.datetime.utcnow()) tz = pytz.timezone(self.format[self.current_format_id][1]) dt = tz.normalize(utc_dt.astimezone(tz)) else: dt = datetime.datetime.now() output = dt.strftime(self.format[self.current_format_id][0]) self.output = { "full_text": output, "urgent": False, } if self.color != "i3Bar": self.output["color"] = self.color def on_upscroll(self): self.current_format_id = (self.current_format_id + 1) % len(self.format) def on_downscroll(self): self.current_format_id = (self.current_format_id - 1) % len(self.format)