From 78f7be4e4b6501b15b5fefc9f7824bbadf0daf2a Mon Sep 17 00:00:00 2001 From: Weitian LI Date: Fri, 13 Jun 2014 21:12:21 +0800 Subject: Added various dotfiles. * Xresources * profile, xprofile, xinitrc * bash (aliases, logout, profile, rc, completion) * gitconfig * gtkrc and gtk-bookmarks * i3 configs (with py3status configs) * i3status.conf * lftp/rc * tmux.conf * xbindkeysrc * mpdconf * ncmpcpp (config and keys) * sbclrc * vifm (vifmrc, colors) * urxvt (perl extensions) * conkyrc (and conky/cronograph configs) --- .i3/py3status/10-mpd.py | 117 ++++++++++++++++++++++++ .i3/py3status/20-volume.py | 112 +++++++++++++++++++++++ .i3/py3status/25-microphone.py | 105 ++++++++++++++++++++++ .i3/py3status/30-touchpad.py | 86 ++++++++++++++++++ .i3/py3status/40-power.py | 73 +++++++++++++++ .i3/py3status/50-battery.py | 106 ++++++++++++++++++++++ .i3/py3status/80-datetime.py | 76 ++++++++++++++++ .i3/py3status/backup/dpms.py | 44 +++++++++ .i3/py3status/backup/empty_class.py | 41 +++++++++ .i3/py3status/backup/glpi.py | 52 +++++++++++ .i3/py3status/backup/i3bar_click_events.py | 127 ++++++++++++++++++++++++++ .i3/py3status/backup/netdata.py | 132 +++++++++++++++++++++++++++ .i3/py3status/backup/ns_checker.py | 57 ++++++++++++ .i3/py3status/backup/pingdom.py | 59 +++++++++++++ .i3/py3status/backup/pomodoro.py | 123 ++++++++++++++++++++++++++ .i3/py3status/backup/sysdata.py | 137 +++++++++++++++++++++++++++++ .i3/py3status/backup/weather_yahoo.py | 106 ++++++++++++++++++++++ .i3/py3status/backup/whoami.py | 26 ++++++ 18 files changed, 1579 insertions(+) create mode 100644 .i3/py3status/10-mpd.py create mode 100644 .i3/py3status/20-volume.py create mode 100644 .i3/py3status/25-microphone.py create mode 100644 .i3/py3status/30-touchpad.py create mode 100644 .i3/py3status/40-power.py create mode 100644 .i3/py3status/50-battery.py create mode 100644 .i3/py3status/80-datetime.py create mode 100644 .i3/py3status/backup/dpms.py create mode 100644 .i3/py3status/backup/empty_class.py create mode 100644 .i3/py3status/backup/glpi.py create mode 100644 .i3/py3status/backup/i3bar_click_events.py create mode 100644 .i3/py3status/backup/netdata.py create mode 100644 .i3/py3status/backup/ns_checker.py create mode 100644 .i3/py3status/backup/pingdom.py create mode 100644 .i3/py3status/backup/pomodoro.py create mode 100644 .i3/py3status/backup/sysdata.py create mode 100644 .i3/py3status/backup/weather_yahoo.py create mode 100644 .i3/py3status/backup/whoami.py (limited to '.i3/py3status') diff --git a/.i3/py3status/10-mpd.py b/.i3/py3status/10-mpd.py new file mode 100644 index 0000000..95b7b4f --- /dev/null +++ b/.i3/py3status/10-mpd.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Weitian LI +# 2014/05/14 + +""" +mpd module for py3status +""" + +## Get output of shell command: +## python 3.x: +## >>> subprocess.getoutput(cmd) +## >>> subprocess.getstatusoutput(cmd) +## python 2.7.x: +## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE) + +import os +import re +import subprocess +import time + + +POSITION = 0 +# regex to match the status string of 'mpc status' output +mpd_status_p = re.compile(r'.*\n^\[([a-z]+)\]', re.M) # multiline + +class Py3status: + """ + MPD module to show mpd status and play info. + + This module also handle click events: + left button: mpc toggle + middle button: mpc stop + right button: mpc next + """ + + def mpd(self, i3status_output_json, i3status_config): + """ + Display MPD status and song info. + """ + response = { + 'full_text': '', + 'name': 'mpd', + 'instance': 'first', + } + # update response fields + self._update_response(i3status_config) + if self.color: + response['color'] = self.color + response['full_text'] = self.full_text + # cache status for 5 seconds + response['cached_until'] = time.time() + 5 + return (POSITION, response) + + def on_click(self, i3status_output_json, i3status_config, event): + """ + Handle click events. + """ + if event['button'] == 1: + # left button click + cmd = 'mpc toggle' + cmd_output = subprocess.getoutput(cmd) + elif event['button'] == 2: + # middle button click + cmd = 'mpc stop' + cmd_output = subprocess.getoutput(cmd) + elif event['button'] == 3: + # right button click + cmd = 'mpc next' + cmd_output = subprocess.getoutput(cmd) + # + self._update_response(i3status_config) + os.system('killall -USR1 py3status') + + def _update_response(self, i3status_config=None): + ## get mpd status + cmd = 'mpc status' + cmd_out = subprocess.getstatusoutput(cmd) + if cmd_out[0] == 0: + # mpd is running + mpd_status_m = mpd_status_p.match(cmd_out[1]) + if mpd_status_m: + self.status = mpd_status_m.group(1) + else: + self.status = 'stopped' + else: + # mpd not running (N/A) + self.status = 'na' + ## set full_text and color + prompt = '' # Icons: uF198 (music) + if self.status == 'playing': + status_text = ' ' # Icons: uF04B (play) + cmd = 'mpc status -f "%artist%-%title%" | head -n 1' + song_text = subprocess.getoutput(cmd) + if i3status_config: + self.color = i3status_config['color_good'] + elif self.status == 'paused': + status_text = ' ' # Icons: uF04C (pause) + cmd = 'mpc status -f "%title%" | head -n 1' + song_text = subprocess.getoutput(cmd) + if i3status_config: + self.color = i3status_config['color_degraded'] + elif self.status == 'stopped': + status_text = '' # Icons: uF04D (stop) + song_text = '' + if i3status_config: + self.color = i3status_config['color_bad'] + else: + # mpd not running (N/A) + status_text = '' # Icons: uF00D (X) + song_text = '' + if i3status_config: + self.color = i3status_config['color_bad'] + # full_text + self.full_text = '{0} {1}{2}'.format(prompt, status_text, song_text) + diff --git a/.i3/py3status/20-volume.py b/.i3/py3status/20-volume.py new file mode 100644 index 0000000..467764c --- /dev/null +++ b/.i3/py3status/20-volume.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Weitian LI +# 2014/05/15 + +""" +volume module for py3status +""" + +## Get output of shell command: +## python 3.x: +## >>> subprocess.getoutput(cmd) +## >>> subprocess.getstatusoutput(cmd) +## python 2.7.x: +## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE) + +import os +import re +import subprocess +import time + + +POSITION = 0 +DEVICE = 'default' +MIXER = 'Master' +# regex compile to match amixer output volume info +amixer_rep = re.compile(r'.*\[(\d+)%\]\s*\[(on|off)\]') + + +class Py3status: + """ + Volume module to show volume info. + + This module also handle click events: + left button: decrease volume + middle button: mute/unmute toggle + right button: increase volume + """ + + def myvolume(self, i3status_output_json, i3status_config): + """ + Display volume info. + + XXX: cannot use name 'volume' ?? + """ + response = { + 'full_text': '', + 'name': 'myvolume', + 'instance': 'first', + } + # update response fields + self._update_response(i3status_config) + if self.color: + response['color'] = self.color + response['full_text'] = self.full_text + # cache status for 5 seconds + response['cached_until'] = time.time() + 5 + return (POSITION, response) + + def on_click(self, i3status_output_json, i3status_config, event): + """ + Handle click events. + """ + if event['button'] == 1: + # left button click + cmd = 'amixer -D "{0}" sset "{1}" "5%-" unmute'.format(DEVICE, MIXER) + cmd_output = subprocess.getoutput(cmd) + elif event['button'] == 2: + # middle button click + cmd = 'amixer -D "{0}" sset "{1}" toggle'.format(DEVICE, MIXER) + cmd_output = subprocess.getoutput(cmd) + elif event['button'] == 3: + # right button click + cmd = 'amixer -D "{0}" sset "{1}" "5%+" unmute'.format(DEVICE, MIXER) + cmd_output = subprocess.getoutput(cmd) + # + self._update_response(i3status_config) + os.system('killall -USR1 py3status') + + def _update_response(self, i3status_config=None): + """ + update self.full_text + """ + # get volume info + cmd = 'amixer -D "{0}" sget "{1}" | tail -n 1'.format(DEVICE, MIXER) + cmd_output = subprocess.getoutput(cmd) + m = amixer_rep.match(cmd_output) + self.volume, self.status = m.group(1, 2) + if int(self.volume) > 60: + self.level = 'high' + prompt = '' # Icons: uF357 (volume-high) + if i3status_config: + self.color = i3status_config['color_degraded'] + elif int(self.volume) > 30: + self.level = 'medium' + prompt = '' # Icons: uF359 (volume-medium) + if i3status_config: + self.color = i3status_config['color_good'] + else: + self.level = 'low' + prompt = '' # Icons: uF358 (volume-low) + if i3status_config: + self.color = i3status_config['color_good'] + # determine icon + if self.status == 'off': + prompt = '' # Icons: uF35A (volume-off) + if i3status_config: + self.color = i3status_config['color_bad'] + # determine display info + self.full_text = '{0} {1}%'.format(prompt, self.volume) + diff --git a/.i3/py3status/25-microphone.py b/.i3/py3status/25-microphone.py new file mode 100644 index 0000000..379a44c --- /dev/null +++ b/.i3/py3status/25-microphone.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Weitian LI +# 2014/05/15 + +""" +microphone module for py3status +""" + +## Get output of shell command: +## python 3.x: +## >>> subprocess.getoutput(cmd) +## >>> subprocess.getstatusoutput(cmd) +## python 2.7.x: +## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE) + +import os +import re +import subprocess + + +POSITION = 0 +DEVICE = 'default' +MIXER = 'Capture' # Microphone +# regex compile to match amixer output volume info +amixer_rep = re.compile(r'.*\[(\d+)%\]\s*\[(on|off)\]') + + +class Py3status: + """ + Microphone module to show microphone info. + + This module also handle click events: + left button: decrease volume + middle button: mute/unmute toggle + right button: increase volume + """ + + def microphone(self, i3status_output_json, i3status_config): + """ + Display microphone info. + """ + response = { + 'full_text': '', + 'name': 'microphone', + 'instance': 'first', + } + # update response fields + self._update_response(i3status_config) + response['full_text'] = self.full_text + if self.color: + response['color'] = self.color + return (POSITION, response) + + def on_click(self, i3status_output_json, i3status_config, event): + """ + Handle click events. + """ + if event['button'] == 1: + # left button click + cmd = 'amixer -D "{0}" sset "{1}" "5%-" unmute'.format(DEVICE, MIXER) + cmd_output = subprocess.getoutput(cmd) + elif event['button'] == 2: + # middle button click + cmd = 'amixer -D "{0}" sset "{1}" toggle'.format(DEVICE, MIXER) + cmd_output = subprocess.getoutput(cmd) + elif event['button'] == 3: + # right button click + cmd = 'amixer -D "{0}" sset "{1}" "5%+" unmute'.format(DEVICE, MIXER) + cmd_output = subprocess.getoutput(cmd) + # + self._update_response(i3status_config) + os.system('killall -USR1 py3status') + + def _update_response(self, i3status_config=None): + """ + update self.full_text + """ + # get volume info + cmd = 'amixer -D "{0}" sget "{1}" | tail -n 1'.format(DEVICE, MIXER) + cmd_output = subprocess.getoutput(cmd) + m = amixer_rep.match(cmd_output) + self.volume, self.status = m.group(1, 2) + prompt = '' # Icons: uF130 (mic-on) + if int(self.volume) > 60: + self.level = 'high' + if i3status_config: + self.color = i3status_config['color_degraded'] + elif int(self.volume) > 30: + self.level = 'medium' + if i3status_config: + self.color = i3status_config['color_good'] + else: + self.level = 'low' + if i3status_config: + self.color = i3status_config['color_good'] + # determine icon + if self.status == 'off': + prompt = '' # Icons: uF131 (mic-off) + if i3status_config: + self.color = i3status_config['color_bad'] + # determine display info + self.full_text = '{0} {1}%'.format(prompt, self.volume) + diff --git a/.i3/py3status/30-touchpad.py b/.i3/py3status/30-touchpad.py new file mode 100644 index 0000000..195d6b1 --- /dev/null +++ b/.i3/py3status/30-touchpad.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Weitian LI +# 2014/05/15 + +""" +touchpad module for py3status +""" + +## Get output of shell command: +## python 3.x: +## >>> subprocess.getoutput(cmd) +## >>> subprocess.getstatusoutput(cmd) +## python 2.7.x: +## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE) + +import os +import re +import subprocess + + +POSITION = 0 + + +class Py3status: + """ + Touchpad module to show the status of touchpad. + + Click events: + left button: enable touchpad + middle button: toggle touchpad + """ + + def __init__(self): + """ + get touchpad status + """ + cmd = 'synclient -l | grep -c "TouchpadOff.*=.*0"' + touchpad_status = subprocess.getoutput(cmd) + if int(touchpad_status) == 1: + self.status = 'on' + else: + self.status = 'off' + + def touchpad(self, i3status_output_json, i3status_config): + """ + Display touchpad status. + """ + #prompt = '' # Icons: uF10A (ipad) + prompt = '' # Icons: uF3E3 (palm) + response = { + 'full_text': '', + 'name': 'touchpad', + 'instance': 'first', + } + if self.status == 'on': + response['color'] = i3status_config['color_good'] + status_text = '' # Icons: uF00C (check) + else: + response['color'] = i3status_config['color_bad'] + status_text = '' # Icons: uF00D (cross) + response['full_text'] = '{0} {1}'.format(prompt, status_text) + return (POSITION, response) + + def on_click(self, i3status_output_json, i3status_config, event): + """ + Handle click events. + """ + if event['button'] == 1: + # left button click + cmd = 'synclient TouchpadOff=0' + cmd_output = subprocess.getoutput(cmd) + self.status = 'on' + elif event['button'] == 2: + # middle button click + if self.status == 'on': + cmd = 'synclient TouchpadOff=1' + self.status = 'off' + else: + cmd = 'synclient TouchpadOff=0' + self.status = 'on' + cmd_output = subprocess.getoutput(cmd) + # + os.system('killall -USR1 py3status') + diff --git a/.i3/py3status/40-power.py b/.i3/py3status/40-power.py new file mode 100644 index 0000000..96b8ce5 --- /dev/null +++ b/.i3/py3status/40-power.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Weitian LI +# 2014/05/15 + +""" +power module for py3status +""" + +## Get output of shell command: +## python 3.x: +## >>> subprocess.getoutput(cmd) +## >>> subprocess.getstatusoutput(cmd) +## python 2.7.x: +## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE) + +import re +import subprocess +import time + + +POSITION = 0 + +BAT_PRESENT = '/sys/class/power_supply/BAT0/present' +# regex to match the '1' at the beginning +one_p = re.compile(r'(^1).*') + + +class Py3status: + """ + Power module to show whether AC/battery is online. + + ac_status: online, offline + bat_status: present, na + """ + + def power(self, i3status_output_json, i3status_config): + """ + Display power status. + """ + response = { + 'full_text': '', + 'name': 'power', + 'instance': 'first', + } + # AC online + ac_cmd = 'on_ac_power' + ac_cmd_out = subprocess.getstatusoutput(ac_cmd) + if ac_cmd_out[0] == 0: + ac_text = '' # Icons: uF237 (ac-online) + self.ac_status = 'online' + response['color'] = i3status_config['color_good'] + else: + ac_text = '' # Icons: uF236 (ac-offline) + self.ac_status = 'offline' + response['color'] = i3status_config['color_bad'] + # Battery present + with open(BAT_PRESENT, 'r') as bat_present_f: + bat_present_c = bat_present_f.read() + bat_m = one_p.match(bat_present_c) + if bat_m.group(1): + bat_text = ' ' # Icons: uF3CF (battery-vertical) + self.bat_status = 'present' + else: + bat_text = '' + self.bat_status = 'na' + # + response['full_text'] = '{0} {1}'.format(ac_text, bat_text) + # cache status for 5 seconds + response['cached_until'] = time.time() + 5 + return (POSITION, response) + diff --git a/.i3/py3status/50-battery.py b/.i3/py3status/50-battery.py new file mode 100644 index 0000000..5e88125 --- /dev/null +++ b/.i3/py3status/50-battery.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Weitian LI +# 2014/05/17 + +""" +battery module for py3status +""" + +## Get output of shell command: +## python 3.x: +## >>> subprocess.getoutput(cmd) +## >>> subprocess.getstatusoutput(cmd) +## python 2.7.x: +## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE) + +import re +import subprocess +import time + + +POSITION = 0 + +BAT_ID = 0 +## uevent: +## ENERGY_NOW: energy that battery has now +## POWER_NOW: battery current discharging/charing rate +BAT_UEVENT = '/sys/class/power_supply/BAT{0}/uevent'.format(BAT_ID) + +# regex to match pattern in 'uevent' contents' +status_p = re.compile(r'.*STATUS=(\w+)', re.S) +present_p = re.compile(r'.*PRESENT=(\d)', re.S) +capacity_p = re.compile(r'.*CAPACITY=(\d+)', re.S) +energynow_p = re.compile(r'.*ENERGY_NOW=(\d+)', re.S) +powernow_p = re.compile(r'.*POWER_NOW=(\d+)', re.S) + + +class Py3status: + """ + Battery module to show battery information. + + battery status: Full, Discharging, Charging, Unknown + """ + + def mybattery(self, i3status_output_json, i3status_config): + """ + Display battery information. + """ + response = { + 'full_text': '', + 'name': 'mybattery', + 'instance': 'first', + } + # open battery uevent file + with open(BAT_UEVENT, 'r') as bat_f: + bat_info = bat_f.read() + status_m = status_p.match(bat_info) + capacity_m = capacity_p.match(bat_info) + energynow_m = energynow_p.match(bat_info) + powernow_m = powernow_p.match(bat_info) + self.status = status_m.group(1) + self.capacity = int(capacity_m.group(1)) + energynow = int(energynow_m.group(1)) + powernow = int(powernow_m.group(1)) + # + bat_text = '{0}%'.format(self.capacity) + if self.status == 'Full': + prompt = '' # Icons: uF213 (battery-full) + color = i3status_config['color_good'] + elif self.status == 'Charging': + prompt = '' # Icons: uF211 (battery-charing) + color = i3status_config['color_degraded'] + elif self.status == 'Discharging': + if self.capacity > 80: + prompt = '' # Icons: uF213 (battery-full) + color = i3status_config['color_good'] + elif self.capacity > 60: + prompt = '' # Icons: uF214 (battery-high) + color = i3status_config['color_degraded'] + elif self.capacity > 30: + prompt = '' # Icons: uF215 (battery-low) + color = i3status_config['color_degraded'] + else: + prompt = '' # Icons: uF212 (battery-empty) + color = i3status_config['color_bad'] + # calc remaining time + remaining_h = energynow // powernow + remaining_m = int((energynow % powernow) / powernow * 60) + if remaining_h: + remaining = '{0}h{1:02d}m'.format(remaining_h, remaining_m) + else: + remaining = '{0:02d}m'.format(remaining_m) + bat_text = '{0} {1}'.format(bat_text, remaining) + else: + # unknown battery status + prompt = '' # Icons: uF215 (battery-low) + prompt = prompt + ' ' # Icons: uF243 (question-sign) + color = i3status_config['color_bad'] + # + response['full_text'] = '{0} {1}'.format(prompt, bat_text) + response['color'] = color + # cache status for 5 seconds + response['cached_until'] = time.time() + 5 + return (POSITION, response) + diff --git a/.i3/py3status/80-datetime.py b/.i3/py3status/80-datetime.py new file mode 100644 index 0000000..5d578a0 --- /dev/null +++ b/.i3/py3status/80-datetime.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Weitian LI +# 2014/05/15 + +""" +datetime module for py3status +""" + +## Get output of shell command: +## python 3.x: +## >>> subprocess.getoutput(cmd) +## >>> subprocess.getstatusoutput(cmd) +## python 2.7.x: +## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE) + +import re +import subprocess +import time + + +# regext to match date and time from output of 'date' +datetime_p = re.compile(r'(^\d+/\d+)\s*(\d+:\d+)') + + +class Py3status: + """ + Datetime module to show current date and time. + """ + + def mydate(self, i3status_output_json, i3status_config): + """ + Display current date. + """ + POSITION = 0 + response = { + 'full_text': '', + 'name': 'mydate', + 'instance': 'first', + } + prompt = '' # Icons: uF073 (calendar) + # update datetime + self._get_datetime() + response['full_text'] = '{0} {1}'.format(prompt, self.date) + # cache status for 5 seconds + response['cached_until'] = time.time() + 5 + return (POSITION, response) + + def mytime(self, i3status_output_json, i3status_config): + """ + Display current time. + """ + POSITION = 1 + response = { + 'full_text': '', + 'name': 'mytime', + 'instance': 'first', + } + prompt = '' # Icons: uF017 (clock) + # update datetime + self._get_datetime() + response['full_text'] = '{0} {1}'.format(prompt, self.time) + # cache status for 5 seconds + response['cached_until'] = time.time() + 5 + return (POSITION, response) + + def _get_datetime(self): + """ + Get current date and time + """ + cmd = 'date "+%m/%d %H:%M"' + datetime = subprocess.getoutput(cmd) + dt_m = datetime_p.match(datetime) + self.date, self.time = dt_m.group(1, 2) + diff --git a/.i3/py3status/backup/dpms.py b/.i3/py3status/backup/dpms.py new file mode 100644 index 0000000..783c53c --- /dev/null +++ b/.i3/py3status/backup/dpms.py @@ -0,0 +1,44 @@ +from os import system + + +class Py3status: + """ + This module allows activation and deactivation + of DPMS (Display Power Management Signaling) + by clicking on 'DPMS' in the status bar. + + Written and contributed by @tasse: + Andre Doser + """ + def __init__(self): + """ + Detect current state on start. + """ + self.run = system('xset -q | grep -iq "DPMS is enabled"') == 0 + + def dpms(self, i3status_output_json, i3status_config): + """ + Display a colorful state of DPMS. + """ + result = { + 'full_text': 'DPMS', + 'name': 'dpms' + } + if self.run: + result['color'] = i3status_config['color_good'] + else: + result['color'] = i3status_config['color_bad'] + return (0, result) + + def on_click(self, json, i3status_config, event): + """ + Enable/Disable DPMS on left click. + """ + if event['button'] == 1: + if self.run: + self.run = False + system("xset -dpms") + else: + self.run = True + system("xset +dpms") + system("killall -USR1 py3status") diff --git a/.i3/py3status/backup/empty_class.py b/.i3/py3status/backup/empty_class.py new file mode 100644 index 0000000..077269c --- /dev/null +++ b/.i3/py3status/backup/empty_class.py @@ -0,0 +1,41 @@ +class Py3status: + """ + Empty and basic py3status class. + + NOTE: py3status will NOT execute: + - methods starting with '_' + - methods decorated by @property and @staticmethod + + NOTE: reserved method names: + - 'kill' method for py3status exit notification + - 'on_click' method for click events from i3bar + """ + def kill(self, i3status_output_json, i3status_config): + """ + This method will be called upon py3status exit. + """ + pass + + def on_click(self, i3status_output_json, i3status_config, event): + """ + This method will be called when a click event occurs on this module's + output on the i3bar. + + Example 'event' json object: + {'y': 13, 'x': 1737, 'button': 1, 'name': 'empty', 'instance': 'first'} + """ + pass + + def empty(self, i3status_output_json, i3status_config): + """ + This method will return an empty text message + so it will NOT be displayed on your i3bar. + + If you want something displayed you should write something + in the 'full_text' key of your response. + + See the i3bar protocol spec for more information: + http://i3wm.org/docs/i3bar-protocol.html + """ + response = {'full_text': '', 'name': 'empty', 'instance': 'first'} + return (0, response) diff --git a/.i3/py3status/backup/glpi.py b/.i3/py3status/backup/glpi.py new file mode 100644 index 0000000..929749d --- /dev/null +++ b/.i3/py3status/backup/glpi.py @@ -0,0 +1,52 @@ +# You need MySQL-python from http://pypi.python.org/pypi/MySQL-python +import MySQLdb + + +class Py3status: + """ + This example class demonstrates how to display the current total number of + open tickets from GLPI in your i3bar. + + It features thresholds to colorize the output and forces a low timeout to + limit the impact of a server connectivity problem on your i3bar freshness. + + Note that we don't have to implement a cache layer as it is handled by + py3status automagically. + """ + def count_glpi_open_tickets(self, json, i3status_config): + response = {'full_text': '', 'name': 'glpi_tickets'} + + # user-defined variables + CRIT_THRESHOLD = 20 + WARN_THRESHOLD = 15 + MYSQL_DB = '' + MYSQL_HOST = '' + MYSQL_PASSWD = '' + MYSQL_USER = '' + POSITION = 0 + + mydb = MySQLdb.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + passwd=MYSQL_PASSWD, + db=MYSQL_DB, + connect_timeout=5, + ) + mycr = mydb.cursor() + mycr.execute('''select count(*) + from glpi_tickets + where closedate is NULL and solvedate is NULL;''') + row = mycr.fetchone() + if row: + open_tickets = int(row[0]) + if i3status_config['colors']: + if open_tickets > CRIT_THRESHOLD: + response.update({'color': i3status_config['color_bad']}) + elif open_tickets > WARN_THRESHOLD: + response.update( + {'color': i3status_config['color_degraded']} + ) + response['full_text'] = '%s tickets' % open_tickets + mydb.close() + + return (POSITION, response) diff --git a/.i3/py3status/backup/i3bar_click_events.py b/.i3/py3status/backup/i3bar_click_events.py new file mode 100644 index 0000000..792965c --- /dev/null +++ b/.i3/py3status/backup/i3bar_click_events.py @@ -0,0 +1,127 @@ +from subprocess import Popen +from time import time + + +class Py3status: + """ + This module allows you to take actions based on click events made on + the i3status modules. For example, thanks to this module you could + launch the wicd GUI when clicking on the ethernet or wireless module + of your i3status output ! + + IMPORTANT: + This module file name is reserved and should NOT be changed if you + want py3status to handle your i3status modules click events ! + + The behavior described above will only work if this file is named + 'i3bar_click_events.py' ! + """ + def __init__(self): + """ + This is where you setup your actions based on your i3status config. + + Configuration: + -------------- + self.actions = { + "": { +