Mối quan hệ của bố cục bàn phím và xmodmap


12

Tôi đang sử dụng Xubfox. Trước khi đăng nhập tôi có thể chọn một bố trí bàn phím. Tôi đang sử dụng xmodmapđể ánh xạ lại một số phím.

Tôi quan tâm đến hai điều:

  1. Làm thế nào trạng thái ánh xạ bàn phím thay đổi (a) khi tôi bật máy tính xách tay, (b) trong quá trình khởi động và (c) đăng nhập vào hệ thống (trong ba giai đoạn này) và khi làm việc với hệ thống (đăng nhập).
  2. Điều gì gây ra các biểu tượng sẽ được hiển thị trên màn hình (và các phím điều khiển được gửi) trong các giai đoạn riêng lẻ. Khi tôi nhấn một số phím, nó sẽ gửi một số tín hiệu đến trình điều khiển bàn phím (?) Và sau đó phải có một số quy trình quyết định (ứng dụng và tệp cấu hình) xác định biểu tượng nào sẽ được hiển thị. Trả lời cho câu hỏi này phải là danh sách các ứng dụng và đường dẫn đến các tệp cấu hình đó (tôi đặc biệt quan tâm đến Ubuntu (hệ thống dựa trên Debian), nhưng bạn có thể mô tả một số hệ thống khác, nhưng ưu tiên Ubuntu).

Câu trả lời:


24

Có hai lớp ở đây, ánh xạ KEYCODE sang KEYSYM và ánh xạ KEYSYM sang ánh xạ văn bản. Có nhiều lớp hơn nếu bạn đếm hạt nhân, phải ánh xạ các bàn phím AT Bàn phím thành KEYCODE kiểu Xt hoặc mã HID Bàn phím USB thành KEYCODE. KEYCODE chỉ đơn giản là một số nguyên không dấu 8 bit mà hạt nhân của Hệ điều hành chuyển đến máy chủ X11. Nó có thể khác nhau giữa các Hệ điều hành như Linux và Solaris. Trên Linux, các KEYCODE này thường có cùng số được sử dụng trên Bàn phím máy tính cũ của PC. Các máy tính mới hơn có bàn phím AT, PS / 2 hoặc USB thường chỉ ánh xạ các bàn phím đó sang mã XT cũ cho phím để giữ cho cuộc sống đơn giản.

Mã bàn phím thô, cho dù chúng là XT, AT, PS / 2 hoặc USB đại diện cho một vị trí thực trên bàn phím. Bàn phím XT chỉ gửi một số 8 bit duy nhất khi nhấn hoặc nhả phím. Phím q trên bàn phím XT của Hoa Kỳ / Anh gửi số 16. Trên bàn phím tiếng Pháp có cùng khóa vật lý được gắn nhãn a, nhưng nó vẫn gửi 16. Đó là các lớp cao hơn trong hệ điều hành gán cho nó một ý nghĩa thực sự. Khi một khóa được phát hành trên bàn phím XT, cùng một mã khóa được gửi cộng với 128. Trong ví dụ này, khi nhấn q, 16 được gửi, nhưng khi phát hành, số 142 (16 + 128) được gửi. Bàn phím AT sử dụng scancodes là một chuỗi các số và có thể khá dài. Phát hành chính thêm mã bổ sung. Ví dụ: scancode cho Tạm dừng là E1, 1D, 45, E1, 9D, C5. Hầu hết các hệ điều hành bao gồm DOS, Windows, Linux, FreeBSD, và BIOS tất cả các scancodes ánh xạ thành các scancodes kiểu XT đơn giản hơn nhiều. Nó cũng giúp dễ dàng hơn để hỗ trợ các bàn phím mới hơn sử dụng các mã khác nhau như Bàn phím USB gửi mã HID. Tất cả các mã được ánh xạ tới cùng một bộ mã nhất quán của Hệ điều hành trước X11 hoặc ứng dụng nhìn thấy chúng.

X11 không biết gì về phần này của quy trình, nó chỉ lấy KEYCODE từ kernel và áp dụng ánh xạ của chính nó để chuyển KEYCODE đó thành KEYSYM. Xmodmap là công cụ tiêu chuẩn để kiểm soát ánh xạ đó. Phần lớn hành vi của ánh xạ bàn phím là cấu hình, nhưng có một số trường hợp đặc biệt như Num Lock, Mode Switch và Caps Lock / Shift Lock được mã hóa cứng thành X11. Các khía cạnh khác như Shift thực sự có thể cấu hình. Bất kỳ khóa nào cũng có thể được ánh xạ để hoạt động như shift, không giống như Mode Switch hoặc Num Lock.

