Показаны сообщения с ярлыком Keyboard. Показать все сообщения
Показаны сообщения с ярлыком Keyboard. Показать все сообщения


Устройство клавиатуры можно найти по имени в каталоге "/dev/input/by-id/". Возможно, нужно будет сменить владельца на текущего пользователя:
sudo chown user:user /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd 
Далее для снятия дампа в hex-виде предлагаю такую замысловатую команду:
sleep 1 ; hexdump -e '24/1 " %02X" "\n"' /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd & sleep 5 ; pkill hexdump
Здесь через 1 секунду (sleep 1, чтобы нажатие Enter не попало в дамп) начнется захват данных с клавиатуры, будет выводиться по 24 байта на строку (24/1), еще через 5 секунд (sleep 5) захват будет остановлен (pkill hexdump, чтобы мы смогли вновь пользоваться клавиатурой после снятия дампа).
Пример вывода, где пару раз была нажата кнопка F1:
sleep 1 ; hexdump -e '24/1 " %02X" "\n"' /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd & sleep 5 ; pkill hexdump
[1] 14693
 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 04 00 04 00 3A 00 07 00
 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 01 00 3B 00 01 00 00 00
 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 00 00 00 00 00 00 00 00
 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 04 00 04 00 3A 00 07 00
 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 01 00 3B 00 00 00 00 00
 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 00 00 00 00 00 00 00 00
 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 04 00 04 00 3A 00 07 00
 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 01 00 3B 00 01 00 00 00
 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 00 00 00 00 00 00 00 00
 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 04 00 04 00 3A 00 07 00
 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 01 00 3B 00 00 00 00 00
 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 00 00 00 00 00 00 00 00
Input-устройства выдают данные пакетами. Каждый пакет — структура input_event:
struct input_event {
 struct timeval time;
 __u16 type;
 __u16 code;
 __s32 value;
};
Структура имеет размер 24 байта (на 64-битной системе), именно поэтому выше мы выводили дамп по 24 байта на строку.

Первое поле структуры input_event — также структура, timeval. Использовалась 64-битная система, поэтому timeval состояла из двух 64-битных (по 8 байт) целых чисел — значения секунд и микросекунд. По первым 8 байтам каждой строки дампа видно, как меняется значение секунд (почти не меняется, только первый байт поменялся с 15 на 16, когда секунда "тикнула"). Следующие 8 байт каждой строки отвечают за микросекунды, а потому меняются хаотично (нажатие/отпускание кнопки F1 приходилось на произвольную долю секунд).

А самое интересное происходит в последних восьми байтах каждой строки дампа. Сначала идет двухбайтное поле type — его значение менялось с 4 (EV_MSC — некая дополнительная информация, разбирать ее не будем) на 1 (EV_KEY — непосредственно событие кнопки клавиатуры) и 0 (EV_SYN — разделитель).

Разберем события EV_KEY, их было всего 4:
 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 01 00 3B 00 01 00 00 00
 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 01 00 3B 00 00 00 00 00
 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 01 00 3B 00 01 00 00 00
 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 01 00 3B 00 00 00 00 00
За полем event следует также двухбайтное поле code — код клавиши. В нашем случае — 3B в hex или 59 в десятичном виде. Смотрим файл input-event-codes.h. Действительно, 59 — это код клавиши F1.

И, наконец, последнее поле — четырехбайтное value. Здесь все просто: значение 1 соответствовало нажатию клавиши F1, значение 0 — отпусканию.

Как известно, тире на клавиатуре набрать не так-то просто, поэтому в большинстве своем в интернете мы встречаем лишь один знак — дефис. Подробнее об этой орфографической и типографической трагедии можно прочесть в статье "Тире, минус и дефис, или Черты русской типографики". Знак минуса пока оставим в покое, а вот тире попробуем все же отыскать. Поможет нам в этом клавиша Compose.
Для начала ее следует назначить. В еще нормальных старых-добрых дистрибутивах сделать это можно было с помощью добавления соответствующей опции в секцию "XkbOptions" конфига иксов xorg.conf. Например, для назначения правого Alt-а (самый популярный вариант) в качестве Compose следует добавить фразу "compose:ralt", чтобы секция выглядела примерно так:

Option "XkbOptions" "grp:caps_toggle,grp_led:caps,compose:ralt"

В новых дистрибутивах "XkbOptions" можно редактировать через xml-конфиги hal-а, или (в случае Убунты) через "/etc/default/console-setup". Подробности ищите в документации к вашему дистрибутиву.

После назначения клавиши (и перезагрузки иксов/компьютера) заветный знак тире доступен по тройному нажатию дефиса с зажатой compose-клавишей.

Естественно, compose поможет набрать не только тире, но и море других символов, см. полный список.

Часто в руководствах и блогах даются советы добавить строку "export GTK_IM_MODULE=xim" (или то же с "QT_IM_MODULE") например в "/etc/environment". Qt-приложения не проверял, GTK-... у меня работают и без установки переменной окружения.

Неприятным сюрпризом стал конфликт Compose с xmodmap (см. статью про переназначение клавиш). Пришлось отказаться от переназначения правых Alt и win-клавиш, закомментировав пару соответствующих строк в "./.xmodmaprc" (благо пользуюсь исключительно левыми).

Любители кастомизации в файле "~/.XCompose" могут задать и свои собственные compose-последовательности (см. опять же).


Заметка про ещё один экзотический девайс и Linux.

