eMachines E728 & OpenSUSE 11.4 vs подсветка экрана
Не так давно появился у меня ноутбук eMachines E728 (Acer), поставил на него OpenSUSE 11.4. Сразу заметил, что некоторые клавиши на клавиатуре «ведут себя странно». В частности, над стрелками вправо/влево есть клавиши с изображениями Доллара и Евро. В предустановленной Windows 7 Starter (которую я снес сразу после первого запуска) эти клавиши вполне-себе выводили эти символы на экран, в OpenSUSE — нажатие на них не приводит ни к какому действию. Также в OpenSUSE не работала… подсветка экрана! Да, да! Именно подсветка экрана! Вернее, поправлюсь. Она работала очень странным образом. А именно: при нажатии на соответствующие комбинации клавиш (Fn+LEFTARROW, Fn+RIGHTARROW) иногда появлялся, а иногда и нет, бегунок, который должен указывать текущий уровень подсветки экрана, но сама подсветка при этом не менялась. А когда же ноутбук гасил экран, то выход из этого состояния сопровождался уменьшением подсветки на несолько процентов, по-отношению к исходному (до гашения экрана). Таким образом я очень быстро пришел к совершенно черному экрану и невозможности его включить.
Ноутбук у меня уже около полугода, на нем побывало несколько ОС (linux), везде не работала подсветка, но такого эффекта «постоянного постепенного» гашения экрана я не встречал больше.
На выходных пришлось переехать обратно на OpenSUSE 11.4 (родней она мне), думал, разработчики-таки поправят этот баг, — ан нет! Но информации по поводу данной странности ОС в интернете уже поднакопилось. И я нашел-таки способ решения данной проблемы, чем и хочу с Вами поделиться.
Итак, приступим.
Первый запрос в гугле выдал мне очень хороший почти пошаговый мануал.
Благодаря ему я понял, что в решение моей проблемы есть, ибо скрипт
value=$(zenity --scale --text "Уровень яркости" --min-value=10 --max-value=100 --value=10) if [ $value = 100 ] then sudo /sbin/setpci -s 00:02.0 F4.B=FF else sudo /sbin/setpci -s 00:02.0 F4.B=$value fi
заработал у меня и дал нужный мне результат. Но…
Выполнив все инструкции по этой ссылке (касательно подсвветки экрана) я столкнулся еще с одной нежданной проблемой: keyboard-touch смог определить стандартные комбинации клавиш изменения яркости (см.выше), но вот перехватить их в рабочем режиме — не смог. Как я не старался.
К тому же, он не смог распознать комбинации Fn+F1, Fn+F2 (Help, XF86Copy), которыми я ни разу за полгода не воспользовался и решил использовать их, как резервные.
Второй заход в гугл натолкнул меня на другую ссылку, где говорилось о (цитирую близко к оригиналу) «поставляемой в каждом дистрибутиве PCLinux» программе xbindkeys, которую я в стандартных репозиториях OpenSUSE не нашел. Но сборка и установка из сырцов с оф.сайта не представила сложности:
wget www.nongnu.org/xbindkeys/xbindkeys-1.8.5.tar.gz tar xzvf xbindkeys-1.8.5.tar.gz cd xbindkeys-1.8.5 sudo zypper in guile ./configure make sudo make install
Далее, запускаем xbindkeys, генерируя перед этим стандартный конфигурационный файл “.xbindkeys” в Вашей домашней директории.
xbindkeys #при первом запуске он выведет команду для создания этого конф.файла (я ее потерял, к сожалению)
#после успешного создания файла конфигурации – запускаем программу:
xbindkeys
Далее алгоритм назначения клавиш очень прост:
1. Запустить «xbindkeys -k» — откроется маленькое ГУИ-окошко с белым фоном, оно должно быть в фокусе
2. Нажать комбинацию клавиш (разработчики обещают полную поддержку 4-х клавиш-модификаторов: Ctrl, Shift, Alt… а какой четвертый?)
3. Записать команду в файл конфигурации.
При нажатии на комбинацию клавиш в окне с белым фоном будет в консоли выведена подобная информация:
"(Scheme function)"
m:0x14 + c:24
Control+Mod2 + q
Это и есть то, что нужно в ставить в консоль один-в-один. Только надо заменить строку “(Scheme function)” на Вашу программу/скрипт, оставив ковычки.
Итак. Скрипт — есть, программа, перехватывающая нужные мне комбинации (да, кстати, xbindkeys тоже не захотел перехватить дефолтные клавиши яркости, хех…). Но, раз уж пошла такая пьянка, я написал скрипт на perl, который будет и убавлять, и прибавлять яркость в зависимости от текущего:
#!/usr/bin/perl $action = $ARGV[0]; if ($action =~ m/([+-])(\d+)/) { $direction = $1; $delta = $2; } else { die ("USAGE: brmon.pl [+-]Value\n\n"); } print "ACTION: $action\n"; print "$direction $delta\n"; open(FILE,"</tmp/brightness") or do { open(FILE, ">/tmp/brightness") or die("Couldn't open file: /tmp/brightness\n"); print FILE "FF"; close(FILE); open(FILE, "</tmp/brightness") or die("Couldn't open file: /tmp/brightness\n"); }; $value = ; chomp($value); $value = hex($value); close(FILE); print "Current brightness: $value\n"; if ($direction eq '+') { $newvalue = $value + $delta; } elsif ($direction eq '-') { $newvalue = $value - $delta; } if ($newvalue > 0xFF) { $newvalue = 0xFF; } elsif ($newvalue < 0x1) { $newvalue = 0x1; } print "New brightness: $newvalue\n"; $command = "/sbin/setpci -s 00:02.0 F4.B=" . sprintf("%X",$newvalue); print $command ."\n"; $result = `$command`; if (!$result) { open(FILE, ">/tmp/brightness"); print FILE sprintf("%X",$newvalue); close FILE; } else { print "ERROR: $result\n"; }
вызывать его нужно, указывая первым параметром командной строки дельту изменения яркости. В моем случае я прописал в конфигурацию xvindkeys:
"/usr/bin/perl /home/bvn13/.scripts/brmon.pl +10" m:0x10 + c:141 Mod2 + XF86Copy "/usr/bin/perl /home/bvn13/.scripts/brmon.pl -10" m:0x10 + c:146 Mod2 + Help
И, совсем уж любопытным скажу, что setpci требует права суперпользователя. Так что…
sudo chown %USER:root /sbin/setpci
И те же права для конфигурационного файла, на который заругается setpci при первой попытке изменить яркость без прав рута.
Все. Мало-мальски, задачу я решил.