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, чтобы мы смогли вновь пользоваться клавиатурой после снятия дампа).
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
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-последовательности (см. опять же).
Клавиатура от яблочников без труда определяется более-менее современным 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", которые помещены непосредственно рядом с "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"Для автоматического применения запишем эти правила в ~/.xmodmaprc:
bash-2.05b$ xmodmap -e "add mod1 = Alt_L"
bash-2.05b$ xmodmap -e "add mod4 = Super_L"
!Очистим старые модификаторы:Запускать его следует так (можно прописать запуск например в ~/.xsession.d/):
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
bash-2.05b$ xmodmap $HOME/.xmodmaprcИ немного сcылок по теме:
Отличный how-to
Статья на Gentoo-wiki
Про ремапинг клавиш в целом
bash-2.05b$ xmodmap -e "keycode 174 = XF86AudioLowerVolume"Замечу, что это стандартные иксовые идентификаторы для такого рода кнопок, поэтому например в IceWM они будут работать уже после рестарта оконного менеджера. Привожу строки из дефолтного конфига IceWM (для привязки клавиш в других оконных средах смотрите их доки):
bash-2.05b$ xmodmap -e "keycode 176 = XF86AudioRaiseVolume"
bash-2.05b$ xmodmap -e "keycode 160 = XF86AudioMute"
bash-2.05b$ xmodmap -e "keycode 204 = XF86Eject"
key "XF86AudioLowerVolume" aumix -v -5
key "XF86AudioRaiseVolume" aumix -v +5
key "XF86AudioMute" aumix -v 0
key "XF86Eject" eject
Ну и пропишем эти маппинги в ~/.xmodmaprc:
!Мультимедиа клавиши:Аналогично можно замапить и любые другие клавиши, например F13-F16.
keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume
keycode 160 = XF86AudioMute
keycode 204 = XF86Eject
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