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