#!/usr/bin/env bash # batterybar; displays battery percentage as a bar on i3blocks # # Copyright 2015 Keftaa # # 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 2 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # # readarray -t output <<< $(acpi battery) battery_count=${#output[@]} for line in "${output[@]}"; do percentages+=($(echo "$line" | grep -o -m1 '[0-9]\{1,3\}%' | tr -d '%')) statuses+=($(echo "$line" | egrep -o -m1 'Not|Discharging|Charging|AC|Full|Unknown')) remaining=$(echo "$line" | egrep -o -m1 '[0-9][0-9]:[0-9][0-9]') if [[ -n $remaining ]]; then remainings+=(" ($remaining)") else remainings+=("") fi done echo $statuses >&2 #There are 8 colors that reflect the current battery percentage when #discharging dis_colors=("#F2777A" "#F2777A" "#F99157" "#F99157" "#FFCC66" "#FFCC66" "#99CC99" "#99CC99") charging_color="#66CCCC" full_color="#D3D0C8" ac_color="#6699CC" while getopts 1:2:3:4:5:6:7:8:c:f:a:h opt; do case "$opt" in 1) dis_colors[0]="$OPTARG";; 2) dis_colors[1]="$OPTARG";; 3) dis_colors[2]="$OPTARG";; 4) dis_colors[3]="$OPTARG";; 5) dis_colors[4]="$OPTARG";; 6) dis_colors[5]="$OPTARG";; 7) dis_colors[6]="$OPTARG";; 8) dis_colors[7]="$OPTARG";; c) charging_color="$OPTARG";; f) full_color="$OPTARG";; a) ac_color="$OPTARG";; h) printf "Usage: batterybar [OPTION] color When discharging, there are 8 [1-8] levels colors. You can specify custom colors, for example: batterybar -1 red -2 \"#F6F6F6\" -8 green You can also specify the colors for the charging, AC and charged states: batterybar -c green -f white -a \"#EEEEEE\"\n"; exit 0; esac done squares="" end=$(($battery_count - 1)) for i in $(seq 0 $end); do # if (( percentages[$i] > 0 && percentages[$i] < 20 )); then # squares="■" # elif (( percentages[$i] >= 20 && percentages[$i] < 40 )); then # squares="■■" # elif (( percentages[$i] >= 40 && percentages[$i] < 60 )); then # squares="■■■" # elif (( percentages[$i] >= 60 && percentages[$i] < 80 )); then # squares="■■■■" # elif (( percentages[$i] >=80 )); then # squares="■■■■■" # fi percents[$i]=$(( percentages[$i] / 2 )) (( percents > 48 )) && percents=48 _full_squares=$(( percents[$i] /8 )) for t in $(seq 1 $_full_squares) do squares+="■" done if [[ $(( percents[$i] - ( _full_squares * 8 ) )) -eq 7 ]] then #squares+="▉" squares+="▇" shortsquares+="▇" elif [[ $(( percents[$i] - ( _full_squares * 8 ) )) -eq 6 ]] then #squares+="▊" squares+="▆" shortsquares+="▆" elif [[ $(( percents[$i] - ( _full_squares * 8 ) )) -eq 5 ]] then #squares+="▋" squares+="▅" shortsquares+="▅" elif [[ $(( percents[$i] - ( _full_squares * 8 ) )) -eq 4 ]] then #squares+="▌" squares+="▄" shortsquares+="▄" elif [[ $(( percents[$i] - ( _full_squares * 8 ) )) -eq 3 ]] then #squares+="▍" squares+="▃" shortsquares+="▃" elif [[ $(( percents[$i] - ( _full_squares * 8 ) )) -eq 2 ]] then #squares+="▎" squares+="▂" shortsquares+="▂" elif [[ $(( percents[$i] - ( _full_squares * 8 ) )) -eq 1 ]] then #squares+="▏" squares+="▁" shortsquares+="▁" fi if [[ "${statuses[$i]}" = "Unknown" ]]; then squares="? $squares" fi case "${statuses[$i]}" in "Charging") color="$charging_color" if (( percentages[$i] <= 10 )) then echo 0 on > /proc/acpi/ibm/led fi ;; "Full") color="$full_color" ;; "AC"|"Not") color="$ac_color" ;; "Discharging"|"Unknown") if (( percentages[$i] >= 0 && percentages[$i] < 10 )); then color="${dis_colors[0]}" echo 0 blink > /proc/acpi/ibm/led elif (( percentages[$i] >= 10 && percentages[$i] < 20 )); then color="${dis_colors[1]}" elif (( percentages[$i] >= 20 && percentages[$i] < 30 )); then color="${dis_colors[2]}" elif (( percentages[$i] >= 30 && percentages[$i] < 40 )); then color="${dis_colors[3]}" elif (( percentages[$i] >= 40 && percentages[$i] < 60 )); then color="${dis_colors[4]}" elif (( percentages[$i] >= 60 && percentages[$i] < 70 )); then color="${dis_colors[5]}" elif (( percentages[$i] >= 70 && percentages[$i] < 80 )); then color="${dis_colors[6]}" elif (( percentages[$i] >= 80 )); then color="${dis_colors[7]}" fi ;; esac _blanks=$(( 6 - ${#squares} )) for t in $(seq 1 $_blanks) do squares+="■" done # Print Battery number if there is more than one if (( $end > 0 )) ; then message="$message$(($i + 1)): " fi shortmessage="$message" if [[ "$BLOCK_BUTTON" -eq 1 ]]; then message="$message${statuses[$i]/Not/Not charging} ${percentages[$i]}%${remainings[$i]} " shortmessage="$shortmessage${statuses[$i]/Not/Not charging} ${remainings[$i]} " fi message="bat $message$squares" shortmessage="bat $shortmessage${percentages[$i]}%" done echo "$message" echo "$shortmessage"