Problema durante l'associazione di un collegamento a un tasto funzione / multimediale


8

Voglio collegare uno script batch a un collegamento. Quando lo rilevo in Impostazioni di sistema> Tastiera> Tasti di scelta rapida funziona con tutti i tasti, ad eccezione dei tasti di luminosità della tastiera Apple esterna.

I tasti di luminosità sono riconosciuti in showkey con i codici chiave 224 e 225 .

uscita 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 

Qualche suggerimento su cosa posso fare?

Risposte:


6

Soluzione usando halevt

Secondo le pagine man halevtè un gestore generico per eventi HAL. È deprecato e sostituito da udev, ma dal momento che non ne so abbastanza udevdarò una halevtsoluzione.

EDIT: dopo un po 'di sudore serio, sono riuscito a farlo udev. Vedi la mia altra risposta .

Userò vimper modificare i file, ma se non sai vimpuoi sostituirlo con nanoo gedit.

Installazione di halevt

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

Determinare quali eventi si desidera associare a uno script
Arrestare il halevtdaemon che è già in esecuzione:

sudo /etc/init.d/halevt stop

Ora vedi se halevtriesco a riconoscere gli eventi delle chiavi che vuoi usare, avvia l'ascoltatore:

sudo -u halevt halevt -fig:plugdev

Ora premi il tasto funzione sulla tastiera a cui vuoi associare lo script. So che l'OP vuole far funzionare i suoi tasti di luminosità, quindi andiamo con quello. L'output per i tasti di luminosità dovrebbe essere simile al seguente:

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)

Puoi vedere che gli eventi brightness-downe brightness-upvengono trasmessi.

Associa l'evento a uno script
Ora modifica il file /etc/halevt/halevt.xml:

sudo vim /etc/halevt/halevt.xml

e aggiungi le seguenti righe (l'ho fatto in fondo, poco prima </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>

dove ovviamente dovresti passare valueall'evento che hai ricevuto dall'ascoltatore e execdal comando che vuoi eseguire.

Concedi all'utente halevt il permesso di eseguire il comando o lo script
Poiché il halevtdaemon viene eseguito come halevtutente, devi concedergli il permesso di fare ciò che hai specificato exec.

Esegui (ricordati di sostituire il vimtuo editor preferito)

sudo EDITOR=vim visudo

e aggiungi le seguenti righe in fondo

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

e salva ed esci.

Assicurati che il tuo script sia eseguibile

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

Avvia di nuovo il demone halevt

sudo /etc/init.d/halevt start

E dovrebbe funzionare!


ha funzionato perfettamente. grazie ancora per la tua risposta precisa.
Remi,

Prego, vedi anche la mia nuova risposta usando udev. Ma sentiti libero di restare con l'altra soluzione, l'importante è che funzioni;)
Gerhard Burger

E: Unable to locate package halevtil 14.04.
umpirsky,

Dal momento che Ubuntu 13.10 halevt non è più incluso ( pacchetti.ubuntu.com/search?keywords=halevt )
Gerhard Burger

11

Soluzione usando udev

Poiché HAL è obsoleto e udevviene ora utilizzato, questo approccio è preferito rispetto all'altra mia risposta (anche se penso che la soluzione che utilizza HAL sia più semplice).

Tuttavia, per molti tasti funzione puoi semplicemente utilizzare Impostazioni di sistema> Tastiera> Tasti di scelta rapida per associare uno script, prova prima! Ti fa risparmiare un sacco di problemi. Ad esempio i tasti di luminosità non funzionano (non ho idea del perché), quindi se vuoi sapere come cambiare il comportamento dei tasti di luminosità, continua a leggere.

NOTA : se si utilizza un notebook Samsung, è possibile correggere tutti i tasti funzione (a seconda del modello) installando il samsung-toolspacchetto da http://www.voria.org/forum/

Questo howto presuppone che tu sappia usare un terminale e usa l' vimeditor. Se non lo sai vim, sostituiscilo nei comandi con gedito nano.


Determinare la tua tastiera

/lib/udev/findkeyboards

dovrei stampare le tastiere collegate al computer, nel mio caso

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

Ora ci sono due opzioni:

  • Tastiere USB :
    se si desidera rimappare la tastiera USB, ispezionarle eseguendo

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

    dove devi sostituire il 9 nell'istruzione awk con il numero corretto. L'output dovrebbe essere simile a

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

    che indica correttamente che la mia tastiera è gestita tramite il mio ricevitore USB Logitech (input / event7 si è rivelato essere il mio mouse Logitech G9 che ha alcuni pulsanti programmabili).

  • Tastiera del laptop :
    se si desidera rimappare la tastiera del laptop, è necessario ricordare il numero per il AT keyboardquale è 4 nel mio caso. Ottieni anche le informazioni dmi per il tuo laptop:

    cat /sys/class/dmi/id/sys_vendor
    

    che è nel mio caso

    SAMSUNG ELECTRONICS CO., LTD.
    

    e

    cat /sys/class/dmi/id/product_name
    

    che è nel mio caso

    305U1A
    

Determina la tua attuale mappatura dei tasti funzione

Ora possiamo determinare la nostra attuale composizione dei tasti ascoltando la tastiera (inserire il numero corretto)

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

puoi uscire da questo comando usando Escsulla tastiera o Ctrl+ csu un'altra tastiera.

Se lo schermo inizia a scorrere molto verso il basso, premere Esce Ctrl+ calcune volte e riprovare con

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

