И так, сегодня мы узнаем:
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. Попробую пока его погонять. Хоть индикатор работает ) А то когда ждешь важное письмо, фильм не комфортно смотреть )
Думаю он вас полностью устроит :)
Отправить комментарий