klavye sabit yeniden eşleme tuşları?


19

Klavye tuşlarını zorla yeniden eşleştirmenin bir yolunu bulmaya çalışıyorum.
Ben xmodmap ve setxkbmap kullanmayı denedim, ancak belirli bir uygulama için çalışmıyor. Bu tür komutlar X tho'daki diğer normal pencereli / uygulamalar için çalışır.

Bence uygulama klavye ham verilerini okuyor ve X girişini yok sayıyor olabilir mi?

Peki, xmodmap ve setxkbmap kullanmadan anahtarları nasıl yeniden eşleyebilirim? bazı yazılımlar kullanılarak yapılması mümkün ise.

Ayrıca xkeycaps, xkbcomp'ı denedim, ancak X üzerinde çalıştığı için loadkey'leri denemedim.

Burada deneyebileceğimi buldum setkeycodes, "çünkü çekirdek anahtar kodunu atadıktan sonra düğme xorg'da çalışmalı" , ama aynı zamanda "USB klavyelerde 'setkeycode'ları kullanamazsınız" , bu benim durumumla ilgileniyorum Birisi ben bir adaptör kullanabilirsiniz düşünüyorum gibi ps2 üzerinde çalışmasını sağlamak).

Bu, umut verici "
Tarama kodlarını anahtar kodlarına eşleştir " gibi görünüyordu , ancak birkaç testten sonra hiçbir şey değişmedi, işte bunlar: vt1'de "36" ("j" tuşu) anahtar kodunu showkey
"7e" (tuş takımı ".") Buldum vt1 ileshowkey --scancodes

$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..

Obs .: ile de çalışmadı: KEYBOARD_KEY_7e=j

