Problem beim Binden einer Verknüpfung an eine Funktions- / Multimedia-Taste

8

Ich möchte ein Batch-Skript mit einer Verknüpfung verbinden. Wenn ich es unter Systemeinstellungen> Tastatur> Verknüpfungen binde, funktioniert es mit jeder Taste, mit Ausnahme meiner Helligkeitstasten von meiner externen Apple-Tastatur.

Die Helligkeitstasten werden im Showkey mit den Schlüsselcodes 224 und 225 erkannt .

xev Ausgabe:

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 

Irgendwelche Vorschläge, was ich tun kann?

remi
quelle

Antworten:

6

Lösung mit halevt

Laut den Manpages halevthandelt es sich um einen generischen Handler für HAL-Events. Es ist veraltet und ersetzt durch udev, aber da ich nicht genug darüber weiß, udevwerde ich eine halevtLösung geben.

EDIT: Nach einigem ernsthaften Schweiß habe ich es geschafft, dies in zu tun udev. Siehe meine andere Antwort .

Ich werde vimDateien bearbeiten, aber wenn Sie nicht wissen vim, können Sie sie durch nanooder ersetzen gedit.

Installation von halevt

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

Festlegen, welche Ereignisse Sie an ein Skript binden möchten
Stoppen Sie den halevtbereits ausgeführten Dämon:

sudo /etc/init.d/halevt stop

halevtStarten Sie nun den Listener, um festzustellen, ob die Ereignisse der Tasten, die Sie verwenden möchten, erkannt werden können:

sudo -u halevt halevt -fig:plugdev

Drücken Sie nun die Funktionstaste auf Ihrer Tastatur, an die Sie das Skript binden möchten. Ich weiß, dass der OP seine Helligkeitstasten zum Laufen bringen möchte, also lasst uns damit weitermachen. Die Ausgabe für die Helligkeitstasten sollte ungefähr so ​​aussehen:

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)

Sie können sehen, dass die brightness-downund brightness-upEreignisse übertragen werden.

Binden Sie das Ereignis an ein Skript.
Bearbeiten Sie nun die Datei /etc/halevt/halevt.xml:

sudo vim /etc/halevt/halevt.xml

und füge die folgenden Zeilen hinzu (ich habe es unten gemacht, kurz zuvor </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>

Hier sollten Sie natürlich valuezu dem Ereignis wechseln , das Sie vom Listener erhalten haben, und zu execdem Befehl, den Sie ausführen möchten.

Geben Sie dem Benutzer halevt die Berechtigung, den Befehl oder das Skript auszuführen.
Da der halevtDämon als halevtBenutzer ausgeführt wird, müssen Sie ihm die Berechtigung erteilen, das zu tun, was Sie angegeben haben exec.

Ausführen (denken Sie daran, vimdurch einen Editor Ihrer Wahl zu ersetzen )

sudo EDITOR=vim visudo

und fügen Sie die folgenden Zeilen unten hinzu

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

und speichern und beenden.

Stellen Sie sicher, dass Ihr Skript ausführbar ist

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

Starten Sie den halevt-Daemon erneut

sudo /etc/init.d/halevt start

Und es sollte funktionieren!

Gerhard Burger
quelle
funktionierte einwandfrei. Nochmals vielen Dank für Ihre genaue Antwort.
Remi
Gern geschehen, siehe auch meine neue Antwort mit udev. Aber zögern Sie nicht, bei der anderen Lösung zu bleiben, das Wichtigste ist, dass es funktioniert;)
Gerhard Burger
E: Unable to locate package halevtam 14.04.
Umpirsky
Da Ubuntu 13.10 halevt nicht mehr enthalten ist ( packages.ubuntu.com/search?keywords=halevt )
Gerhard Burger
11

Lösung mit udev

Da HAL veraltet ist und udevjetzt verwendet wird, wird dieser Ansatz meiner anderen Antwort vorgezogen (obwohl ich denke, dass die Lösung mit HAL einfacher ist).

Für viele Funktionstasten können Sie jedoch einfach Systemeinstellungen> Tastatur> Verknüpfungen verwenden , um ein Skript zu binden. Versuchen Sie dies zuerst! Das erspart Ihnen viel Ärger. Zum Beispiel die Helligkeitstasten funktionieren nicht (ich habe keine Ahnung, warum nicht). Wenn Sie also wissen möchten, wie Sie das Verhalten beispielsweise der Helligkeitstasten ändern können, lesen Sie weiter.

