diff options
Diffstat (limited to 'xpybar/config/mytimer.py')
-rw-r--r-- | xpybar/config/mytimer.py | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/xpybar/config/mytimer.py b/xpybar/config/mytimer.py new file mode 100644 index 0000000..e886ed3 --- /dev/null +++ b/xpybar/config/mytimer.py @@ -0,0 +1,142 @@ +# -*- python -*- +from common import * + +from datetime import datetime + + +class MyTimer(Entry): + def __init__(self, *args, alarms = [], **kwargs): + self.start = None + self.length = None + self.notified = False + self.pause_text = None + self.triggered_alarm = None + self.alarms = [] + for alarm in alarms: + alarm = alarm.split(': ') + text = ': '.join(alarm[1:]) + if not text: + text = alarm + weekday = None + alarm = alarm[0].split(':') + if not alarm[0].isdigit(): + weekday, alarm[0] = alarm[0].split(' ') + weekday = {'mon' : 0, + 'tue' : 1, + 'wed' : 2, + 'thu' : 3, + 'fri' : 4, + 'sat' : 5, + 'sun' : 6}[weekday.lower()[:3]] + time = (int(alarm[0]) * 60 + int(alarm[1])) * 60 + if len(alarm) > 2: + time += int(alarm[2]) + self.alarms.append([False, time, weekday, text]) + mqueue_map['timer'] = self.mqueue + Entry.__init__(self, *args, **kwargs) + + def mqueue(self, args): + if args[1] == 'stop': + self.stop() + elif args[1] in ('pause', 'resume'): + self.pause() + else: + duration = args[1].split(':') + duration.reverse() + seconds = 0 + if len(duration) > 0: seconds += int(duration[0]) + if len(duration) > 1: seconds += int(duration[1]) * 60 + if len(duration) > 2: seconds += int(duration[2]) * 60 * 60 + if len(duration) > 3: seconds += int(duration[3]) * 60 * 60 * 24 + self.start = time.time() + self.length = seconds + self.notified = False + self.pause_text = None + self.invalidate() + + def action(self, col, button, x, y): + if self.triggered_alarm is not None: + self.triggered_alarm = None + self.invalidate() + elif button == LEFT_BUTTON: + self.pause() + elif button == RIGHT_BUTTON: + self.stop() + + def pause(self): + if self.pause_text is not None: + self.start = time.time() + self.pause_text = None + elif self.length is None: + pass + elif self.length - int(time.time() - self.start) < 0: + self.start, self.length, self.notified, self.pause_text = None, None, False, None + else: + self.pause_text = '' + self.length -= int(time.time() - self.start) + self.pause_text = self.dur(self.length) + self.invalidate() + + def stop(self): + self.start = None + self.length = None + self.notified = False + self.pause_text = None + self.invalidate() + + def dur(self, t): + s, t = t % 60, t // 60 + m, t = t % 60, t // 60 + h, d = t % 24, t // 24 + if d > 0: + return '%id %i:%02i:%02i' % (d, h, m, s) + elif h > 0: + return '%i:%02i:%02i' % (h, m, s) + else: + return '%i:%02i' % (m, s) + + def notify(self, text = 'You are done with your task'): + subprocess.Popen(['notify-send', '-u', 'critical', text]).wait() + + def wall(self, text = 'You are done with your task'): + subprocess.Popen(['wall', text]).wait() + + def function(self): + now = datetime.now() + weekday = now.weekday() + now = now.hour * 60 * 60 + now.minute * 60 + now.second + + if self.triggered_alarm is not None: + countdown = int(self.alarms[self.triggered_alarm][1] - now) % 2 + if countdown == 0: + return '\033[37;41m%s\033[00m' % self.alarms[self.triggered_alarm][3] + else: + return '\033[31m%s\033[00m' % self.alarms[self.triggered_alarm][3] + + for i, alarm in enumerate(self.alarms): + if (alarm[2] is None or weekday == alarm[2]) and now >= alarm[1] and now < alarm[1] + 30 * 60: + if not alarm[0]: + alarm[0] = True + xasync(lambda : self.notify(alarm[3]), name = 'alarm notify') + xasync(lambda : self.wall(alarm[3]), name = 'alarm wall') + self.triggered_alarm = i + return self.function() + else: + alarm[0] = False + + if self.pause_text is not None: + return '%s (paused)' % self.pause_text + if self.start is None: + return 'Timer inactive' + countdown = self.length - int(time.time() - self.start) + if countdown > 0: + return self.dur(countdown) + if not self.notified: + self.notified = True + xasync(self.notify, name = 'timer notify') + xasync(self.wall, name = 'timer wall') + countdown %= 2 + if countdown == 0: + return '\033[37;41mYou are done\033[00m' + else: + return '\033[31mYou are done\033[00m' |