Anahtarları bulmak için başka alternatif yollar (@ vinc17 ile):
evtest /dev/input/by-id/... veya
input-kbd 3( ls -l /dev/input/by-id/*ör. Event3'te bulunan kimlik dizinini yerleştirin )

Not: * Kendinizi test etmekle ilgileniyorsanız, uygulama için ilgili konu şudur: http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ Sorunlar I aynı: bazı anahtarlar (KP_Decimal, DownArrow, UpArrow, RightArrow) yok sayılır ve hepsi aynı değerde "0x00" olarak kabul edilir


Güncellenmiş dosyası olmalıdır /etc/udev/hwdb.bin, değil /lib/udev/hwdb.bin. Ancak bu dosya doğru bir şekilde güncellenmiş olsa da, bu yeniden başlatmadan sonra bile benim için çalışmıyor. Belgelerde eksik olan bir şey olabilir. Bu konuda: bugs.freedesktop.org/show_bug.cgi?id=82311
vinc17

@ vinc17 gerçekten ilginç, en kısa sürede tekrar deneyeceğim, bu ayar dosyasını bulmamız ve taklit etmeye çalışmamız gerektiğini düşünüyorum, thx!
Kova Gücü

1
Benim sorunum KEYBOARD_KEY_ satırları tek bir yerine 2 boşluk ile başladı gerçeği (bu belgelenmedi ve hiçbir hata mesajı var!). Senin için bilmiyorum, ama USB showkey --scancodesklavyemle udev'in beklediği tarama kodlarını vermiyor (değerler farklı); input-kbdprogramı doğru scancodes verir.
vinc17

1
Yardımcı evtestprogram da size doğru tarama kodlarını vermelidir: bir anahtar yazdıktan sonra, 2 satır almalısınız ve ilki formun bir şeyiyle bitmelidir code 4 (MSC_SCAN), value xxx, burada xxxtarama kodu. Ama klavyemin sürücüsü buggy ve MSC_SCANtekrarlamak istediğim bazı tuşlar için bu satırı alamıyorum . Bu yüzden input-kbd, seçili cihaz için tüm tarama kodlarını listeleyen kullandım .
vinc17

1
Bir cevaba ayrıntılı bilgi gönderdim. Şimdi, 36 veya 7002c'nin bir değer olarak çalıştığından emin değilim. Anahtar kodu tanımlayıcısına ihtiyacınız olduğunu düşünüyorum. Cevabımı gör.
vinc17

Yanıtlar:


17

Öncelikle yeniden kullanılması gereken anahtarın tarama kodunu bulun, örneğin evtestyardımcı programla. Aşağıdaki gibi bir çizgi ( MSC_SCANiçinde) çıkarılmalıdır:

Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068

ardından geçerli anahtar kodunu veren ikinci bir kod gelir. Herhangi bir MSC_SCANsatır çıkmazsa , bunun nedeni çekirdek sürücüsü hatasıdır, ancak tarama kodu input-kbdyardımcı programla hala bulunabilir ; çıkışta evtestkarşılık gelen satırı bulmanın kolay olması için anahtar kodu vermiş olmalıdır input-kbd(örn. kullanarak grep).

Yeniden eşlenecek anahtarların tarama kodları belirlendikten sonra, yeniden kaldırmaları /etc/udev/hwdb.d/98-custom-keyboard.hwdbiçeren bir dosya oluşturun . Dosyanın başlangıcı /lib/udev/hwdb.d/60-keyboard.hwdbbazı bilgiler verir. Benim durumumda (hangi çalışır), ben var:

evdev:input:b0003v05ACp0221*
 KEYBOARD_KEY_70035=102nd       # Left to z: backslash bar
 KEYBOARD_KEY_70064=grave       # Left to 1: grave notsign
 KEYBOARD_KEY_70068=insert      # F13: Insert

(Udev 220'den önce keyboard:usb:v05ACp0221*ilk satır için kullanmak zorunda kaldım .)

evdev:Dize satırın başında olmalıdır. Satıcı ve ürün kimliğindeki harflerin büyük harf olması gerektiğini unutmayın. Her KEYBOARD_KEY_ayarın önünde tam olarak bir boşluk olmalıdır (not: boşluğu olmayan bir satır hata mesajı verir ve iki boşluklu bir satır eski udev sürümleriyle sessizce yoksayılır). KEYBOARD_KEY_onaltılık (neyi ikisi gibi scancode takip eder evtestve input-kbd-ver). Geçerli değerler ya elde edilebilir evtestçıkışı ya da input-kbdçıkış arasında veya /usr/include/linux/input.hdosya: Örneğin, KEY_102NDverecek 102nd(kaldırarak KEY_yukarıda kullanılan olan ve küçük harfe dönüştürme).

Dosya kaydedildikten sonra şunu yazın:

udevadm hwdb --update

veritabanını (yeniden) oluşturmak /etc/udev/hwdb.bin(zaman damgasını kontrol edebilirsiniz). Sonra,

udevadm trigger --sysname-match="event*"

yeni ayarları dikkate alacaktır. İle kontrol edebilirsiniz evtest.

2014 yılında yayımlanan udev'in eksik / buggy bilgileri vardı /lib/udev/hwdb.d/60-keyboard.hwdb, ancak dosyanın en son geliştirme sürümüne ve / veya hata raporuma ve dokümantasyon ve boşluk sorunları ile ilgili tartışmamıza bakabilirsiniz .

Bu işe yaramazsa, udevdile günlük düzeyini geçici olarak artırdıktan sonra sorun bulunabilir udevadm control(ayrıntılar için udevadm (8) kılavuz sayfasına bakın).

udev204 gibi eski sürümler için bu yöntem yine de çalışmalıdır.


Udevadm komutlarını çalıştırdığımda güncellenen dosya /lib/udev/hwdb.bin, baktım blessve KEYBOARD_KEY_70085sonunda belirir. Ben ubuntu 14.04 bu şekilde yapılandırılmış (korumalı?) Düşünüyorum. Denedim udevadm control --log-priority=debug. lsusb(045e: 0750) tabanlı klavyem benzer keyboard:usb:v045ep0750*, ama ben de denedim keyboard:usb:v*p*. Benim tahminim bu /etc/udev/hwdb.bingüncellenmesi gerekir ama hatta yok.
Kova Gücü

Ben okurken burada ben bu komutu kullanıyordum gibi olması gerektiği udevadm hwdb --usr --updateben değildim rağmen.
Kova Gücü

Sonra udevadm hwdb --updateben kopyalanan /lib/udev/hwdb.biniçin /etc/udev/hwdb.binve ran strace udevadm trigger --sysname-match="event*"ve dosya hwdb.bin(bu eserleri gibi ise) onun tarafından okunmayan görünüyor.
Kova Gücü

1
@AquariusPower Evet, Ubuntu'ya özgü bir hata olabilir (Debian / kararsız kullanıyorum). Veritabanının bunu yaparken okunup okunmadığını udevadm trigger ...görmek için testime buradan bakın . Çalıştırmadan önce udevadm trigger ..., dosyanın değişiklik süresinin güncellendiğinden emin olmanız gerektiğini, aksi takdirde dosya okunduğunda erişim süresinin güncellenmeyeceğini unutmayın.
vinc17

1
@AquariusPower udevadm --version: 215 (ve udev paket sürümü: 215-7). Bu udevadm trigger ...nedenle, yeniden başlatmanız gerekmez (ayarları kaldırmak istemiyorsanız, AFAIK). Ancak herhangi bir etki olup olmadığını görmek için yeniden başlatmayı deneyebilirsiniz.
vinc17
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.