HINWEIS : Wenn Sie ein Samsung-Notebook verwenden, können Sie alle (je nach Modell) Funktionstasten reparieren, indem Sie das samsung-toolsPaket von http://www.voria.org/forum/ installieren.

In dieser Anleitung wird davon ausgegangen, dass Sie wissen, wie ein Terminal verwendet wird, und der vimEditor verwendet wird. Wenn Sie es nicht wissen vim, ersetzen Sie es bitte in den Befehlen durch entweder geditoder nano.


Bestimmen Sie Ihre Tastatur

/lib/udev/findkeyboards

sollte in meinem Fall die Tastaturen drucken, die an den Computer angeschlossen sind

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

Jetzt gibt es zwei Möglichkeiten:

  • USB-Tastaturen :
    Wenn Sie Ihre USB-Tastatur neu zuordnen möchten, überprüfen Sie sie, indem Sie sie ausführen

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

    Hier müssen Sie die 9 in der awk-Anweisung durch die richtige Zahl ersetzen. Die Ausgabe sollte ähnlich sein wie

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

    Dies zeigt korrekt an, dass meine Tastatur über meinen Logitech USB-Empfänger bedient wird (Eingang / Ereignis7 erwies sich als meine Logitech G9-Maus mit einigen programmierbaren Tasten).

  • Laptop-Tastatur :
    Wenn Sie Ihre Laptop-Tastatur neu zuordnen möchten, sollten Sie sich die Nummer für AT keyboarddie 4 in meinem Fall merken . Holen Sie sich auch die dmi-Informationen für Ihren Laptop:

    cat /sys/class/dmi/id/sys_vendor
    

    Das ist in meinem Fall

    SAMSUNG ELECTRONICS CO., LTD.
    

    und

    cat /sys/class/dmi/id/product_name
    

    Das ist in meinem Fall

    305U1A
    

Bestimmen Sie Ihre aktuelle Zuordnung Ihrer Funktionstasten

Jetzt können wir unsere aktuelle Keymapping durch Hören auf die Tastatur bestimmen (richtige Nummer einfügen)

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

Sie können diesen Befehl beenden, indem Sie ihn Escauf der Tastatur oder Ctrl+ cauf einer anderen Tastatur verwenden.

Wenn der Bildschirm beginnt sehr hart nach unten scrollen, drücken Escund Ctrl+ cein paar Mal und versuchen Sie es erneut mit

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

oder, wenn Sie immer noch das Bildlaufproblem haben

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

Im letzten Fall haben Sie immer noch das Scrollen, aber wenn Sie die Funktionstasten drücken, sollten sie dort angezeigt werden, ~/keymap.logwo Sie sie später lesen können.

