aboutsummaryrefslogtreecommitdiffstats
path: root/xpybar/config/mytimer.py
diff options
context:
space:
mode:
Diffstat (limited to 'xpybar/config/mytimer.py')
-rw-r--r--xpybar/config/mytimer.py142
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'