aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron LI <aaronly.me@gmail.com>2016-01-06 15:11:44 +0800
committerAaron LI <aaronly.me@gmail.com>2016-01-06 15:11:44 +0800
commitdba767e8ff1599a0b4cf8fb3dc06ac0cce727748 (patch)
tree1c85bbf6409e1cb398da0dcb4cd5ad8a78644354
parentc07a9bd96fde28c0f672af8d1b4d345c2e34f1b3 (diff)
downloaddotfiles-dba767e8ff1599a0b4cf8fb3dc06ac0cce727748.tar.bz2
i3: update configuration for i3wm
* Update i3 wm config * Add i3blocks.conf * Remove py3status
-rw-r--r--.i3/config226
-rw-r--r--.i3/i3blocks.conf101
-rw-r--r--.i3/i3status.conf (renamed from .i3/py3status.conf)44
-rw-r--r--.i3/py3status/10-mpd.py117
-rw-r--r--.i3/py3status/20-volume.py112
-rw-r--r--.i3/py3status/25-microphone.py105
-rw-r--r--.i3/py3status/30-touchpad.py86
-rw-r--r--.i3/py3status/40-power.py73
-rw-r--r--.i3/py3status/50-battery.py106
-rw-r--r--.i3/py3status/80-datetime.py76
-rw-r--r--.i3/py3status/backup/dpms.py44
-rw-r--r--.i3/py3status/backup/empty_class.py41
-rw-r--r--.i3/py3status/backup/glpi.py52
-rw-r--r--.i3/py3status/backup/i3bar_click_events.py127
-rw-r--r--.i3/py3status/backup/netdata.py132
-rw-r--r--.i3/py3status/backup/ns_checker.py57
-rw-r--r--.i3/py3status/backup/pingdom.py59
-rw-r--r--.i3/py3status/backup/pomodoro.py123
-rw-r--r--.i3/py3status/backup/sysdata.py137
-rw-r--r--.i3/py3status/backup/weather_yahoo.py106
-rw-r--r--.i3/py3status/backup/whoami.py26
21 files changed, 247 insertions, 1703 deletions
diff --git a/.i3/config b/.i3/config
index 3388538..1e274bb 100644
--- a/.i3/config
+++ b/.i3/config
@@ -2,10 +2,17 @@
## ~/.i3/config
##
## i3 config file (v4)
-## Ref: http://i3wm.org/docs/userguide.html
##
-## Weitian LI <liweitianux@gmail.com>
-## 2014/05/10
+## References:
+## [1] http://i3wm.org/docs/userguide.html
+##
+## Credits:
+## [1] https://github.com/Airblader/dotfiles-manjaro
+## [2] https://github.com/Remedan/dotfiles
+##
+## Aaron LI <aaronly.me@outlook.com>
+## Created: 2014-05-10
+## Updated: 2015-12-18
###########################################################
###### NOTES ###### {{{
@@ -34,7 +41,7 @@ set $shots_dir ~/pictures/screenshots
# Use pango to choose FreeType fonts
#font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
#font pango:DejaVu Sans Mono 10
-font pango:Terminus, WenQuanYi Bitmap Song, Icons, FontAwesome, 10
+font pango:Terminus, WenQuanYi Bitmap Song, FontAwesome, 10
# use `Mouse+$mod' to drag floating windows
floating_modifier $mod
@@ -45,6 +52,9 @@ floating_modifier $mod
# timeout of urgency hint on workspace change (default 500ms)
force_display_urgency_hint 1000 ms
+# do not focus the activated window, always mark urgent (default: smart)
+focus_on_window_activation urgent
+
# ipc (`i3-msg' to run i3 commands)
ipc-socket ~/.i3/i3-ipc.sock
###### settings ###### }}}
@@ -53,9 +63,12 @@ ipc-socket ~/.i3/i3-ipc.sock
# border style
#new_window 1pixel
bindsym $mod+t border normal
-bindsym $mod+y border 1pixel
+bindsym $mod+y border pixel 3
bindsym $mod+u border none
+# 2 pixel border by default
+for_window [class="^.*"] border pixel 2
+
# orientation for new workspaces
default_orientation auto
@@ -63,29 +76,44 @@ default_orientation auto
#hide_edge_borders vertical
### colors
-## solarized colorscheme (customized) {{{
-client.background #1e2320
-# colorclass border background text indicator
-client.focused #859900 #859900 #fdf6e3 #2e9ef4
-client.focused_inactive #268bd2 #268bd2 #fdf6e3 #484e50
-client.unfocused #93a1a1 #93a1a1 #fdf6e3 #292d2e
-client.urgent #cb4b16 #cb4b16 #fdf6e3 #2e9ef4
-## colorscheme }}}
-#
+# molokai
+set $black #1b1d1e
+set $white #f8f8f2
+set $dark_gray #303030
+set $light_gray #9999aa
+set $red #b60050
+set $light_red #f92672
+set $green #88bb22
+set $light_green #80ff00
+set $brown #c47f2c
+set $yellow #ffba68
+set $blue #30309b
+set $light_blue #7070f0
+set $purple #7e40a5
+set $light_purple #bb88dd
+set $cyan #4699af
+set $light_cyan #66d9ef
+
+# BORDER BACKGROUND TEXT INDICATOR
+client.focused $green $green $black $green
+client.unfocused $black $black $white $black
+client.focused_inactive $black $black $white $black
+client.urgent $red $red $black $red
+client.background $black
###### appearance ###### }}}
###### workspace ###### {{{
# name workspace
-set $ws1 1gentoo
-set $ws2 2term
-set $ws3 3vim
-set $ws4 4web
-set $ws5 5work
-set $ws6 6media
-set $ws7 7game
-set $ws8 8sys
-set $ws9 9misc
-set $ws0 0float
+set $ws1 "1: "
+set $ws2 "2: "
+set $ws3 "3: "
+set $ws4 "4: "
+set $ws5 "5: ??"
+set $ws6 "6: ??"
+set $ws7 "7: "
+set $ws8 "8:  "
+set $ws9 "9: "
+set $ws0 "10: "
# switch to workspace
bindsym $mod+1 workspace $ws1
@@ -98,6 +126,7 @@ bindsym $mod+7 workspace $ws7
bindsym $mod+8 workspace $ws8
bindsym $mod+9 workspace $ws9
bindsym $mod+0 workspace $ws0
+
# auto back-and-forth when switched to the current workspace
workspace_auto_back_and_forth yes
@@ -115,11 +144,6 @@ bindsym $mod+Shift+0 move container to workspace $ws0
# move to provided workspace
bindsym $mod+Shift+m exec i3-input -F 'move container to workspace "%s"' -P 'move to workspace: '
-# assign workspace for applications
-assign [class="Gvim"] $ws3
-assign [class="Firefox" instance="Navigator"] $ws4
-assign [class="Vlc"] $ws6
-
# switch workspace
bindsym $mod+Tab workspace back_and_forth
bindsym $mod+Ctrl+Left workspace prev
@@ -138,34 +162,33 @@ bindsym $mod+Shift+q kill
bindsym $mod+F4 kill
# change focus (h/j/k/l)
-bindsym $mod+h focus left
-bindsym $mod+j focus down
-bindsym $mod+k focus up
-bindsym $mod+l focus right
+bindsym $mod+h focus left
+bindsym $mod+j focus down
+bindsym $mod+k focus up
+bindsym $mod+l focus right
# alternatively, you can use the cursor keys:
-bindsym $mod+Left focus left
-bindsym $mod+Down focus down
-bindsym $mod+Up focus up
+bindsym $mod+Left focus left
+bindsym $mod+Down focus down
+bindsym $mod+Up focus up
bindsym $mod+Right focus right
# move focused window (h/j/k/l)
-bindsym $mod+Shift+h move left
-bindsym $mod+Shift+j move down
-bindsym $mod+Shift+k move up
-bindsym $mod+Shift+l move right
+bindsym $mod+Shift+h move left
+bindsym $mod+Shift+j move down
+bindsym $mod+Shift+k move up
+bindsym $mod+Shift+l move right
# alternatively, you can use the cursor keys:
-bindsym $mod+Shift+Left move left
-bindsym $mod+Shift+Down move down
-bindsym $mod+Shift+Up move up
+bindsym $mod+Shift+Left move left
+bindsym $mod+Shift+Down move down
+bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
# split in horizontal orientation
bindsym $mod+Shift+v split h
-
# split in vertical orientation
-bindsym $mod+v split v
+bindsym $mod+v split v
# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen
@@ -194,6 +217,9 @@ bindsym $mod+Shift+minus move scratchpad
# If there are multiple scratchpad windows, this command cycles through them.
bindsym $mod+minus scratchpad show
+# toggle whether to stick a window to the screen (regardless of workspaces)
+bindsym $mod+Shift+s sticky toggle
+
# reload the configuration file
bindsym $mod+Shift+c reload
# restart i3 inplace (preserves layout/session, can be used to upgrade i3)
@@ -226,12 +252,11 @@ mode "resize" {
bindsym $mod+r mode "resize"
# mode_system: prompt for lock, logout, suspend, shutdown, etc.
-set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown
+set $mode_system System (l) lock, (e) logout, (s) suspend, (r) reboot, (Shift+s) shutdown
mode "$mode_system" {
bindsym l exec --no-startup-id $i3_scripts/i3exit.sh lock, mode "default"
bindsym e exec --no-startup-id $i3_scripts/i3exit.sh logout, mode "default"
bindsym s exec --no-startup-id $i3_scripts/i3exit.sh suspend, mode "default"
- bindsym h exec --no-startup-id $i3_scripts/i3exit.sh hibernate, mode "default"
bindsym r exec --no-startup-id $i3_scripts/i3exit.sh reboot, mode "default"
bindsym Shift+s exec --no-startup-id $i3_scripts/i3exit.sh shutdown, mode "default"
# back to normal: Enter or Escape
@@ -241,29 +266,34 @@ mode "$mode_system" {
bindsym $mod+Ctrl+Delete mode "$mode_system"
###### i3 modes ###### }}}
-###### applications bindings ###### {{{
+###### application bindings ###### {{{
## NOTE: (Mod4: Win)
## Some Mod4-keys binded for urxvt (~/.Xresources)
## Mod4-c, Mod4-v, Mod4-Shift-v
## Mod4-Escape, Mode4-s, Mod4-u
-# dmenu & i3-dmenu-desktop
-bindsym $mod+d exec --no-startup-id dmenu_run
-bindsym $mod+F2 exec --no-startup-id dmenu_run
+## program launcher
+#bindsym $mod+d exec --no-startup-id dmenu_run
+#bindsym $mod+F2 exec --no-startup-id dmenu_run
+# use 'rofi' instead of 'dmenu'
+bindsym $mod+d exec --no-startup-id rofi -show run
+bindsym $mod+F2 exec --no-startup-id rofi -show run
# `i3-dmenu-desktop' only displays applications with a .desktop file
-bindsym $mod+p exec --no-startup-id i3-dmenu-desktop
+bindsym $mod+p exec --no-startup-id i3-dmenu-desktop
# lock screen (i3lock)
bindsym $mod+Ctrl+l exec --no-startup-id $i3_scripts/i3exit.sh lock
+bindsym $sup+l exec --no-startup-id $i3_scripts/i3exit.sh lock
# turn off display
bindsym $mod+Ctrl+b exec --no-startup-id sleep 1 && xset dpms force off
# screenshots
-bindsym Print exec --no-startup-id scrot -e 'mv $f $shots_dir/$f'
-bindsym $mod+Print exec --no-startup-id scrot -s -e 'mv $f $shots_dir/$f'
+bindsym --release Print exec --no-startup-id scrot -e 'mv $f $shots_dir/'
+bindsym --release $mod+Print exec --no-startup-id scrot -s -e 'mv $f $shots_dir/'
# terminal
-bindsym $sup+t exec urxvtc || urxvt || i3-sensible-terminal
+bindsym $sup+t exec urxvtc || urxvt || i3-sensible-terminal
+bindsym $sup+Enter exec urxvtc || urxvt || i3-sensible-terminal
# file manager
bindsym $sup+f exec thunar
# web browser
@@ -281,61 +311,53 @@ bindsym $mod+backslash [instance="dropdown_term"] scratchpad show
###### window control ###### {{{
## floating
-for_window [window_role="pop-up"] floating enable
-for_window [class="Feh"] floating enable
-for_window [class="XFontSel"] floating enable
-for_window [class="Arandr"] floating enable
-for_window [class="Xfce4-notifyd"] floating enable
+for_window [window_role="pop-up"] floating enable
+for_window [window_role="bubble"] floating enable
+for_window [window_role="task_dialog"] floating enable
+for_window [window_role="Preferences"] floating enable
+
+for_window [window_type="dialog"] floating enable
+for_window [window_type="menu"] floating enable
+
+for_window [class="(?i)Arandr"] floating enable
for_window [class="Xscreensaver-demo"] floating enable
-for_window [class="Pinentry-gtk-2"] floating enable
-for_window [class="Ds9"] floating enable
-for_window [class="Toplevel"] floating enable
-for_window [class="Firefox" instance="Places"] floating enable
-for_window [class="Firefox" instance="Browser"] floating enable
-for_window [class="Firefox" instance="Update"] floating enable
-## floating by title
-# xbindkeys
+
for_window [title="^XBindKey:.*Hit.*"] floating enable
-# xev
-for_window [title="^Event Tester$"] floating enable
-# thunar copy files
-for_window [title="^File Operation Progress$"] floating enable
-
-## adjust window border
-for_window [class="URxvt"] border 1pixel
-for_window [class="Firefox"] border 1pixel
-for_window [class="Xfce4-notifyd"] border none
+
+for_window [class="(?i)Xfce4-notifyd"] floating enable, border none
+
+# assign workspace for applications
+assign [class="(?i)firefox"] $ws1
###### window control ###### }}}
###### i3bar ###### {{{
-# i3bar (plus the system information i3status finds out, if available)
bar {
- #status_command py3status -c ~/.i3/py3status.conf
- status_command py3status -s -c ~/.i3/py3status.conf
+ #status_command i3status -c ~/.i3/i3status.conf
+ status_command i3blocks -c ~/.i3/i3blocks.conf
position top
# whether show the current binding mode indicator (default yes)
#binding_mode_indicator no
+ font pango:Terminus, WenQuanYi Bitmap Song, FontAwesome, 11
+ tray_output primary
+ separator_symbol " "
+ # disable scroll on workspace buttons
+ bindsym button4 nop
+ bindsym button5 nop
+ # disable tray padding (default: 2)
+ tray_padding 0
+ # display workspace of name "[n]:[NAME]" with only the "[NAME]"
+ strip_workspace_numbers yes
- ## color theme
colors {
- ## zenburn colorscheme (customized) {{{
- background #1e2320
- statusline #dcdccc
- separator #94bff3
- # colorclass border background text
- focused_workspace #506070 #506070 #ffffff
- active_workspace #dcdccc #506070 #ffffff
- inactive_workspace #dcdccc #1e2320 #dcdccc
- urgent_workspace #dcdccc #cb4b16 #dcdccc
- ## colorscheme }}}
- #
- ## solarized colorscheme {{{
- #background #073642
- #statusline #eee8d5
- #focused_workspace #cb4b16 #cb4b16 #eee8d5
- #active_workspace #cb4b16 #cb4b16 #eee8d5
- #inactive_workspace #b58900 #b58900 #eee8d5
- ## solarized }}}
+ statusline $white
+ background $black
+ separator $green
+ # BORDER BACKGROUND TEXT
+ focused_workspace $light_green $light_green $black
+ active_workspace $black $black $white
+ inactive_workspace $black $black $white
+ urgent_workspace $light_red $light_red $white
+ binding_mode $black $black $yellow
}
}
###### i3bar ###### }}}
@@ -343,11 +365,13 @@ bar {
###### autostart ###### {{{
## run applications on startup
## if need to run command when restarting i3, use `exec_always'
-# disable bell
exec --no-startup-id xset b off
exec --no-startup-id xrdb -load ~/.Xresources
+#exec --no-startup-id feh --bg-fill $i3_images/wallpaper.png
exec --no-startup-id sh ~/.fehbg
-exec --no-startup-id xcompmgr
+#exec --no-startup-id xcompmgr
+exec --no-startup-id compton -b
+exec --no-startup-id redshift
exec --no-startup-id xbindkeys
exec --no-startup-id urxvtd -q -o -f
exec --no-startup-id parcellite
diff --git a/.i3/i3blocks.conf b/.i3/i3blocks.conf
new file mode 100644
index 0000000..28b79a6
--- /dev/null
+++ b/.i3/i3blocks.conf
@@ -0,0 +1,101 @@
+#
+# i3blocks config file
+#
+# Aaron LI
+# 2015-12-18
+#
+
+
+# List of valid properties:
+#
+# align
+# color
+# command
+# full_text
+# instance
+# interval
+# label
+# min_width
+# name
+# separator
+# separator_block_width
+# short_text
+# signal
+# urgent
+
+# Global properties
+#
+# The top properties below are applied to every block, but can be overridden.
+# Each block command defaults to the script name to avoid boilerplate.
+command=$SCRIPT_DIR/$BLOCK_NAME
+separator_block_width=15
+markup=none
+
+# Volume indicator
+#
+# The first parameter sets the step (and units to display)
+# The second parameter overrides the mixer selection
+# See the script for details.
+[volume]
+label=VOL
+#label=♪
+instance=Master
+#instance=PCM
+interval=once
+signal=10
+
+# Memory usage
+#
+# The type defaults to "mem" if the instance is not specified.
+[memory]
+label=MEM
+separator=false
+interval=30
+
+# Network interface monitoring
+#
+# If the instance is not specified, use the interface used for default route.
+# The address can be forced to IPv4 or IPv6 with -4 or -6 switches.
+[iface]
+#instance=wlan0
+color=#00FF00
+interval=10
+separator=false
+
+[wifi]
+#instance=wlp3s0
+interval=10
+separator=false
+
+[bandwidth]
+#instance=eth0
+interval=5
+
+# CPU usage
+#
+# The script may be called with -w and -c switches to specify thresholds,
+# see the script for details.
+[cpu_usage]
+label=CPU
+interval=10
+min_width=CPU: 100.00%
+#separator=false
+
+#[load_average]
+#interval=10
+
+# Battery indicator
+#
+# The battery instance defaults to 0.
+[battery]
+label=BAT
+#label=⚡
+#instance=1
+interval=30
+
+# Date Time
+#
+[time]
+command=date '+%Y-%m-%d %H:%M:%S'
+interval=5
+
diff --git a/.i3/py3status.conf b/.i3/i3status.conf
index d19b4b8..9a41923 100644
--- a/.i3/py3status.conf
+++ b/.i3/i3status.conf
@@ -1,34 +1,32 @@
-## ~/.i3/py3status.conf
-##
-## py3status configuration file
-## same syntax as 'i3status.conf' (man i3status)
-##
+# ~/.i3status.conf
+# i3status configuration file.
+# see "man i3status" for documentation.
-# It is important that this file is edited as *UTF-8*.
+# It is important that this file is edited as UTF-8.
# The following line should contain a sharp s:
# ß
# If the above line is not correctly displayed, fix your editor first!
general {
- colors = true
- color_good = '#dcdccc'
- color_degraded = '#8cd0d3'
- color_bad = '#dc8cc3'
- interval = 3
- # output format (i3bar|dzen2|xmobar|none)
- output_format = 'i3bar'
+ colors = true
+ color_good = '#88b090'
+ color_degraded = '#ccdc90'
+ color_bad = '#e89393'
+ interval = 3
+ # output format (i3bar|dzen2|xmobar|none)
+ output_format = 'i3bar'
}
-#order += "volume master"
+order += "volume master"
#order += "ipv6"
-#order += "disk /"
+order += "disk /"
#order += "run_watch DHCP"
#order += "run_watch VPN"
#order += "wireless wlp3s0"
-#order += "ethernet enp0s25"
+order += "ethernet eth0"
order += "battery 0"
order += "load"
-#order += "tztime local"
+order += "tztime local"
volume master {
format = "%volume"
@@ -37,13 +35,13 @@ volume master {
mixer_idx = 0
}
-wireless wlp3s0 {
- #format_up = "W: (%quality at %essid) %ip"
- format_up = "%essid(%ip)"
- format_down = "down"
-}
+#wireless wlp3s0 {
+# #format_up = "W: (%quality at %essid) %ip"
+# format_up = "%essid(%ip)"
+# format_down = "down"
+#}
-ethernet enp0s25 {
+ethernet eth0 {
# if you use %speed, i3status requires root privileges
format_up = "E: %ip"
format_down = "E: down"
diff --git a/.i3/py3status/10-mpd.py b/.i3/py3status/10-mpd.py
deleted file mode 100644
index 95b7b4f..0000000
--- a/.i3/py3status/10-mpd.py
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# Weitian LI <liweitianux@gmail.com>
-# 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
deleted file mode 100644
index 467764c..0000000
--- a/.i3/py3status/20-volume.py
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# Weitian LI <liweitianux@gmail.com>
-# 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
deleted file mode 100644
index 379a44c..0000000
--- a/.i3/py3status/25-microphone.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# Weitian LI <liweitianux@gmail.com>
-# 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
deleted file mode 100644
index 195d6b1..0000000
--- a/.i3/py3status/30-touchpad.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# Weitian LI <liweitianux@gmail.com>
-# 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
deleted file mode 100644
index 96b8ce5..0000000
--- a/.i3/py3status/40-power.py
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# Weitian LI <liweitianux@gmail.com>
-# 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
deleted file mode 100644
index 5e88125..0000000
--- a/.i3/py3status/50-battery.py
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# Weitian LI <liweitianux@gmail.com>
-# 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
deleted file mode 100644
index 5d578a0..0000000
--- a/.i3/py3status/80-datetime.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# Weitian LI <liweitianux@gmail.com>
-# 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
deleted file mode 100644
index 783c53c..0000000
--- a/.i3/py3status/backup/dpms.py
+++ /dev/null
@@ -1,44 +0,0 @@
-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 <dosera AT tf.uni-freiburg.de>
- """
- 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
deleted file mode 100644
index 077269c..0000000
--- a/.i3/py3status/backup/empty_class.py
+++ /dev/null
@@ -1,41 +0,0 @@
-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
deleted file mode 100644
index 929749d..0000000
--- a/.i3/py3status/backup/glpi.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# 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
deleted file mode 100644
index 792965c..0000000
--- a/.i3/py3status/backup/i3bar_click_events.py
+++ /dev/null
@@ -1,127 +0,0 @@
-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 = {
- "<module name and instance>": {
- <button number>: [<function to run>, <arg1>, <arg2>],
- }
- }
-
- Variables:
- ----------
- <button number> is an integer from 1 to 3:
- 1 : left click
- 2 : middle click
- 3 : right click
-
- <function to run> is a python function written in this module.
- The 'external_command' function is provided for convenience if
- you want to call an external program from this module.
- You can of course write your own functions and have them executed
- on a click event at will with possible arguments <arg1>, <arg2>...
-
- <module name and instance> is a string made from the module
- attribute 'name' and 'instance' using a space as separator:
- For i3status modules, it's simply the name of the module as it
- appears in the 'order' instruction of your i3status.conf.
- Example:
- in i3status.conf -> order += "wireless wlan0"
- self.actions key -> "wireless wlan0"
-
- Usage example:
- --------------
- - Open the wicd-gtk GUI when we LEFT click on the ethernet
- module of i3status.
- - Open emelfm2 to /home when we LEFT click on
- the /home instance of disk_info
- - Open emelfm2 to / when we LEFT click on
- the / instance of disk_info
-
- The related i3status.conf looks like:
- order += "disk /home"
- order += "disk /"
- order += "ethernet eth0"
-
- The resulting self.actions should be:
- self.actions = {
- "ethernet eth0": {
- 1: [external_command, 'wicd-gtk', '-n'],
- },
- "disk_info /home": {
- 1: [external_command, 'emelfm2', '-1', '~'],
- },
- "disk_info /": {
- 1: [external_command, 'emelfm2', '-1', '/'],
- },
- }
- """
- # CONFIGURE ME PLEASE, LOVE YOU BIG TIME !
- self.actions = {
- }
-
- def on_click(self, i3status_output_json, i3status_config, event):
- """
- If an action is configured for the given i3status module 'name' and
- 'instance' (if present), then we'll execute the given function with
- its arguments (if present).
-
- Usually you SHOULD NOT modify this part of the code.
- """
- button = event['button']
- key_name = '{} {}'.format(
- event['name'],
- event.get('instance', '')
- ).strip()
- if key_name in self.actions and button in self.actions[key_name]:
- # get the function to run
- func = self.actions[key_name][button][0]
- assert hasattr(func, '__call__'), \
- 'first element of the action list must be a function'
-
- # run the function with the possibly given arguments
- func(*self.actions[key_name][button][1:])
-
- def i3bar_click_events(self, i3status_output_json, i3status_config):
- """
- Cached empty output, this module doesn't show anything.
- """
- response = {'full_text': '', 'name': 'i3bar_click_events'}
- response['cached_until'] = time() + 3600
- return (-1, response)
-
-
-def external_command(*cmd):
- """
- This convenience function lets you call an external program at will.
-
- NOTE:
- The stdout and stderr MUST be suppressed as shown here to avoid any
- output from being caught by the i3bar (this would freeze it).
- See issue #20 for more info.
- """
- Popen(
- cmd,
- stdout=open('/dev/null', 'w'),
- stderr=open('/dev/null', 'w')
- )
diff --git a/.i3/py3status/backup/netdata.py b/.i3/py3status/backup/netdata.py
deleted file mode 100644
index 729983b..0000000
--- a/.i3/py3status/backup/netdata.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# netdata
-
-# Netdata is a module uses great Py3status (i3status wrapper) to
-# display network information (Linux systems) in i3bar.
-# For more information read:
-# i3wm homepage: http://i3wm.org
-# py3status homepage: https://github.com/ultrabug/py3status
-
-# Copyright (C) <2013> <Shahin Azad [ishahinism at Gmail]>
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# ----------------------------------------------------------------- #
-# Notes:
-# 1. netdata will check 'eth0' interface by default. You can
-# change it by changing 'self.net_interface' variable in 'GetData'
-# class.
-# 2. Colors are depended on strict specification in traffic/netspeed methods.
-# You can change them by manipulating conditions.
-
-import subprocess
-from time import time
-
-# Method 'netSpeed' will use this variables to calculate downloaded
-# bytes in last second. Initializing this variables globally is
-# necessary since we can't use __init__ method in Py3Status class.
-old_transmitted, old_received = 0, 0
-
-
-class GetData:
- """Get system status
-
- """
- def __init__(self):
- # You can change it to another interface.
- # It'll be used for grabbing net interface data.
- self.net_interface = 'eth0'
-
- def execCMD(self, cmd, arg):
- """Take a system command and its argument, then return the result.
-
- Arguments:
- - `cmd`: system command.
- - `arg`: argument.
- """
- result = subprocess.check_output([cmd, arg])
- return result
-
- def netBytes(self):
- """Execute 'cat /proc/net/dev', find the interface line (Default
- 'eth0') and grab received/transmitted bytes.
-
- """
- net_data = self.execCMD('cat', '/proc/net/dev').decode('utf-8').split()
- interface_index = net_data.index(self.net_interface + ':')
- received_bytes = int(net_data[interface_index + 1])
- transmitted_bytes = int(net_data[interface_index + 9])
-
- return received_bytes, transmitted_bytes
-
-
-class Py3status:
- """
- System status in i3bar
- """
- def netSpeed(self, json, i3status_config):
- """Calculate network speed ('eth0' interface) and return it. You can
- change the interface using 'self.net_interface' variable in
- 'GetData' class.
-
- """
- data = GetData()
- response = {'full_text': '', 'name': 'net_speed'}
-
- global old_received
- global old_transmitted
-
- received_bytes, transmitted_bytes = data.netBytes()
- dl_speed = (received_bytes - old_received) / 1024.
- up_speed = (transmitted_bytes - old_transmitted) / 1024.
-
- if dl_speed < 30:
- response['color'] = i3status_config['color_bad']
- elif dl_speed < 60:
- response['color'] = i3status_config['color_degraded']
- else:
- response['color'] = i3status_config['color_good']
-
- response['full_text'] = "LAN(Kb): {:5.1f}↓ {:5.1f}↑"\
- .format(dl_speed, up_speed)
- response['cached_until'] = time()
-
- old_received, old_transmitted = received_bytes, transmitted_bytes
- return (0, response)
-
- def traffic(self, json, i3status_config):
- """Calculate networks used traffic. Same as 'netSpeed' method you can
- change the interface.
-
- """
- data = GetData()
- response = {'full_text': '', 'name': 'traffic'}
-
- received_bytes, transmitted_bytes = data.netBytes()
- download = received_bytes / 1024 / 1024.
- upload = transmitted_bytes / 1024 / 1024.
- total = download + upload
-
- if total < 400:
- response['color'] = i3status_config['color_good']
- elif total < 700:
- response['color'] = i3status_config['color_degraded']
- else:
- response['color'] = i3status_config['color_bad']
-
- response['full_text'] = "T(Mb): {:3.0f}↓ {:3.0f}↑ {:3.0f}↕"\
- .format(download, upload, total)
-
- return (1, response)
diff --git a/.i3/py3status/backup/ns_checker.py b/.i3/py3status/backup/ns_checker.py
deleted file mode 100644
index 4a332b1..0000000
--- a/.i3/py3status/backup/ns_checker.py
+++ /dev/null
@@ -1,57 +0,0 @@
-import dns.resolver
-import socket
-
-
-class Py3status:
- """
- This module launch a simple query on each nameservers for the specified domain.
- Nameservers are dynamically retrieved. The FQDN is the only one mandatory parameter.
- It's also possible to add additional nameservers by appending them in nameservers list.
-
- The default resolver can be overwritten with my_resolver.nameservers parameter.
-
- Written and contributed by @nawadanp
- """
- def __init__(self):
- self.domain = 'google.com'
- self.lifetime = 0.3
- self.resolver = []
- self.nameservers = []
-
- def ns_checker(self, i3status_output_json, i3status_config):
- response = {'full_text': '', 'name': 'ns_checker'}
- position = 0
- counter = 0
- error = False
- nameservers = []
-
- my_resolver = dns.resolver.Resolver()
- my_resolver.lifetime = self.lifetime
- if self.resolver:
- my_resolver.nameservers = self.resolver
-
- my_ns = my_resolver.query(self.domain, 'NS')
-
- # Insert each NS ip address in nameservers
- for ns in my_ns:
- nameservers.append(str(socket.gethostbyname(str(ns))))
- for ns in self.nameservers:
- nameservers.append(str(ns))
-
- # Perform a simple DNS query, for each NS servers
- for ns in nameservers:
- my_resolver.nameservers = [ns]
- counter += 1
- try:
- my_resolver.query(self.domain, 'A')
- except:
- error = True
-
- if error:
- response['full_text'] = str(counter) + ' NS NOK'
- response['color'] = i3status_config['color_bad']
- else:
- response['full_text'] = str(counter) + ' NS OK'
- response['color'] = i3status_config['color_good']
-
- return (position, response)
diff --git a/.i3/py3status/backup/pingdom.py b/.i3/py3status/backup/pingdom.py
deleted file mode 100644
index cddf1a9..0000000
--- a/.i3/py3status/backup/pingdom.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import requests
-from time import time
-
-
-class Py3status:
- """
- Dynamically display the latest response time of the configured checks using
- the Pingdom API.
- We also verify the status of the checks and colorize if needed.
- Pingdom API doc : https://www.pingdom.com/services/api-documentation-rest/
-
- #NOTE: This module needs the 'requests' python module from pypi
- https://pypi.python.org/pypi/requests
- """
- def pingdom_checks(self, json, i3status_config):
- response = {'full_text': '', 'name': 'pingdom_checks'}
-
- #NOTE: configure me !
- APP_KEY = '' # create an APP KEY on pingdom first
- CACHE_TIMEOUT = 600 # recheck every 10 mins
- CHECKS = [] # checks' names you want added to your bar
- LATENCY_THRESHOLD = 500 # when to colorize the output
- LOGIN = '' # pingdom login
- PASSWORD = '' # pingdom password
- TIMEOUT = 15
- POSITION = 0
-
- r = requests.get(
- 'https://api.pingdom.com/api/2.0/checks',
- auth=(LOGIN, PASSWORD),
- headers={'App-Key': APP_KEY},
- timeout=TIMEOUT,
- )
- result = r.json()
- if 'checks' in result:
- for check in [
- ck for ck in result['checks'] if ck['name'] in CHECKS
- ]:
- if check['status'] == 'up':
- response['full_text'] += '{}: {}ms, '.format(
- check['name'],
- check['lastresponsetime']
- )
- if check['lastresponsetime'] > LATENCY_THRESHOLD:
- response.update(
- {'color': i3status_config['color_degraded']}
- )
- else:
- response['full_text'] += '{}: DOWN'.format(
- check['name'],
- check['lastresponsetime']
- )
- response.update({'color': i3status_config['color_bad']})
- response['full_text'] = response['full_text'].strip(', ')
- response['cached_until'] = time() + CACHE_TIMEOUT
-
- return (POSITION, response)
diff --git a/.i3/py3status/backup/pomodoro.py b/.i3/py3status/backup/pomodoro.py
deleted file mode 100644
index 28b5ea1..0000000
--- a/.i3/py3status/backup/pomodoro.py
+++ /dev/null
@@ -1,123 +0,0 @@
-"""
-Pomodoro countdown on i3bar originally written by @Fandekasp (Adrien Lemaire)
-"""
-from subprocess import call
-from time import time
-
-MAX_BREAKS = 4
-POSITION = 0
-TIMER_POMODORO = 25 * 60
-TIMER_BREAK = 5 * 60
-TIMER_LONG_BREAK = 15 * 60
-
-
-class Py3status:
- """
- """
- def __init__(self):
- self.__setup('stop')
- self.alert = False
- self.run = False
-
- def on_click(self, json, i3status_config, event):
- """
- Handles click events
- """
- if event['button'] == 1:
- if self.status == 'stop':
- self.status = 'start'
- self.run = True
-
- elif event['button'] == 2:
- self.__setup('stop')
- self.run = False
-
- elif event['button'] == 3:
- self.__setup('pause')
- self.run = False
-
- @property
- def response(self):
- """
- Return the response full_text string
- """
- return {
- 'full_text': '{} ({})'.format(self.prefix, self.timer),
- 'name': 'pomodoro'
- }
-
- def __setup(self, status):
- """
- Setup a step
- """
- self.status = status
- if status == 'stop':
- self.prefix = 'Pomodoro'
- self.status = 'stop'
- self.timer = TIMER_POMODORO
- self.breaks = 1
-
- elif status == 'start':
- self.prefix = 'Pomodoro'
- self.timer = TIMER_POMODORO
-
- elif status == 'pause':
- self.prefix = 'Break #%d' % self.breaks
- if self.breaks > MAX_BREAKS:
- self.timer = TIMER_LONG_BREAK
- self.breaks = 1
- else:
- self.breaks += 1
- self.timer = TIMER_BREAK
-
- def __decrement(self):
- """
- Countdown handler
- """
- self.timer -= 1
- if self.timer < 0:
- self.alert = True
- self.run = False
- self.__i3_nagbar()
- if self.status == 'start':
- self.__setup('pause')
- self.status = 'pause'
- elif self.status == 'pause':
- self.__setup('start')
- self.status = 'start'
-
- def __i3_nagbar(self, level='warning'):
- """
- Make use of i3-nagbar to display warnings to the user.
- """
- msg = '{} time is up !'.format(self.prefix)
- try:
- call(
- ['i3-nagbar', '-m', msg, '-t', level],
- stdout=open('/dev/null', 'w'),
- stderr=open('/dev/null', 'w')
- )
- except:
- pass
-
- def pomodoro(self, json, i3status_config):
- """
- Pomodoro response handling and countdown
- """
- if self.run:
- self.__decrement()
-
- response = self.response
- if self.alert:
- response['urgent'] = True
- self.alert = False
-
- if self.status == 'start':
- response['color'] = i3status_config['color_good']
- elif self.status == 'pause':
- response['color'] = i3status_config['color_degraded']
- else:
- response['color'] = i3status_config['color_bad']
-
- response['cached_until'] = time()
- return (POSITION, response)
diff --git a/.i3/py3status/backup/sysdata.py b/.i3/py3status/backup/sysdata.py
deleted file mode 100644
index 14aefb3..0000000
--- a/.i3/py3status/backup/sysdata.py
+++ /dev/null
@@ -1,137 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# sysdata
-
-# Sysdata is a module uses great Py3status (i3status wrapper) to
-# display system information (RAM usage) in i3bar (Linux systems).
-# For more information read:
-# i3wm homepage: http://i3wm.org
-# py3status homepage: https://github.com/ultrabug/py3status
-
-# Copyright (C) <2013> <Shahin Azad [ishahinism at Gmail]>
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-import subprocess
-from time import time
-
-
-class GetData:
- """Get system status
-
- """
- def execCMD(self, cmd, arg):
- """Take a system command and its argument, then return the result.
-
- Arguments:
- - `cmd`: system command.
- - `arg`: argument.
- """
- result = subprocess.check_output([cmd, arg])
- return result
-
- def cpu(self):
- """Get the cpu usage data from /proc/stat :
- cpu 2255 34 2290 22625563 6290 127 456 0 0
- - user: normal processes executing in user mode
- - nice: niced processes executing in user mode
- - system: processes executing in kernel mode
- - idle: twiddling thumbs
- - iowait: waiting for I/O to complete
- - irq: servicing interrupts
- - softirq: servicing softirqs
- - steal: involuntary wait
- - guest: running a normal guest
- - guest_nice: running a niced guest
- These numbers identify the amount of time the CPU has spent performing
- different kinds of work. Time units are in USER_HZ (typically hundredths of a
- second)
- """
- with open('/proc/stat', 'r') as fd:
- line = fd.readline()
- cpu_data = line.split()
- total_cpu_time = sum(map(int, cpu_data[1:]))
- cpu_idle_time = int(cpu_data[4])
-
- #return the cpu total&idle time
- return total_cpu_time, cpu_idle_time
-
- def memory(self):
- """Execute 'free -m' command, grab the memory capacity and used size
- then return; Memory size 'total_mem', Used_mem, and percentage
- of used memory.
-
- """
- # Run 'free -m' command and make a list from output.
- mem_data = self.execCMD('free', '-m').split()
- total_mem = int(mem_data[7]) / 1024.
- used_mem = int(mem_data[15]) / 1024.
- # Caculate percentage
- used_mem_percent = int(used_mem / (total_mem / 100))
-
- # Results are in kilobyte.
- return total_mem, used_mem, used_mem_percent
-
-
-class Py3status:
- """
- System status in i3bar
- """
- def __init__(self):
- self.data = GetData()
- self.cpu_total = 0
- self.cpu_idle = 0
-
- def cpuInfo(self, json, i3status_config):
- """calculate the CPU status and return it.
-
- """
- response = {'full_text': '', 'name': 'cpu_usage'}
- cpu_total, cpu_idle = self.data.cpu()
- used_cpu_percent = 1 - float(cpu_idle-self.cpu_idle)/float(cpu_total-self.cpu_total)
- self.cpu_total = cpu_total
- self.cpu_idle = cpu_idle
-
- if used_cpu_percent <= 40:
- response['color'] = i3status_config['color_good']
- elif used_cpu_percent <= 75:
- response['color'] = i3status_config['color_degraded']
- else:
- response['color'] = i3status_config['color_bad']
-
- response['full_text'] = "CPU: %.2f%%" % (used_cpu_percent*100)
- #cache the status for 10 seconds
- response['cached_until'] = time() + 10
-
- return (0, response)
-
- def ramInfo(self, json, i3status_config):
- """calculate the memory (RAM) status and return it.
-
- """
- response = {'full_text': '', 'name': 'ram_info'}
- total_mem, used_mem, used_mem_percent = self.data.memory()
-
- if used_mem_percent <= 40:
- response['color'] = i3status_config['color_good']
- elif used_mem_percent <= 75:
- response['color'] = i3status_config['color_degraded']
- else:
- response['color'] = i3status_config['color_bad']
-
- response['full_text'] = "RAM: %.2f/%.2f GB (%d%%)" % \
- (used_mem, total_mem, used_mem_percent)
- response['cached_until'] = time()
-
- return (0, response)
diff --git a/.i3/py3status/backup/weather_yahoo.py b/.i3/py3status/backup/weather_yahoo.py
deleted file mode 100644
index 6b91b04..0000000
--- a/.i3/py3status/backup/weather_yahoo.py
+++ /dev/null
@@ -1,106 +0,0 @@
-# -*- coding: utf-8 -*-
-from time import time
-import requests
-
-
-class Py3status:
- """
- Display current day + 3 days weather forecast as icons on your i3bar
- Based on Yahoo! Weather. forecast, thanks guys !
- See: http://developer.yahoo.com/weather/
- """
- def __init__(self):
- """
- Basic configuration
- Find your city code using:
- http://answers.yahoo.com/question/index?qid=20091216132708AAf7o0g
- The city_code in this example is for Paris, France
- """
- self.cache_timeout = 1800
- self.city_code = 'FRXX0076'
- self.request_timeout = 10
-
- def _get_forecast(self):
- """
- Ask Yahoo! Weather. for a forecast
- """
- r = requests.get(
- 'http://query.yahooapis.com/v1/public/yql?q=select item from weather.forecast where location="%s"&format=json' % self.city_code,
- timeout=self.request_timeout
- )
-
- result = r.json()
- status = r.status_code
- forecasts = []
-
- if status == 200:
- forecasts = result['query']['results']['channel']['item']['forecast']
- # reset today
- forecasts[0] = result['query']['results']['channel']['item']['condition']
- else:
- raise Exception('got status {}'.format(status))
-
- # return current today + 3 days forecast
- return forecasts[:4]
-
- def _get_icon(self, forecast):
- """
- Return an unicode icon based on the forecast code and text
- See: http://developer.yahoo.com/weather/#codes
- """
- icons = ['☀', '☁', '☂', '☃', '?']
- code = int(forecast['code'])
- text = forecast['text'].lower()
-
- # sun
- if 'sun' in text or code in [31, 32, 33, 34, 36]:
- code = 0
-
- # cloud / early rain
- elif 'cloud' in text or code in [
- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
- 44
- ]:
- code = 1
-
- # rain
- elif 'rain' in text or code in [
- 0, 1, 2, 3, 4, 5, 6, 9,
- 11, 12,
- 37, 38, 39,
- 40, 45, 47
- ]:
- code = 2
-
- # snow
- elif 'snow' in text or code in [
- 7, 8,
- 10, 13, 14, 15, 16, 17, 18,
- 35,
- 41, 42, 43, 46
- ]:
- code = 3
-
- # dunno
- else:
- code = -1
-
- return icons[code]
-
- def weather_yahoo(self, json, i3status_config):
- """
- This method gets executed by py3status
- """
- response = {
- 'cached_until': time() + self.cache_timeout,
- 'full_text': '',
- 'name': 'weather_yahoo'
- }
-
- forecasts = self._get_forecast()
- for forecast in forecasts:
- icon = self._get_icon(forecast)
- response['full_text'] += '{} '.format(icon)
- response['full_text'] = response['full_text'].strip()
-
- return (0, response)
diff --git a/.i3/py3status/backup/whoami.py b/.i3/py3status/backup/whoami.py
deleted file mode 100644
index f930991..0000000
--- a/.i3/py3status/backup/whoami.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from getpass import getuser
-from time import time
-
-
-class Py3status:
- """
- Simply output the currently logged in user in i3bar.
-
- Inspired by i3 FAQ:
- https://faq.i3wm.org/question/1618/add-user-name-to-status-bar/
- """
- def whoami(self, i3status_output_json, i3status_config):
- """
- We use the getpass module to get the current user.
- """
- # the current user doesnt change so much, cache it good
- CACHE_TIMEOUT = 600
-
- # here you can change the format of the output
- # default is just to show the username
- username = '{}'.format(getuser())
-
- # set, cache and return the output
- response = {'full_text': username, 'name': 'whoami'}
- response['cached_until'] = time() + CACHE_TIMEOUT
- return (0, response)