И так, сегодня мы узнаем:
1. Как настроить вкл/выкл touchpad и его диодного индикатора;
2. Как настроить вкл/выкл wifi и bluetooth и его диодного индикатора (правда у меня, к сожалению, не работает, хотя должен :( );
3. Сохранять их статус, т.е. если при выключении/перезагрузке ноута у тебя, например, был выключен touchpad, то и после загрузки системы он будет выключен;
4. Включать/выключать/мигать диодным индикатором почты, когда есть новые сообщения (на примере claws-mail).
Вступление
Помнишь в прошлом посте я говорил, что меня не устроило как работает клавиша Fn+F2? Так вот, включаю ноут, wifi и bluetooth включены, тыкаю эту клавишу одно вырубается, другое врубается при том, что заранее толком не предугадаешь, к тому же если вырубить, а потом врубить, переключатель на передней панельке ноута, то у меня врубался bluetooth, а wifi вырубался (могу ошибаться, т.к. пишу по памяти). Кому такое понравится? Или это только у меня так? Вот меня это не устроило, поэтому было решено сделать по своему, как описано выше.
Так же мне не нравилось, что кнопка вкл/выкл тачпада не работает, а в идеале хотелось чтобы и диодный индикатор загорался, когда тачпад отключен.
К тому же мне очень мешало то, что после перезагрузки тачпад, вайфай и блутуз снова включаются. Раз я что-то выключил, значит они и должны быть выключены!
Мне удалось всего этого добиться. И сегодня делюсь с тобой, уважаемый читатель :)
Предварительная настройка
Чтобы работала клавиша Fn+F9 нужно кое-что сделать.
Для ubuntu 9.04 и выше:
Для начала нужно скопировать файл-правило в каталог правил демона HAL, для этого выполняем:
$ sudo cp \ > /usr/share/hal/fdi/policy/20thirdparty/11-x11-synaptics.fdi \ > /etc/hal/fdi/policy/Теперь нужно этот файл-правило подкорректировать, а именно включить возможность изменения параметров тачпада (точнее драйвера synaptics) "на лету". Для этого открываем файл-правило /etc/hal/fdi/policy/11-x11-synaptics.fdi и добавляем нужную строку (приведен весь файл-правило целиком, добавляемая строка выделена):
$ sudo vim /etc/hal/fdi/policy/11-x11-synaptics.fdi <?xml version="1.0" encoding="ISO-8859-1"?> <deviceinfo version="0.2"> <device> <match key="info.capabilities" contains="input.touchpad"> <merge key="input.x11_driver" type="string">synaptics</merge> <!-- Arbitrary options can be passed to the driver using the input.x11_options property since xorg-server-1.5. --> <!-- EXAMPLE: <merge key="input.x11_options.LeftEdge" type="string">120</merge> --> <merge key="input.x11_options.SHMConfig" type="string">true</merge> </match> </device> </deviceinfo>
Для ubuntu 8.10 и ниже (если не ошибаюсь):
Открываем файл /etc/X11/xorg.conf и, если драйвер тачпада установлен и сконфигурирован, там должен быть раздел InputDevice, в который нужно добавить строку 'Option "SHMConfig" "true"' (добавляемая строка выделена):
Section "InputDevice" Identifier "Synaptics Touchpad" Driver "synaptics" Option "SendCoreEvents" "true" Option "Device" "/dev/psaux" Option "Protocol" "auto-dev" # ... skiped ... # Option "SHMConfig" "true" EndSectionПосле внесения изменений, желательно, перезагрузить ноут, чтобы изменения вступили в силу.
С предварительной настройкой окончили, преходим к...
Кратке описание файлов
Ниже приводится краткое описание файлов, которые нужны для реализаии задуманного, с указанием полных путей, где они должны лежать. Подробное описание этих файлов будет приведено ниже, когда будем рассматривать механизм их работы.
/usr/share/acpi-support/asus-m50vc-func - глобальный файл, в котором описаны необходимые функции и переменные.
/etc/fnkeys.conf - Файл когфигурации; необходим чтобы восстановить состояние touchpad, wifi и bluetooth после перезагрузки ноута.
/etc/acpi/events/asus-touchpad - файл-обработчик события (далее ФОС), который описывает правила реагирования на вкл/выкл тачпада для touchpad acpid.
/etc/acpi/events/asus-wifi-bluetooth-off - ФОС для выключение wifi и bluetooth.
/etc/acpi/events/asus-wifi-bluetooth-on - тоже самое, но включение.
/etc/acpi/events/asus-wifi-bluetooth-switch - ФОС для переключения состояния wifi и bluetooth.
/etc/acpi/asus-touchpad.sh - скрипт вызываемый ФОС при вкл/выкл touchpad.
/etc/acpi/asus-wifi-bluetooth.sh - тоже самое, но для wifi и bluetooth.
/etc/init.d/fnkeys - "демон", для возобновления состояния touchpad, wifi и bluetooth после загрузки ноута.
~/.config/autostart/fnkeys.desktop - почти тоже самое, но выполняется при загрузке рабочего стола гнома, т.е. после логина в GDM.
Теперь думаю пора рассмотреть сами эти файлы (некоторые)... Начнем с самого большого и сложного.
$ cat /usr/share/acpi-support/asus-m50vc-func # Общие переменные и функции для работы Fn клавиш # на ноутбуке ASUS M50Vc DISPLAY=':0.0' export DISPLAY USER_NAME="angel" CONF="/etc/fnkeys.conf" IMG_PATH="/home/angel/.icons/fnkeys" WON_BON="wbt_on.png" # WiFi=ON & BT=ON WON_BOFF="w_on.png" # WiFi=ON & BT=OFF WOFF_BON="bt_on.png" # WiFi=OFF & BT=ON WOFF_BOFF="wbt_off.png" # WiFi=OFF & BT=OFF T_ON="t_on.png" # Touchpad=ON T_OFF="t_off.png" # Touchpad=OFF WSTATE="/sys/class/net/wlan0/device/rfkill/rfkill0/state" WLED="/sys/devices/platform/asus-laptop/wlan" BSTATE="/sys/devices/platform/asus-laptop/bluetooth" TLED="/sys/devices/virtual/leds/asus::touchpad/brightness" NOTIFYSEND="/usr/bin/notify-send" SYNCLIENT="/usr/bin/synclient" AWK="/usr/bin/awk" PRINTF="/usr/bin/printf" SUDO="/usr/bin/sudo" CAT="/bin/cat" ON=1 OFF=0 WS=$($CAT $WSTATE) BS=$($CAT $BSTATE) # include settings if [ -e $CONF ] ; then . $CONF fi # Служебная функция, вкл/выкл тачпада _tp(){ if [ $1 -eq $OFF ] ; then $SYNCLIENT TouchpadOff=1 echo $OFF > $TLED else $SYNCLIENT TouchpadOff=0 echo $ON > $TLED fi } # Вкл/Выкл тачпада _touchpad() { # get the current state of the touchpad TPSTATUS=$($SYNCLIENT -l | $AWK '/TouchpadOff/ {print $3}') # if getting the status failed, exit if [ -z $TPSTATUS ] ; then exit 1 ; fi if [ $TPSTATUS -eq $OFF ]; then _tp $OFF $SUDO -u $USER_NAME $NOTIFYSEND -i "$IMG_PATH/$T_OFF" \ "Touchpad Disabled" TOUCHPAD=$OFF else _tp $ON $SUDO -u $USER_NAME $NOTIFYSEND -i "$IMG_PATH/$T_ON" \ "Touchpad Enabled" TOUCHPAD=$ON fi } # Служебная функция, вкл/выкл WiFi _wifi(){ echo $1 > $WSTATE echo $1 > $WLED } # Служебная функция, вкл/выкл Bluetooth _bluetooth(){ echo $1 > $BSTATE } # Служебная функция, отображает уведомления # при вкл/выкл WiFi и Bluetooth _notify_show(){ if [ $1 -eq $ON -a $2 -eq $OFF ] ; then $SUDO -u $USER_NAME $NOTIFYSEND -i "$IMG_PATH/$WON_BOFF" \ "$($PRINTF "Wireless\t\tON\nBluetooth\t\tOFF")" else if [ $1 -eq $ON -a $2 -eq $ON ] ; then $SUDO -u $USER_NAME $NOTIFYSEND -i "$IMG_PATH/$WON_BON" \ "$($PRINTF "Wireless\t\tON\nBluetooth\t\tON")" else if [ $1 -eq $OFF -a $2 -eq $ON ] ; then $SUDO -u $USER_NAME $NOTIFYSEND -i "$IMG_PATH/$WOFF_BON" \ "$($PRINTF "Wireless\t\tOFF\nBluetooth\t\tON")" else if [ $1 -eq $OFF -a $2 -eq $OFF ] ; then $SUDO -u $USER_NAME $NOTIFYSEND -i "$IMG_PATH/$WOFF_BOFF" \ "$($PRINTF "Wireless\t\tOFF\nBluetooth\t\tOFF")" fi fi fi fi } # Переключение режима WiFi и Bluetooth [Fn+F2] _wb_select(){ # select mode # if switch = off then exit if [ $SWITCH -eq $OFF ] ; then exit 0 ; fi if [ $WS -eq $ON -a $BS -eq $OFF ] ; then WIFI=$ON BLUETOOTH=$ON _notify_show $ON $ON else if [ $WS -eq $ON -a $BS -eq $ON ] ; then WIFI=$OFF BLUETOOTH=$ON _notify_show $OFF $ON else if [ $WS -eq $OFF -a $BS -eq $ON ] ; then WIFI=$ON BLUETOOTH=$OFF _notify_show $ON $OFF else if [ $WS -eq $OFF -a $BS -eq $OFF ] ; then WIFI=$ON BLUETOOTH=$OFF _notify_show $ON $OFF fi fi fi fi _wifi $WIFI sleep 5 # Иначе не хочет работать правильно _bluetooth $BLUETOOTH } # Вкл/Выкл. Для переключателя на фронтальной панели ноута # (слева внизу, где ИК порт) _wb_switch(){ if [ $SWITCH -eq $OFF ] ; then SWITCH=$ON _wifi $WIFI sleep 5 # Иначе не хочет работать правильно _bluetooth $BLUETOOTH _notify_show $WIFI $BLUETOOTH else SWITCH=$OFF _wifi $OFF _bluetooth $OFF _notify_show $OFF $OFF fi } # Сохранение настроек, # чтобы после ребута можно было все восстановить _save_conf(){ $PRINTF "WIFI=$WIFI\nBLUETOOTH=$BLUETOOTH\nSWITCH=$SWITCH TOUCHPAD=$TOUCHPAD\n" > $CONF }Вот такой воть он большой :) Зато довольно простой. Тут вначале идет объявления переменных, а потом функций. Сам файл не является скриптом, это как бы библиотека/модуль для скриптов и создан для, того чтобы в каждом скрипте не писать одно и тоже, что так же облегчает и правку.
Объявление и экспорт переменной $DISPLAY необходимо для того, чтобы на экране отображались уведомления. А так как на моем ноуте только одна учетка, то с вероятностью близкой к 100% номер дисплея для моей учетки всегда будет равен ":0.0". А имя пользователя я указываю чтобы тоже не заморачиваться в дальнейшем, т.к. всегда работаю под одним и тем же. Зачем? В коде есть строчки подобные этой:
$SUDO -u $USER_NAME $NOTIFYSEND -i "$IMG_PATH/$T_OFF" \ "Touchpad Disabled"Так вот, переменную с именем юзера исопользую тут, а sudo чтобы скрипты выводили уведомления на экран, т.е. sudo + $DISPLAY, по другому работать не хотели. Лениво был разбираться детально, поэтому и пошел по пути наименьшего сопротивления.
Дальше вроде понятно даже по названию, что это за переменные и для чего они нужны... Поясню только переменные $WSTATE, $WLED, $BSTATE, $TLED. Первая указывает где хранится файл отвечающий за включение/выключение wifi, вторая - его диод, третья - bluetooth, а последняя - за диод touchpad'а. Ниже идут функции, перечислю: _tp(), _touchpad(), _wifi(), _bluetooth(), _notify_show(), _wb_select(), _wb_switch(), _save_conf(). Назначение каждой функции можно узнать читая комментарии в коде, поэтому останавливаться на этом не буду. Т.ж. не вижу смысла пояснять как и какая функция работает и что делает, из самого кода это видно наглядно. Поэтому если кому будет не понятно, спрашивайте в комментариях, расскажу.
/etc/acpi/events/asus-wifi-bluetooth-on как говорилось выше - это файл-обработчик события, в нем всего две строки:
event=hotkey (ATKD|HOTK) 0000005e action=/etc/acpi/asus-wifi-bluetooth.sh onПервая говорит демону acpid, на какое событие реагировать, а вторая - что делать при наструплении события. Остальные файлы из этого же каталога работают по этому же принципу и так же содержат всего 2 строки.
/etc/acpi/asus-touchpad.sh, /etc/acpi/asus-wifi-bluetooth.sh и /etc/init.d/fnkeys только вызывают нужные функции из /usr/share/acpi-support/asus-m50vc-func. На последний надо сделать символьные ссылки - /etc/rc{2..5}.d/S99fnkeys, чтобы выполнялось при загрузке системы.
В общем это все...
В архиве лежат все перчисленые выше файлы. Т.ж. пложил туда иконки, которые у меня отображаются в уведомлениях и скрипт для установки этого добра одним махом. Кстати, иконки рисовал сам, на основе иконки с изображением блутуса. Ставить все это добро очень просто:
$ cd /tmp/ $ wget http://dl.getdropbox.com/u/922069/Blog/fnkeys.tar.gz $ tar -xzf fnkeys.tar.gz $ cd fnkeysОткрой файл setup.sh и отредактируй строки 3 и 4, т.е. в переменную $UG впиши свой $LOGNAME, а в $H - $HOME. И далее:
$ sudo sh setup.sh $ sudo /etc/init.d/acpi restartСкрипт выполнит копирование файлов в нужные каталоги, расставит права доступа и владельца, а так же настроет автозапуск при старте системы и гнома. Если какой-либо файл уже будет существовать, то скрипт спросит перезаписать ли этот файл (но резервные копии НЕ создает). Все изменения в системе, которые делает скрипт, выводятся на стандартный вывод.
Скрипты писались и тестировались в Ubuntu 9.04 Desktop на ноуте ASUS M50Vc и на работу в других системах и на других ноутах не рассчитаны и могут вызвать проблемы. В любом случае я, т.е. автор, не несу никакой, абсолютно никакой, ответственности, за использование этих скриптов. Используй их на свой страх и риск.
Заключение
Не знаю, возможно я тут все описал очень поверхностно, но думаю, что вполне достаточно для того чтобы ты мог понять и разобраться как все это работает, а главное, подружить совего пингвина с Fn-клавишами ноута. Ну а скрипты (ссылка), уверен, помогут понять и разобраться в том, что я "забыл" тут упомянуть :)
Как видишь, в очередной раз доказано, что пингвин на много дружелюбнее форточек :)
ЗЫЖ Чуть не забыл, я же еще хотел привести пример как зажечь/погасить "почтовый" диод... Для Claws Mail для начала надо поставить плагин acpi-notifier, если он еще не стоит. В ubuntu делается это так:
$ sudo aptitude install claws-mail-acpi-notifier
Теперь открывай claws-mail и иди в Настройки -> Параметры... -> Уведомления через ACPI, в правой части окна выбирай в поле "Тип ACPI" свой ноут, жми ОК, принимай новую почту или отметь какое-либо письмо как новое. Если не помогло, попробуй другой тип ACPI. Мне ни один из имеющихся типов не помог, поэтому я сделал так:
1. В файл /etc/rc.local добавил след. строку перед строкой "exit 0":
$ chmod 666 '/sys/devices/virtual/leds/asus::mail/brightness'2. В claws-mail в Настройки -> Параметры... -> Уведомления через ACPI в поле "Тип ACPI" выбрал "Other file" и ниже указал путь до файла /sys/devices/virtual/leds/asus::mail/brightness, выше выставил все так как мне нравится.
3. Проверил почту, получил новые письма и диодик весело мне замигал :)
Информация с сайта http://angel2s2.blogspot.com/.
10 коммент.:
Здорово, что Вы нашли решение. Как раз сегодня-завтра собираюсь ставить linux на ноут.
Скажите, а Вы случаем не искали решение как сделать анимированные картинки или индикаторы на события по fn кнопкам?
Чтобы как в vista/seven по центру экрана выскакивали? Нет не искал, я просто через notify-send вывожу сообщение с картинкой, мне этого достаточно :))
Куда не загляну, везде ваш блог и ваша запись :) Уже 4 или 5 по поиску результат выдает вашу статью :)
Нет, я не имею ничего против, how-to нормальный.
Спасибо :)
А я все никак не могу прикрутить почтовый индикатор к Thunderbird или, на худой конец, к Evolution. Может подкинете идею?
До сих пор юзаю Asus M50VM, Debian Squeeze.
Я этими клиентами не пользуюсь, поэтому даже не знаю, что подсказать :(
Думаю для Thunderbird'а можно найти подходящий аддон.
Проблема с аддонами. Найду - отпишусь, может кому пригодится.
А за статью спасибо!
А... Вот оно что...
А вы claws-mail пробовали? Я раньше сидел на птичке, но потом перелез на claws-mail. Не знаю как сейчас, но тогда птичка довольно сильно отставала, особенно раздражали утечки памяти и медлительность.
Поюзал claws-mail. Попробую пока его погонять. Хоть индикатор работает ) А то когда ждешь важное письмо, фильм не комфортно смотреть )
Думаю он вас полностью устроит :)
Отправить комментарий