summaryrefslogtreecommitdiffstats
path: root/py3status
diff options
context:
space:
mode:
authorrixx <rixx-git@cutebit.de>2015-03-19 15:40:36 +0100
committerrixx <rixx-git@cutebit.de>2015-03-19 15:43:53 +0100
commit102313553232fae442a17d2c6193ee43b5852d22 (patch)
tree9992c9e424d8105c378be4e4452aba8f4fd295a7 /py3status
parent74c855d59f8aacc0b67261d2e5b7ac7402877360 (diff)
parentdbbe4cdc6bf9d428f6fa5e2fb3c7a8dd6198abcd (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'py3status')
-rw-r--r--py3status/modules/online_status.py67
-rw-r--r--py3status/modules/pomodoro.py88
2 files changed, 148 insertions, 7 deletions
diff --git a/py3status/modules/online_status.py b/py3status/modules/online_status.py
new file mode 100644
index 0000000..8cc6eeb
--- /dev/null
+++ b/py3status/modules/online_status.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+"""
+Module displaying if a connection to the internet is established.
+
+@author obb
+"""
+
+from time import time
+try:
+ # python3
+ from urllib.request import urlopen
+except:
+ from urllib2 import urlopen
+
+
+class Py3status:
+ """
+ Configuration parameters:
+ - cache_timeout : how often to run the check
+ - format_offline : what to display when offline
+ - format_online : what to display when online
+ - timeout : how long before deciding we're offline
+ - url : connect to this url to check the connection status
+ """
+ # available configuration parameters
+ cache_timeout = 10
+ format_offline = '■'
+ format_online = '●'
+ timeout = 2
+ url = 'http://www.google.com'
+
+ def _connection_present(self):
+ try:
+ urlopen(self.url, timeout=self.timeout)
+ except:
+ return False
+ else:
+ return True
+
+ def online_status(self, i3s_output_list, i3s_config):
+ response = {
+ 'cached_until': time() + self.cache_timeout
+ }
+
+ connected = self._connection_present()
+ if connected:
+ response['full_text'] = self.format_online
+ response['color'] = i3s_config['color_good']
+ else:
+ response['full_text'] = self.format_offline
+ response['color'] = i3s_config['color_bad']
+
+ return response
+
+if __name__ == "__main__":
+ """
+ Test this module by calling it directly.
+ """
+ from time import sleep
+ x = Py3status()
+ config = {
+ 'color_good': '#00FF00',
+ 'color_bad': '#FF0000',
+ }
+ while True:
+ print(x.online_status([], config))
+ sleep(1)
diff --git a/py3status/modules/pomodoro.py b/py3status/modules/pomodoro.py
index 7fcecba..ecb3f57 100644
--- a/py3status/modules/pomodoro.py
+++ b/py3status/modules/pomodoro.py
@@ -4,13 +4,40 @@ Pomodoro countdown on i3bar originally written by @Fandekasp (Adrien Lemaire)
"""
from subprocess import call
+from syslog import syslog, LOG_INFO
from time import time
+try:
+ from pygame import mixer
+ mixer.init()
+except ImportError:
+ mixer = None
+
+# PROGRESS_BAR_ITEMS = u"▁▃▄▅▆▇█"
+PROGRESS_BAR_ITEMS = u"▏▎▍▌▋▊▉"
+
class Py3status:
+ """
+ Configuration parameters:
+ - display_bar: display time in bars when True, otherwise in seconds
+ - max_breaks: maximum number of breaks
+ - num_progress_bars: number of progress bars
+ - sound_break_end: break end sound (file path)
+ - sound_pomodoro_end: pomodoro end sound (file path)
+ - sound_pomodoro_start: pomodoro start sound (file path)
+ - timer_break: normal break time (seconds) (requires pygame)
+ - timer_long_break: long break time (seconds) (requires pygame)
+ - timer_pomodoro: pomodoro time (seconds) (requires pygame)
+ """
# available configuration parameters
+ display_bar = False
max_breaks = 4
+ num_progress_bars = 5
+ sound_break_end = None
+ sound_pomodoro_end = None
+ sound_pomodoro_start = None
timer_break = 5 * 60
timer_long_break = 15 * 60
timer_pomodoro = 25 * 60
@@ -23,15 +50,16 @@ class Py3status:
def on_click(self, i3s_output_list, i3s_config, event):
"""
Handles click events:
- - left click starts an inactive counter and pauses a running
- Pomodoro
- - middle click resets everything
- - right click starts (and ends, if needed) a break
+ - left click starts an inactive counter and pauses a running
+ Pomodoro
+ - middle click resets everything
+ - right click starts (and ends, if needed) a break
"""
if event['button'] == 1:
if self.status == 'stop':
self.status = 'start'
+ self.__play_sound(self.sound_pomodoro_start)
self.run = True
elif self.status == 'break':
@@ -64,9 +92,28 @@ class Py3status:
"""
Return the response full_text string
"""
- return {
- 'full_text': '{} ({})'.format(self.prefix, self.timer)
- }
+ if self.display_bar and self.status in ('start', 'pause'):
+ bar = u''
+ items_cnt = len(PROGRESS_BAR_ITEMS)
+ bar = u''
+ bar_val = float(self.timer) / self.time_window * \
+ self.num_progress_bars
+ while bar_val > 0:
+ selector = int(bar_val * items_cnt)
+ selector = min(selector, items_cnt - 1)
+ bar += PROGRESS_BAR_ITEMS[selector]
+ bar_val -= 1
+
+ bar = bar.ljust(self.num_progress_bars).encode('utf_8')
+ else:
+ bar = self.timer
+
+ if self.run:
+ text = '{} [{}]'.format(self.prefix, bar)
+ else:
+ text = '{} ({})'.format(self.prefix, bar)
+
+ return dict(full_text=text)
def __setup(self, status):
"""
@@ -77,20 +124,24 @@ class Py3status:
self.prefix = 'Pomodoro'
self.status = 'stop'
self.timer = self.timer_pomodoro
+ self.time_window = self.timer
self.breaks = 1
elif status == 'start':
self.prefix = 'Pomodoro'
self.timer = self.timer_pomodoro
+ self.time_window = self.timer
elif status == 'break':
self.prefix = 'Break #%d' % self.breaks
if self.breaks > self.max_breaks:
self.timer = self.timer_long_break
+ self.time_window = self.timer
self.breaks = 1
else:
self.breaks += 1
self.timer = self.timer_break
+ self.time_window = self.timer
def __decrement(self):
"""
@@ -101,12 +152,16 @@ class Py3status:
self.alert = True
self.run = False
self.__i3_nagbar()
+
if self.status == 'start':
self.__setup('break')
self.status = 'break'
+ self.__play_sound(self.sound_pomodoro_end)
+
elif self.status == 'break':
self.__setup('start')
self.status = 'start'
+ self.__play_sound(self.sound_break_end)
def __i3_nagbar(self, level='warning'):
"""
@@ -144,6 +199,25 @@ class Py3status:
response['cached_until'] = time()
return response
+ def __play_sound(self, sound_fname):
+ """Play sound if required
+ """
+ if not sound_fname:
+ return
+
+ if not mixer:
+ syslog(LOG_INFO, "pomodoro module: the pygame library is required"
+ " to play sounds")
+ return
+
+ try:
+ mixer.music.load(sound_fname)
+ except Exception as e:
+ return
+
+ mixer.music.play()
+
+
if __name__ == "__main__":
"""
Test this module by calling it directly.