Linux altında tuşları yalnızca belirli bir klavye için yeniden eşleme


18

Yakın zamanda takas edilmiş sağ alt ve Windows tuşları ile birlikte gelen bir Unicomp klavye satın aldım. Klavye lsusb'de şu şekilde tanımlanır:

Bus 003 Device 002: ID 17f6:0822 Unicomp, Inc 

Çekirdek (yani xmodmap tabanlı değil) sağ alt ve windows tuşlarını değiştirmenin bir yolu var mı? ? Bunu sadece bu klavye için almanın bir yolu var mı?


Klavyenin seri numarasını eşleştirerek ve ardından yeniden eşleme yapan bir komut dosyası çağırarak udev ile yapabileceğinizden şüpheleniyorum. Cihazın geri koyması için bağımsız olarak çağırılmak üzere benzer bir komut dosyasına ihtiyacınız olabilir.
reçel

1
@jam Bu, bağlı tüm klavyeleri yeniden eşler mi? Linux'un o kadar esnek olduğunu hayal bile edemiyorum, tüm bağlı (USB) klavyeler için sadece bir eşleme tablosu yönetebiliyor.
FUZxxl

@jam Ek olarak, gerçek değişimin nasıl yapılacağını açıklayabilirseniz gerçekten bana yardımcı olursunuz. Ben bu konuda yararlı bir şey bulmak başaramadı, sadece xmodmap şeyler (ki ben kullanmak istemiyorum).
FUZxxl

Eğer xmodmap kullanmak istemiyorsanız, sorduğunuz şey, bilgim için özür dilerim. Önerdiğim yöntem, klavyenin bağlı olduğu süre boyunca bu tuşların tuş kodlarını tüm aygıtlar için değiştirmek için xmodmap kullanır ve sonra geri koyar. Aynı anda birden fazla klavye kullanmayı bekliyor musunuz?
reçel

@jam Xmodmap kullansaydım, X sunucusu istemciye çevrilmemiş anahtar kodları gönderdiği için X programları yine de yanlış anahtar kodlarını görür. Bu, örneğin video oyunları için önemlidir. Çekirdekte, tarama kodlarını okuyan uygulamalarla hayatımı daha karmaşık hale getirmeyen bir çözüm olması gerekiyordu.
FUZxxl

Yanıtlar:


27

Evet, XKB kullanmak mümkündür. Xmodmap'ın aksine, XKB anahtarlarınızı tek tek cihazlar için yeniden eşleyebilir.

Not: xkbcomp> 1.2.0 olduğundan emin olun

İlk önce cihazlarınızı aşağıdakilerle listeleyin:

xinput list

Bunun gibi bir şey elde edersiniz:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen stylus               id=11   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger touch             id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=13   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen eraser               id=14   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger pad               id=15   [slave  pointer  (2)]
⎜   ↳ GASIA USB KB V11                          id=17   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=8    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=9    [slave  keyboard (3)]
    ↳ Logitech G19 Gaming Keyboard              id=10   [slave  keyboard (3)]
    ↳ GASIA USB KB V11                          id=16   [slave  keyboard (3)]

Aygıtınızın dizesini tanımlayın ve sed satırını aygıtınızın adına uyan bir satırla değiştirerek aşağıdaki kabuk komut dosyasını düzenleyin. Ardından yeniden eşlemeniz gereken tuşları değiştirin.

Örnek: xevYeniden eşlemek istediğiniz bir tuşu yükleyin ve basın. Anahtar kod 84'ü bulduğunuzu varsayalım . 84 numaralı telefondan https://gist.github.com/zoqaeski/3880640 adresinde arayın . Anahtar adı var <KP5>. Ardından, değiştirilmesini istediğiniz anahtarı arayın (aynı bağlantıda, daha aşağıda ) ve köşeli parantezlerin içindekileri kopyalayın. İstediğiniz tüm tuşlar için işlemi tekrarlayın.

remote_id=$(
    xinput list |
    sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit

# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control

mkdir -p /tmp/xkb/symbols
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
cat >/tmp/xkb/symbols/custom <<\EOF

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};
EOF

# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
#     we used above, in this case it's the "remote" definition
#     described in the file named "custom" which we specify in
#     this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
#     keyboard. This includes the file we just made, read in last,
#     so as to override any prior definitions.  Importantly we 
#     need to include the directory of the place we placed the file
#     to be considered when reading things in.
#
# Also notice that we aren't including exactly the 
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
# 
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
setxkbmap -device $remote_id -print \
 | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' \
 | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

