Usiłuję znaleźć sposób na silne mapowanie klawiszy klawiatury.
Próbowałem użyć xmodmap i setxkbmap, ale nie działają one dla jednej konkretnej aplikacji. Takie polecenia działają dla innych normalnych okien / aplikacji na X tho.
Myślę, że aplikacja może odczytywać nieprzetworzone dane z klawiatury i ignoruje dane wejściowe X?
Jak więc mapować klucze bez użycia xmodmap i setxkbmap? jeśli kiedykolwiek można to zrobić za pomocą jakiegoś oprogramowania.
Próbowałem także xkeycaps, xkbcomp, ale nie próbowałem loadkeys, ponieważ działa na X.
Znalazłem tutaj, że mogę spróbować setkeycodes
, „ponieważ po przypisaniu kodu jądra przycisk powinien działać w Xorg” , ale znalazłem również, że „nie można używać„ setkeycodes ”na klawiaturach USB” , to moja sprawa (jestem zainteresowany przypadkiem ktoś sprawi, że będzie działać na PS2, ponieważ myślę, że mógłbym użyć adaptera).
Wydawało się to obiecujące „Mapuj skancody na kody” , ale po kilku testach nic się nie zmieniło, oto one:
Znalazłem kod „36” (klawisz „j”) w vt1 z showkey
scancode „7e” (klawiatura ”.) W vt1 zshowkey --scancodes
$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..
Obs .: nie działa również z: KEYBOARD_KEY_7e=j
Inne alternatywne sposoby (by @ vinc17) na znalezienie kluczy:
evtest /dev/input/by-id/...
lub
input-kbd 3
(wstaw indeks identyfikatora znaleziony na przykład ls -l /dev/input/by-id/*
z event3)
PS .: * Jeśli jesteś zainteresowany testowaniem siebie, pokrewny wątek dla aplikacji jest następujący: http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ Problemy I mają takie same: niektóre klucze (KP_Decimal, DownArrow, UpArrow, RightArrow) są ignorowane i są traktowane jako wszystkie o tej samej wartości „0x00”
źródło
/etc/udev/hwdb.bin
, nie/lib/udev/hwdb.bin
. Ale chociaż ten plik jest poprawnie zaktualizowany, to też nie działa dla mnie, nawet po ponownym uruchomieniu. Być może czegoś brakuje w dokumentacji. O tym: bugs.freedesktop.org/show_bug.cgi?id=82311showkey --scancodes
nie daje scancodes, których oczekuje udev (wartości są różne);input-kbd
narzędzie daje poprawne kody skanowe.evtest
Narzędzie powinno również dać odpowiednie kody skanowe: po wpisaniu klucza, należy uzyskać 2 linie i pierwsza powinna kończyć się czymś formularzacode 4 (MSC_SCAN), value xxx
, gdziexxx
jest scancode. Ale sterownik mojej klawiatury jest wadliwy i nie dostaję tejMSC_SCAN
linii w przypadku niektórych klawiszy, które chciałem ponownie mapować. Właśnie dlatego użyłeminput-kbd
, który wyświetla wszystkie skancody dla wybranego urządzenia.Odpowiedzi:
Najpierw znajdź kod klucza, który należy ponownie przypisać, np. Za pomocą
evtest
narzędzia.MSC_SCAN
Powinien zostać wyświetlony wiersz podobny do następującego (z nim):a następnie drugi, podając aktualny kod klucza. Jeśli nie
MSC_SCAN
jest wyprowadzany żaden wiersz, jest to spowodowane błędem sterownika jądra, ale scancode nadal można znaleźć winput-kbd
narzędziu;evtest
powinien podać kod klucza, aby łatwo było znaleźć odpowiedni wiersz nainput-kbd
wyjściu (np. za pomocągrep
).Po określeniu scancodes kluczy, które mają być ponownie mapowane, utwórz plik, na przykład
/etc/udev/hwdb.d/98-custom-keyboard.hwdb
zawierający ponowne mapowanie. Początek pliku/lib/udev/hwdb.d/60-keyboard.hwdb
zawiera pewne informacje. W moim przypadku (który działa) mam:(Przed udev 220 musiałem użyć
keyboard:usb:v05ACp0221*
pierwszego wiersza).evdev:
Ciąg musi być na początku linii. Pamiętaj, że litery w identyfikatorze dostawcy i produktu powinny być wielkimi literami. KażdeKEYBOARD_KEY_
ustawienie powinno mieć wcześniej dokładnie jedną spację (uwaga: linia bez spacji wyświetli komunikat o błędzie, a linia z dwiema spacjami była cicho ignorowana w starych wersjach udev).KEYBOARD_KEY_
po nim następuje scancode w systemie szesnastkowym (podobnie jak obaevtest
iinput-kbd
dają). Prawidłowe wartości można uzyskać z danychevtest
wyjściowych lubinput-kbd
wyjściowych, a nawet z/usr/include/linux/input.h
pliku: na przykładKEY_102ND
dałby102nd
(przez usunięcieKEY_
i konwersję na małe litery), którego użyłem powyżej.Po zapisaniu pliku wpisz:
aby (ponownie) zbudować bazę danych
/etc/udev/hwdb.bin
(możesz sprawdzić jej znacznik czasu). Następnie,weźmie pod uwagę nowe ustawienia. Możesz to sprawdzić za pomocą
evtest
.W 2014 r. Wydana wersja udev zawierała niepełne / błędne informacje
/lib/udev/hwdb.d/60-keyboard.hwdb
, ale możesz przejrzeć najnowszą wersję rozwojową pliku i / lub mój raport o błędach i dyskusję dotyczącą dokumentacji i problemów z odstępami.Jeśli to nie zadziała, problem może zostać wykryty po tymczasowym zwiększeniu poziomu dziennika za
udevd
pomocąudevadm control
(szczegóły na stronie podręcznika udevadm (8)).W przypadku starszych
udev
wersji, takich jak 204, ta metoda powinna nadal działać.źródło
/lib/udev/hwdb.bin
, szukałem gobless
iKEYBOARD_KEY_70085
pojawia się na końcu. Myślę, że Ubuntu 14.04 jest skonfigurowany (chroniony?) W ten sposób. Próbowałemudevadm control --log-priority=debug
. na podstawielsusb
(045e: 0750) moja klawiatura się polubiłakeyboard:usb:v045ep0750*
, ale ja też próbowałemkeyboard:usb:v*p*
. Domyślam się, że/etc/udev/hwdb.bin
należy to zaktualizować, ale nawet nie istnieje.udevadm hwdb --usr --update
, mimo że nie byłem.udevadm hwdb --update
skopiowane/lib/udev/hwdb.bin
do/etc/udev/hwdb.bin
i ranstrace udevadm trigger --sysname-match="event*"
, a plikhwdb.bin
wydaje nie zostały odczytane przez niego (jeśli to jest jak to działa).udevadm trigger ...
, zobacz mój test tutaj . Pamiętaj, że przed uruchomieniemudevadm trigger ...
musisz upewnić się, że czas modyfikacji pliku został zaktualizowany, w przeciwnym razie czas dostępu nie zostanie zaktualizowany podczas odczytu pliku.udevadm --version
: 215 (i wersja pakietu udev: 215-7). Dziękiudevadm trigger ...
nie musisz zrestartować komputera (chyba że chcesz usunąć ustawienia, AFAIK). Ale możesz spróbować ponownie uruchomić komputer, aby sprawdzić, czy jest jakiś efekt.