Mengapa mereka tidak berfungsi
Menurut artikel ArchWiki yang Anda sebutkan:
-
Server X mendapatkan kode kunci dari perangkat input dan mengonversinya kestatus dan keysym .
-
negara adalah bitmask dari pengubah X (Ctrl/Shift/dll).
-
keysym adalah (menurut
/usr/include/X11/keysymdef.h
) bilangan bulat yangmengidentifikasi karakter atau fungsi yang terkait dengan setiap tombol (mis., melalui ukiran yang terlihat) dari tata letak keyboard.
Setiap karakter yang dapat dicetak memiliki kuncinya sendiri, seperti
plus
,a
,A
, atauCyrillic_a
, tetapi kunci lain juga menghasilkan simbol kuncinya, sepertiShift_L
,Left
atauF1
.
-
-
Aplikasi di acara pers/rilis utama mendapatkan semua informasi ini.
Beberapa aplikasi melacak keyyms seperti
Control_L
sendiri, yang lain hanya mencari bit pengubah di status .
Jadi apa yang terjadi, ketika Anda menekan AltGr +j :
-
Anda menekan AltGr . Aplikasi mendapatkan acara KeyPressed dengan keycode108 (
<RALT>
) dan keyym 0xfe03 (ISO_Level3_Shift
), statusnya adalah 0. -
Anda menekan j (yang memetakan ke “h” di dvorak tanpa pengubah). Aplikasi mendapatkan acara KeyPressed dengan kode kunci 44 (
<AC07>
), keyym 0xff51(Left
) dan nyatakan 0x80 (pengubah Mod5 aktif). -
Anda melepaskan j . Aplikasi mendapatkan event KeyRelease untuk key
<AC07>
/Left
dengan parameter yang sama. -
Kemudian lepaskan AltGr — Acara KeyRelease untuk AltGr. (Ngomong-ngomong, status di sini masih 0x80, tapi itu tidak masalah.)
Ini bisa dilihat jika Anda menjalankan xev
utilitas.
Jadi, itu artinya, meskipun aplikasi mendapatkan kode keyym yang sama (Left
) seperti dari kunci normal <LEFT>
, itu juga mendapatkan kode kunci dan status pengubah dari AltGr. Kemungkinan besar, program-program yang tidak berfungsi, perhatikan pengubahnya dan tidak ingin berfungsi saat ada yang aktif.
Cara membuatnya berfungsi
Rupanya, kami tidak dapat mengubah setiap program untuk tidak mencari pengubah. Maka satu-satunya pilihan untuk keluar dari situasi ini adalah dengan tidak membuat simbol kunci dan bit status pengubah.
1. Grup terpisah
Satu-satunya metode yang muncul di benak saya adalah:menentukan tombol gerakan kursor dalam grup terpisah dan beralih, dengan penekanan tombol terpisah, ke grup tersebut sebelum menekan tombol j , k , l , i (h
,t
, n
, c
) (penguncian grup adalah metode yang lebih disukai untuk satu kali perubahan grup, seperti yang saya mengerti).
Misalnya:
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 AltGr lalu (secara terpisah) salah satu tombol gerakan, ini akan berfungsi.
Namun, ini tidak terlalu berguna, lebih tepat untuk LockGroup
alih-alih kait dan tekan AltGr sebelum dan sesudah beralih grup. Lebih baik lagi mungkin ke SetGroup
— kemudian AltGr akan memilih grup itu hanya saat ditekan, tetapi itu membuka kunci aplikasi AltGr(ISO_Group_Shift
/ISO_Group_Latch
/apa pun yang didefinisikan) (tetapi status pengubah tetap bersih).
Tapi... ada juga kemungkinan bahwa aplikasi juga membaca kode kunci (kode kunci sebenarnya). Kemudian ia akan melihat tombol kursor "palsu".
2. Hamparan
Solusi yang lebih “tingkat rendah” adalah hamparan (seperti yang dijelaskan oleh artikel yang sama).
Hamparan hanya berarti bahwa beberapa tombol (keyboard asli) mengembalikan kode kunci dari tombol lain. Server X mengubah kode kunci dari sebuah kunci dan menghitung status pengubah dan simbol kunci untuk kode kunci baru tersebut, sehingga aplikasi tidak akan menyadari perubahan tersebut.
Namun overlay sangat terbatas:
- Hanya ada 2 bit kontrol overlay di server X (maksimum ada 2 overlay).
- Setiap kunci hanya dapat memiliki 1 kode kunci alternatif.
Selebihnya, penerapannya 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 pelepasan kunci. Seharusnya ada fungsi serupa LatchControls
, tapixkbcomp
memberi saya
Error: Unknown action LatchControls
pada kompilasi keymap.
(Ngomong-ngomong, saya juga menggunakan dvorak dan juga telah memetakan ulang beberapa simbol tombol gerakan ke tombol alfabet tingkat tinggi. Dan juga menemukan beberapa fungsi yang rusak (pilihan dalam catatan Xfce dan sakelar desktop dengan Ctrl-Alt-Kiri/Kanan). Terima kasih atas pertanyaan Anda dan jawaban ini, sekarang saya tahu apa itu overlay :).)
Cara membuatnya bekerja - Solusi 3
Menggunakan Level tambahan dan Action RedirectKey
Solusi berikut menggunakan tombol Alt kiri untuk menyediakan tombol kursor di jkli, Beranda/Akhir/PageUp/PageDown di uopö, dan Hapus di Backspace.
Tombol Alt kiri tetap dapat digunakan untuk keperluan lain untuk semua tombol lainnya (seperti untuk menu aplikasi). Alt kiri (Mod1) dihapus dari status pengubah saat blok kursor digunakan sehingga aplikasi tidak dapat melihatnya.
xkb_keymap {
xkb_keycodes {
include "evdev+aliases(qwertz)"
};
xkb_types {
include "complete"
};
xkb_compat {
include "complete"
interpret osfLeft {
action = RedirectKey(keycode=<LEFT>, clearmodifiers=Mod1);
};
interpret osfRight {
action = RedirectKey(keycode=<RGHT>, clearmodifiers=Mod1);
};
interpret osfUp {
action = RedirectKey(keycode=<UP>, clearmodifiers=Mod1);
};
interpret osfDown {
action = RedirectKey(keycode=<DOWN>, clearmodifiers=Mod1);
};
interpret osfBeginLine {
action = RedirectKey(keycode=<HOME>, clearmodifiers=Mod1);
};
interpret osfEndLine {
action = RedirectKey(keycode=<END>, clearmodifiers=Mod1);
};
interpret osfPageUp {
action = RedirectKey(keycode=<PGUP>, clearmodifiers=Mod1);
};
interpret osfPageDown {
action = RedirectKey(keycode=<PGDN>, clearmodifiers=Mod1);
};
interpret osfDelete {
action = RedirectKey(keycode=<DELE>, clearmodifiers=Mod1);
};
};
xkb_symbols {
include "pc+de(nodeadkeys)"
include "inet(evdev)"
include "compose(rwin)"
key <LALT> {
type[Group1] = "ONE_LEVEL",
symbols[Group1] = [ ISO_Level5_Shift ]
};
modifier_map Mod1 { <LALT> };
key <AC07> {
type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1] = [ j, J, dead_belowdot, dead_abovedot, osfLeft, osfLeft, osfLeft, osfLeft ]
};
key <AC08> {
type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1] = [ k, K, kra, ampersand, osfDown, osfDown, osfDown, osfDown ]
};
key <AC09> {
type[Group1] = "EIGHT_LEVEL_ALPHABETIC",
symbols[Group1] = [ l, L, lstroke, Lstroke, osfRight, osfRight, osfRight, osfRight ]
};
key <AC10> {
type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1] = [ odiaeresis, Odiaeresis, doubleacute, doubleacute, osfPageDown, osfPageDown, osfPageDown, osfPageDown ]
};
key <AD07> {
type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1] = [ u, U, downarrow, uparrow, osfBeginLine, osfBeginLine, osfBeginLine, osfBeginLine ]
};
key <AD08> {
type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1] = [ i, I, rightarrow, idotless, osfUp, osfUp, osfUp, osfUp ]
};
key <AD09> {
type[Group1] = "EIGHT_LEVEL_ALPHABETIC",
symbols[Group1] = [ o, O, oslash, Oslash, osfEndLine, osfEndLine, osfEndLine, osfEndLine ]
};
key <AD10> {
type[Group1] = "EIGHT_LEVEL_ALPHABETIC",
symbols[Group1] = [ p, P, thorn, THORN, osfPageUp, osfPageUp, osfPageUp, osfPageUp ]
};
key <BKSP> {
type[Group1] = "EIGHT_LEVEL_ALPHABETIC",
symbols[Group1] = [ BackSpace, BackSpace, BackSpace, BackSpace, osfDelete, osfDelete, osfDelete, osfDelete ]
};
};
xkb_geometry {
include "pc(pc105)"
};
};
Saya memiliki masalah yang sama. Ini sangat menyakitkan.
Jadi judulnya adalah “Bagaimana membuat semua aplikasi menghargai tata letak xkb saya yang dimodifikasi?”. Yah, saya pikir satu-satunya cara adalah memperbaiki semua program yang salah melakukannya. Ayo lakukan itu!
Nah, setelah melaporkan bug itu di NetBeans (Pembaruan:Saya sudah mencoba versi terbaru dan berhasil sekarang! ), saya pikir saya akan terus melaporkan bug ini untuk setiap aplikasi. Aplikasi berikutnya dalam daftar adalah Speedcrunch .
Namun, setelah mencari laporan bug serupa saya menemukan masalah ini. Orang lain mengalami masalah yang sama, bagus!
Setelah membaca komentar, Anda akan memahami bahwa bug ini seharusnya ada di semua aplikasi QT. Ini adalah laporan bug QT. Belum terselesaikan, namun sepertinya masalah teratasi di Qt5 .
Namun, jika Anda melihat komentar, ada solusinya! Inilah cara kerjanya. Jika Anda melakukan ini:
key <SPCE> { [ ISO_Level3_Shift ] };
Kemudian Anda dapat mengubahnya menjadi ini:
key <SPCE> {
type[Group1]="ONE_LEVEL",
symbols[Group1] = [ ISO_Level3_Shift ]
};
Dan itu benar-benar akan memecahkan masalah untuk beberapa aplikasi! Misalnya, Speedcrunch sekarang bekerja untuk saya! Hore!
Ringkasan
Saat ini aplikasi apa pun harus berfungsi dengan benar. Jika tidak, maka Anda harus menggunakan type[Group1]="ONE_LEVEL"
. Jika Anda sudah memilikinya, maka Anda harus memperbarui perangkat lunak Anda. Jika masih tidak berfungsi, berarti ini khusus aplikasi dan Anda harus mengirimkan laporan bug.
PEMBARUAN (23-09-2017)
Sampai hari ini, semua aplikasi menghargai tata letak keyboard saya. Semua kecuali satu.
Serius, penanganan keyboard di Chromium adalah sampah . Ada beberapa masalah dengannya:
- Pemilihan shift tidak dengan tombol panah khusus (tetapi tombol panah itu sendiri berfungsi dengan baik)
- Jika Anda memiliki beberapa tata letak dan pada salah satu tata letak beberapa kunci bersifat khusus (misalnya panah, Backspace, dll.), maka pada tata letak lain kunci ini akan diperbaiki ke apa pun yang Anda miliki pada tata letak pertama Anda. Misalnya, jika Anda memiliki dua tata letak:
foo
,bar
dan beberapa tombol melakukan Backspace difoo
, maka itu akan tetap berfungsi sebagai Backspace dibar
bahkan jika itu didefinisikan ulang di sana.
Selama bertahun-tahun saya mengabaikan masalah ini hanya dengan tidak menggunakan kromium. Namun, saat ini banyak hal cenderung menggunakan Electron, yang sayangnya dibangun di atas Chromium.
Cara yang tepat untuk menyelesaikan ini adalah dengan mengirimkan laporan bug di Chromium dan berharap yang terbaik. Saya tidak tahu berapa lama mereka akan menyelesaikan masalah yang hanya mempengaruhi beberapa pengguna… tapi sepertinya itu satu-satunya jalan keluar. Masalahnya adalah chromium sebenarnya berfungsi dengan baik dengan neo(de)
tata letak. Tata letak Neo memiliki tombol panah di level5, tetapi saya tidak dapat membuatnya berfungsi di tata letak khusus saya.
Laporan bug yang masih terbuka:
- Pluma – https://github.com/mate-desktop/pluma/issues/17