Search
Write a publication
Pull to refresh

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 http://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 при первой попытке изменить яркость без прав рута.

Все. Мало-мальски, задачу я решил.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.