Neden çalışmıyorlar
Göre ArchWiki makalesinde Bahsettiğiniz o:
X sunucusu , giriş aygıtından anahtar kodları alır ve bunları duruma ve key koduna dönüştürür
.
durumu X değiştiricilerinin (Ctrl / Shift / etc) bit maskesidir.
keysym ( /usr/include/X11/keysymdef.h
tam olarak ) tamsayıdır.
bir klavye düzeninin her tuşuyla ilişkili karakterleri veya işlevleri (ör. görünür gravür yoluyla) tanımlayın.
Her yazdırılabilir karakter kendi keysym gibi vardır plus
, a
, A
, veya
Cyrillic_a
, fakat diğer tuşlar da benzeri onların keysyms oluşturmak
Shift_L
, Left
ya da F1
.
Tuş basma / bırakma olaylarındaki uygulama tüm bu bilgileri alır.
Bazı uygulamalar Control_L
kendileri gibi anahtarları izler , diğerleri sadece durumdaki değiştirici bitleri arar .
Eğer bastığınızda Peki, olur AltGr+ j:
Siz basın AltGr. Uygulama 108 ( <RALT>
) ve 0xym03 ( ISO_Level3_Shift
) tuş takımı ile KeyPressed olayını alır , durum 0'dır.
Tuşuna basın j(değiştirici olmadan dvorak'ta “h” ile eşleşir). Uygulama, 44 ( <AC07>
), 0xym51 ( Left
) anahtar kodu ve durum 0x80 (Mod5 değiştirici açık) ile KeyPressed olayını alır .
Sen serbest bırak j. Uygulama, anahtar için <AC07>
/ Left
aynı parametrelerle KeyRelease olayını alır
.
Ardından AltGr, AltGr için KeyRelease olayını bırakın . (Bu arada, buradaki durum hala 0x80, ancak bu önemli değil.)
xev
Yardımcı programı çalıştırırsanız bu görülebilir .
Yani, her şey, uygulama Left
normal anahtarla <LEFT>
aynı key kodunu ( ) alsa da, AltGr'den key kodunu ve değiştirici durumunu da alır. Büyük olasılıkla, çalışmayan, değiştiricileri izleyen ve bazıları aktifken çalışmak istemeyen programlar.
Onları nasıl çalıştırabilirim?
Görünüşe göre, her programı değiştiricileri aramayacak şekilde değiştiremeyiz. Bu durumda, bu durumdan kaçmanın tek yolu, değiştiricilerin anahtar sözcüklerini ve durum bitlerini oluşturmamaktır.
1. Ayrı grup
Benim akla gelen tek bir yöntemdir: tuşlarına basarak önce bu gruba, ayrı bir tuşa basarak, ayrı bir grup ve anahtar içinde bulunan imlecin hareket tuşları tanımlanır j, k, l, i( h
,
t
, n
, c
) (grup mandal tercih edilen bir yöntemdir anladığım kadarıyla bir zaman grubu değişikliği için).
Örneğin:
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compatibility {
include "complete"
interpret ISO_Group_Latch { action = LatchGroup(group=2); };
};
xkb_symbols {
include "pc+us(dvorak)+inet(evdev)"
key <RALT> { [ ISO_Group_Latch ] };
key <AC07> {
type[Group2] = "ONE_LEVEL",
symbols[Group2] = [ Left ]
};
key <AC08> {
type[Group2] = "ONE_LEVEL",
symbols[Group2] = [ Down ]
};
key <AC09> {
type[Group2] = "ONE_LEVEL",
symbols[Group2] = [ Right ]
};
key <AD08> {
type[Group2] = "ONE_LEVEL",
symbols[Group2] = [ Up ]
};
};
xkb_geometry { include "pc(pc104)" };
};
Şimdi, önce AltGrhareket tuşlarından birine ve sonra (ayrı ayrı) basarsanız , bu işe yarayacaktır.
Ancak, bu çok yararlı değildir LockGroup
, mandal yerine daha uygun olacaktır ve grup geçişinden önce ve sonra AltGr tuşuna basın. Daha da iyisi olabilir SetGroup
- o zaman AltGr bu grubu sadece basıldığında seçer, ancak bu uygulama AltGr'ın keyfisini ( ISO_Group_Shift
/ ISO_Group_Latch
/ tanımlanmış ne olursa olsun) açıklar (ancak değiştirici durumu temiz kalır).
Ancak ... uygulamanın aynı zamanda anahtar kodlarını da (gerçek anahtarların kodları) okuma olasılığı kalmıştır. Sonra “sahte” imleç tuşlarını görecektir.
2. Kaplama
Daha “düşük seviyeli” çözüm kaplamadır (aynı makalede
açıklandığı gibi).
Kaplama , bazı (gerçek klavye) tuşlarının başka bir tuşun tuş kodunu döndürmesi anlamına gelir. X sunucusu bir anahtarın anahtar kodunu değiştirir ve bu yeni anahtar kodunun değiştirici durumunu ve anahtar kodunu hesaplar, böylece uygulama değişikliği fark etmemelidir.
Ancak yer paylaşımları çok sınırlıdır:
- X sunucusunda yalnızca 2 kaplama kontrol biti vardır (yani maksimum 2 kaplama olabilir).
- Her anahtarın yalnızca 1 alternatif anahtar kodu olabilir.
Geri kalanlara gelince, uygulama ayrı bir grupla yönteme oldukça benzer:
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compatibility {
include "complete"
interpret Overlay1_Enable {
action = SetControls(controls=overlay1);
};
};
xkb_symbols {
include "pc+us(dvorak)+inet(evdev)"
key <RALT> {
type[Group1] = "ONE_LEVEL",
symbols[Group1] = [ Overlay1_Enable ]
};
key <AC07> { overlay1 = <LEFT> };
key <AC08> { overlay1 = <DOWN> };
key <AC09> { overlay1 = <RGHT> };
key <AD08> { overlay1 = <UP> };
};
xkb_geometry { include "pc(pc104)" };
};
SetControls
, tuşa basılıyken kontrol bitini değiştirmek ve tuş bırakmada geri yüklemek anlamına gelir. Benzer bir işlev olmalı LatchControls
, ama
xkbcomp
bana
Error: Unknown action LatchControls
keymap derlemesinde.
(Bu arada, ben de dvorak kullanıyorum ve ayrıca bazı hareket tuş takımlarını yüksek alfabetik tuşlara yeniden eşledim. Ayrıca bazı kırık işlevlerle de karşılaştım (Xfce notlarında seçim ve Ctrl-Alt-Sol / Sağ tarafından masaüstü anahtarı). sorunuzu ve bu cevabınızı, şimdi bindirmenin ne olduğunu biliyorum :).)