Xmodmap için anahtar kodlar nasıl alınır?


76

Dell L100 klavyesinde xmodmapyeniden eşleme Alt/ Supertuş kullanmaya çalışıyorum ve tuş kodlarını alma konusunda sorun yaşıyorum.

Örneğin, kullanmak xevbana anahtar kodunu vermiyorAlt

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   

İçin Right Superanahtarı xevve showkey- Farklı keycodes vermek 134ve 126sırasıyla.

Bu kodlara ne oluyor?

Anahtar kodları almayı showkey -kve xmodmapaşağıdaki dosyaları kullanmayı denedim , ancak bu banahtarın yeniden gönderildiği tuhaf bir harita verdi :

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

Alt_L ile ateşlenmiyorken de aynı sorunu yaşıyorum (ama Alt_R iyi), XUbuntu 14.04. Hangi sistemi kullanıyorsunuz?
Paul Price

Yanıtlar:


54

Klavyeniz ve klavye olayını işleyen işlem arasında çok fazla oyuncu var. Peyzajın ana bölümleri arasında, X sisteminin kendi klavye işleme katmanına sahip olduğu gerçeği var ve X, farklı "tuş kodlarını", Linux taban sisteminizden farklı tuşlarla ilişkilendirir. showkeyKomut size Linux-baz-sistem lingo keycodes gösteriyor. İçin xmodmapsen nesin X keycodes, ihtiyaç xevgörüntülüyor. X'te çalışmayı ve anahtarınızı yeniden bağlamayı planladığınız sürece xmodmap, görmezden gelin showkeysve sadece söylediklerini dinleyin xev.

xevÇıktınızda aramak istediğiniz şey bunun gibi bloklardır:

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

xevözellikle farenizi hareket ettirdiğinizde çok fazla çıktı üretme eğilimindedir. Aradığınız çıktıyı bulmak için bir süre geri gitmeniz gerekebilir. Önceki çıktıda, bunun keysym Alt_LX tuş koduyla ilişkilendirildiğini görüyoruz 64.


3
Sorun şu ki, Windows anahtarında KeyPress olayı alamadım. 3 farklı klavye ve aynı sonucu denedim. Xev'den yalnızca FocusOut, FocusIn ve KeymapNotify'ı yukarıda görüldüğü gibi alıyorum. Ancak, Gnome yöneticisi aracılığıyla kısayollar ayarlayabilirim ve Windows tuşunu "Mod4" olarak görüyor
Yaroslav Bulatov

Sağ Windows anahtarı Mod4 olarak rapor eder, Windows anahtar raporlarını Alt ... olarak bırakır.
Yaroslav Bulatov

Alt için Mod1'i deneyin.
dubiousjim

2
@YaroslavBulatov, masaüstü ortamınızın anahtarı yiyor (muhtemelen ana menüsünü getirmek için?)
derobert

3
Xev'in size verdiği olayları filtreleyebilirsiniz. Bu durumda xev -event keyboard, gürültünün çoğundan kurtulmak için yeterli olacaktır.
Fredrik Wendt

24

xev çalışmalı

Garip, benim xev alt için bir KeyPress ve KeyRelease olayı verir (ve burada "süper" olarak adlandırılan Windows anahtarı):

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

Ve sağ taraf:

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

İki olasılık görebiliyorum:

  1. Başka bir şey tamamen tuşa basmak veya alt tuşuna bastığınızda pencereyi odaklamak. Başka bir boş X sunucusunda xev'i çalıştırmayı deneyin (örneğin, yalnızca çalıştırın, yalnızca bir xterm'e sahip bir X sunucusu xinit -- :1edinmesi gerekir - çalışan bir pencere yöneticisi bile olmaz). Xterm'den çıkmak oturumu kapatacaktır).
  2. Az önce xev'in yaydığı toplu olaydaki iki olayı kaçırdınız.

Anahtar adını biliyorsanız, kolay bir yol

Başka bir olasılık: sadece xmodmap'tan kodları al:

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)

Yine 64 ve 108 var. xmodmap -pmSize sadece sayıları veren değiştirici haritasını göstereceğim (yine de bu kez hex cinsinden).


15

Sorunuzdaki üç sorunu "tespit ediyorum":

  1. Bir anahtar için neden farklı anahtar kodlar üretilir xevve showkeybildirilir?
  2. Neden düzgün şekilde basıldığını xevgöstermiyor Alt?
  3. Nasıl takas Altve Win?

İlk soruya gelince : X'teki "sürücü" klavyesi donanımı gerçekten kullanamadığı bu günlerde, tuş kodlarını çekirdekten X çekirdeğine geçebiliyor, ancak geçmiyor. Geçmeden önce anahtar koduna 8 ekler.

İkincisi: X oturumunuzdaki bir şey Altolayı kapıyor . Diğer cevaplar bunu zaten kapsıyor. (Yani xev, görmek istediğiniz etkinliği alamazsınız). Suçlu, pencere yöneticinizle ilgili olabilir. Daha çıplak bir X oturumu deneyin.

Üçüncüsü: Kullanmayın xmodmap. Bir on yıldır modası geçmiş oldu. Yeni adamlar XKB ve onun aracı setxkbmap.

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

