вторник, июля 03, 2007

Купил мультимедийную клавиатуру

Собственно, сабж ;)
Давно хотел, ибо у обычной клавиатуры клавиш банально не хватает. Ну действительно, алфавитные клавиши заняты просто алфавитом, Ctrl-буква используются во многих приложениях, Alt-буква - используются для вызова меню итп. Остаются только сочетания Win+что-то. Но все их я давно уже занял на операции с окнами, запуск основных программ итп. Так что в последнее время у меня начали появляться всякие "емаксерские" комбинации, вроде "Win-X,L" для управления разными named scratchpad-ами. Что не есть удобно :)
Купил клаву Defender Virtuoso какую-то. Появился лишний десяток кнопок, половину из них занял сразу под управление скратчпадами.
Клавиатура, видимо, использует нестандартные коды клавиш для XF86Play итп., так как иксы их сходу не узнали, пришлось дописывать в ~/.Xmodmap:
keycode 148 = XF86Cut
keycode 202 = XF86Copy
keycode 101 = XF86Paste

keycode 162 = XF86AudioPlay
keycode 164 = XF86AudioStop
keycode 144 = XF86AudioPrev
keycode 153 = XF86AudioNext
keycode 160 = XF86AudioMute
keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume

keycode 229 = XF86Search
keycode 178 = XF86HomePage
keycode 236 = XF86Mail

keycode 230 = XF86Favorites
keycode 233 = XF86Forward
keycode 234 = XF86Back
keycode 231 = XF86Refresh

keycode 161 = XF86Calculator


Тогда запахало почти всё, кроме XF86Cut,Copy,Paste - их иксы не видели, а ядро в логах ругалось на неопределенные сканкоды. Совет ядра воспользоваться утилитой setkeycodes помог. Написал в /etc/init.d/rc.local:
setkeycodes e025 222
setkeycodes e026 223
setkeycodes e023 224

Только вот приложения, как выяснилось, по умолчанию такие клавиши (Cut,Copy,Paste) не понимают. Ну мне-то все равно, я на них скратчпады повесил в ion-е, но хочется, чтобы у родни они работали соответственно иконкам на них (вырезать-копировать-вставить). Долго мучался, нашел решение в виде xbindkeys+xvkbd. В .xbindkeysrc пишем:
"xvkbd -xsendevent -text '\Cx'"
Mod2 + XF86Cut

"xvkbd -xsendevent -text '\Cc'"
Mod2 + XF86Copy

"xvkbd -xsendevent -text '\Cv'"
Mod2 + XF86Paste
Откуда Mod2 и почему именно Mod2 - не спрашивайте, не знаю :) Именно так определил эти клавиши xbindkeys -k.

И заодно, раз уж взялся настраивать клавиатуру, решил осуществить еще одно давнее желание - чтоб стандартные комбинации клавиш (напр., вимовские hjkl, башевские Ctrl-A,Ctrl-E и пр.) работали во всех приложениях. Понятно, что в чистом виде это неосуществимо - каждое приложение работает с клавиатурой по-своему. Поэтому пришлось добавить "модификатор" на CapsLock и работать с ним. Делается это так: в /usr/share/X11/xkb/symbols/addkeys пишем:
partial alphanumeric_keys
xkb_symbols "en" {
include "us"
name[Group1]= "US - Additional";
key.type[group1]="FOUR_LEVEL";
key <ac01> { [ a, A, Home, Home ] };
key <ad03> { [ e, E, End, End ] };
key <ac05> { [ g, G, Home, End ] };
key <ac06> { [ h, H, Left, Left ] };
key <ac07> { [ j, J, Down, Down ] };
key <ac08> { [ k, K, Up, Up ] };
key <ac09> { [ l, L, Right, Right ] };
key <ac03> { [ d, D, Delete, Delete ] };
include "addkeys(caps_switch)"
};

partial alphanumeric_keys
xkb_symbols "ru" {
include "ru(winkeys)"
name[Group1]= "Russia - Winkeys - Additional";
key.type[group1]="FOUR_LEVEL";
key <ac01> { [ Cyrillic_ef, Cyrillic_EF, Home, Home ] };
key <ad03> { [ Cyrillic_u, Cyrillic_U, End, End ] };
key <ac05> { [ Cyrillic_pe, Cyrillic_PE, Home, End ] };
key <ac06> { [ Cyrillic_er, Cyrillic_ER, Left, Left ] };
key <ac07> { [ Cyrillic_o, Cyrillic_O, Down, Down ] };
key <ac08> { [ Cyrillic_el, Cyrillic_EL, Up, Up ] };
key <ac09> { [ Cyrillic_de, Cyrillic_DE, Right, Right ] };
key <ac03> { [ Cyrillic_ve, Cyrillic_VE, Delete, Delete ] };
include "addkeys(caps_switch)"
};

default partial modifier_keys
xkb_symbols "caps_switch" {
key <caps> {
type[Group1]="ONE_LEVEL",
symbols[Group1] = [ ISO_Level3_Shift ]
};
modifier_map Mod5 { ISO_Level3_Shift };
};
И в /etc/X11/xorg.conf заменяем
Option "XkbLayout" "us,ru(winkeys)"
(ну или что там у вас) на
Option "XkbLayout" "addkeys(en),addkeys(ru)"
Все. Теперь Caps+hjkl - это стрелки, Caps+A - это Home, Caps+E - End, Caps+g - Home, Caps+Shift+g - End, Caps+D - Delete. При желании можно добавить и другие клавиши.