Jak zmienić mapę klawiszy pojedynczego urządzenia (prezenter Logitech)?

20

Mój prezenter Logitech R400 wysyła następujące kody kluczy:

keycode 112 (keysym 0xff55,  Prior) [page up]
keycode 117 (keysym 0xff56,   Next) [page down]
keycode  60 (keysym   0x2e, period)
keycode  71 (keysym 0xffc2,     F5)
keycode   9 (keysym 0xff1b, Escape)

Zasadniczo chcę użyć tego prezenter zdalne sterowanie Banshee, więc chciałbym przemapować Priordo B, Nextdo N, i tak dalej.

Jak mogę zmienić mapę klawiszy tylko dla tego urządzenia (ponieważ z pewnością nie chcę ponownie mapować tych kluczowych kodów globalnie)?

htorque
źródło
„Wskaźnik slave” AFAIU oznacza, że ​​to mysz, a nie klawiatura. Nie można załadować mapy klawiszy do myszy. Czy to naprawdę jedyne urządzenia obecne na liście xinput?
Marius Gedminas
@MariusGedminas Musiałem przejść przez urządzenia / dev / input / eventX, a event5 był prezenterem, więc wydaje się, że jest to „klawiatura”.
htorque

Odpowiedzi:

15

Nigdy tego nie zrobiłem, ale myślę, że musisz utworzyć plik mapy klawiszy /lib/udev/keymaps/i dodać regułę dla swojego urządzenia/lib/udev/rules.d/95-keymap.rules


Detale:

  • Mapa klawiszy udev odwzorowuje kody skanowania na kody kluczy, więc musisz znaleźć oba, aby utworzyć plik mapy klawiszy. Aby znaleźć kody skanowania, uruchom następujące czynności i naciśnij przyciski na urządzeniu:

    sudo /lib/udev/keymap -i input/event5
    

    Może być konieczne wypróbowanie różnych numerów dla zdarzenia * . Dane wyjściowe powinny wyglądać następująco:

    scan code: 0x70037   key code: dot
    scan code: 0x70029   key code: esc
    scan code: 0x7003E   key code: f5
    scan code: 0x7004B   key code: pageup
    scan code: 0x7004E   key code: pagedown
    

    Listę kluczowych kodów można znaleźć tutaj .

    Teraz utwórz plik mapy klawiszy (przechowuję go jako / lib / udev / keymaps / logitech-r400 ):

    0x70037 brightnessdown
    0x70029 brightnessup
    0x7003E brightnessdown
    0x7004B brightnessup
    0x7004E brightnessdown
    

    Nie robi nic przydatnego - po prostu test, aby łatwo sprawdzić, czy działa.

  • Aby tymczasowo przetestować nową mapę klawiszy, uruchom:

    sudo /lib/udev/keymap input/event5 /lib/udev/keymaps/logitech-r400
    

    co powinno dać wynik w ten sposób:

    Remapped scancode 0x70037 to 0xe0 (prior: 0x34)
    Remapped scancode 0x70029 to 0xe1 (prior: 0x01)
    Remapped scancode 0x7003e to 0xe0 (prior: 0x3f)
    Remapped scancode 0x7004b to 0xe1 (prior: 0x68)
    Remapped scancode 0x7004e to 0xe0 (prior: 0x6d)
    

    Przyciski powinny teraz zmienić jasność.

  • Jeśli chcesz, aby ta zmiana była trwała, musisz dodać regułę udev, /lib/udev/rules.d/95-keymap.rulesktóra stosuje plik mapy klawiszy do urządzenia.

    1. Otwórz plik: gksudo gedit /lib/udev/rules.d/95-keymap.rules
    2. Na dole pliku, ale przed LABEL="keyboard_end"linią dodaj:

      ENV{ID_VENDOR}=="Logitech*", ATTRS{idProduct}=="c52d", RUN+="keymap $name logitech-r400"
      
    3. Zapisz, zamknij, a po ponownym uruchomieniu przyciski powinny zmienić jasność.

Florian Diesch
źródło
Och, jak mogłem o tym zapomnieć (/ lib / udev / keymaps / zepto-znote został napisany przeze mnie: D). Później dodam więcej o tym, jak sprawiłem, że zadziałało w twojej odpowiedzi.
htorque
Chciałem tylko dodać do tej odpowiedzi, że możesz uruchomić „eventX” na klawiaturze, uruchamiając /lib/udev/findkeyboards. Spowoduje to wyświetlenie wszystkich aktualnie podłączonych klawiatur, więc nie musisz próbować tylu. Logitech r400 pokazał mi się jako „klawiatura USB: wejście / zdarzenie 11”.
jat255,
Fajna odpowiedź, ale jak odkryć ID_VENDOR i idProduct do użycia? Próbowałem /sys/class/dmi/id/sys_vendori /sys/class/dmi/id/product_nameale to nie działa.
PutzKipa
2
/lib/udev/keymapi /lib/udev/findkeyboardsjuż nie istnieją 13.10. forum.ubuntu-fr.org/viewtopic.php?id=1395051 mówi zamiast tego używać evtest.
Stéphane Gourichon
6
Witaj @htorque, czy możesz zaktualizować odpowiedź na nowy sposób? W Ubuntu Trusty wszystkie te pliki już nie istnieją. Jesteś jedynym, którego widziałem w sieci, mającym tę samą sprawę.
londumas
4