o, se hai ancora il problema di scorrimento

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

Nell'ultimo caso avrai comunque lo scorrimento, ma se premi i tasti funzione dovrebbero andare ~/keymap.logdove puoi leggerli in seguito.

Ora possiamo controllare la mappatura attuale dei tasti funzione premendo su di essi, il che dovrebbe darti un elenco come (questo è il mio Fn+ F1attraverso 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

Ora annota i codici di scansione per i quali desideri modificare il comportamento.


Modifica dei codici chiave per i codici di scansione

Se vedi che il codice chiave chiaramente non copre ciò che ti aspetti che faccia la chiave, puoi dare un'occhiata /usr/include/linux/input.hsotto Chiavi e pulsanti per vedere se c'è un codice chiave che meglio corrisponde a ciò che realmente vuoi che accada. I codici chiave ci sono nel formato KEY_KEYCODEe devi scrivere la parte dopo KEY_in minuscolo. A volte cambiare questo è sufficiente per risolvere il problema.

I tasti di luminosità, tuttavia, spesso hanno il giusto codice chiave associato a loro, e questo è ciò che non consente loro di essere rimappati. Quindi dobbiamo cambiarli in altri codici chiave. Useremo prog1e prog2per questo esempio perché questi non sono in uso sul mio computer, tuttavia puoi anche usarli f13attraverso f24o f20attraverso f24se hai una tastiera Apple che ha i tasti F1passanti F19.

  1. Crea un keymap personalizzato :
    crea un file keymap nella directory /lib/udev/keymapscon un nome adatto, dai un'occhiata all'output di ls /lib/udev/keymapsper vedere i nomi adatti. Vado con custom-brightnesslo scopo di questa domanda.

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

    e inserisci i codici di scansione dei tasti che desideri modificare seguiti dagli scancodes che desideri che abbiano. Il mio custom-brightnessassomiglia a questo:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. Creare un file di rilascio chiave personalizzato. Solo se stai cambiando la tastiera del tuo laptop : a
    volte l'evento di rilascio dei tasti non viene inviato correttamente, causando il blocco del computer. Per evitare ciò, scriveremo anche un file di rilascio chiave personalizzato

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

    questo file dovrebbe contenere gli stessi codici di scansione, il mio sembra

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

Assicurati che i nuovi mapping siano caricati nei file delle regole.
Ora dobbiamo assicurarci che i tuoi mapping siano caricati. Possiamo farlo modificando /lib/udev/rules.d/95-keymap.rules, quindi è intelligente fare un backup

Ancora una volta abbiamo due opzioni:

  • Tastiere USB :
    poiché si dispone di una tastiera USB, è necessario aggiungere la voce in LABEL="keyboard_usbcheck"e dovrebbe essere oltre le altre voci del produttore della tastiera. Questo perché la mia tastiera con

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

    è già associato a una delle regole e in caso contrario viene sovrascritto.
    Aggiungi la seguente regola, dove dovresti cambiare opportunamente il ID_VENDOR_IDe ID_MODEL_IDe il nome della tua keymap

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • Tastiera del laptop :
    se /lib/udev/findkeyboardssegnalato come la AT keyboardtua regola del laptop dovrebbe andare sotto LABEL="keyboard_vendorcheck", altrimenti mettilo sotto LABEL="keyboard_modulecheck". Mettilo di nuovo sotto le altre voci per il tuo produttore di laptop. Aggiungi la seguente regola ( SAMSUNG ELECTRONICS CO., LTD.è un po 'lunga, quindi ho usato un carattere jolly`)

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

    Ora aggiungi anche una regola /lib/udev/rules.d/95-keyboard-force-release.rulesdopo averne eseguito il backup

    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
    

    Ancora una volta sotto le altre voci del produttore aggiungere

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

Assicurarsi che udev carichi le nuove regole
Per caricare le nuove regole eseguite

sudo adevadm trigger

NOTA: udevadm control --reload-rules(ancora nelle istruzioni su molti siti Web) non funziona.

Ora controlla se le regole sono state applicate correttamente

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

che dovrebbe ora segnalare i tasti luminosità

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

Rimappare le chiavi in ​​Impostazioni di sistema
Se l'ultimo passaggio ha riportato i codici chiave corretti, entrambi i tasti iniziano a funzionare automaticamente (nel caso in cui avessero prima i codici chiave sbagliati).

Per la luminosità devi ancora associare i tasti a uno script che ora è possibile utilizzando Impostazioni di sistema> Tastiera> Tasti di scelta rapida .

Godere



Note :

  • Se le tue chiavi avevano il codice chiave sbagliato e sono state corrette con questo approccio, segui le istruzioni in /usr/share/doc/udev/README.keymap.txt.gz(puoi aprirlo senza estrarre utilizzando zless) e invia i tuoi risultati agli indirizzi e-mail menzionati lì, quindi le modifiche possono essere incluse nella prossima versione. Molti utenti ne trarranno beneficio!

  • Mille grazie a questo utile post di Vaidas Jablonskis.


1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directoryanche$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky il

Grazie per il tuo commento, l'ho esaminato e sembra che udev verrà unito in systemd e le impostazioni della mappa di chiavi verranno invece gestite in hwdb. Secondo bbs.archlinux.org/viewtopic.php?id=168720 è possibile estrarre i tasti di ricerca da una versione precedente di systemd, ma non sono sicuro che il resto della risposta sia ancora valido ...
Gerhard Burger,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.