Тачпад и мышка
Материал из Bryansk Linux Users Group.
Сегодня ноутбуки становятся доступнее и уже многие успели ими обзавестись. И многие уже обратили внимание на такое раздражающее неудобство, как переключение с активного окна при случайном касании тачпада во время набора текста. В этой статье рассматриваются два способа, устраняющие это неудобство. Оба способа разрабатывались для дистрибутива Ubuntu 8.04, хотя они пригодны и для других современных дистрибутивов без переделки, либо с небольшими изменениями.
Способ первый
Суть этого способа - назначение специальной комбинации клавиш для отключения тачпада. Он зависит от модели ноутбука, в моём случае это был ноутбук ASUS Z99Le (A8Le). Кроме того, на метод влияет модель тачпада, но, насколько я знаю, в большинстве случаев это продукция компании Synaptics, либо её аналоги.
Итак, сначала разрешаем настройку тачпада в конфигурационном файле /etc/X11/xorg.conf. Открываем этот файл командой
$ sudo gedit /etc/X11/xorg.conf
Затем находим переходим в секцию описания тачпада и добавляем опцию "SHMConfig" со значением "on".
Section "InputDevice" Identifier "Synaptics Touchpad" Driver "synaptics" Option "SendCoreEvents" "true" Option "Device" "/dev/psaux" Option "Protocol" "auto-dev" Option "HorizEdgeScroll" "0" Option "SHMConfig" "on" EndSection
После этого перегружаем X. Теперь командой synclient мы можем включать и выключать тачпад:
$ synclient TouchpadOff=0 $ synclient TouchpadOff=1
Настало время назначить комбинацию клавиш для включения и выключения тачпада. Как правило для этого используется комбинация клавиш Fn+Fx (где Fn - модулирующая клавиша на клавиатуре ноутбука, а Fx - одна из клавиш F1-F12). В моём случае выбрана (причём это было "из коробки", в самом дистрибутиве) комбинация Fn+F9. Определить код этой комбинации можно с помощью программы acpi_listen. Ниже приведён пример для комбинации Fn+F9.
$ acpi_listen hotkey ATKD 0000006b 00000000 hotkey ATKD 0000006b 00000001 hotkey ATKD 0000006b 00000002 hotkey ATKD 0000006b 00000003
Как видно из примера, код комбинации будет 0x6b, второе значение - количество нажатий, нам оно не пригодится.
Обработка нажатий специальных комбинаций (и многих других событий) в современных дистрибутивах выполняется системой acpi. Поэтому идём в каталог /etc/acpi/events и находим файл asus-touchpad (не забудьте, для вашего ноутбука это может быть другой файл). Открываем файл и убеждаемся, что данному событию назначена нужная нам комбинация:
$ cat /etc/acpi/events/asus-touchpad # /etc/acpi/events/asus-touchpad # This is called when the user presses the touchpad button and calls # /etc/acpi/asus-touchpad.sh for further processing. event=hotkey ATKD 0000006b action=/etc/acpi/asus-touchpad.sh
Если значение ключа event отличается от нашего кода - правим на нужное значение. Можно заметить, что при получении нашего кода 0000006b система acpi вызовет скрипт /etc/acpi/asus-touchpad.sh. Давайте посмотрим, что находится в этом скрипте:
$ cat asus-touchpad.sh
#!/bin/sh
# get the current state of the touchpad
TPSTATUS=`synclient -l | grep TouchpadOff | awk '{print $3}'`
# if getting the status failed, exit
test -z $TPSTATUS && exit 1
if [ $TPSTATUS = 0 ]; then
synclient TouchpadOff=1
else
synclient TouchpadOff=0
fi
Этот скрипт проверяет текущее состояние тачпада и меняет его на противоположное (включает или выключает).
Далее перезагрузим ноутбук и проверим работу нашей комбинации клавиш. Для контроля будем просматривать лог демона acpid:
$ tail -f /var/log/acpid [Sun Jun 8 14:32:30 2008] received event "hotkey ATKD 0000006b 0000000d" [Sun Jun 8 14:32:30 2008] notifying client 5230[111:123] [Sun Jun 8 14:32:30 2008] notifying client 7087[0:0] [Sun Jun 8 14:32:30 2008] executing action "/etc/acpi/asus-touchpad.sh" [Sun Jun 8 14:32:30 2008] BEGIN HANDLER MESSAGES [Sun Jun 8 14:32:30 2008] END HANDLER MESSAGES [Sun Jun 8 14:32:30 2008] action exited with status 0 [Sun Jun 8 14:32:30 2008] completed event "hotkey ATKD 0000006b 0000000d"
Видно, что после нажатия комбинации Fn+F9 система получила событие "hotkey ATKD 0000006b ...", что привело к выполнению скрипта /etc/acpi/asus-touchpad.sh. Соответственно, тачпад должен перестать работать. Повторное нажатие комбинации клавиш должно включить тачпад. Таким образом, наша цель достигнута. Теперь при начале работы с текстом мы можем отключить тачпад и спокойно работать, не опасаясь, что от случайного прикосновения к тачпаду наш курсор улетит в неизвестном направлении.
Если у вас ноутбук не ASUS, проверьте содержимое каталогов /etc/acpi и /etc/acpi/events на наличие скриптов и настроек для вашего ноутбука.
Способ второй
Не секрет, что тачпад - вещь довольно неудобная и пользуются им неохотно (хотя, вы, возможно, думаете иначе), стараясь в каждом удобном случае воткнуть USB-мышку. А если есть мышка - то зачем нам включенный тачпад? Не проще ли предусмотреть, чтобы при подключении мышки тачпад отключался, а при её отключении тачпад вновь подключался? Именно это и позволяет делать второй способ настройки тачпада.
Во-первых, не забудьте разрешить настройку тачпада, включив опицию "SHMConfig on" в /etc/X11/xorg.conf, как это сделано в первом случае.
Теперь нам нужно настроить систему udev так, чтобы она, при подключении или отключении мышки вызывала нужный нам скрипт, изменяющий состояние тачпада. Для этого мы идём в каталог /etc/udev/rules.d/ и создаём файл 99-touchpad.rules следующего содержания:
#/etc/udev/rules.d/99-touchpad.rules
ENV{ID_CLASS}=="mouse", RUN+="/etc/udev/scripts/touchpad.sh"
Затем создаём каталог /etc/udev/scripts/ (если он не был создан ранее) и записываем в него файл touchpad.sh следующего содержания:
#!/bin/sh case "$ACTION" in add) synclient TouchpadOff=1 ;; remove) synclient TouchpadOff=0 ;; esac
Не забываем назначить ему соответствующие права:
$ sudo chmod +x /etc/udev/scripts/touchpad.sh
Теперь можно перезагрузить машину и проверить отключение тачпада при подключении мышки и его восстановление при её отключении. Дополнительно контролировать процесс можно просматривая лог файл syslog:
$ tail -f /var/log/syslog # --- произведено подключение мышки --- kernel: [15626.875997] usb 2-2: new low speed USB device using uhci_hcd and address 2 kernel: [15627.048832] usb 2-2: configuration #1 chosen from 1 choice NetworkManager: <debug> [1212922633.427592] nm_hal_device_added(): New device added (hal udi is '/org/freedesktop/Hal/devices/usb_device_9da_a_noserial'). kernel: [15627.329475] usbcore: registered new interface driver hiddev kernel: [15627.341425] input: A4Tech PS/2+USB Mouse as /devices/pci0000:00/0000:00:1a.1/usb2/2-2/2-2:1.0/input/input9 kernel: [15627.367153] input,hidraw0: USB HID v1.10 Mouse [A4Tech PS/2+USB Mouse] on usb-0000:00:1a.1-2 kernel: [15627.367169] usbcore: registered new interface driver usbhid kernel: [15627.367173] /build/buildd/linux-2.6.24/drivers/hid/usbhid/hid-core.c: v2.6:USB HID core driver NetworkManager: <debug> [1212922633.742955] nm_hal_device_added(): New device added (hal udi is '/org/freedesktop/Hal/devices/usb_device_9da_a_noserial_if0'). NetworkManager: <debug> [1212922633.853019] nm_hal_device_added(): New device added (hal udi is '/org/freedesktop/Hal/devices/usb_device_9da_a_noserial_if0_logicaldev_input'). # --- произведено отключение мышки --- kernel: [15631.683458] usb 2-2: USB disconnect, address 2 NetworkManager: <debug> [1212922638.086834] nm_hal_device_removed(): Device removed (hal udi is '/org/freedesktop/Hal/devices/usb_device_9da_a_noserial_if0_logicaldev_input'). NetworkManager: <debug> [1212922638.093573] nm_hal_device_removed(): Device removed (hal udi is '/org/freedesktop/Hal/devices/usb_device_9da_a_noserial_if0'). NetworkManager: <debug> [1212922638.097985] nm_hal_device_removed(): Device removed (hal udi is '/org/freedesktop/Hal/devices/usb_device_9da_a_noserial').
Вот и всё.
Кстати, на ноутбуке можно реализовать оба метода одновременно, тогда даже подключив мышку при необходимости можно включить тачпад (вот только для чего - это вы сами решите :) )
Ссылки
Автор: xbow 8 июня 2008