Sonra kaynak (.xinitrc içine ekleyebilirsiniz). Hepsi tamam! Şimdi tuşlara basmak, yalnızca belirttiğiniz cihaz için istenen çıkışı üretmelidir.

Düzenleme : Son zamanlarda, bir nedenden dolayı, yeni yapılandırmanın hemen uygulanmadığını fark ettim. Önce diğer klavyenizdeki bir tuşa basmanız , ardından değiştirilmiş klavyenizdeki yapılandırılmış tuşları test etmeniz gerekir . Bunun neden olduğunu bilmiyorum, belki bir çeşit önbellek.


Bu klavyeyi kullandığım bilgisayara döndüğümde Pazartesi günü bunu deneyeyim.
FUZxxl

1
a) sed -n 's/.*G19 Gaming Keyboard.*id=\([0-9]*\).*keyboard.*/\1/p' c) Evet, önce $remote_idkimlik numarası ile değiştirerek mutlaka test etmelisiniz . Burada iki referans olduğunu unutmayın $remote_id, ikisini de değiştirdiniz mi?
Watcom

1
Oh, ve sabit kodlu test ederken $remote_id, [ "$remote_id" ] || exiteğer başka türlü yapmadıysanız , hattı yorumladığınızdan emin olun , sadece kurtarılacaktır.
Watcom

1
@ stats-hb $9çalışmaz, yani 9?
Watcom

1
bu benim için çalışıyor lampjs.wordpress.com/2015/06/26/…
usil

6

Buraya Google'dan gelen ve sorgulayıcının başlangıçta umduğu şeyle daha fazla yanıt isteyen herkes için, evdevdeğişikliğin tüm uygulamalar için geçerli olması için etkinlikleri düzeydeki yeniden eşlemenin iki yolunun farkındayım :

  1. udev, tarama kodları ve anahtar kodları arasındaki eşlemeleri kontrol eden donanım veritabanı girişlerini değiştirmek için bir API sağlar. Talimatları içeren bu ArchiWiki sayfası , hem X11 hem de konsol girişi için çalışacağını açıkça söylüyor.

    Amaç /etc/udev/hwdb.d/, bir aygıt eşleştirme düzeni ve bazı tarama kodu-anahtar kodu yeniden eşleme tanımlarından oluşan özel bir giriş oluşturmanız ve ardından systemd-hwdb updateveritabanını yeniden oluşturmak ve udevadm triggeryeniden başlatmadan uygulamaktır.

  2. Wayland'ın X11'in klavye alt sistemini kullanmadığı ve GNOME Shell ve Weston gibi büyük Wayland bestecilerinin libinput'un ilgili yönlerini yapılandırmak için UI uygulamadığı göz önüne alındığında, birisi sorunu Logitech için G15Daemon kullanıcı alanı sürücüsüne benzer şekilde çözen evdevremapkeys adlı bir arka plan yazdı G15 oyun klavyeleri.

    (Yeniden eşlemek istediği olayları yutar, böylece cihazı dinleyen başka hiçbir şey onları göremez, ardından uinputkullanıcı alanından çekirdek düzeyinde giriş aygıtları oluşturmak için API aracılığıyla düzeltilmiş olayları yayınlar.)


Burada
DuckDuckGo

0

@Watcom seçeneği ile başarılı olamayanlar için, yeni eşleme dosyanızı aşağıdaki gibi koyun:

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};

/ usr / share / X11 / xkb / semboller / için belki kök (ubuntu, dağıtımınız için farklı olabilir), 'özel' dosyasını arayın. Geçerli düzen dizenizi isteyin setxkbmap -device <device id> -print | grep xkb_symbolsve ekleyin +custom. Yeniden düzenlenmiş tuşlarla ve değiştirilmiş düzen dizesiyle yeni düzeni ayarlayın:

setxkbmap -device <device id> -layout "us+ru:2+us:3+inet(evdev)+capslock(grouplock)+custom"

Efekt kalıcı değildir ve diğer klavye bağlandığında maalesef sıfırlanır, henüz nasıl düzeltileceğini bilmiyordu. Yukarıdaki komutu .bashrcyine de ekleyebilirsiniz , böylece gerekirse yeniden başlatma sırasında anahtarlar değiştirilir.

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.