Меняем местами кнопки на клавиатуре

Когда пользователь нажимает клавишу на клавиатуре, клавиатура посылает операционной системе скан-код клавиши (действия)

Существует три уровня идентификации клавиши:

Скан код (scancode) - это низший уровень идентификации клавиши. Представляет из себя число, которое клавиатура посылает компьютеру.

Код клавиши (keycode) - это следующий уровень идентификации клавиши. Кейкод соответствует какой-то функции.

Символ клавиши (keysym) - это третий уровень идентификации клавиши. Он отвечает за символ. Он может зависеть от того, нажата ли клавиша Shift или была ли одновременно нажата какая-то другая клавиша-модификатор.

Подробнее.

Посмотрим текущую таблицу сопоставления (маппинга) нажатия на клавишу (keycode) и действие, которое будет отправляться операционной системе.

xmodmap -pke > ~/.Xmodmap
cp ~/.Xmodmap ~/.Xmodmap.original
cat ~/.Xmodmap

Видим таблицу маппинга - где слева keycode, справа keysym

keycode (код клавиши) - это числовое значение, получаемое ядром при нажатии клавиши клавиатуры или мыши.

keysym (символ клавиши) - название символа который должен напечататься (а в некоторых случаях название действия. Возможные значения изложены на странице ключей.

keycode <x> = <1> <2> <3> <4> <5> <6> <7> <8>
                \   \   \   \   \   \   \  \-> - 
                 \   \   \   \   \   \   \---> Num_Lock + Mode_switch + key (возможно AltGr + Shift + key)
                  \   \   \   \   \   \------> AltGr + key
                   \   \   \   \   \---------> Num_Lock + key
                    \   \   \   \------------> Shift + Mode_switch + key
                     \   \   \---------------> Mode_switch + key   
                      \   \------------------> Shift + key
                       \---------------------> key

Как это читать:

keycode <x> - номер клавиши на клавиатуре

<1> - символ который должен быть напечатан при нажатии на клавишу клавиатуры

<2> - символ который должен быть напечатан при нажатии на клавишу (если при этом нажата клавиша Shift)

<3> - символ который должен быть напечатан при нажатии на клавишу (если при этом нажата клавиша Mode_switch*)

<4> - символ который должен быть напечатан при нажатии на клавишу (если при этом нажата клавиша Mode_switch и клавиша Shift)

<5> - символ который должен быть напечатан при нажатии на клавишу (если при этом включен Num_Lock)

<6> - символ который должен быть напечатан при нажатии на клавишу (если при этом нажата клавиша AltGr*)

<7> - символ который должен быть напечатан при нажатии на клавишу (если при этом нажата клавиша AltGr и клавиша Shift)

<8> - неизвестное мне сочетание клавиш

*Mode_switch - это старое (до XKB) имя клавиши, которая вызывается AltGr во многих раскладках клавиатуры.

*AltGr - клавиша Alt справа от пробела (возможно сейчас уже данной клавиши нет на клавиатурах, вот пример:

Меняем местами кнопки Alt (левый) и Super (левый)

В файле ~/.Xmodmap находим Super (видим такую строку):

keycode 133 = Super_L NoSymbol Super_L NoSymbol Super_L

Ага, это как раз то, что надо Super_L это Super (левый)

В файле ~/.Xmodmap находим Alt (видим такую строку):

keycode  64 = Alt_L Meta_L Alt_L Meta_L Alt_L Meta_L

Ага, это как раз то, что надо Alt_L это Alt (левый)

Меняем описания местами, т.е. теперь у нас получается так:

keycode  64 = Super_L NoSymbol Super_L NoSymbol Super_L
keycode 133 = Alt_L Meta_L Alt_L Meta_L Alt_L Meta_L

Применяем изменения:

xmodmap ~/.Xmodmap

Применяется где-то в течении одной минуты (зависает ось), но оказалось все работает не так ожидаемо, например сочетания клавиш не работало, возвращаю все назад:

xmodmap ~/.Xmodmap.original

Для ознакомления, рассмотрим более простой и быстрый способ, например при нажатии F2 чтобы происходило действие F1

xmodmap -e "keycode  68 = F1"

Кроме физических клавиш, есть еще и виртуальные клавиши - это даже не клавиши, а просто сопоставления, например нажимая Shift + keycode 38, должна напечататься буква A, нажатие клавиши A генерирует keycode 73, которому назначен keysym 0×61, которому в свою очередь назначен символ A в таблице ASCII. С этим я пока не разобрался, но меня keycode 73 = F7 F7 F7 F7 F7 F7 XF86Switch_VT_7 F7 F7 XF86Switch_VT_7 F7 F7 F7 F7 XF86Switch_VT_7.

Источники: 1 - 2 - 3 - 3


09.07.2007 20:58

Комментарии

Ребята давайте жить дружно!!!
29.04.2009 04:37
Слабо(
Выдрал сам не зная откуда, автор - сам проверял?
Где гугловский и мой любимый intitle:index of?
31.07.2009 10:50