Bagaimana cara mendapatkan kode kunci untuk xmodmap?

76

Saya mencoba menggunakan xmodmapuntuk memetakan kembali Alt/ Superpada keyboard Dell L100, dan kesulitan mendapatkan kode kunci.

Misalnya, menggunakan xevtidak memberi saya kode kunci untukAlt

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 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   

Untuk Right Superkunci, xevdan showkeyberikan kode kunci yang berbeda - 134dan 126masing - masing.

Apa yang terjadi dengan kode kunci ini?

Saya mencoba mendapatkan kode kunci dari showkey -k, dan menggunakan xmodmapfile di bawah ini, tetapi itu memberikan peta aneh yang memetakan kembali bkunci:

clear Mod1
clear Control
keycode 125 = Meta_L
keycode 126 = Meta_R
keycode 58 = Control_L
keycode 56 = Control_L
keycode 100 = Control_R
add Control = Control_L Control_R
add Mod1 = Meta_L Meta_R
Yaroslav Bulatov
sumber
Saya memiliki masalah yang sama dengan Alt_L tidak memecat (tapi Alt_R baik-baik saja), di XUbuntu 14.04. Sistem apa yang Anda gunakan?
Harga Paul

Jawaban:

54

Ada banyak pemain di antara keyboard Anda dan proses yang akhirnya menangani acara keyboard. Di antara bagian-bagian utama lansekap adalah kenyataan bahwa sistem X memiliki lapisan penanganan keyboard sendiri, dan X mengaitkan "kode kode" yang berbeda dengan kunci dibandingkan dengan sistem basis Linux Anda. The showkeyperintah menunjukkan Anda keycodes di Linux-base-sistem lingo. Untuk xmodmapAnda memerlukan kode kunci X, yang merupakan apa xevyang ditampilkan. Selama Anda berencana untuk bekerja di X dan melakukan rebinding dengan kunci Anda xmodmap, maka, abaikan showkeysdan dengarkan saja apa yang xevdikatakan.

Apa yang ingin Anda cari dalam xevoutput Anda adalah blok-blok seperti ini:

KeyPress event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417361, (340,373), root:(342,393),
    state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417474, (340,373), root:(342,393),
    state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

xevcenderung menghasilkan banyak output, terutama ketika Anda menggerakkan mouse Anda. Anda mungkin harus menggulir ke belakang sebentar untuk menemukan output yang Anda cari. Pada keluaran sebelumnya, kita melihat bahwa keysym Alt_Lberhubungan dengan keycode X 64.

dubiousjim
sumber
3
Masalahnya adalah saya tidak mendapatkan acara KeyPress di tombol Windows. Saya mencoba 3 keyboard berbeda dan hasilnya sama. Dari xev saya hanya mendapatkan FocusOut, FocusIn dan KeymapNotify seperti yang terlihat di atas. Namun, saya bisa pergi dan mengatur pintasan melalui manajer Gnome, dan ia melihat kunci Windows sebagai "Mod4"
Yaroslav Bulatov
Laporan kunci Windows kanan sebagai Mod4, meninggalkan laporan kunci Windows sebagai Alt ... yang membingungkan karena saya bahkan tidak memiliki kategori "Alt" di xmodmap saya.
Yaroslav Bulatov
Coba Mod1 untuk Alt.
dubiousjim
2
@YaroslavBulatov terdengar seperti lingkungan desktop Anda sedang memakan kunci (mungkin untuk membuka menu utamanya?)
derobert
3
Anda dapat memfilter acara yang xev berikan kepada Anda. Dalam hal ini xev -event keyboardakan cukup untuk menghilangkan sebagian besar kebisingan.
Fredrik Wendt
24

xev harus bekerja

