Управление яркостью экрана в Linux при помощи Intel Backlight

22.03.2025

Илья Замарацких

Linux

Решения проблем

Содержание

Настраивая свою систему на базе 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