dotless

automated dotfiles setup for all my systems
Log | Files | Refs | README | LICENSE

backlight.sh (3869B)


      1 #!/bin/sh
      2 #
      3 # useful script for backlight
      4 #
      5 
      6 usage()
      7 {
      8         printf "\033[1musage:\033[0m %s [get|up|down|set] N%%\n" "$0"
      9         printf "\tget\t\t\033[3mPrint current brightness percent\033[0m\n"
     10         printf "\tup N\t\t\033[3mIncrease brightness by N percent\033[0m\n"
     11         printf "\tdown N\t\t\033[3mDecrease brightness by N percent\033[0m\n"
     12         printf "\tset N\t\t\033[3mSet brightness to N percent (0-100)\033[0m\n"
     13         printf "\n\033[1m\033[91mWarning:\033[0m (or not really) if you have multiple backlights (multimonitor) then this script isn't for you.\n"
     14         printf "\tConsider alternatives such as brightnessctl\n"
     15 }
     16 
     17 perms()
     18 {
     19         printf "\033[91mPermission error:\033[0m Cannot access \`/sys/class/backlight/*/brightness\`"
     20         printf "\nPlease set the perms to allow video group to access \`/sys/class/backlight/*/brightness\`:\n"
     21         printf "\tchgrp video /sys/class/backlight/*/brightness\n"
     22         printf "\tchmod 0660 /sys/class/backlight/*/brightness\n"
     23         printf "\n\033[3mOptionally, you can set a udev/mdev rule to do this at boot (which is recommended)\033[0m\n"
     24 }
     25 
     26 # only finds the first one, which is why it's not recommended for multi-display setups
     27 find_backlight()
     28 {
     29         for d in /sys/class/backlight/*; do
     30                 [ -e "$d" ] || continue
     31                 if [ -r "$d/max_brightness" ] && [ -w "$d/brightness" ]; then
     32                         printf '%s\n' "$d"
     33                         return 0
     34                 fi
     35         done
     36         return 1
     37 }
     38 
     39 dev=$(find_backlight) || {
     40         perms
     41         exit 2
     42 }
     43 bright_file="$dev/brightness"
     44 max_file="$dev/max_brightness" 
     45 
     46 read_file() {
     47         if [ ! -r "$1" ]; then
     48                 usage
     49                 exit 1
     50         fi
     51         IFS= read -r val <"$1" || return 1
     52 
     53         case "$val" in
     54                 ''|*[!0-9]) return 1 ;;
     55                 *) printf '%s\n' "$val" ;;
     56         esac
     57 }
     58 
     59 # max brightness in int
     60 max=$(read_file "$max_file") || {
     61         printf '\033[91merror:\033[0m cannot read max_brightness\n' >&2
     62         exit 3
     63 }
     64 # current brightness in int
     65 cur_int=$(read_file "$bright_file") || {
     66         printf '\033[91merror:\033[0m cannot read brightness\n' >&2
     67         exit 3
     68 }
     69 
     70 int_to_perc()
     71 {
     72         int=$1
     73         printf '%s\n' $(( (int * 100 + max/2) / max ))
     74 }
     75 
     76 perc_to_int()
     77 {
     78         p=$1
     79         if [ "$p" -le 0 ]; then
     80                 printf '0\n'
     81                 return
     82         fi
     83         if [ "$p" -ge 100 ]; then
     84                 printf '%s\n' "$max"
     85                 return
     86         fi
     87         printf '%s\n' $(( (p * max + 50) / 100 ))
     88 }
     89 
     90 cmd=${1:-}
     91 case "$cmd" in
     92         get)
     93                 int_to_perc "$cur_int"
     94                 exit 0
     95                 ;;
     96         up|down|set)
     97                 if [ -z "${2:-}" ]; then
     98                         usage
     99                         exit 1
    100                 fi
    101                 case "$2" in
    102                         ''|*[!0-9]) printf '\033[91merror:\033[0m N must be a non-negative integer\n' >&2; exit 1 ;;
    103                 esac
    104                 n=$2
    105                 ;;
    106         *)
    107                 usage
    108                 exit 1
    109                 ;;
    110 esac
    111 
    112 # grab the current brightness
    113 cur_perc=$(int_to_perc "$cur_int")
    114 
    115 case "$cmd" in
    116         set)  target_perc=$n ;;
    117         up)   target_perc=$(( cur_perc + n )) ;;
    118         down) target_perc=$(( cur_perc - n )) ;;
    119 esac
    120 
    121 # ensure values are never less than 0 or greater than 100
    122 if [ "$target_perc" -lt 0 ]; then target_perc=0; fi
    123 if [ "$target_perc" -gt 100 ]; then target_perc=100; fi
    124 
    125 target_int=$(perc_to_int "$target_perc") || {
    126         printf '\033[91merror:\033[0m failed to compute target value\n' >&2
    127         exit 4
    128 }
    129 
    130 if printf '%s' "$target_int" > "$bright_file"; then
    131         printf '\033[1;32mok:\033[0m brightness set to %s%% (%s/%s)\n' "$target_perc" "$target_int" "$max"
    132         exit 0
    133 else
    134         perms
    135         exit 5
    136 fi