diff --git a/home/.config/xmonad/xmonad.hs b/home/.config/xmonad/xmonad.hs index 8b73583..52e9f93 100644 --- a/home/.config/xmonad/xmonad.hs +++ b/home/.config/xmonad/xmonad.hs @@ -197,13 +197,13 @@ myKeys = , ("", spawn "pulsemixer --toggle-mute") , ("", spawn "pulsemixer --change-volume -5") , ("", spawn "pulsemixer --change-volume +5") - , ("", spawn "brightness + 5 %") - , ("", spawn "brightness - 5 %") + , ("", spawn "brightness -i 5%") + , ("", spawn "brightness -d 5%") -- Map media keys to meta + arrows for keyboards without special keys , ("M-", spawn "pulsemixer --change-volume -5") , ("M-", spawn "pulsemixer --change-volume +5") - , ("M-", spawn "brightness + 5 %") - , ("M-", spawn "brightness - 5 %") + , ("M-", spawn "brightness -i 5%") + , ("M-", spawn "brightness -d 5%") ] where nonNSP = WSIs (return (\ws -> W.tag ws /= "NSP")) nonEmptyNonNSP = WSIs (return (\ws -> isJust (W.stack ws) && W.tag ws /= "NSP")) diff --git a/home/.local/bin/scripts/brightness b/home/.local/bin/scripts/brightness index 0687327..4efadf0 100755 --- a/home/.local/bin/scripts/brightness +++ b/home/.local/bin/scripts/brightness @@ -1,63 +1,153 @@ #!/bin/sh -BRIGHTNESS_FILE="/sys/class/backlight/intel_backlight/brightness" -BRIGHTNESS_MAX=937 -function change_brightness() { - BRIGHTNESS=$(cat $BRIGHTNESS_FILE) +# Parse arguments +# ------------------------------------------------------------------------------------ +BRIGHTNESS_DIR="/sys/class/backlight/*" +SEND_NOTIFICATION=0 +URGENCY="normal" +INCREASE=0 +DECREASE=0 +SET=0 +BRIGHTNESS=0 - change_value=$2 +while [ "$1" ]; do + case "$1" in + -h | --help) + cat << EOF +brightness is a cli tool that for displaying or modifying screen brightness. - # If we're dealing with percentages, convert to absolutes - if [ $3 == "%" ]; then - change_value=$((($BRIGHTNESS_MAX / 100) * $change_value)) - elif [ $3 == "#" ]; then - change_value=$change_value - else - echo "Invalid unit, options: [% - percent, # - absolute], default: %" - exit 1 +Options: +-h | --help: Display this message +-n | --notification: Produce a desktop notification with brightness info +-N | --no-notification: Don't produce a desktop notification with brightness info +-u | --urgency [URGENCY]: Pass over notify-send urgency attribute (default: normal) +-i | --increase [BRIGHTNESS]: Increase the brightness by given amount +-d | --decrease [BRIGHTNESS]: Decrease the brightness by given amount +-s | --set [BRIGHTNESS]: Set new brightness level +-p | --path [DIR_PATH]: Path to brightness directory (default: /sys/class/backlight/*) + +Valid values: + URGENCY: low, normal, critical + DIR_PATH: Valid path to a directory + BRIGHTNESS: + specific value - Example: 10 + percentage value - Example: 10% +EOF + exit 0 + ;; + -n | --notification) + SEND_NOTIFICATION=1 + ;; + -N | --no-notification) + SEND_NOTIFICATION=0 + ;; + -u | --urgency) + URGENCY="$2" + shift + ;; + -i | --increase) + INCREASE=1 + BRIGHTNESS="$2" + shift + ;; + -d | --decrease) + DECREASE=1 + BRIGHTNESS="$2" + shift + ;; + -s | --set) + SET=1 + BRIGHTNESS="$2" + shift + ;; + -p | --path) + BRIGHTNESS_DIR="$2" + shift + ;; + * ) + echo "Unknown argument '$1', use -h or --help for help" + exit 1 + ;; + esac + shift +done + +# Define constants based on parsed arguments +# ------------------------------------------------------------------------------------ +BRIGHTNESS_FILE="$BRIGHTNESS_DIR/brightness" +BRIGHTNESS_MAX="$(cat $BRIGHTNESS_DIR/max_brightness)" + + +# Helper functins +# ------------------------------------------------------------------------------------ + +# Send brightness level desktop notification, showing the given brightness level +# as progress bar, along with given message. +# $1 - brightness level (number 0-100) +# $2 - message (notification body) +send_brightness_notify() { + percent_brightness="$1" + msg="$2" + + notify-send \ + --app-name=brightness \ + --urgency="$URGENCY" \ + -h int:value:$percent_brightness \ + -h string:synchronous:brightness \ + "brightness" "$msg" +} + + +# Set brightness to given absolute value +# $1 - brightness absolute value +set_brightness() { + # there should be sudo config allowing this command without password + echo "$1" | sudo tee $BRIGHTNESS_FILE >/dev/null +} + + +# Main Logic +# ------------------------------------------------------------------------------------ + +# Determine the absolute new brightness level +if [ $INCREASE -eq 1 ] || [ $DECREASE -eq 1 ] || [ $SET -eq 1 ]; then + # If we're dealing with percentages, change to absolutes + if echo "$BRIGHTNESS" | grep -qE '%$'; then + numeric=$(echo "$BRIGHTNESS" | sed 's/.$//') + absolute=$(echo "($BRIGHTNESS_MAX / 100) * $numeric" | bc -l) + BRIGHTNESS=$(printf "%.0f" $absolute) fi - # Increment or decrement based on first arg - if [ $1 == "+" ]; then - new_brightness=$(($BRIGHTNESS + $change_value)) - elif [ $1 == "-" ]; then - new_brightness=$(($BRIGHTNESS - $change_value)) + # Get the new requested absolute brightness + if [ $SET -eq 1 ]; then + new_brightness=$BRIGHTNESS + elif [ $DECREASE -eq 1 ]; then + cur_brightness=$(cat $BRIGHTNESS_FILE) + new_brightness=$(($cur_brightness - $BRIGHTNESS)) else - echo "Invalid operator, options: [+, -]" - exit 1 + cur_brightness=$(cat $BRIGHTNESS_FILE) + new_brightness=$(($cur_brightness + $BRIGHTNESS)) fi - # Make sure we respect min/max boundaries + # Ensure we respect max/min boundaries if [ $new_brightness -lt 0 ]; then new_brightness=0 elif [ $new_brightness -gt $BRIGHTNESS_MAX ]; then new_brightness=$BRIGHTNESS_MAX fi - # Write the brightness (sudo shouldn't require password here) - echo $new_brightness | sudo tee $BRIGHTNESS_FILE -} - -if [ $# -ge 1 ] && [ "$1" == "+" ] || [ "$1" == "-" ]; then - if [ $# -lt 2 ]; then - change_value=5 # Default to 5% - else - change_value=$2 - fi - - if [ $# -lt 3 ]; then - unit="%" - else - unit=$3 - fi - change_brightness $1 $change_value $unit > /dev/null + # Update the brightness + set_brightness $new_brightness fi -# Display new brightness +cur_brightness=$(cat $BRIGHTNESS_FILE) +percent_brightness=$(echo "($cur_brightness / $BRIGHTNESS_MAX) * 100" | bc -l) +percent_brightness_2f=$(printf "%.2f" $percent_brightness) +percent_brightness_rounded=$(printf "%.0f" $percent_brightness) -BRIGHTNESS=$(cat $BRIGHTNESS_FILE) -BRIGHTNESS_PERCENT=$(echo "($BRIGHTNESS / $BRIGHTNESS_MAX) * 100" | bc -l) -BRIGHTNESS_PERCENT=$(printf "%.2f" $BRIGHTNESS_PERCENT) +if [ $SEND_NOTIFICATION -eq 1 ]; then + send_brightness_notify "$percent_brightness_rounded" "Level: $percent_brightness_rounded" +fi -echo "Brightness: ${BRIGHTNESS_PERCENT}% (absolute: $BRIGHTNESS)" +echo "Brightness: ${percent_brightness_2f}% (absolute: $cur_brightness)"