Các KEYCODE đại diện cho các khóa vật lý được gửi bởi kernel của Hệ điều hành. Mỗi KEYCODE có thể ánh xạ tới 8 KEYSYM có thể. Chỉ có 4 được sử dụng và đôi khi được gọi là cấp 1-4. Cấp 1 chỉ định KEYSYM được in khi không có sửa đổi nào được kích hoạt. Đây thường là chữ thường và chữ số. Công cụ sửa đổi là các KEYCODE sửa đổi KEYSYM được tạo bởi các KEYCODE khác khi công cụ sửa đổi được kích hoạt (nhấn hoặc bật.) Các mã khóa sửa đổi cũng được điều khiển thông qua Xmodmap. Cấp độ 2 chỉ định một KEYSYM được gửi khi nhấn công cụ sửa đổi ca. Cấp 3 được kích hoạt bất cứ khi nào Công tắc chế độ KEYSYM được nhấn. Cấp 4 được kích hoạt khi cả phím shift và Mode Switch đang hoạt động.

Khi KEYSYM đã được tạo, điều này có thể được diễn giải trực tiếp, nhưng hầu hết sẽ được chuyển đổi thành văn bản. Không phải tất cả các KEYSYM đều biến thành văn bản hoặc chỉ có thể ảnh hưởng đến một KEYSYM trong tương lai. Một ví dụ là Shift_L, tất nhiên, không có biểu diễn văn bản, nhưng cũng có một số KEYSYM được sử dụng để Soạn một ký tự khác. Một danh sách của họ trên hệ thống của tôi là dưới /usr/share/X11/locale/en_US.UTF-8/Compose. Một ví dụ như vậy là dead_acute KEYSYM, khi được nhấn, sẽ cố gắng chuyển đổi KEYSYM tiếp theo thành một chữ cái có dấu cấp tính. Có một ánh xạ chuẩn để biến các KEYSYM thành Unicode.

Bây giờ tất cả những điều này đã được nói, lưu ý rằng Xmodmap đã lỗi thời và được thay thế bằng XKB phức tạp hơn nhiều. Điều này ảnh hưởng đến cách các KEYCODE được ánh xạ tới các KEYSYM, nhưng không ảnh hưởng đến cách kernel tạo ra các KEYCODE cũng như cách các KEYSYM được chuyển đổi thành văn bản hoặc sáng tác vẫn giống nhau. XKB có thể bị vô hiệu hóa khôi phục hành vi Xmodmap. Nó cũng có một lớp tương thích để hỗ trợ Xmodmap, nhưng nó có thể có vấn đề vì nó không hoàn toàn tương thích. Các quy tắc XKB được thực hiện /usr/share/X11/xkb/và tinh vi hơn nhiều. Có một số tài liệu tốt ở nơi khác về cách nó tạo bố cục bàn phím để ánh xạ các KEYCODE sang KEYSYM.

Đối với bảng điều khiển Linux, nó có bố trí bàn phím riêng được lưu trữ /usr/share/keymapsvà tải loadkeyslệnh. Khi ở giai đoạn BIOS và bộ tải khởi động trước đó, bao gồm GRUB2, ánh xạ bàn phím là bất cứ số nào mà BIOS quyết định ánh xạ khóa tới.


Cảm ơn bạn đã giải thích tuyệt vời và thông tin mới. Bạn có biết ứng dụng nào được khởi động trong quá trình khởi động (khởi động hoặc initscript) để đưa ra quyết định trên bàn phím và điều gì xảy ra khi đăng nhập trong giai đoạn tôi có thể chọn bố cục. Chương trình nào tương tác với nó và nó được lưu trữ ở đâu trong hệ thống tập tin? Sau khi đăng nhập xmodmap hoặc xkb sẽ ghi đè lên bố cục mặc định được chọn trong quá trình đăng nhập?
xralf

Sơ đồ lõi, như tôi đã nói được tải loadkeysbởi một trong các tập lệnh init. grep loadkeys /etc/init.d/*tiết lộ các tập tin keymap.sh. X11 có chế độ tạo hình riêng của nó, theo truyền thống được tải bởi Xmodmap chạy từ một trong các tập lệnh khởi động Xsession. Ngày nay, với XKB được sử dụng thay cho Xmodmap, việc tạo khóa mặc định được đặt trong Xorg.conf thông qua các tùy chọn Xkb khác nhau hoặc thông qua HAL. Khi trình quản lý Hiển thị Gnome hoặc KDE được tải, họ có thể tải bố cục của riêng mình thông qua setxkbmaplệnh. Môi trường máy tính để bàn của người dùng cũng có thể thiết lập bố cục khác khi đăng nhập.
chim cánh cụt359

Tôi đã thử các lệnh grep loadkeys /etc/init.d/*locate keymap.shvà không có gì đã được tìm thấy. Tệp Xorg.conf cũng không được tìm thấy. Có phụ thuộc vào phiên bản Ubuntu của tôi là 10.04 không?
xralf

Cửa sổ sẽ nhận được loại sự kiện nào? Một sự kiện với KEYSYM và sau đó ứng dụng chuyển đổi KEYSYM thành văn bản, bằng cách nào? Xorg có cung cấp giao diện IPC / RPC cho các ứng dụng để chuyển đổi KEYSYM thành văn bản không? Hoặc ứng dụng phải tự làm nó hoàn toàn?
薯条
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.