Kenapa mereka tidak bekerja?
Menurut artikel ArchWiki yang Anda sebutkan:
Server X mendapatkan kode kunci dari perangkat input dan mengubahnya menjadi
status dan kunci .
state adalah bitmask dari pengubah X (Ctrl / Shift / etc).
keysym adalah (menurut /usr/include/X11/keysymdef.h
) bilangan bulat itu
mengidentifikasi karakter atau fungsi yang terkait dengan setiap tombol (misalnya, melalui ukiran yang terlihat) dari tata letak keyboard.
Setiap karakter dicetak memiliki Keysym sendiri, seperti plus
, a
, A
, atau
Cyrillic_a
, tetapi kunci lain juga menghasilkan Keysyms mereka, seperti
Shift_L
, Left
atau F1
.
Aplikasi dalam acara pers / pelepasan kunci mendapatkan semua informasi ini.
Beberapa aplikasi melacak keyyms seperti Control_L
sendiri, yang lain hanya mencari bit pengubah di negara bagian .
Jadi apa yang terjadi, ketika Anda menekan AltGr+ j:
Anda menekan AltGr. Aplikasi mendapat acara KeyPressed dengan kode kunci 108 ( <RALT>
) dan keysym 0xfe03 ( ISO_Level3_Shift
), menyatakan 0.
Anda menekan j(yang memetakan ke "h" di dvorak tanpa pengubah). Aplikasi mendapat acara KeyPressed dengan kode kunci 44 ( <AC07>
), keysym 0xff51 ( Left
) dan status 0x80 (modifier Mod5 aktif).
Anda lepaskan j. Aplikasi mendapat acara KeyRelease untuk kunci
<AC07>
/ Left
dengan parameter yang sama.
Kemudian lepaskan AltGr- acara KeyRelease untuk AltGr. (Omong-omong, keadaan di sini masih 0x80, tapi itu tidak masalah.)
Ini bisa dilihat jika Anda menjalankan xev
utilitas.
Jadi, itu semua berarti bahwa, meskipun aplikasi mendapatkan kode keysym yang sama ( Left
) seperti dari tombol normal <LEFT>
, ia juga mendapatkan kode keysym dan status pengubah dari AltGr. Kemungkinan besar, program-program yang tidak berfungsi, menonton modifikator dan tidak ingin bekerja ketika beberapa aktif.
Cara membuatnya bekerja
Tampaknya, kami tidak dapat mengubah setiap program untuk tidak mencari pengubah. Maka satu-satunya pilihan untuk keluar dari situasi ini adalah untuk tidak menghasilkan kunci pengubah dan bit negara.
1. Kelompok terpisah
Satu-satunya metode yang datang ke pikiran saya adalah: mendefinisikan kunci gerakan kursor dalam kelompok dan saklar yang terpisah, dengan tekan tombol terpisah, untuk kelompok yang sebelum menekan tombol j, k, l, i( h
,
t
, n
, c
) (kelompok menempel adalah metode yang disukai untuk satu kali perubahan grup, seperti yang saya mengerti).
Sebagai contoh:
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)" };
};
Sekarang, jika Anda pertama kali menekan AltGrdan kemudian (secara terpisah) salah satu tombol gerakan, ini akan berfungsi.
Namun, ini tidak terlalu berguna, lebih tepat LockGroup
daripada kait dan tekan AltGr sebelum dan sesudah beralih kelompok. Bahkan mungkin lebih baik untuk SetGroup
- maka AltGr akan memilih grup itu hanya ketika sedang ditekan, tetapi yang mengungkapkan ke aplikasi keysym AltGr ( ISO_Group_Shift
/ ISO_Group_Latch
/ apa pun yang didefinisikan) (tetapi negara pengubah tetap bersih).
Tapi ... ada juga kemungkinan bahwa aplikasi tersebut juga membaca kode kunci (kode dari kunci asli). Maka akan terlihat kunci kursor "palsu".
2. Hamparan
Solusi "tingkat rendah" yang lebih banyak adalah overlay (seperti yang
dijelaskan artikel yang sama ).
Overlay berarti bahwa beberapa (keyboard nyata) kunci mengembalikan kode kunci tombol lain. Server X mengubah kode kunci dan menghitung status pengubah dan kode kunci untuk kode kunci baru tersebut, sehingga aplikasi tidak akan memperhatikan perubahan tersebut.
Namun overlay sangat terbatas:
- Hanya ada 2 bit kontrol overlay di server X (yaitu maksimum 2 overlay).
- Setiap kunci hanya dapat memiliki 1 kode kunci alternatif.
Adapun sisanya, implementasi sangat mirip dengan metode dengan grup terpisah:
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
berarti mengubah bit kontrol saat tombol ditekan dan mengembalikannya pada rilis kunci. Seharusnya ada fungsi yang serupa LatchControls
, tetapi
xkbcomp
memberi saya
Error: Unknown action LatchControls
pada kompilasi keymap.
(Ngomong-ngomong, saya juga menggunakan dvorak dan juga telah memetakan kembali beberapa tombol gerakan ke tingkat tinggi dari tombol alfabet. Dan juga menemukan beberapa fungsi yang rusak (pemilihan catatan Xfce dan pergantian desktop dengan Ctrl-Alt-Kiri / Kanan). Terima kasih kepada pertanyaan Anda dan jawaban ini, sekarang saya tahu apa itu overlay :).)