#!/bin/bash # Проверяем, передан ли аргумент (например, +10, -10 или абсолютное значение) if [ -z "$1" ]; then echo "Ошибка: укажи изменение яркости (например, +10, -10 или 50)" exit 1 fi # Временный файл для хранения значения яркости TEMP_FILE="/tmp/ddc_brightness_value" DEBOUNCE_FILE="/tmp/ddc_brightness_debounce" # Функция для получения текущей яркости get_current_brightness() { ddcutil getvcp 10 | grep -oP '(?<=current value = )\s*\d+' | tr -d ' ' } # Читаем текущее значение из файла или получаем с монитора, если файла нет if [ -f "$TEMP_FILE" ]; then CURRENT_VALUE=$(cat "$TEMP_FILE") else CURRENT_VALUE=$(get_current_brightness) echo "$CURRENT_VALUE" > "$TEMP_FILE" fi # Вычисляем новое значение if [[ "$1" =~ ^[+-] ]]; then NEW_VALUE=$((CURRENT_VALUE + $1)) else NEW_VALUE="$1" fi # Ограничиваем значение в пределах 0-100 if [ "$NEW_VALUE" -lt 0 ]; then NEW_VALUE=0 elif [ "$NEW_VALUE" -gt 100 ]; then NEW_VALUE=100 fi # Записываем новое значение во временный файл echo "$NEW_VALUE" > "$TEMP_FILE" echo "$NEW_VALUE" >> /tmp/wobpipe # Обновляем метку времени для debounce touch "$DEBOUNCE_FILE" # Функция для установки яркости с debounce apply_brightness() { # Ждём 0.5 секунды после последнего изменения sleep 0.5 # Проверяем, не изменился ли файл с тех пор NOW=$(date +%s%3N) LAST_CHANGE=$(cat "$TIMESTAMP_FILE" 2>/dev/null || echo 0) # Проверяем, прошло ли 500 мс (0.5 с) с последнего изменения if [ $((NOW - LAST_CHANGE)) -lt 500 ]; then exit 0 fi # Читаем финальное значение из файла FINAL_VALUE=$(cat "$TEMP_FILE") # Устанавливаем яркость ddcutil setvcp 10 "$FINAL_VALUE" > /tmp/ddcutil_output 2>&1 # Получаем текущую яркость для вывода RESULT="$(ddcutil getvcp 10)" CURRENT_PERC="$(echo "$RESULT" | grep -oP '(?<=current value = )\s*\d+' | tr -d ' ')" # Выводим результат и записываем в wobpipe echo "$RESULT" echo "\"$CURRENT_PERC\"" } # Запускаем применение яркости в фоновом режиме, если ещё не запущено if ! pgrep -f "apply_brightness" > /dev/null; then apply_brightness & fi exit 0