Являясь счастливым обладателем ноутбука с графикой от ATI, я испытал необычайное чувство радости, когда, после обновления Ubuntu 10.04 до 12,04 я увидел, что регулировка яркости не работает с проприетарными драйверами fglrx от AMD.
Тогда я откатился к open source драйверам radeon в надежде, что там все работает.
Да, ну почти да. Там работает все, за исключением 3d и аппаратного ускорения.
Увы, увы, но Unity 3d так и не запустился, несмотря на все мои танцы с бубном. Вероятней всего, из-за того, что неподдерживаемая серия карточек HD 5xxx не поддерживает 3d, а у меня карта модели 5650.
Захотев всех прелестей новой Unity, после долгосрочного и скучного времяпровождения в Gnome 2, я опять поставил fglrx драйвер, скачав его с сайта производителя (ссылка выше), правда выбрал версию постарше, т.к. на старой Ubuntu LTS реглировка яркости вполне прилично работала. Виной всему, как мне кажется, является новое ядро от Ubuntu — 3.2.0-24.
Речь идет о нажатии на специальные Fn кнопки: Fn + F6/F7 для увеличения или уменьшения яркости подсветки экрана.
Солнечный ползунок изменяется, что нельзя сказать о самой яркости дисплея.
Порывшись на форумах и ничего не обнаружив, кроме десятка багов на Launchpad на эту тему, я решил написать скрипты для ручного изменения яркости и привязать их к клавишам.
Сначала нужно найти файл, отвечающий за яркость. Это оказалось несложно. В моем случае это был — */sys/class/backlight/acpi_video0/brightness хотя попался еще один, который не работал — /sys/class/backlight/toshiba/brightness*
Эти файлы содержат число, которое может изменяться в пределах от 0 до 8, это справедливо в моем случае, для других моделей степень градации может отличаться.
Получается, чтобы поменять яркость, нужно всего лишь задать нужное число в файл, но не все так просто, как кажется.
На практике оказалось, что менять значение в этом файле может только привилегированный пользователь с id=0. Я сначала было подумал, что достаточно задать скрипту хозяина root и поставить setuid и дело в шляпе, но защита системы не позволяет выполнять скрипты с рутовым setuid, они продолжают запускаться с id все того же пользователя.
Поэтому я решил остановиться на бинарной программе, которая будет запускать мой скрипт.
Это небезопасно с точки зрения системного администратора, но с точки зрения конечного пользователя, мне нужней мои глаза, т.к. максимальная яркость экрана далеко не всегда приятна и уместна.
Для начала, напишем маленькую программу на C.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main( int argc, char *argv[] )
{
setuid( 0 );
system( argv[1] );
return 0;
}
Она берет в качестве аргумента любую другую программу или скрипт и запускает её с id 0.
Сохраним наш код в файл, например runscript.c и скомпилируем его.
gcc runscript.c -o runscript
Получим на выходе бинарный файл runscript, но он все еще не будет работать так, как нам нужно. Дадим ему рутовые права.
su -
chown root runscript
chmod 4750 runscript
Проверьте, чтоб группа скрипта была такая же, как и ваш пользователь, иначе не сможете запустить его.
Теперь создадим парочку скриптов, я приведу только один из них — для понижения яркости, т.к. второй будет отличаться от него только знаком и названием.
insider@home:~$ cat ~/Documents/scripts/brightness_down.sh
#!/bin/bash
BRIGHTNESS=`cat /sys/class/backlight/acpi_video0/brightness`
# Во втором скрипте будет знак +
BRIGHTNESS=$(($BRIGHTNESS-1))
echo $BRIGHTNESS > /sys/class/backlight/acpi_video0/brightness
Зачмодим оба скрипта, чтоб они стали исполняемыми.
chmod +x ~/Documents/scripts/brightness_{down,up}.sh
Теперь проверим, работает ли наша программа в координации со скриптами.
./runscript ~/Documents/scripts/brightness_down.sh
./runscript ~/Documents/scripts/brightness_up.sh
Если вы все сделали как в инструкции, то должно работать.
Теперь осталось поставить на них удобные комбинации клавиш, я выбрал
правый Ctrl + ArrowUp/ArrowDown.
Вот и все. Наслаждаемся нормальным переключением яркости и 3d.
P.S. Чтоб проверить, поддерживает ли ваша видеокарта Unity 3d запустите следующую программу в работающих «иксах».
insider@home:~$ /usr/lib/nux/unity_support_test -p
OpenGL vendor string: ATI Technologies Inc.
OpenGL renderer string: AMD Radeon HD 6500M/5600/5700 Series
OpenGL version string: 4.2.11399 Compatibility Profile Context
Not software rendered: yes
Not blacklisted: yes
GLX fbconfig: yes
GLX texture from pixmap: yes
GL npot or rect textures: yes
GL vertex program: yes
GL fragment program: yes
GL vertex buffer object: yes
GL framebuffer object: yes
GL version is 1.4+: yes
Unity 3D supported: yes