eMachines E728 & OpenSUSE 11.4 vs подсветка экрана

21 октября 2011 г.

Не так давно появился у меня ноутбук eMachines E728 (Acer), поставил на него OpenSUSE 11.4. Сразу заметил, что некоторые клавиши на клавиатуре «ведут себя странно». В частности, над стрелками вправо/влево есть клавиши с изображениями Доллара и Евро. В предустановленной Windows 7 Starter (которую я снес сразу после первого запуска) эти клавиши вполне-себе выводили эти символы на экран, в OpenSUSE — нажатие на них не приводит ни к какому действию. Также в OpenSUSE не работала… подсветка экрана! Да, да! Именно подсветка экрана! Вернее, поправлюсь. Она работала очень странным образом. А именно: при нажатии на соответствующие комбинации клавиш (Fn+LEFTARROW, Fn+RIGHTARROW) иногда появлялся, а иногда и нет, бегунок, который должен указывать текущий уровень подсветки экрана, но сама подсветка при этом не менялась. А когда же ноутбук гасил экран, то выход из этого состояния сопровождался уменьшением подсветки на несолько процентов, по-отношению к исходному (до гашения экрана). Таким образом я очень быстро пришел к совершенно черному экрану и невозможности его включить.
Ноутбук у меня уже около полугода, на нем побывало несколько ОС (linux), везде не работала подсветка, но такого эффекта «постоянного постепенного» гашения экрана я не встречал больше.

eMachines E728
На выходных пришлось переехать обратно на 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 при первой попытке изменить яркость без прав рута.

Все. Мало-мальски, задачу я решил.

Теги:
рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики