klawisze twarde zmiany mapowania?


19

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”


Zaktualizowany plik powinien być /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=82311
vinc17

@ vinc17, to jest naprawdę interesujące, jak tylko będę mógł spróbować jeszcze raz, myślę, że musimy znaleźć ten plik ustawień i spróbować go naśladować, dzięki!
Aquarius Power

1
Mój problem wynikał z faktu, że linie KEYBOARD_KEY_ zaczynały się od 2 spacji zamiast jednego (nie zostało to udokumentowane i nie otrzymałem żadnych komunikatów o błędach!). Nie wiem dla ciebie, ale dzięki mojej klawiaturze USB showkey --scancodesnie daje scancodes, których oczekuje udev (wartości są różne); input-kbdnarzędzie daje poprawne kody skanowe.
vinc17

1
evtestNarzędzie powinno również dać odpowiednie kody skanowe: po wpisaniu klucza, należy uzyskać 2 linie i pierwsza powinna kończyć się czymś formularza code 4 (MSC_SCAN), value xxx, gdzie xxxjest scancode. Ale sterownik mojej klawiatury jest wadliwy i nie dostaję tej MSC_SCANlinii w przypadku niektórych klawiszy, które chciałem ponownie mapować. Właśnie dlatego użyłem input-kbd, który wyświetla wszystkie skancody dla wybranego urządzenia.
vinc17

1
W odpowiedzi opublikowałem szczegółowe informacje. Teraz nie jestem pewien, czy 36 lub 7002c działa jako wartość. Myślę, że potrzebujesz identyfikatora kodu klucza. Zobacz moją odpowiedź.
vinc17

Odpowiedzi:


17

Najpierw znajdź kod klucza, który należy ponownie przypisać, np. Za pomocą evtestnarzędzia. MSC_SCANPowinien zostać wyświetlony wiersz podobny do następującego (z nim):

Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068

a następnie drugi, podając aktualny kod klucza. Jeśli nie MSC_SCANjest wyprowadzany żaden wiersz, jest to spowodowane błędem sterownika jądra, ale scancode nadal można znaleźć w input-kbdnarzędziu; evtestpowinien podać kod klucza, aby łatwo było znaleźć odpowiedni wiersz na input-kbdwyjś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.hwdbzawierający ponowne mapowanie. Początek pliku /lib/udev/hwdb.d/60-keyboard.hwdbzawiera pewne informacje. W moim przypadku (który działa) mam:

evdev:input:b0003v05ACp0221*
 KEYBOARD_KEY_70035=102nd       # Left to z: backslash bar
 KEYBOARD_KEY_70064=grave       # Left to 1: grave notsign
 KEYBOARD_KEY_70068=insert      # F13: Insert

(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żde KEYBOARD_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 oba evtesti input-kbddają). Prawidłowe wartości można uzyskać z danych evtestwyjściowych lub input-kbdwyjściowych, a nawet z /usr/include/linux/input.hpliku: na przykład KEY_102NDdałby 102nd(przez usunięcie KEY_i konwersję na małe litery), którego użyłem powyżej.

Po zapisaniu pliku wpisz:

udevadm hwdb --update

aby (ponownie) zbudować bazę danych /etc/udev/hwdb.bin(możesz sprawdzić jej znacznik czasu). Następnie,

udevadm trigger --sysname-match="event*"

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 udevdpomocą udevadm control(szczegóły na stronie podręcznika udevadm (8)).

W przypadku starszych udevwersji, takich jak 204, ta metoda powinna nadal działać.


Kiedy uruchamiam komendy udevadm, aktualizowany jest plik /lib/udev/hwdb.bin, szukałem go blessi KEYBOARD_KEY_70085pojawia się na końcu. Myślę, że Ubuntu 14.04 jest skonfigurowany (chroniony?) W ten sposób. Próbowałem udevadm control --log-priority=debug. na podstawie lsusb(045e: 0750) moja klawiatura się polubiła keyboard:usb:v045ep0750*, ale ja też próbowałem keyboard:usb:v*p*. Domyślam się, że /etc/udev/hwdb.binnależy to zaktualizować, ale nawet nie istnieje.
Aquarius Power

Jak czytam tutaj , mogło być tak, że korzystałem z tego polecenia udevadm hwdb --usr --update, mimo że nie byłem.
Aquarius Power

Po udevadm hwdb --updateskopiowane /lib/udev/hwdb.bindo /etc/udev/hwdb.bini ran strace udevadm trigger --sysname-match="event*", a plik hwdb.binwydaje nie zostały odczytane przez niego (jeśli to jest jak to działa).
Aquarius Power

1
@AquariusPower Tak, może występować błąd specyficzny dla Ubuntu (używam Debiana / niestabilny). Aby zobaczyć, czy baza danych jest czytana podczas wykonywania udevadm trigger ..., zobacz mój test tutaj . Pamiętaj, że przed uruchomieniem udevadm trigger ...musisz upewnić się, że czas modyfikacji pliku został zaktualizowany, w przeciwnym razie czas dostępu nie zostanie zaktualizowany podczas odczytu pliku.
vinc17

1
@AquariusPower udevadm --version: 215 (i wersja pakietu udev: 215-7). Dzięki udevadm 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.
vinc17
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.