Chciałbym ponownie przypisać klawisze na klawiaturze numerycznej, aby zachowywały się inaczej w zależności od czasu naciśnięcia klawisza. Oto przykład:
Jeśli przytrzymam klawisz Numpad 9 przez mniej niż 300 ms, wyśle polecenie „poprzednia karta” Ctrl+Tab
Jeśli przytrzymam klawisz Numpad 9 przez 300-599 ms, wyśle polecenie „nowa karta” Ctrl+T
Jeśli przytrzymam klawisz Numpad 9 przez 600-899 ms, wyśle polecenie „zamknij kartę / okno” Ctrl+W
Jeśli przytrzymam klawisz Numpad 9 dłużej niż 899 ms, nic nie zrobię w przypadku, gdy przegapiłem okno czasowe, które chciałem.
W Windowsie mogłem to zrobić za pomocą AutoHotKey, a w OS XI mogłem to zrobić za pomocą ControllerMate, ale nie mogę znaleźć narzędzia w systemie UNIX / Linux, które pozwala na ponowne mapowanie klucza w oparciu o czas przechowywania klucza.
Jeśli znasz narzędzie, które może rozwiązać mój problem, upewnij się, że podałeś przykładowy skrypt lub kod, który demonstruje zachowanie warunkowego trzymania klucza opisane powyżej. Nie musi to być pełny kod, aby rozwiązać mój przykład, ale powinienem wystarczyć, aby zmienić przeznaczenie na mój przykład.
Odpowiedzi:
Właśnie napisałem to w C :
Użyj,
showkey -a
aby uzyskać kod przypisania:Umieść kod powiązania 5 i jego polecenie (np. Uruchom
/tmp/.a.out
) w ~ / .bashrc:Zauważ, że odpowiedni kod klucza musi również ulec zmianie w kodzie źródłowym (wartość szesnastkową można również uzyskać z
sudo showkey -a
góry):Skompiluj z (dane wyjściowe do
/tmp/a.out
w moim przykładzie):Demonstracja:
Numpad 5, krótkie naciśnięcie, otwórz nową kartę, średnie naciśnięcie, otwórz gedit i długie wciśnięcie, otwórz gnome-terminal.
Nie ma to bezpośredniego zastosowania w żadnym oknie menedżera pulpitu gnome, ale myślę, że powinno dać ci pewien pomysł, jak (trudno) go wdrożyć. Działa również w konsoli wirtualnej (Ctrl + Alt + N) i działa w niektórych emulatorach terminali (np. Konsole, gnome-terminal, xterm).
p / s: Nie jestem programistą ac, więc wybacz mi, jeśli ten kod nie jest zoptymalizowany.
[AKTUALIZACJA]
Poprzednia odpowiedź działa tylko w powłoce i wymaga skupienia, więc myślę, że przeanalizuj / dev / input / eventX to rozwiązanie do pracy w całej sesji X.
Nie chcę wymyślać koła na nowo. I bawić się z
evtest
użyteczności i modyfikowane dolną część evtest.c z mojego własnego kodu:Pamiętaj, że powinieneś zmienić część nazwy użytkownika ( xiaobai to moja nazwa użytkownika). A także
if ( (ev[i].code == 76) ) {
jest to mój kod numeryczny Numpad 5, może być konieczne ręczne wydrukowanie kodu ev [i] w celu podwójnego potwierdzenia. I oczywiście powinieneś również zmienić ścieżkę wideo :)Skompiluj i przetestuj go bezpośrednio za pomocą (część `` jest po to, aby uzyskać poprawne
/dev/input/eventN
):Zauważ, że
/by-id/
nie działa w Fedorze 24, więc zmieniam go na / by-path /. Kali nie ma takiego problemu.Mój menedżer pulpitu to gdm3:
Więc wstawiłem ten wiersz,
/etc/gdm3/PostLogin/Default
aby uruchomić to polecenie jako root podczas uruchamiania gdm (/etc/X11/Xsession.d/*
nie działa):Z nieznanego powodu /
etc/gdm/PostLogin/Default
nie działa na Fedorze 24 'gdm, co daje mi „ Odmowę dostępu ” podczas sprawdzania/tmp/l_gdmE
dziennika. Jednak ręcznie nie ma problemu.Demonstracja:
Numpad 5, natychmiastowe naciśnięcie (<= 0,2 sekundy) zostanie zignorowane, krótkie naciśnięcie (0,2 do 0,5 sekundy) otwarte
nautilus
, średnie naciśnięcie (0,5 do 1 sekundy) otwarte,vlc
aby odtworzyć wideo, długie naciśnięcie (1 do 2 sekund) otwórzgnome-terminal
i limit czasu naciśnij (2 sekundy) otwórzgedit
.Przesłałem tutaj pełny kod (tylko jeden plik) .
[Ponownie zaktualizuj]
[1] Dodano przepływ wielu kluczy i naprawiono błąd
notify-send
definiowaniaDBUS_SESSION_BUS_ADDRESS
. [2] DodanoXDG_CURRENT_DESKTOP
iGNOME_DESKTOP_SESSION_ID
aby upewnić się, że konsola używa GUI motywu gnome (Zmień go, jeśli nie używasz gnome).Zaktualizowałem swój kod tutaj .
Zauważ, że ten kod nie obsługuje przepływu klawiszy kombinacji, np . Ctrl+ t.
AKTUALIZACJA:
Istnieje wiele interfejsów urządzeń, których sekwencja wpisów / dev / input / by-path / XXX-eventN jest losowa. Zmieniam więc polecenie w
/etc/gdm3/PostLogin/Default
następujący sposób (Chesen
to nazwa mojej klawiatury, w twoim przypadku powinieneś zmienić ją nagrep Razer
):Możesz wypróbować fragment eventN z
cat /proc/bus/input/devices | grep -i Razer -A 4
:W powyższym przykładzie
sudo cat /dev/input/event7
wydrukowane zostaną dziwne dane wyjściowe tylko po kliknięciu 12 cyfr myszy Razer, która ma wzorzec „sysrq kbd leds event7” do użyciagrep -P '^(?=.*sysrq)(?=.*leds)'
powyżej (wzór może się różnić).sudo cat /dev/input/event6
wydrukuje dziwne wyniki tylko po kliknięciu środkowego klawisza góra / dół. Podczas gdysudo cat /dev/input/event5
wydrukuje dziwne wyniki, gdy poruszasz myszką i przewijasz kółko.[Aktualizacja: Wsparcie Wymień kabel klawiatury, aby ponownie załadować program]
Wyjaśnienia powinny być następujące:
źródło
if-else
każde naciśnięcie klawisza, a ja również dodałem,if (currCode >= 59) && (currCode <= 81)
aby ograniczyć zakres wcześniejif-else
.Możesz znaleźć narzędzie, które działa z określonym zestawem programów, ale nie będzie żadnego narzędzia globalnie użytecznego, ponieważ zachowanie związane z czasem zachodzi w aplikacjach w X, a nie w systemie okienkowym.
źródło
sprawdziłeś Xmodmap?
xmodmap to narzędzie do modyfikowania map klawiszy i mapowań przycisków wskaźników w Xorg
https://wiki.archlinux.org/index.php/Xmodmap
źródło