Клавиатура от яблочников без труда определяется более-менее современным PC ещё на уровне bios, в Linux же без дополнительных телодвижений подхватывается стандартным "USB HID" драйвером. Печатать, и даже по-русски, уже можно =)

И что самое главное, подхватываются и нестандартные клавиши: xev реагирует например на нажатие клавиши повышения громкости и возвращает keycode:

KeyRelease event, serial 30, synthetic NO, window 0xe00001,
root 0x9f, subw 0x0, time 806958, (-515,533), root:(576,561),
state 0x10, keycode 176 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:

Теперь о том, что собственно подлежит настройке.

Поставим Alt на место.

Наверно самым неудобным (а скорее непривычным) кажется расположение клавиш "Alt", которые помещены непосредственно рядом с "Ctrl", так что естественным будет желание поменять их местами с "command" (кнопками с изображениями яблок).

Посмотрим модификаторы (альты, меты и проч.) по умолчанию:
bash-2.05b$ xmodmap -pm
xmodmap: up to 3 keys per modifier, (keycodes in parentheses):

shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x6d)
mod1 Alt_L (0x40), Alt_L (0x7d), Meta_L (0x9c)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x7f), Hyper_L (0x80)
mod5 Mode_switch (0x5d), ISO_Level3_Shift (0x7c)

И посмотрим маппинг нужных нам клавиш по умолчанию:
bash-2.05b$ xmodmap -pke | grep Alt ; xmodmap -pke | grep Super
keycode 64 = Alt_L Meta_L
keycode 113 = Alt_R Meta_R
keycode 125 = NoSymbol Alt_L
keycode 115 = Super_L
keycode 116 = Super_R
keycode 127 = NoSymbol Super_L

Очистим старые модификаторы:
bash-2.05b$ xmodmap -e "clear mod4"
bash-2.05b$ xmodmap -e "clear mod1"

Переназначим кнопки:
bash-2.05b$ xmodmap -e "keycode 64 = Super_L"
bash-2.05b$ xmodmap -e "keycode 115 = Alt_L Meta_L"
bash-2.05b$ xmodmap -e "keycode 113 = Super_R"
bash-2.05b$ xmodmap -e "keycode 116 = Alt_R Meta_R"
Переназначим модификаторы:

bash-2.05b$ xmodmap -e "add mod1 = Meta_L"
bash-2.05b$ xmodmap -e "add mod1 = Alt_L"
bash-2.05b$ xmodmap -e "add mod4 = Super_L"
Для автоматического применения запишем эти правила в ~/.xmodmaprc:
!Очистим старые модификаторы:
clear mod4
clear mod1
!Переназначим кнопки:
keycode 64 = Super_L
keycode 115 = Alt_L Meta_L
keycode 113 = Super_R
keycode 116 = Alt_R Meta_R
!Переназначим модификаторы:
add mod1 = Meta_L
add mod1 = Alt_L
add mod4 = Super_L
Запускать его следует так (можно прописать запуск например в ~/.xsession.d/):
bash-2.05b$ xmodmap $HOME/.xmodmaprc
И немного сcылок по теме:
Отличный how-to
Статья на Gentoo-wiki
Про ремапинг клавиш в целом

Настройка мультимедиаклавиш.
Запускаем xev и выясняем коды для мультимедиаклавиш, это 174, 176, 160 и 204 соответственно. Теперь замапим их соответствующим образом:
bash-2.05b$ xmodmap -e "keycode 174 = XF86AudioLowerVolume"
bash-2.05b$ xmodmap -e "keycode 176 = XF86AudioRaiseVolume"
bash-2.05b$ xmodmap -e "keycode 160 = XF86AudioMute"
bash-2.05b$ xmodmap -e "keycode 204 = XF86Eject"
Замечу, что это стандартные иксовые идентификаторы для такого рода кнопок, поэтому например в IceWM они будут работать уже после рестарта оконного менеджера. Привожу строки из дефолтного конфига IceWM (для привязки клавиш в других оконных средах смотрите их доки):
key "XF86AudioLowerVolume" aumix -v -5
key "XF86AudioRaiseVolume" aumix -v +5
key "XF86AudioMute" aumix -v 0
key "XF86Eject" eject

Ну и пропишем эти маппинги в
~/.xmodmaprc:
!Мультимедиа клавиши:
keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume
keycode 160 = XF86AudioMute
keycode 204 = XF86Eject
Аналогично можно замапить и любые другие клавиши, например F13-F16.

UPD Актуальный .xmodmaprc:
!Очистим старые модификаторы:
clear mod4
clear mod1

!Переназначим кнопки:
keycode 64 = Super_L
keycode 133 = Alt_L Meta_L
!keycode 134 = Alt_R Meta_R
keycode 108 = Super_R

!Правый альт -- Compose key:
keycode 134 = Multi_key

!Переназначим модификаторы:
add mod1 = Meta_L
add mod1 = Alt_L
add mod4 = Super_L

!F13-F16
keycode 191 = F13
keycode 192 = F14
keycode 193 = F15
keycode 194 = F16

!Мультимедиа клавиши (теперь работают из коробки):
!keycode 122 = XF86AudioLowerVolume
!keycode 123 = XF86AudioRaiseVolume
!keycode 121 = XF86AudioMute
!keycode 204 = XF86Eject


 

Copyright © 2007 DamnSmallBlog. Content is licensed under Creative Commons Attribution-Noncommercial.

Design: GeckoandFly and Blogcrowds.