Настраивая свою систему на базе Gentoo, использующая драйвера Intel для работы с графикой, столкнулся с проблемой, что утилиты настройки яркости (xbacklight
, например) не изменяют яркость экрана. В качестве простой альтернативы, предлагаю примитивный скрипт на Bash, который я использую в связке с i3wm
.
¶ Как проверить работу intel_backlight?
Измените значение файла /sys/class/backlight/intel_backlight/brightness
и посмотрите, сменится ли яркость экрана. Лучше предварительно посмотреть максимальное значение экрана и оттолкнуться от него
cat /sys/class/backlight/intel_backlight/max_brightness # в моем случае, вывело 96000
echo 80000 | sudo tee /sys/class/backlight/intel_backlight/brightness
¶ Автоматизируем смену яркости
¶ Преднастройка доступа
В первую очередь, нужно дать доступ пользователю для модификации файла без ввода пароля. Минимальный вариант в случае использования sudo
выглядит примерно так:
%brightness ALL=(ALL:ALL) NOPASSWD:/usr/bin/tee /sys/class/backlight/intel_backlight/brightness
Для работы примера выше потребуется группа brightness
и нахождение пользователя в ней. Для своей рабочей машины я просто дополнил правило группы sudo
.
%sudo ALL=(ALL:ALL) ALL,NOPASSWD:/usr/bin/tee /sys/class/backlight/intel_backlight/brightness
¶ Пишем скрипт смены
Мне был необходим скрипт, который сможет расчитать нужное значение яркости экрана и понизить его на некоторое количество процентов. Значение яркости будем хранить в файле, на вход принимать операцию (повышение/понижение яркости) и значение, на которое нужно будет изменить яркость экрана.
BACKLIGHT_FILE_PATH="$HOME/.config/i3/backlight_level"
[ -f "$BACKLIGHT_FILE_PATH" ] || echo "100" > $BACKLIGHT_FILE_PATH # если файла нет, создаем по умолчанию файл со 100% яркостью
OPERATION=$1
DELTA=$2
Далее, логика за малым - получаем значение яркости из файла, максимальное значение яркости, от которого считаем значение процента яркости и после записываем все новые значения.
BACKLIGHT_FILE_PATH="$HOME/.config/i3/backlight_level"
[ -f "$BACKLIGHT_FILE_PATH" ] || echo "100" > $BACKLIGHT_FILE_PATH # если файла нет, создаем по умолчанию файл со 100% яркостью
OPERATION=$1
DELTA=$2
OLD_BACKLIGHT=$(cat "$BACKLIGHT_FILE_PATH")
MAX_BACKLIGHT=$(cat /sys/class/backlight/intel_backlight/max_brightness)
case "$OPERATION" in
"+")
NEW_BACKLIGHT_PERCENTAGE=$(($OLD_BACKLIGHT + $DELTA))
;;
"-")
NEW_BACKLIGHT_PERCENTAGE=$(($OLD_BACKLIGHT - $DELTA))
;;
*)
echo "Unknown operation"
exit 1
;;
esac
NEW_BACKLIGHT=$(($MAX_BACKLIGHT / 100 * $NEW_BACKLIGHT_PERCENTAGE))
echo "$NEW_BACKLIGHT_PERCENTAGE" > $BACKLIGHT_FILE_PATH
echo "$NEW_BACKLIGHT" | sudo tee /sys/class/backlight/intel_backlight/brightness
И заключительное - защита от неверных значений яркости свыше 100 процентов и 1. При желании, подсветку экрана можно вовсе выключить, но я намеренно ограничиваю скрипт на 1 проценте.
BACKLIGHT_FILE_PATH="$HOME/.config/i3/backlight_level"
[ -f "$BACKLIGHT_FILE_PATH" ] || echo "100" > $BACKLIGHT_FILE_PATH # если файла нет, создаем по умолчанию файл со 100% яркостью
OPERATION=$1
DELTA=$2
OLD_BACKLIGHT=$(cat "$BACKLIGHT_FILE_PATH")
MAX_BACKLIGHT=$(cat /sys/class/backlight/intel_backlight/max_brightness)
case "$OPERATION" in
"+")
NEW_BACKLIGHT_PERCENTAGE=$(($OLD_BACKLIGHT + $DELTA))
;;
"-")
NEW_BACKLIGHT_PERCENTAGE=$(($OLD_BACKLIGHT - $DELTA))
;;
*)
echo "Unknown operation"
exit 1
;;
esac
[ "$NEW_BACKLIGHT_PERCENTAGE" -gt 100 ] && NEW_BACKLIGHT_PERCENTAGE=100
[ "$NEW_BACKLIGHT_PERCENTAGE" -lt 0 ] && NEW_BACKLIGHT_PERCENTAGE=1
NEW_BACKLIGHT=$(($MAX_BACKLIGHT / 100 * $NEW_BACKLIGHT_PERCENTAGE))
echo "$NEW_BACKLIGHT_PERCENTAGE" > $BACKLIGHT_FILE_PATH
echo "$NEW_BACKLIGHT" | sudo tee /sys/class/backlight/intel_backlight/brightness
¶ Используем скрипт
Сам скрипт можно поместить в любую директорию в $PATH, например /usr/local/bin/backlight.sh
и дать право выполнения при помощи команды chmod +x <путь к скрипту>
. Примеры вызова:
backlight.sh + 50
backlight.sh - 25
Чтобы привязать выполнение скрипта в i3wm на нажатие кнопок яркости, добавьте следующие строки в конфиг-файл:
bindsym XF86MonBrightnessDown exec --no-startup-id backlight.sh - 10
bindsym XF86MonBrightnessUp exec --no-startup-id backlight.sh + 10