Problem z powiązaniem skrótu z klawiszem funkcyjnym / multimedialnym

8

Chcę połączyć skrypt wsadowy ze skrótem. Po powiązaniu w obszarze Ustawienia systemu> Klawiatura> Skróty działa z każdym klawiszem, z wyjątkiem klawiszy jasności z zewnętrznej klawiatury Apple.

Klawisze jasności są rozpoznawane w kluczu pokazującym za pomocą kodu 224 i 225 .

wyjście xev:

FocusOut event, serial 41, synthetic NO, window 0x4000001,
mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 41, synthetic NO, window 0x4000001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 41, synthetic NO, window 0x0,
    keys:  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 

Jakieś sugestie, co mogę zrobić?

remi
źródło

Odpowiedzi:

6

Rozwiązanie za pomocą halevt

Według stron halevtpodręcznika jest to ogólna procedura obsługi zdarzeń HAL. Jest przestarzałe i zastąpione przez udev, ale ponieważ nie wiem wystarczająco dużo o udev, dam halevtrozwiązanie.

EDYCJA: po poważnym pocie udało mi się to zrobić udev. Zobacz moją drugą odpowiedź .

Użyję vimdo edycji plików, ale jeśli nie wiesz vim, możesz go zastąpić przez nanolub gedit.

Instalowanie halevt

sudo apt-get update && sudo apt-get install halevt

Określanie, które zdarzenia chcesz powiązać ze skryptem
Zatrzymaj halevtdziałającego już demona:

sudo /etc/init.d/halevt stop

Teraz sprawdź, czy halevtrozpoznaje zdarzenia klawiszy, których chcesz użyć, uruchom detektor:

sudo -u halevt halevt -fig:plugdev

Teraz naciśnij klawisz funkcyjny na klawiaturze, z którą chcesz powiązać skrypt. Wiem, że OP chce uruchomić swoje klawisze jasności, więc idźmy z tym. Dane wyjściowe dla klawiszy jasności powinny wyglądać mniej więcej tak:

Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-down)
Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-up)

Widać, że zdarzenia brightness-downi brightness-upsą transmitowane.

Powiąż wydarzenie ze skryptem
Teraz edytuj plik /etc/halevt/halevt.xml:

sudo vim /etc/halevt/halevt.xml

i dodaj następujące linie (zrobiłem to na dole, tuż przed </halevt:Configuration>):

<halevt:Device match="hal.info.category = input">

    <halevt:Condition name="ButtonPressed" value="brightness-up" exec="sudo /home/user/brightness-script.sh up"/>

    <halevt:Condition name="ButtonPressed" value="brightness-down" exec="sudo /home/user/brightness-script.sh down"/>

</halevt:Device>

gdzie oczywiście powinieneś zmienić valuena wydarzenie, które otrzymałeś od nasłuchującego, i execpoleceniem, które chcesz wykonać.

Zezwól użytkownikowi halevt na wykonanie polecenia lub skryptu
Ponieważ halevtdemon jest uruchamiany jako halevtużytkownik, musisz dać mu uprawnienia do robienia tego, co podałeś exec.

Uruchom (pamiętaj, aby zastąpić vimwybranym edytorem)

sudo EDITOR=vim visudo

i dodaj następujące linie na dole

halevt ALL=(root) NOPASSWD: /home/user/brightness-script.sh 

i zapisz i wyjdź.

Upewnij się, że skrypt jest wykonywalny

sudo chmod +x /home/user/brightness-script.sh

Uruchom ponownie demona halevt

sudo /etc/init.d/halevt start

I powinno działać!

Gerhard Burger
źródło
działał bezbłędnie. jeszcze raz dziękuję za dokładną odpowiedź.
rem
Proszę bardzo, patrz również mój nowy odpowiedź użyciu udev. Ale nie wahaj się trzymać innego rozwiązania, ważne jest to, że działa;)
Gerhard Burger
E: Unable to locate package halevt14.04.
umpirsky
Ponieważ Ubuntu 13.10 halevt nie jest już uwzględniony ( packages.ubuntu.com/search?ke words=halevt )
Gerhard Burger
11

Rozwiązanie za pomocą udev

Ponieważ HAL jest przestarzałe i udevjest teraz używane, takie podejście jest lepsze niż moja inna odpowiedź (chociaż myślę, że rozwiązanie wykorzystujące HAL jest prostsze).

Jednak w przypadku wielu klawiszy funkcyjnych możesz po prostu użyć Ustawienia systemowe> Klawiatura> Skróty, aby powiązać skrypt, wypróbuj to najpierw! Oszczędza ci to wielu kłopotów. Na przykład klawisze jasności to nie działa (nie mam pojęcia, dlaczego nie), więc jeśli chcesz wiedzieć, jak zmienić zachowanie np. Klawiszy jasności, czytaj dalej.