Jetzt können wir die aktuelle Zuordnung Ihrer Funktionstasten überprüfen, indem wir sie drücken. Daraufhin sollte eine Liste angezeigt werden (dies ist meine Fn+ F1bis 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

Notieren Sie sich nun die Scan-Codes, für die sich das Verhalten ändern soll.


Ändern der Schlüsselcodes für die Scan-Codes

Wenn Sie sehen, dass der Schlüsselcode eindeutig nicht das abdeckt, was Sie von dem Schlüssel erwarten, können Sie /usr/include/linux/input.hunter Schlüssel und Schaltflächen nachsehen , ob es einen Schlüsselcode gibt, der besser zu dem passt, was Sie tatsächlich wollen. Die dortigen Schlüsselcodes liegen im Format vor KEY_KEYCODEund Sie müssen das Teil danach KEY_in Kleinbuchstaben notieren . Manchmal reicht es aus, dies zu ändern, um das Problem zu lösen.

Den Helligkeitstasten ist jedoch häufig der richtige Schlüsselcode zugeordnet, sodass sie nicht neu zugeordnet werden können. Wir müssen sie also in andere Schlüsselcodes ändern. Wir werden prog1und prog2für dieses Beispiel verwenden, da diese auf meinem Computer nicht verwendet werden. Sie können sie jedoch auch f13durch f24oder f20durch verwenden, f24wenn Sie eine Apple-Tastatur mit F1Durchgangstasten haben F19.

  1. Erstellen einer benutzerdefinierten Keymap :
    Erstellen Sie eine Keymap-Datei im Verzeichnis /lib/udev/keymapsmit einem geeigneten Namen. Sehen Sie sich die Ausgabe von ls /lib/udev/keymapsan, um nach geeigneten Namen zu suchen . Ich gehe mit custom-brightnesszum Zweck dieser Frage.

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

    und geben Sie die Scan-Codes der Schlüssel ein, die Sie ändern möchten, gefolgt von den Scancodes, die sie haben sollen. Mein custom-brightnesssieht so aus:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. Erstellen Sie eine benutzerdefinierte Schlüsselfreigabedatei. Nur wenn Sie die Tastatur Ihres Laptops ändern :
    Manchmal wird das Ereignis der Tastenfreigabe nicht ordnungsgemäß gesendet , wodurch der Computer hängen bleibt. Um dies zu vermeiden, schreiben wir auch eine benutzerdefinierte Schlüsselfreigabedatei

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

    Diese Datei sollte die gleichen Scan-Codes enthalten, meine sieht aus wie

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

Stellen Sie sicher, dass die neuen Zuordnungen in die
Regeldateien geladen sind. Jetzt müssen wir sicherstellen, dass Ihre Zuordnungen geladen sind. Wir können dies durch Bearbeiten tun /lib/udev/rules.d/95-keymap.rules, daher ist es klug, ein Backup zu erstellen

Wieder haben wir zwei Möglichkeiten:

  • USB-Tastaturen :
    Da Sie eine USB-Tastatur haben, sollten Sie Ihren Eintrag unter hinzufügen LABEL="keyboard_usbcheck"und er sollte hinter den anderen Einträgen Ihres Tastaturherstellers liegen. Das liegt daran, dass meine Tastatur mit

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

    wird bereits von einer der Regeln abgeglichen, andernfalls wird es überschrieben.
    Fügen Sie die folgende Regel hinzu, nach der Sie das ID_VENDOR_IDund ID_MODEL_IDund den Namen Ihrer Keymap entsprechend ändern sollten

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • Laptop-Tastatur :
    Wenn /lib/udev/findkeyboardsgemeldet wird, dass Ihre Laptop-Tastatur unter AT keyboardIhre Regel fallen sollte LABEL="keyboard_vendorcheck", setzen Sie sie andernfalls unter LABEL="keyboard_modulecheck". Setzen Sie es erneut unter die anderen Einträge für Ihren Laptop-Hersteller. Füge die folgende Regel hinzu ( SAMSUNG ELECTRONICS CO., LTD.ist etwas lang, also habe ich einen Platzhalter verwendet`)

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

    Fügen Sie jetzt auch eine Regel hinzu, /lib/udev/rules.d/95-keyboard-force-release.rulesnachdem Sie sie gesichert haben

    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
    

    Wieder unter den anderen Einträgen Ihres Herstellers hinzufügen

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

Stellen Sie sicher, dass udev die neuen Regeln lädt.
Um die neuen Regeln zu laden, führen Sie sie aus

sudo adevadm trigger

HINWEIS: udevadm control --reload-rules(noch in den Anweisungen auf vielen Websites) funktioniert nicht.

Überprüfen Sie nun, ob die Regeln von erfolgreich angewendet wurden

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

die jetzt für die Helligkeitstasten melden sollte

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

Neuzuordnung der Schlüssel in den Systemeinstellungen
Wenn im letzten Schritt die richtigen Schlüsselcodes gemeldet wurden, funktionieren beide Schlüssel automatisch (falls sie zuerst die falschen Schlüsselcodes hatten).

Für die Helligkeit müssen Sie die Tasten noch an einen Scrip binden, der jetzt über Systemeinstellungen> Tastatur> Verknüpfungen möglich ist .

Genießen



Anmerkungen :

  • Wenn Ihre Schlüssel den falschen Schlüsselcode hatten und durch diesen Ansatz behoben wurden, befolgen /usr/share/doc/udev/README.keymap.txt.gzSie bitte die Anweisungen in (Sie können diese öffnen, ohne sie mit zu extrahieren zless) und senden Sie Ihren Ergebnissen die dort genannten E-Mail-Adressen. Die Änderungen können dann in die nächste Version aufgenommen werden. Viele Benutzer werden davon profitieren!

  • Vielen Dank an diesen hilfreichen Beitrag von Vaidas Jablonskis.

Gerhard Burger
quelle
1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directoryauch$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky
Vielen Dank für Ihren Kommentar, ich habe ihn mir angesehen und es scheint, dass udev in systemd zusammengeführt wird und die Keymap-Einstellungen stattdessen in hwdb verwaltet werden. Laut bbs.archlinux.org/viewtopic.php?id=168720 ist es möglich, Findkeyboards aus einer älteren Version von systemd zu extrahieren, aber ich bin mir nicht sicher, ob der Rest der Antwort weiterhin gilt ...
Gerhard Burger