#!/usr/bin/env bash # --- CONFIGURATION --- DISPLAY_NUM=1 STEP=5 STATE_FILE="/tmp/waybar_brightness.tmp" # --------------------- # Function to send the actual DDC/CI command in the background set_brightness_in_background() { pkill -f "ddcutil.*setvcp 10" (ddcutil --display $DISPLAY_NUM setvcp 10 $1) & } # Ensure state file exists, or create it by querying the monitor if [ ! -f "$STATE_FILE" ]; then # ddcutil terse output format: "VCP 10 C " initial_brightness=$(ddcutil --display $DISPLAY_NUM getvcp 10 -t 2>/dev/null | awk '{print $4}') # Fallback to 50 if ddcutil fails or returns non-numeric if ! [[ "$initial_brightness" =~ ^[0-9]+$ ]]; then initial_brightness=50 fi echo "$initial_brightness" >"$STATE_FILE" fi current=$(cat "$STATE_FILE") # Validate current is a number, fallback to 50 if corrupted if ! [[ "$current" =~ ^[0-9]+$ ]]; then current=50 echo "$current" >"$STATE_FILE" fi case "$1" in "get") echo "$current" ;; "up") new_brightness=$((current + STEP > 100 ? 100 : current + STEP)) if [ "$current" -ne "$new_brightness" ]; then echo "$new_brightness" >"$STATE_FILE" set_brightness_in_background "$new_brightness" fi pkill -RTMIN+9 waybar # Can add whatever RTMIN+n you please, as long as it's an integer. Make sure the signals match between the config and script. ;; "down") new_brightness=$((current - STEP < 0 ? 0 : current - STEP)) if [ "$current" -ne "$new_brightness" ]; then echo "$new_brightness" >"$STATE_FILE" set_brightness_in_background "$new_brightness" fi pkill -RTMIN+9 waybar ;; "right_click") new_brightness=0 if [ "$current" -ne "$new_brightness" ]; then echo "$new_brightness" >"$STATE_FILE" set_brightness_in_background "$new_brightness" fi pkill -RTMIN+9 waybar ;; "left_click") new_brightness=100 if [ "$current" -ne "$new_brightness" ]; then echo "$new_brightness" >"$STATE_FILE" set_brightness_in_background "$new_brightness" fi pkill -RTMIN+9 waybar ;; esac