UWAGA : Jeśli korzystasz z notebooka Samsung, możesz naprawić wszystkie (w zależności od modelu) klawisze funkcyjne, instalując samsung-toolspakiet ze strony http://www.voria.org/forum/

To howto zakłada, że ​​wiesz, jak korzystać z terminala i używa vimedytora. Jeśli nie wiesz, vimzastąp go w poleceniach jednym geditlub nano.


Określanie klawiatury

/lib/udev/findkeyboards

powinien wydrukować klawiatury podłączone do komputera, w moim przypadku

USB keyboard: input/event9
USB keyboard: input/event7
AT keyboard: input/event4

Teraz są dwie opcje:

  • Klawiatury USB :
    jeśli chcesz ponownie przypisać klawiaturę USB, sprawdź je, uruchamiając

    udevadm info --export-db | awk '/event9/' RS="" | grep -P 'ID_(VENDOR|MODEL)(?!_ENC)'
    

    gdzie musisz zastąpić 9 w instrukcji awk prawidłową liczbą. Dane wyjściowe powinny być podobne do

    E: ID_MODEL=USB_Receiver
    E: ID_MODEL_ID=c52b
    E: ID_VENDOR=Logitech
    E: ID_VENDOR_ID=046d
    

    co poprawnie wskazuje, że moja klawiatura jest obsługiwana przez mój odbiornik Logitech USB (wejście / event7 okazało się moją myszką Logitech G9, która ma kilka programowalnych przycisków).

  • Klawiatura laptopa :
    jeśli chcesz ponownie mapować klawiaturę laptopa, powinieneś zapamiętać liczbę, AT keyboardktóra w moim przypadku wynosi 4. Uzyskaj także informacje o dmi dla swojego laptopa:

    cat /sys/class/dmi/id/sys_vendor
    

    co jest w moim przypadku

    SAMSUNG ELECTRONICS CO., LTD.
    

    i

    cat /sys/class/dmi/id/product_name
    

    co jest w moim przypadku

    305U1A
    

Określ bieżące mapowanie klawiszy funkcyjnych

Teraz możemy ustalić nasze aktualne mapowanie klawiszy, słuchając klawiatury (wstaw prawidłową liczbę)

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

możesz wyjść z tego polecenia, używając Escna klawiaturze lub Ctrl+ cna innej klawiaturze.

Jeśli ekran zacznie się przesuwać w dół bardzo ciężko, naciśnij Esci Ctrl+ ckilka razy i spróbuj ponownie

sudo /lib/udev/keymap -i input/event4 2> /dev/null

lub jeśli nadal masz problem z przewijaniem

sudo /lib/udev/keymap -i input/event4 > ~/keymap.log

W ostatnim przypadku nadal będziesz mieć przewijanie, ale jeśli naciśniesz klawisze funkcyjne, powinny one przejść do ~/keymap.logmiejsca, w którym możesz je później przeczytać.

Teraz możemy sprawdzić bieżące mapowanie klawiszy funkcyjnych, naciskając je, co powinno dać ci listę jak (to jest mój Fn+ F1do Fn+ F12):

scan code: 0xCE   key code: kpplusminus
scan code: 0x89   key code: brightnessdown
scan code: 0x88   key code: brightnessup
scan code: 0x82   key code: switchvideomode
scan code: 0xF9   key code: f23
scan code: 0xA0   key code: mute
scan code: 0xAE   key code: volumedown
scan code: 0xB0   key code: volumeup
scan code: 0x43   key code: f9
scan code: 0x44   key code: f10
scan code: 0xB3   key code: prog3
scan code: 0x86   key code: wlan

Teraz zapisz kody skanowania, dla których chcesz zmienić zachowanie.


Zmiana kodów kluczowych dla kodów skanowania

Jeśli widzisz, że kod klucza wyraźnie nie obejmuje tego, czego oczekujesz od klucza, możesz zajrzeć /usr/include/linux/input.hpod Klucze i przyciski, aby sprawdzić, czy istnieje kod klucza, który lepiej pasuje do tego, co naprawdę chcesz się wydarzyć. Kluczowe kody są w formacie KEY_KEYCODEi musisz zapisać część później KEY_małymi literami. Czasami zmiana tego wystarczy, aby rozwiązać problem.

