Tại sao họ không làm việc
Theo bài viết của ArchWiki mà bạn đã đề cập:
Máy chủ X nhận mã khóa từ thiết bị đầu vào và chuyển đổi chúng sang
trạng thái và keyym .
trạng thái là bitmask của bộ sửa đổi X (Ctrl / Shift / etc).
keyym là (theo /usr/include/X11/keysymdef.h
) số nguyên mà
xác định các ký tự hoặc chức năng được liên kết với mỗi phím (ví dụ: thông qua khắc có thể nhìn thấy) của bố cục bàn phím.
Mỗi nhân vật có thể in được có keysym riêng của mình, giống như plus
, a
, A
, hay
Cyrillic_a
, nhưng các phím khác cũng tạo keysyms của họ, giống như
Shift_L
, Left
hoặc F1
.
Ứng dụng trong các sự kiện nhấn / phát hành chính có được tất cả các thông tin này.
Một số ứng dụng theo dõi các từ khóa giống như Control_L
chính chúng, một số khác chỉ tìm kiếm các bit sửa đổi trong trạng thái .
Vì vậy, những gì xảy ra, khi bạn nhấn AltGr+ j:
Bạn nhấn AltGr. Ứng dụng nhận sự kiện KeyPress với mã khóa 108 ( <RALT>
) và keyym 0xfe03 ( ISO_Level3_Shift
), trạng thái là 0.
Bạn nhấn j(bản đồ tới tầm hiên trong dvorak mà không cần sửa đổi). Ứng dụng nhận sự kiện KeyPress với mã khóa 44 ( <AC07>
), keyym 0xff51 ( Left
) và trạng thái 0x80 (Mod5 Mod5 được bật).
Bạn phát hành j. Ứng dụng nhận sự kiện KeyRelease cho khóa
<AC07>
/ Left
với cùng tham số.
Sau đó phát hành AltGr- sự kiện KeyRelease cho AltGr. (Nhân tiện, trạng thái ở đây vẫn là 0x80, nhưng điều đó không thành vấn đề.)
Điều này có thể được nhìn thấy nếu bạn chạy xev
tiện ích.
Vì vậy, tất cả có nghĩa là, mặc dù ứng dụng có cùng mã keyym ( Left
) như từ khóa thông thường <LEFT>
, nhưng nó cũng nhận được mã keyym và trạng thái sửa đổi từ AltGr. Rất có thể, những chương trình không hoạt động, xem các công cụ sửa đổi và không muốn hoạt động khi một số hoạt động.
Làm thế nào để làm cho chúng hoạt động
Rõ ràng, chúng ta không thể thay đổi mọi chương trình để không tìm kiếm sửa đổi. Sau đó, tùy chọn duy nhất để thoát khỏi tình huống này là không tạo ra các từ khóa và bit trạng thái của bộ sửa đổi.
1. Nhóm riêng
Phương pháp duy nhất mà nói đến cái tâm của tôi là: xác định các phím di chuyển con trỏ vào một nhóm riêng biệt và chuyển đổi, với một phím bấm riêng biệt, cho nhóm đó trước khi nhấn các phím j, k, l, i( h
,
t
, n
, c
) (nhóm chốt là phương pháp ưa thích cho một lần thay đổi nhóm, như tôi hiểu).
Ví dụ:
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)" };
};
Bây giờ, nếu bạn lần đầu tiên nhấn AltGrvà sau đó (riêng biệt) một trong các phím di chuyển, điều này sẽ hoạt động.
Tuy nhiên, điều này không hữu ích lắm, thích hợp hơn là LockGroup
thay vì chốt và nhấn AltGr trước và sau khi chuyển nhóm. Thậm chí tốt hơn có thể là SetGroup
- sau đó AltGr sẽ chỉ chọn nhóm đó trong khi được nhấn, nhưng điều đó tiết lộ cho các ứng dụng Các phím của AltGr ( ISO_Group_Shift
/ ISO_Group_Latch
/ bất cứ điều gì được xác định) (nhưng trạng thái sửa đổi vẫn sạch).
Nhưng ... cũng có một khả năng còn lại là ứng dụng cũng đọc mã khóa (mã của các khóa thực). Sau đó, nó sẽ nhận thấy các phím con trỏ giả mạo của người Viking.
2. Lớp phủ
Giải pháp nhiều cấp độ thấp hơn nữa sẽ là lớp phủ (như cùng một bài viết
mô tả).
Lớp phủ đơn giản có nghĩa là một số phím (bàn phím thực) trả về mã khóa của một phím khác. Máy chủ X thay đổi mã khóa của khóa và tính toán trạng thái sửa đổi và mã khóa cho mã khóa mới đó, vì vậy ứng dụng không nên chú ý thay đổi.
Nhưng lớp phủ rất hạn chế:
- Chỉ có 2 bit điều khiển lớp phủ trong máy chủ X (nghĩa là có thể có tối đa 2 lớp phủ).
- Mỗi khóa chỉ có thể có 1 mã khóa thay thế.
Đối với phần còn lại, việc thực hiện khá giống với phương pháp với một nhóm riêng:
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
có nghĩa là thay đổi bit điều khiển trong khi phím được nhấn và khôi phục nó trên bản phát hành khóa. Có chức năng tương tự LatchControls
, nhưng
xkbcomp
cung cấp cho tôi
Error: Unknown action LatchControls
về biên dịch keymap.
(Nhân tiện, tôi cũng sử dụng dvorak và cũng đã ánh xạ lại một số từ khóa chuyển động sang mức cao của các phím chữ cái. câu hỏi của bạn và câu trả lời này, bây giờ tôi biết lớp phủ là gì :).)