Откакто се сдобих с 42″ LCD телевизор все се чудя как да измисля удобен начин да играя различни игри на него, без да имам нужда от цяла клавиатура (с кабел или безжична).

Мислех да използвам един Android TV Stick (MK808B) който си взех наскоро, и по този начин да го превърна в евтина игрова конзола.
Обче се оказа че повечето игри под Android не поддържат коректно геймпад (наскоро си взех един „пиратски“ бежичен PS3 геймпад) , а дори и тези които поддържат не са особено удобни за игра.
Плюс това повечето игри за Android не са кой знае колко „сериозни“…

Така че това отпадна като вариант, и реших да опитам да ползвам телевизора за PC игри.
Отново, оказа се че геймпада не е добър вариант. Освен че в конкретния случай с PS3 геймпада се изисква допълнителна настройка за да работи с PC (а под Линукс така и не можах да го накарам да работи), се оказа и че повечето игри които ме интересуват всъщност не могат да се играят пълноценно с геймпад. Ако изобщо го поддържат…

Явно ми трябваше нещо, което хем е малко и портативно като геймпад, хем се засича като обикновена клавиатура.
Като се замислих, се сетих за „гениалното“ решение да пригодя малка цифрова USB клавиатура за целта.
Не забравяйте – основната идея беше да НЕ използвам голяма клавиатура, така че да мога удобно да седя (по-точно да се излежавам) пред телевизора, с едната ръка да контролирам клавишите, а с другата – безжичната мишка 🙂

Наистина  – цифровата клавиатура изглеждаше идеална за целта – разполага с достатъчно за повечето игри клавиши, и се засича като обикновена клавиатура…
Най-лесния начин да я използвам беше като просто я свържа, и от настройките на играта която искам да играя променя контролите, така че вместо примерно W,S,A,D и т.н., играта да използва съответните клавиши от цифровата клавиатура – стрелка наляво, надясно и т.н.
Обаче… това не е много удобно, защото в момента в който реша че искам да си седна пред компютъра за да играя на играта, трябва да си връщам предишните контроли.
Прекалено сложно става.
Явно ми трябваше някакъв начин, чрез който да мога да пренастроя клавишите на самата цифрова клавиатура, така че когато натискам примерно стрелка наляво от цифровата клавиатура, играта да си мисли че натискам „a“ от основната клавиатура. И така нататък. Без да се налага да променям настройките на играта.

След малко разучаване открих че това е лесно постижимо под Линукс, като единственият страничен ефект е че промяната се отнася не само за допълнителната цифрова клавиатура, но и за тази която си е част от основната клавиатура.
Но това не е от особено значение в случая – настройката е лесно обратима както чрез една команда, така и след рестарт.

Първо, преди да правим каквото и да е, трябва да си направим резервно копие на текущата конфигурация на клавиатурата.
Отворете си терминал от менюто Система, и в него изпълнете:

xmodmap -pke > xmodmap_default

Това ще запише стандартната конфигурация във файл „xmodmap_default“.

Сега следва да зададем кой клавиш от цифровата клавиатура какво да прави.
Ето какво искаме да постигнем в примера който ще дам (ако някой се интересува – ще играя Minecraft с тази конфигурация):

Клавиш от цифровата клавиатура На кой клавиш да съответства
8 (стрелка нагоре) w
5 s
4 (стрелка наляво) a
6 (стрелка надясно) d
7 (home) q
9 (PgUp) e
1 (End) Left Shift
Enter Space
/ Esc
* Tab

И така, ето какво трябва да направим.
Първо трябва да разберем кой код съответства на клавиша който натискаме на цифровата клавиатура.
Това става като стартираме командата „xev“ в терминал (уверете се че NumLock НЕ Е включен).
Стартирайте xev, и натиснете желания клавиш върху цифровата клавиатура – в примера –  това е „8“ (стрелка нагоре).
В терминала ще се появи нещо подобно на това:

KeyPress event, serial 36, synthetic NO, window 0x4c00001,
    root 0x26d, subw 0x0, time 19029975, (-505,265), root:(624,327),
    state 0x0, keycode 80 (keysym 0xff97, KP_Up), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False
 
KeyRelease event, serial 36, synthetic NO, window 0x4c00001,
    root 0x26d, subw 0x0, time 19030015, (-505,265), root:(624,327),
    state 0x0, keycode 80 (keysym 0xff97, KP_Up), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Нас ни интересува редът state 0x0, keycode 80 (keysym 0xff97, KP_Up), same_screen YES,

На този ред „keycode 80“ ни казва че кодът на клавиша е 80.
Сега повторете същото, но този път за клавишът, на който искате да отговаря този клавиш (т.е. „‘w“).
Ще видите това:

KeyPress event, serial 35, synthetic NO, window 0x4c00001,
    root 0x26d, subw 0x0, time 19263373, (-627,513), root:(502,575),
    state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
    XLookupString gives 1 bytes: (77) "w"
    XmbLookupString gives 1 bytes: (77) "w"
    XFilterEvent returns: False
 
KeyRelease event, serial 35, synthetic NO, window 0x4c00001,
    root 0x26d, subw 0x0, time 19263464, (-627,513), root:(502,575),
    state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
    XLookupString gives 1 bytes: (77) "w"
    XFilterEvent returns: False

 

Тук също ни интересува реда state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
Този път обаче, гледаме частта (keysym 0x77, w) – тя ни казва че „името“ на клавиша е „w“.
След като знаем че кода е 80, а името е „w“ създаваме един празен текстов файл (примерно с име „keymap“), с десен бутон на мишката, от „Свойства“ -> „Права“ слагаме отметка пред „Изпълним“, и в него слагаме това:

#!/bin/bash
 
xmodmap -e "keycode 80 = w"

Сега повтаряме двете стъпки с xev за клавишите „5“ на цифровата клавиатура и „s“ на основната.
При мен кода е 84, а името – „s“.
Във файла който създадохме, добавяме това:

xmodmap -e "keycode 84 = s"

След като сме повторили тези стъпки за всички клавиши които искаме да променим, ето примерния готов скрипт:

#!/bin/bash
 
xmodmap -e "keycode 80 = w"
xmodmap -e "keycode 83 = a"
xmodmap -e "keycode 85 = d"
xmodmap -e "keycode 84 = s"
xmodmap -e "keycode 81 = e"
xmodmap -e "keycode 79 = q"
xmodmap -e "keycode 104 = space"
xmodmap -e "keycode 106 = Escape"
xmodmap -e "keycode 63 = Tab"
xmodmap -e "keycode 87 = Shift_L"

За да задействате конфигурацията, просто щракнете двойно върху скрипта (уверете се че сте направили файла изпълним).
За връщане на стандартната конфигурация, си направете следния изпълним скрипт в същата папка, в която е записан файла „xmodmap_default“ (примерно с име „keymap_default“):

#!/bin/bash
xmodmap ./xmodmap_default

И така, преди да играем стартираме „keymap“ с двойно щракване, а след като приключим – „keymap_default“.
Описаното решение може и да не е по вкуса на всеки, плюс това не е и безжично, но е някакво решение все пак.

Плюс това показва още веднъж че под Линукс си има команда за всичко 🙂