Aneh, xev saya memberikan acara KeyPress dan KeyRelease untuk alt (dan untuk kunci Windows, di sini disebut "super"):

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467354, (98,77), root:(102,443),
    state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467453, (98,77), root:(102,443),
    state 0x18, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Dan tangan kanan:

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572876, (75,33), root:(79,399),
    state 0x10, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572972, (75,33), root:(79,399),
    state 0x18, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Saya dapat melihat dua kemungkinan:

  1. Sesuatu yang lain benar-benar memakan penekanan tombol, atau mengubah fokus jendela saat Anda menekan alt. Coba jalankan xev di server X yang kosong (mis. Jalankan saja xinit -- :1, yang seharusnya memberi Anda server X hanya dengan xterm — bahkan tidak akan ada window manager yang berjalan. Keluar dari xterm akan menutup sesi).
  2. Anda baru saja melewatkan dua peristiwa dalam jumlah besar yang dikeluarkan xev.

Cara mudah, jika Anda tahu nama kuncinya

Kemungkinan lain: dapatkan kode kunci dari xmodmap:

anthony@Zia:~$ xmodmap -pk | grep -i alt
     64         0xffe9 (Alt_L)  0xffe7 (Meta_L) 0xffe9 (Alt_L)  0xffe7 (Meta_L)
    108         0xffea (Alt_R)  0xffe8 (Meta_R) 0xffea (Alt_R)  0xffe8 (Meta_R)
    204         0x0000 (NoSymbol)       0xffe9 (Alt_L)  0x0000 (NoSymbol)       0xffe9 (Alt_L)
anthony@Zia:~$ xmodmap -pk | grep -i super
    133         0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)
    134         0xffec (Super_R)        0x0000 (NoSymbol)       0xffec (Super_R)
    206         0x0000 (NoSymbol)       0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)

Ada 64 dan 108 lagi. xmodmap -pmakan menunjukkan kepada Anda hanya peta pengubah, yang juga memberi Anda angka (meskipun, kali ini, dalam hex).

derobert
sumber
15

Saya "mendeteksi" tiga masalah dalam pertanyaan Anda:

  1. Mengapa xevdan showkeymelaporkan kode kunci yang berbeda untuk suatu kunci?
  2. Mengapa xevtidak terlihat Altditekan dengan benar?
  3. Bagaimana cara bertukar Altdan Win?

Mengenai pertanyaan pertama: hari-hari ini, di mana "driver" keyboard di X tidak benar-benar menggerakkan perangkat keras, ia hanya bisa melewatkan kode kunci dari kernel ke inti X, tetapi ternyata tidak. Ia menambahkan 8 ke kode kunci sebelum meneruskannya.

Kedua: Sesuatu di sesi X Anda adalah meraih Altacara. Jawaban lain sudah mencakup ini. (Yaitu xevtidak mendapatkan acara yang ingin Anda lihat). Pelakunya mungkin terkait dengan manajer jendela Anda. Coba sesi X yang lebih telanjang.

Ketiga: Jangan gunakan xmodmap. Itu sudah usang selama satu dekade. Orang-orang baru adalah XKB dan alatnya setxkbmap.

$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    caps:backspace

Untuk bertukar Altdan Winsudah ada opsi yang disiapkan di XKB. Tambahkan saja:

$ setxkbmap -option altwin:swap_alt_win
$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    altwin:swap_alt_win,caps:backspace
Robert Siemer
sumber
Bagaimana Anda membuat setxkbmapperubahan itu permanen?
Steve Kehlet
Tambahkan perubahan ke ~/.xinitrc.
Matthias Braun
11

Sebagai root, jalankan:

showkey -s

... untuk melihat apa kode sandi untuk kunci misteri Anda. Saya mendapat sesuatu seperti ini:

# showkey -s
kb mode was RAW
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s after last keypress)...

0xc6 
0x46 0xc6 
0xc6 
0x46 0xc6 
0x46 

Tidak yakin mengapa tampaknya satu kunci menghasilkan dua scancode. Itu bukan hal keydown / keyup, sejauh yang saya tahu dari pola. Perhatikan peringatannya, jadi Anda mungkin ingin menjalankan ini dalam mode satu pengguna.

Saya menduga 0x46 adalah kode kunci saya.

Selanjutnya, cari kode kunci yang tidak digunakan dengan:

xmodmap -pke | less

Di sini Anda dapat melihat kode kunci 97 tidak digunakan di sistem saya:

