Система Orphus
[]

четверг, 10 сентября 2009 г.

Настройка Fn-клавиш в ubuntu на ASUS M50Vc. Часть 2

В прошлом посте я рассказывал как настроить Fn-клавиши на ноуте, точнее дал вводную информацию, показал простейший пример и дал "пищу" для дальнейших размышлений. Сегодня я хочу показать пример настройки Fn-клавиш для обработки событий вкл/выкл touchpad, wifi и bluetooth, который значительно сложнее приведенного в предыдущем посте и требует значительно больше телодвижений (для ASUS M50Vc тебе не придется делать много телодвижений, я ведь заботливый ;) ).

И так, сегодня мы узнаем:
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 коммент.:

Анонимный комментирует... вторник, 27 апреля 2010 г. в 16:27:00 GMT+3

Здорово, что Вы нашли решение. Как раз сегодня-завтра собираюсь ставить linux на ноут.
Скажите, а Вы случаем не искали решение как сделать анимированные картинки или индикаторы на события по fn кнопкам?

Unknown комментирует... вторник, 27 апреля 2010 г. в 16:40:00 GMT+3

Чтобы как в vista/seven по центру экрана выскакивали? Нет не искал, я просто через notify-send вывожу сообщение с картинкой, мне этого достаточно :))

Ярослав комментирует... суббота, 29 октября 2011 г. в 16:52:00 GMT+3

Куда не загляну, везде ваш блог и ваша запись :) Уже 4 или 5 по поиску результат выдает вашу статью :)
Нет, я не имею ничего против, how-to нормальный.

Sabalt комментирует... четверг, 5 апреля 2012 г. в 22:08:00 GMT+3

А я все никак не могу прикрутить почтовый индикатор к Thunderbird или, на худой конец, к Evolution. Может подкинете идею?
До сих пор юзаю Asus M50VM, Debian Squeeze.

Unknown комментирует... пятница, 6 апреля 2012 г. в 08:50:00 GMT+3

Я этими клиентами не пользуюсь, поэтому даже не знаю, что подсказать :(
Думаю для Thunderbird'а можно найти подходящий аддон.

Sabalt комментирует... пятница, 6 апреля 2012 г. в 15:34:00 GMT+3

Проблема с аддонами. Найду - отпишусь, может кому пригодится.
А за статью спасибо!

Unknown комментирует... пятница, 6 апреля 2012 г. в 15:48:00 GMT+3

А... Вот оно что...

А вы claws-mail пробовали? Я раньше сидел на птичке, но потом перелез на claws-mail. Не знаю как сейчас, но тогда птичка довольно сильно отставала, особенно раздражали утечки памяти и медлительность.

Sabalt комментирует... пятница, 6 апреля 2012 г. в 20:43:00 GMT+3

Поюзал claws-mail. Попробую пока его погонять. Хоть индикатор работает ) А то когда ждешь важное письмо, фильм не комфортно смотреть )

Unknown комментирует... пятница, 6 апреля 2012 г. в 21:38:00 GMT+3

Думаю он вас полностью устроит :)

Отправить комментарий