Auf Tastendrücke von Spezieller Tastatur reagieren



  • Grüß euch!
    Ist es mit C (oder jeder anderen Sprache) möglich, dass man auf einen Tastendruck von einer speziellen Tastatur reagiert?
    Ich habe eine Maus, für die es keine Linux Treiber gibt und somit ich nicht auf die Sondertasten der Maus reagieren kann (Razer Naga / Noch von meiner Windows "Karriere").
    D.h.: Das Programm müsste im Hintergrund laufen und jeden Tastendruck abfragen (auch, wenn das Fenster nicht fokusiert ist), wenn der Druck dann von der Maus kommt, dann sollte er darauf reagieren.
    Ich hoffe es weiß jemand.

    Andere Möglichkeit:

    Es gibt schon ein Programm dass genau dass macht, was oben beschrieben wurde -> halt damit man es Einstellen kann was passiert.

    mfg
    weini (debian wheezy)


  • Mod

    weini37 schrieb:

    Es gibt schon ein Programm dass genau dass macht, was oben beschrieben wurde -> halt damit man es Einstellen kann was passiert.

    Ich habe zwar keine solche Maus und kann es nicht testen, aber Google flüstert mir, dass razercfg vielleicht was für dich wäre.



  • SeppJ schrieb:

    razercfg

    Schon fast richtig 🙂
    Laut http://bues.ch/cms/hacking/razercfg.html
    kann man bei der Razer Naga "nur":
    Profile bearbeiten
    Frequenz wechseln
    DPI wechseln
    Leds ein/ausschalten

    aber noch keine Buttons remappen 😞

    Ich kann es bestätigen, es gibt noch kein Buttonremapping für die Naga


  • Mod

    Aber was ist mit der auf der Tool-Seite vorgeschlagenen Kombination mit xmodmap & Co. um die Belegung der Tasten zu ändern? Oder reichen dir die Möglichkeiten davon nicht?



  • Mit xinput kann man nur die Buttonreihenfolge umändern.
    Xmodmap kann nur jeweils ein Profil laden (also entweder ich stelle das gesammte System um oder gar nichts).
    Andere habe ich nicht gefunden

    mfg
    weini


  • Mod

    Dann bin ich mit meinem (geringen) Wissen leider am Ende. Dann muss wohl wirklich ein eigenes Programm her. Aber das Vorhaben ist schon ein bisschen ambitioniert. Möglicherweise gibt es sogar noch unbekannte Hindernisse, die der Grund sind, warum es das noch nicht gibt.

    Ich kann dir jedenfalls nicht beantworten, ob das auf X11-Ebene geht oder ob du dafür sogar runter auf die Device-Ebene musst.

    Aber ich hätte noch die Idee, dass dein Programm einfach verschiedene xmodmap-Profile verwaltet und zwischen diesen umschalten kann. Ist das nicht, was der Windowstreiber auch macht? Oder reagiert die Mausbelegung in Windows sogar auf die derzeit aktive Anwendung? Das derzeit fokussierte Fenster ließe sich bestimmt auch noch irgendwie herausfinden über X11. Wird aber sicherlich nicht einfach. Dafür wirst du der Held der Razercommunity, wenn du das durchziehst.



  • So hab jetzt was herausgefunden, was vielleicht hilft:

    xinput list | sed -n 's/.*Naga.*id=\([0-9]*\).*keyboard.*/\1/p'
    

    Das erkennt, welche ID die Naga hat.

    Danach könnte man irgendwie mit

    setxkbmap -device <code>
    

    Etwas umändern
    in etwa so:

    $id = xinput list | sed -n 's/.*Naga.*id=\([0-9]*\).*keyboard.*/\1/p'
    setxkbmap -device $id <mach was>
    

    Vielleicht hilft das weiter 🙂

    src: https://bbs.archlinux.org/viewtopic.php?pid=1181482

    Die benutzten das:

    remote_id=$(
      xinput list |
      sed -n 's/.*Naga.*id=\([0-9]*\).*keyboard.*/\1/p'
    )
    [ "$remote_id" ] || exit
    
    mkdir -p /tmp/xkb/symbols
    cat >/tmp/xkb/symbols/custom <<\EOF
    xkb_symbols "remote" {
        key <AE01>   { [F1, F1] };
        key <AE02>   { [F2, F2] };
        key <AE03>   { [F3, F3] };
        key <AE04>   { [F4, F4] };
        key <AE05>   { [F5, F5] };
        key <AE06>   { [F6, F6] };
        key <AE07>   { [F7, F7] };
        key <AE08>   { [F8, F8] };
        key <AE09>   { [F9, F9] };
        key <AE10>   { [F10, F10] };
        key <AE11>   { [F11, F11] };
        key <AE12>   { [F12, F12] };
    };
    EOF
    
    setxkbmap -device $remote_id -print | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null
    

    Wobei dieser Code bei mir nicht funktioniert

    mfg
    weini



  • Das Script funktioniert jetzt -
    Keine Ahnung, was vorher nicht gegangen ist 🙂

    So ich setzte mich mal ran und programmiere ein kleines Java Tool, welches diese so eine Konfigurations Datei erstellt und eventuell noch ausführt



  • So da hätten wir die jar:
    http://www.weini.at/other/razerNagaKeyBinder.jar
    http://www.weini.at/other/preview.png
    Bei mir funktioniert sie.

    Was man machen muss:
    Wenn du das Programm startest, findest du in der oberen hälfte den Output von xinput --list

    Dort musst du unter "Virtual core keyboard" deine Razer Naga raussuchen.
    Bei mir wäre das der Output von xinput --list

    ⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
    ⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
    ⎜   ↳ Razer Razer Naga                        	id=10	[slave  pointer  (2)]
    ⎜   ↳ ETPS/2 Elantech Touchpad                	id=14	[slave  pointer  (2)]
    ⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
        ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
        ↳ Power Button                            	id=6	[slave  keyboard (3)]
        ↳ Video Bus                               	id=7	[slave  keyboard (3)]
        ↳ Sleep Button                            	id=8	[slave  keyboard (3)]
        ↳ USB 2.0 Camera                          	id=9	[slave  keyboard (3)]
        ↳ Razer Razer Naga                        	id=11	[slave  keyboard (3)]
        ↳ Asus Laptop extra buttons               	id=12	[slave  keyboard (3)]
        ↳ AT Translated Set 2 keyboard            	id=13	[slave  keyboard (3)]
        ↳ ACPI Virtual Keyboard Device            	id=15	[slave  keyboard (3)]
    

    Dementsprechend ist die id von der Razer Naga 11 (Nicht 10, da 10 bei Virtual Core Pointers ist)

    Nachdem du das gemacht hast, trage die id in die Textbox ein und klicke auf set.

    Hier wirst du nacheinander gefragt (insgesammt 12 mal), welche Taste du damit binden willst.
    Z.b.
    Key 1 (only ONE char!!)
    input: b

    Somit wird immer "b" gedrückt, wenn du die erste Taste auf deiner Maus drückst.
    Wenn du etwas falsch eingeben hast (oder auf abbrechen geklickt hast) musst du alle neu belegen 😛

    Nachdem du die 12 Tasten erfolgreich eingegeben hast, kontrollierst du sie noch einmal in der unteren hälfte des Fensters.

    Wenn etwas nicht stimmt, darfst du noch einmal alle 12 eingeben 😛
    Wenn du alle eingegeben hast und alle stimmen, klicke auf run und es wird ausgeführt.

    Evt. wenn du noch etwas manuell umändern willst, gehe ins Verzeichnis:
    $user.home/.weiniKeyConfig/
    und ändere die Datei run.txt um, wenn du fertig bist führe sie aus mit "sh run.txt"

    Den Ordner kannst du nachdem du alles gemacht hast wieder löschen.

    Das alles ist sehr schnell programmiert worden und wenn du etwas falsches eingegeben hast, überprüft das Programm fast nichts, da es nur schnell "hingefetzt" wurde ⚠ ⚠
    Wenn etwas nachdem du das Programm ausgeführt hast nicht mehr funktioniert, starte den Computer neu.
    Wenn dann noch immer der Fehler passiert, bisst du selbst schuld, probiere noch einmal das Programm auszuführen 🙂
    Ich übernehme keine Haftung für Schäden am Computer ⚠ (Für mich hat es funktioniert)

    mfg
    weini


Anmelden zum Antworten