Jednak klawisze jasności często są powiązane z odpowiednim kodem klucza, a to nie pozwala na ich ponowne mapowanie. Musimy więc zmienić je na inne kody. Będziemy wykorzystywać prog1i prog2na tym przykładzie, ponieważ nie są w użyciu na moim komputerze, jednak można również używać f13przez f24lub f20za pośrednictwem f24jeśli masz klawiaturę firmy Apple, który ma F1za F19klucze.

  1. Utwórz niestandardową mapę klawiszy :
    Utwórz plik mapy klawiszy w katalogu /lib/udev/keymapso odpowiedniej nazwie, zajrzyj do wyjścia, ls /lib/udev/keymapsaby zobaczyć odpowiednie nazwy. Idę z custom-brightnesscelem tego pytania.

    sudo vim /lib/udev/keymaps/custom-brightness
    

    i wprowadź kody skanowania kluczy, które chcesz zmienić, a następnie skancody, które chcesz mieć. Mój custom-brightnesswygląda tak:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. Utwórz niestandardowy plik wydania klucza. Tylko jeśli zmieniasz klawiaturę laptopa :
    czasami zdarzenie zwolnienia klawisza nie jest poprawnie wysyłane, co powoduje zawieszenie się komputera. Aby tego uniknąć, napiszemy również niestandardowy plik wydania klucza

    sudo vim /lib/udev/keymaps/force-release/custom-brightness
    

    ten plik powinien zawierać te same kody skanowania, mój wygląda

    # /lib/udev/keymaps/force-release/custom-brightness
    
    0x89
    0x88
    

Upewnij się, że nowe mapowania zostały załadowane w plikach reguł
Teraz musimy upewnić się, że twoje mapowania są załadowane. Możemy to zrobić, edytując /lib/udev/rules.d/95-keymap.rules, więc mądrze jest wykonać kopię zapasową

Ponownie mamy dwie opcje:

  • Klawiatury USB :
    Ponieważ masz klawiaturę USB, powinieneś dodać swój wpis pod, LABEL="keyboard_usbcheck"a powinien on znajdować się poza pozostałymi wpisami producenta klawiatury. To dlatego, że moja klawiatura z

    E: ID_MODEL=USB_Receiver
    E: ID_MODEL_ID=c52b
    E: ID_VENDOR=Logitech
    E: ID_VENDOR_ID=046d
    

    jest już zgodny z jedną z reguł, w przeciwnym razie zostanie zastąpiony.
    Dodaj następującą regułę, w której należy odpowiednio zmienić ID_VENDOR_IDi ID_MODEL_IDoraz nazwę mapy klawiszy

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • Klawiatura laptopa :
    jeśli /lib/udev/findkeyboardszgłoszono, że klawiatura laptopa jest zgodna AT keyboardz regułą LABEL="keyboard_vendorcheck", w przeciwnym razie połóż ją LABEL="keyboard_modulecheck". Ponownie umieść go pod innymi wpisami dotyczącymi producenta laptopa. Dodaj następującą regułę ( SAMSUNG ELECTRONICS CO., LTD.jest trochę długa, więc użyłem symbolu wieloznacznego)

    ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keymap $name custom_brightness"
    

    Teraz dodaj także regułę /lib/udev/rules.d/95-keyboard-force-release.rulespo utworzeniu kopii zapasowej

    sudo cp /lib/udev/rules.d/95-keyboard-force-release.rules /lib/udev/rules.d/95-keyboard-force-release.rules.bak
    sudo vim /lib/udev/rules.d/95-keyboard-force-release.rules
    

    Ponownie pod innymi wpisami twojego producenta dodaj

    ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keyboard-force-release.sh $devpath custom_test"
    

Upewnij się, że udev ładuje nowe reguły
Aby załadować nowe reguły, uruchom

sudo adevadm trigger

UWAGA: udevadm control --reload-rules(nadal w instrukcjach na wielu stronach internetowych) nie działa.

Teraz sprawdź, czy reguły zostały pomyślnie zastosowane przez

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

które powinny teraz zgłaszać klucze jasności

scan code: 0x89   key code: prog1
scan code: 0x88   key code: prog2

Ponownie przypisz klucze w Ustawieniach systemu
Jeśli w ostatnim kroku zgłoszono prawidłowe kody kluczy, albo klucze zaczną działać automatycznie (w przypadku, gdy najpierw miały nieprawidłowe kody kluczy).

Aby uzyskać jasność, nadal musisz powiązać klawisze ze skrawkiem, co jest teraz możliwe przy użyciu Ustawienia systemu> Klawiatura> Skróty .

Cieszyć się



Uwagi :

  • Jeśli twoje klucze miały niewłaściwy kod klucza i zostały naprawione dzięki temu podejściu, postępuj zgodnie z instrukcjami w /usr/share/doc/udev/README.keymap.txt.gz(możesz to otworzyć bez rozpakowywania za pomocą zless) i wyślij swoje wyniki podany tam adres e-mail, wówczas zmiany mogą zostać uwzględnione w następnej wersji. Wielu użytkowników skorzysta!

  • Ogromne podziękowania za ten pomocny post Vaidasa Jablonskisa.

Gerhard Burger
źródło
1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directorytakże$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky
Dzięki za komentarz, przyjrzałem się temu i wygląda na to, że udev zostanie scalony w systemd, a ustawienia mapowania klawiszy będą zarządzane w hwdb. Według bbs.archlinux.org/viewtopic.php?id=168720 można wyodrębnić findkeyboardy ze starszej wersji systemd, ale nie jestem pewien, czy reszta odpowiedzi nadal obowiązuje ...
Gerhard Burger