Ich möchte die Tasten auf meinem Nummernblock neu zuordnen, damit sie sich je nach gedrückter Taste unterschiedlich verhalten. Hier ist ein Beispiel:
Wenn ich die Numpad 9-Taste weniger als 300 ms lang gedrückt halte, wird der Tastenbefehl "Vorherige Registerkarte" Ctrl+ gesendetTab
Wenn ich die Numpad 9-Taste 300-599 ms lang gedrückt halte, wird der Tastenbefehl "Neue Registerkarte" Ctrl+ gesendetT
Wenn ich die Numpad 9-Taste 600-899 ms lang gedrückt halte, wird der Tastenbefehl "Tab / Fenster schließen" Ctrl+ gesendetW
Wenn ich die Numpad 9-Taste länger als 899 ms gedrückt halte, geschieht nichts, falls ich das gewünschte Zeitfenster verpasst habe.
Unter Windows könnte ich dies mit AutoHotKey und unter OS XI mit ControllerMate tun, aber unter UNIX / Linux kann ich kein Tool finden, das eine Neuzuordnung von Schlüsseln basierend auf der Haltedauer eines Schlüssels ermöglicht.
Wenn Ihnen ein Tool bekannt ist, mit dem mein Problem gelöst werden kann, stellen Sie sicher, dass Sie ein Skript oder ein Codebeispiel bereitstellen, das das oben beschriebene Verhalten der bedingten Haltedauer von Schlüsseln demonstriert. Es muss nicht der vollständige Code sein, um mein Beispiel zu lösen, aber es sollte ausreichen, um es für mein Beispiel zu verwenden.
Antworten:
Ich habe das gerade in C geschrieben :
Verwenden Sie
showkey -a
diese Option, um den Bindungsschlüsselcode abzurufen:/tmp/.a.out
Geben Sie den Bindungsschlüsselcode 5 und seinen Befehl (z. B. Ausführen ) in ~ / .bashrc ein:Beachten Sie, dass sich der relevante Schlüsselcode auch im Quellcode ändern muss (der Hex-Wert kann auch von
sudo showkey -a
oben kommen):Kompilieren mit (Ausgabe an
/tmp/a.out
in meinem Beispiel):Demonstration:
Numpad 5, kurz drücken, neue Registerkarte öffnen, mittel drücken, gedit öffnen und lange drücken, Gnome-Terminal öffnen.
Dies ist in keinem Fenster des Gnome-Desktop-Managers direkt anwendbar, aber ich denke, es sollte Ihnen eine Vorstellung davon geben, wie (schwer) es zu implementieren ist. Es funktioniert auch in der virtuellen Konsole (Strg + Alt + N) und in einigen Terminalemulatoren (z. B. Konsole, Gnome-Terminal, xterm).
p / s: Ich bin kein AC-Programmierer. Verzeihen Sie mir, wenn dieser Code nicht optimiert ist.
[AKTUALISIEREN]
Die vorherige Antwort funktioniert nur in der Shell und erfordert den Fokus. Daher denke ich, dass das Parsen von / dev / input / eventX die Lösung ist, um in der gesamten X-Sitzung zu arbeiten.
Ich möchte das Rad nicht neu erfinden. Ich spiele mit dem
evtest
Dienstprogramm herum und habe den unteren Teil von evtest.c mit meinem eigenen Code geändert :Beachten Sie, dass Sie den Teil Benutzername ( Xiaobai ist mein Benutzername) ändern sollten . Außerdem
if ( (ev[i].code == 76) ) {
ist dies mein Numpad 5-Schlüsselcode. Möglicherweise müssen Sie den ev [i] .code manuell ausdrucken, um ihn doppelt zu bestätigen. Und natürlich solltest du auch den Videopfad ändern :)Kompilieren und testen Sie es direkt mit (der `` Teil dient dazu, das richtige zu erhalten
/dev/input/eventN
):Beachten Sie, dass
/by-id/
dies in Fedora 24 nicht funktioniert, daher ändere ich es in / by-path /. Kali kein solches Problem.Mein Desktop Manager ist gdm3:
Also habe ich diese Zeile
/etc/gdm3/PostLogin/Default
eingefügt, um diesen Befehl als Root beim Start von gdm auszuführen (/etc/X11/Xsession.d/*
funktioniert nicht):Aus unbekannten Gründen /
etc/gdm/PostLogin/Default
funktioniert nicht mit Fedora 24 'gdm, die mir beim Überprüfen des Protokolls " Berechtigung verweigert " geben/tmp/l_gdmE
. Manuell kein Problem ausführen.Demonstration:
Numpad 5, Sofortdruck (<= 0,2 Sekunden) wird ignoriert, Kurzdruck (0,2 bis 0,5 Sekunden) geöffnet
nautilus
, Mitteldruck (0,5 bis 1 Sekunde) geöffnetvlc
, um Video abzuspielen, Langdruck (1 bis 2 Sekunden) Öffnengnome-terminal
und Timeout-Drücken (2 Sekunden) öffnengedit
.Ich habe hier den vollständigen Code (nur eine Datei) hochgeladen .
[Erneut aktualisieren]
[1] Mehrere Schlüssel wurden hinzugefügt und
notify-send
durch Definieren fehlgeschlagen behobenDBUS_SESSION_BUS_ADDRESS
. [2] HinzugefügtXDG_CURRENT_DESKTOP
undGNOME_DESKTOP_SESSION_ID
um sicherzustellen, dass die Konsole Gnome Theme GUI verwendet (Ändern Sie es, wenn Sie Gnome nicht verwenden).Ich habe meinen Code hier aktualisiert .
Beachten Sie, dass dieser Code nicht für den Fluss von Kombinationsschlüsseln geeignet ist, z . B. Ctrl+ t.
AKTUALISIEREN:
Es gibt mehrere Geräteschnittstellen, bei denen die Eingabesequenz / dev / input / by-path / XXX-eventN zufällig ist. Also ändere ich den Befehl
/etc/gdm3/PostLogin/Default
wieChesen
folgt ( ist mein Tastaturname, für Ihren Fall sollten Sie ihngrep Razer
stattdessen ändern ):Sie können den eventN-Extrakt ausprobieren aus
cat /proc/bus/input/devices | grep -i Razer -A 4
:In diesem Beispiel oben
sudo cat /dev/input/event7
wird eine bizarre Ausgabe nur gedruckt, wenn Sie auf die 12 Stellen der Razer-Maus klicken, die das oben verwendete Muster "sysrq kbd leds event7" enthältgrep -P '^(?=.*sysrq)(?=.*leds)'
(Ihr Muster kann variieren).sudo cat /dev/input/event6
druckt bizarre Ausgaben nur, wenn Sie auf die mittlere Auf- / Ab-Taste klicken. Whilesudo cat /dev/input/event5
druckt bizarre Ausgaben, wenn Sie die Maus bewegen und das Rad bewegen.[Update: Support Replug-Tastaturkabel zum erneuten Laden des Programms unterstützen]
Folgendes sollte selbsterklärend sein:
quelle
if-else
jedem Tastendruck ausgeführt, während ich auch hinzugefügt habeif (currCode >= 59) && (currCode <= 81)
, um den Bereich vorher zu begrenzenif-else
.Möglicherweise finden Sie ein Tool, das mit einem bestimmten Satz von Programmen funktioniert. Es gibt jedoch kein global verwendbares Tool, da zeitbezogenes Verhalten in Anwendungen in X und nicht vom Fenstersystem ausgeführt wird.
quelle
Hast du die Xmodmap überprüft?
xmodmap ist ein Dienstprogramm zum Ändern von Keymaps und Zeigerschaltflächenzuordnungen in Xorg
https://wiki.archlinux.org/index.php/Xmodmap
quelle