keycode  94 = less greater less greater bar brokenbar
keycode  95 = F11 XF86Switch_VT_11 F11 XF86Switch_VT_11
keycode  96 = F12 XF86Switch_VT_12 F12 XF86Switch_VT_12
keycode  97 =
keycode  98 = Katakana NoSymbol Katakana
keycode  99 = Hiragana NoSymbol Hiragana

Keycode X menggunakan dan keycode yang digunakan kernel OFF OLEH 8 karena "alasan historis". Jadi ambil 97 - 8 = 89 dan gunakan 89 dengan perintah setkeycodes (sekali lagi sebagai root):

# setkeycodes 46 89

Dan Anda harus siap. Konfirmasikan dengan xev bahwa Anda mendapatkan Keypress Event dengan kode kunci 97. (meskipun begitu saya memberi tahu file kunci Fluxbox untuk menggunakan kode kunci itu, saya tidak mendapatkan acara KeyPress lagi - mungkin karena Fluxbox menelannya saat menggunakannya?)

Perhatikan bahwa 'setkeycodes' tidak akan selamat dari reboot, jadi Anda harus menambahkannya ke skrip init Anda (mis. Di /etc/rc.local)

Greg
sumber
1
Apakah Anda memiliki petunjuk tentang "mati sebelum jam 8 karena alasan historis"?
Robert Siemer
Saya menggunakan jawaban Anda untuk memetakan caps-lock ke tombol fungsi (khusus F9). Ini memungkinkan saya menggunakan F9 sebagai kunci awalan di tmux. Terima kasih.
Raymond Kroeker
@RobertSiemer tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html "Seringkali angka X akan menjadi 8 lebih dari angka Linux." Kata-kata saya dengan "historis" pastilah dari halaman lain.
Greg Bell
11

Saya mencoba menyelesaikan ini untuk diri saya sendiri dan saya baru saja menemukan jawabannya.

Masalah utama adalah bahwa Anda tidak mendapatkan acara untuk penekanan tombol. Melihat log yang Anda kirim alasannya jelas.

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 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   

Anda dapat melihat para Focus{In,Out}peristiwa memiliki modedari Notify{Grab,Ungrab}. Ini menunjukkan bahwa kunci ditangani oleh proses lain (mungkin aplikasi pintas / pengikat tombol).

Dalam kasus saya itu adalah xbindkeys, tetapi jika Anda menggunakan lingkungan desktop mereka mungkin memiliki sistem keybinding. Untuk melihat acara ini adalah xev, Anda harus menghentikan / menonaktifkan program lain.

Jika Anda tidak dapat menentukan program apa yang mencuri peristiwa penting, solusi terbaik adalah memulai sesi X lainnya tanpa menjalankannya. Jalankan perintah berikut untuk memulai sesi X lain pada layar :1, jika itu sudah diambil, tambah saja jumlahnya di akhir. Anda tentu saja dapat mengubah terminal ke apa pun yang Anda inginkan atau telah diinstal pada sistem Anda.

xinit /usr/bin/xterm -- :1

Kemudian jalankan xevlagi. Itu akan memberi Anda hasilnya tanpa tertangkap oleh program lain. Perhatikan bahwa window manager yang memulai adalah hover-focus, jadi Anda harus meletakkan kursor Anda di atas jendela xev agar kunci dapat diambil.


Seperti yang dikatakan dalam jawaban yang bagus oleh dubiousjim , kode kunci itu berbeda karena ada banyak lapisan antara xev dan kernel.

Kevin Cox
sumber
4

Saya memiliki masalah yang sama dengan Alt_Lmenghilang di XUbuntu 14.04 ( Alt_Rbaik-baik saja). Setelah banyak bermain, saya mengamati bahwa showkeymerekam keystroke, tetapi xevtidak --- itu pasti sesuatu di sistem jendela. Saya menjelajahi semua pengaturan "Window Manager" dan "Window Manager Tweaks", dan tidak menemukan apa pun. Akhirnya, saya menemukan nyasar Alt_Ldi daftar pintasan keyboard ( xfce4-keyboard-shortcuts) di "Pengaturan Editor". Saya "mengatur ulang" itu, dan saya Alt_Lmendukung saya ! Alt_LPintasan tersesat tidak muncul di tempat lain kecuali di "Editor Pengaturan".

Paul Price
sumber