Jestem na Ubuntu 16.04. Zrobiłem tu przewodnik

Wykrywanie za pomocą evtest

sudo evtest

Spójrz na listę urządzeń:

/dev/input/event0:  Lid Switch
/dev/input/event1:  Power Button
/dev/input/event2:  Sleep Button
/dev/input/event3:  Power Button
/dev/input/event4:  AT Translated Set 2 keyboard
/dev/input/event5:  Video Bus
/dev/input/event6:  USB Optical Mouse
/dev/input/event7:  AlpsPS/2 ALPS DualPoint Stick
/dev/input/event8:  AlpsPS/2 ALPS DualPoint TouchPad
/dev/input/event9:  Logitech USB Receiver
/dev/input/event10: Logitech USB Receiver
/dev/input/event11: HDA Intel PCH Dock Mic
/dev/input/event12: HDA Intel PCH Headset Mic
/dev/input/event13: HDA Intel PCH Dock Line Out
/dev/input/event14: HDA Intel PCH Headphone
/dev/input/event15: HDA Intel PCH HDMI/DP,pcm=3
/dev/input/event16: HDA Intel PCH HDMI/DP,pcm=7
/dev/input/event17: HDA Intel PCH HDMI/DP,pcm=8
/dev/input/event18: Integrated Webcam
/dev/input/event19: Dell WMI hotkeys
Select the device event number [0-19]: 9
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x46d product 0xc52d version 0x111
Input device name: "Logitech USB Receiver"

Wziął pierwszy „odbiornik Logitech USB”, tutaj ma identyfikator zdarzenia 9.

Testing ... (interrupt to exit)

OK, teraz evtest chce wejść, po prostu kliknij na zdalne przyciski Logitech, mam to (uproszczone):

[>] value 7003e (KEY_PRESENTATION)
[>] value 70029 (KEY_PRESENTATION)
[ ] value 70037 (KEY_DISPLAYTOGGLE)
 <  value 7004b (KEY_PAGEUP)
 >  value 7004e (KEY_PAGEDOWN)

Uwaga: Odkryłem, że po tym wielokrotnym kliknięciu [>] podałem 7003e, potem 70029, potem 7003e itd. Nie wiem dlaczego.

Modyfikacja udev conf

Teraz, gdy mamy kody wejściowe, spójrzmy na udev conf:

sudo gedit /lib/udev/hwdb.d/60-keyboard.hwdb

Wyszukaj „R400” i zamień prezentację i wyświetlanie według tego, czego chcesz, klawiszy strzałek Playpause i Stopcd :

# Logitech Presenter R400
evdev:input:b0003v046DpC52D*
 KEYBOARD_KEY_070029=playpause    # bottom  left [>] was "presentation"   
 KEYBOARD_KEY_07003e=playpause    # bottom  left [>] was "presentation"  
 KEYBOARD_KEY_070037=stopcd       # bottom right [ ] was "displaytoggle"

Jak wcześniej wspomniano, ponieważ 07003e i 070029 są tym samym przyciskiem, dałem im ten sam klawisz zwiększania mocy wyjściowej . 7004b i 7004e nie pojawiają się tutaj domyślnie, być może dlatego, że są natywnymi wejściami PAGEUP i PAGEDOWN i nie są powiązane z „Logitech Presenter R400”. Dodajmy je:

 KEYBOARD_KEY_07004b=previoussong #    top  left  <
 KEYBOARD_KEY_07004e=nextsong     #    top right  >  

Oto moja ostatnia konf:

 KEYBOARD_KEY_07004b=previoussong #    top  left  <
 KEYBOARD_KEY_07004e=nextsong     #    top right  >
 KEYBOARD_KEY_070029=playpause    # bottom  left [>] was "presentation"
 KEYBOARD_KEY_07003e=playpause    # bottom  left [>] was "presentation"
 KEYBOARD_KEY_070037=stopcd       # bottom right [ ] was "displaytoggle"

Przeładowywanie (nowe) zasady

sudo udevadm hwdb --update

Następnie, używając tego samego identyfikatora zdarzenia, który wybraliśmy wcześniej, tutaj identyfikator zdarzenia 9:

sudo udevadm trigger /dev/input/event9

Możesz sprawdzić to nowe mapowanie w przeglądarce internetowej, na przykład:

$('body').on('keydown', function(e){ console.log(e.key) })

To dało mi:

[>] ArrowUp
[ ] ArrowDown
 <  ArrowLeft
 >  ArrowRight
Ssh-uunen
źródło
Wprowadziłem kilka drobnych usprawnień do twojego oryginalnego przewodnika logitech-r400-remap.md z GitHub. Jeśli chcesz, zmień je lub edytuj na swojej stronie GitHub (bez konieczności przypisywania mnie do mnie). Twoja odpowiedź została odrzucona, ponieważ moim zdaniem była to tylko odpowiedź linku, dlatego też cofnąłem głosowanie.
karel
Wady zostały usunięte, więc teraz twoja odpowiedź może być rozpatrywana indywidualnie, jak każda inna odpowiedź tutaj.
karel
1
Użyłem twojego przewodnika. Działa jak urok:)
Costa