#!/bin/bash runtime="${XDG_RUNTIME_DIR}/i3blocks" [[ ! -d "$runtime" ]] && mkdir -p "$runtime" human_time() { local seconds="${1}" local minutes=$(( seconds / 60 )) local hours=$(( minutes / 60 )) minutes=$(( minutes % 60 )) printf "%d:%02d\n" "$hours" "$minutes" return } # Récupération des infos de la batterie source /sys/class/power_supply/BAT1/uevent time="$(date +%s)" # Min et max personnalisés (20 et 80 % ici) MIN="$(( POWER_SUPPLY_CHARGE_FULL * 2 / 10 ))" MAX="$(( POWER_SUPPLY_CHARGE_FULL * 8 / 10 ))" # Utiliser toute la plage de la batterie #MIN=0 #MAX="$POWER_SUPPLY_CHARGE_FULL" # %age réel #percentage="$POWER_SUPPLY_CAPACITY" # %age relatif aux MIN/MAX percentage=$(( (POWER_SUPPLY_CHARGE_NOW - MIN) * 100 / (MAX - MIN) )) # État de la batterie status="$POWER_SUPPLY_STATUS" # Indiquer la limite mise dans le BIOS, si la batterie n’indique pas qu’elle # est chargée d’elle-même if [[ "$status" == "Charging" && "$POWER_SUPPLY_CAPACITY" -eq 80 ]] then status="Full" fi if [[ -f "${runtime}/bat" ]] then mapfile -t old < "${runtime}/bat" fi # Estimation naïve du temps restant if [[ "${old[0]}" != "$status" ]] then printf "%s\n" "$status" "$time" "$POWER_SUPPLY_CHARGE_NOW" > "${runtime}/bat" fi if [[ "$status" == "Discharging" ]] then remaining_secs="$(( (POWER_SUPPLY_CHARGE_NOW - MIN) / ((old[2] - POWER_SUPPLY_CHARGE_NOW) / (time - old[1])) ))" elif [[ "$status" == "Charging" ]] then remaining_secs="$(( (MAX - POWER_SUPPLY_CHARGE_NOW) / ((POWER_SUPPLY_CHARGE_NOW - old[2]) / (time - old[1])) ))" else remaining_secs=0 fi [[ "$remaining_secs" -lt 0 ]] && remaining_secs=0 remaining="$(human_time "$remaining_secs")" # Définition des couleurs dis_colors=("#F2777A" "#F2777A" "#F99157" "#F99157" "#FFCC66" "#FFCC66" "#99CC99" "#99CC99") charging_color="#66CCCC" ac_color="#6699CC" full_color="#D3D0C8" # Création de la barre « graphique », 48 états affichables ## à partir du pourcentage de calculé plus tôt percents=$(( percentage / 2 )) (( percents > 48 )) && percents=48 ## à partir des données brutes # percents=$(( (POWER_SUPPLY_CHARGE_NOW - MIN) * 48 / (MAX - MIN) )) full_squares=$(( percents / 8 )) for t in $(seq 1 $full_squares) do squares+="█" done if [[ $(( percents - ( full_squares * 8 ) )) -eq 7 ]] then #squares+="█" squares+="▉" #squares+="▇" elif [[ $(( percents - ( full_squares * 8 ) )) -eq 6 ]] then #squares+="▓" squares+="▊" #squares+="▆" elif [[ $(( percents - ( full_squares * 8 ) )) -eq 5 ]] then #squares+="▓" squares+="▋" #squares+="▅" elif [[ $(( percents - ( full_squares * 8 ) )) -eq 4 ]] then #squares+="▒" squares+="▌" #squares+="▄" elif [[ $(( percents - ( full_squares * 8 ) )) -eq 3 ]] then #squares+="▒" squares+="▍" #squares+="▃" elif [[ $(( percents - ( full_squares * 8 ) )) -eq 2 ]] then #squares+="░" squares+="▎" #squares+="▂" elif [[ $(( percents - ( full_squares * 8 ) )) -eq 1 ]] then #squares+="░" squares+="▏" #squares+="▁" fi # Complétion de la barre afin d'avoir une taille fixe blanks=$(( 6 - ${#squares} )) for t in $(seq 1 $blanks) do squares+=" " done # Choix de la couleur case "${status}" in "Charging") color="$charging_color" ;; "Full") color="$full_color" ;; "AC") color="$ac_color" ;; "Discharging"|"Unknown") if (( percentage < 10 )); then color="${dis_colors[0]}" elif (( percentage >= 10 && percentage < 20 )); then color="${dis_colors[1]}" elif (( percentage >= 20 && percentage < 30 )); then color="${dis_colors[2]}" elif (( percentage >= 30 && percentage < 40 )); then color="${dis_colors[3]}" elif (( percentage >= 40 && percentage < 60 )); then color="${dis_colors[4]}" elif (( percentage >= 60 && percentage < 70 )); then color="${dis_colors[5]}" elif (( percentage >= 70 && percentage < 80 )); then color="${dis_colors[6]}" elif (( percentage >= 80 )); then color="${dis_colors[7]}" fi ;; esac # Format détaillé en cas de clic if [[ -n "$BLOCK_BUTTON" ]] then message="${status} ${percentage}% ${remaining}" message=${message% } else message="$squares ${remaining}" fi # Affichage echo "bat $message" echo "bat ${percentage}%" declare -p MIN MAX percents percentage >&2