Takas için Altve WinXKB'de hazırlanmış bir seçenek zaten var. Sadece ekleyin:

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

setxkbmapDeğişimi nasıl kalıcı kılıyorsunuz?
Steve Kehlet

Değişikliği için ekle ~/.xinitrc.
Matthias Braun

11

Kök olarak, koş:

showkey -s

... gizemli anahtarınız için tarama kodunun ne olduğunu görmek için. Bunun gibi bir şey var:

# 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 

Neden bir anahtarın iki tarama kodu oluşturduğundan emin değilsiniz. Bu, kalıptan söyleyebileceğim kadar yakın bir keydown / keyup meselesi değil. Uyarıya dikkat edin, böylece bunu tek kullanıcı modunda çalıştırmak isteyebilirsiniz.

Tahminim 0x46 benim tarama kodumdu.

Ardından, kullanılmayan bir anahtar kodu bulun:

xmodmap -pke | less

Burada benim sistemimde 97 anahtar kodunun kullanılmadığını görebilirsiniz:

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

X'in kullandığı anahtar kodu ve çekirdeğin kullandığı anahtar kodu, "tarihsel nedenlerden dolayı" KAPALI by 8'dir. Bu yüzden 97 - 8 = 89'u alın ve 89'u setkeycodes komutuyla kullanın (yine root olarak):

# setkeycodes 46 89

Ve ayarlanması gerekir. Xev ile 97 kodlu bir Keypress Etkinliği aldığınızı doğrulayın. (Bir kere Fluxbox tuşları dosyasına bu tuş kodunu kullanmasını söyledim, ancak artık KeyPress olayları alamadım - belki de bu yüzden Fluxbox onları kullandığında yutuyor?)

'Setkeycode' öğelerinin yeniden başlatma işleminde hayatta kalmayacağına dikkat edin, bu nedenle init komut dosyalarınıza eklemeniz gerekir (örn. /Etc/rc.local)


1
"Tarihi nedenlerden dolayı 8'e kadar" ile ilgili bir göstergeniz var mı?
Robert Siemer

Cevabınızı büyük harfle fonksiyon tuşunu (özellikle F9) eşlemek için kullandım. Bu, tmux'ta önek anahtarı olarak F9 kullanmama izin veriyor. Teşekkürler.
Raymond Kroeker,

@RobertSiemer tldp.org/HOWTO/Keyboard- ve- Console-HOWTO-15.html "X sayısı genellikle Linux numarasından 8 olacaktır." "Tarihsel" ifadem, başka bir sayfadan yapılmış olmalı.
Greg Bell,

11

Bunu kendim için çözmeye çalışıyordum ve çözdüm.

Asıl sorun, tuşa basma olayını alamamanızdır. Gönderdiğiniz kayıt defterine bakıldığında sebebi belli.

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   

Görebilirsiniz Focus{In,Out}olaylar var modeiçinde Notify{Grab,Ungrab}. Bu, bir anahtarın başka bir işlem tarafından işlendiğini gösterir (muhtemelen bir kısayol / tuş bağlama uygulaması).

Benim durumumda xbindkeys idi, ancak bir masaüstü ortamı kullanıyorsanız, muhtemelen bir anahtarlama sistemine sahipler. Bu olayları görebilmek için diğer programı durdurmanız / devre dışı bırakmanız gerekir.

Hangi programların önemli olayları çaldığını belirleyemiyorsanız, en iyi çözüm, başka bir X oturumunu çalıştırmadan başlatmaktır. Ekranda başka bir X oturumu başlatmak için aşağıdaki komutu çalıştırın :1, eğer zaten alınmışsa, sadece sayıyı arttırın. Elbette, terminali tercih ettiğiniz veya sisteminize kurduğunuz şekilde değiştirebilirsiniz.

xinit /usr/bin/xterm -- :1

Sonra xevtekrar koş . Bu, diğer programlar tarafından yakalanmadan size sonuç vermelidir. Başlayan pencere yöneticisinin odağın üstünde durduğunu unutmayın; bu nedenle, tuşların yakalanması için imlecinizi xev penceresinin üstüne getirmeniz gerekir.


Dedi gibi dubiousjim tarafından bu mükemmel cevap XEV ve çekirdek arasında tabakaların bir yeri vardır, çünkü, anahtar kodu farklıdır.


4

Alt_LXUbuntu 14.04'te ortadan kaybolma konusunda da aynı problem vardı ( Alt_Riyiydi). Çok fazla oyundan sonra showkey, tuş vuruşunu kaydettiğini gözlemledim , ancak xevyapmadım - bunun pencere sisteminde bir şey olması gerekmedi. Tüm "Pencere Yöneticisi" ve "Pencere Yöneticisi Tweaks" ayarlarını taradım ve hiçbir şey bulamadım. Sonunda, "Ayarlar Düzenleyicisi" ndeki Alt_Lklavye kısayolları listesinde bir yol buldum xfce4-keyboard-shortcuts. Bunu "sıfırladım" ve Alt_Lsırtım döndü Başıboş Alt_Lkısayol, "Ayarlar Düzenleyicisi" dışında başka hiçbir yerde görünmedi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.