Saya ingin memetakan kembali tombol pada papan angka saya sehingga mereka berperilaku berbeda tergantung pada berapa lama tombol itu ditekan. Ini sebuah contoh:
Jika saya menahan tombol Numpad 9 kurang dari 300ms itu akan mengirim perintah kunci "tab sebelumnya" Ctrl+Tab
Jika saya menahan tombol Numpad 9 untuk 300-599ms itu akan mengirim perintah tombol "tab baru" Ctrl+T
Jika saya menahan tombol Numpad 9 untuk 600-899ms, ia akan mengirimkan perintah tombol "close tab / window" Ctrl+W
Jika saya menahan tombol Numpad 9 lebih dari 899 ms, itu tidak melakukan apa-apa kalau-kalau saya melewatkan jendela waktu yang saya inginkan.
Pada Windows saya bisa melakukan ini dengan AutoHotKey dan pada OS XI bisa melakukan ini dengan ControllerMate, tetapi saya tidak dapat menemukan alat di UNIX / Linux yang memungkinkan pemetaan ulang kunci berdasarkan berapa lama kunci dipegang.
Jika Anda mengetahui alat yang dapat memecahkan masalah saya, pastikan untuk memberikan sampel skrip atau kode yang menunjukkan perilaku durasi penahanan kunci bersyarat yang saya jelaskan di atas. Tidak perlu kode lengkap untuk menyelesaikan contoh saya, tetapi harus cukup bagi saya untuk menggunakan kembali contoh saya.
Jawaban:
Saya baru saja menulis ini di C :
Gunakan
showkey -a
untuk mendapatkan kode kunci bind:Masukkan kode kunci bind 5 dan perintahnya (mis. Jalankan
/tmp/.a.out
) di ~ / .bashrc:Perhatikan bahwa kode kunci yang relevan perlu diubah dalam kode sumber juga (nilai hex bisa dapatkan dari
sudo showkey -a
atas juga):Kompilasi dengan (output ke
/tmp/a.out
dalam contoh saya):Demonstrasi:
Numpad 5, tekan pendek buka tab baru, tekan menengah buka gedit, dan tekan lama buka terminal gnome.
Ini tidak langsung dapat diterapkan di jendela mana pun di gnome desktop manager, tetapi saya pikir itu harus memberi Anda beberapa ide bagaimana (sulit) untuk mengimplementasikannya. Ia bekerja di Virtual Console (Ctrl + Alt + N) juga, dan bekerja di beberapa terminal emulator (misalnya konsole, gnome-terminal, xterm).
p / s: Saya bukan programmer ac, jadi maafkan saya jika kode ini tidak dioptimalkan.
[MEMPERBARUI]
Jawaban sebelumnya hanya bekerja di shell dan fokus yang diperlukan, jadi saya pikir parse / dev / input / eventX adalah solusi untuk bekerja di seluruh sesi X.
Saya tidak ingin menemukan kembali roda. Saya bermain-main dengan
evtest
utilitas dan memodifikasi bagian bawah evtest.c dengan kode saya sendiri:Perhatikan bahwa Anda harus mengubah nama pengguna ( xiaobai adalah nama pengguna saya). Dan juga
if ( (ev[i].code == 76) ) {
kode kunci Numpad 5 saya, Anda mungkin perlu mencetak kode ev [i] secara manual untuk mengonfirmasi ganda. Dan tentu saja Anda harus mengubah jalur video juga :)Kompilasi dan uji langsung dengan (bagian `` untuk mendapatkan yang benar
/dev/input/eventN
):Catatan yang
/by-id/
tidak berfungsi di Fedora 24, jadi saya mengubahnya ke / by-path /. Kali tidak ada masalah seperti itu.Manajer desktop saya adalah gdm3:
Jadi, saya meletakkan baris ini
/etc/gdm3/PostLogin/Default
untuk menjalankan perintah ini sebagai root pada gdm startup (/etc/X11/Xsession.d/*
tidak berfungsi):Untuk alasan yang tidak diketahui /
etc/gdm/PostLogin/Default
tidak bekerja pada Fedora 24 'gdm yang memberi saya " Izin ditolak " saat memeriksa/tmp/l_gdmE
log. Secara manual menjalankan tidak ada masalah.Demonstrasi:
Numpad 5, tekan cepat (<= 0,2 detik) akan diabaikan, tekan pendek (0,2 hingga 0,5 detik) terbuka
nautilus
, tekan sedang (0,5 hingga 1 detik) terbukavlc
untuk memutar video, tekan lama (1 hingga 2 detik) terbukagnome-terminal
, dan batas waktu-tekan (2 detik) terbukagedit
.Saya mengunggah kode lengkap (hanya satu file) di sini .
[PERBARUI lagi]
[1] Menambahkan aliran banyak kunci dan diperbaiki
notify-send
gagal oleh defineDBUS_SESSION_BUS_ADDRESS
. [2] DitambahkanXDG_CURRENT_DESKTOP
danGNOME_DESKTOP_SESSION_ID
untuk memastikan konsole menggunakan gnome theme gui (Ubah jika Anda tidak menggunakan gnome).Saya memperbarui kode saya di sini .
Perhatikan bahwa kode ini tidak menangani aliran kunci kombinasi, misalnya Ctrl+ t.
MEMPERBARUI:
Ada beberapa antarmuka perangkat yang urutan entri / dev / input / by-path / XXX-eventN adalah acak. Jadi saya mengubah perintah
/etc/gdm3/PostLogin/Default
seperti di bawah ini (Chesen
adalah nama keyboard saya, untuk kasus Anda, Anda harus mengubahnya menjadigrep Razer
sebagai gantinya):Anda dapat mencoba ekstrak eventN dari
cat /proc/bus/input/devices | grep -i Razer -A 4
:Dalam contoh di atas, hanya
sudo cat /dev/input/event7
akan mencetak output aneh ketika mengklik 12 digit pada mouse Razer, yang memiliki pola "sysrq kbd leds event7" untuk digunakan digrep -P '^(?=.*sysrq)(?=.*leds)'
atas (pola Anda mungkin berbeda).sudo cat /dev/input/event6
akan mencetak output aneh hanya ketika mengklik tombol tengah atas / bawah. Sementarasudo cat /dev/input/event5
akan mencetak output aneh ketika menggerakkan mouse Anda dan menggulirkan roda.[Pembaruan: Mendukung kabel keyboard Replug untuk memuat ulang program]
Berikut ini harus penjelasan sendiri:
sumber
if-else
setiap tekan tombol, sementara saya juga menambahkanif (currCode >= 59) && (currCode <= 81)
untuk membatasi rentang sebelumnyaif-else
.Anda mungkin menemukan alat yang berfungsi dengan sekumpulan program tertentu, tetapi tidak akan ada alat yang dapat digunakan secara global karena perilaku terkait waktu dilakukan dalam aplikasi di X, bukan oleh sistem windowing.
sumber
apakah Anda memeriksa Xmodmap?
xmodmap adalah utilitas untuk memodifikasi pemetaan tombol dan pemetaan tombol penunjuk di Xorg
https://wiki.archlinux.org/index.php/Xmodmap
sumber