Внутреннее устройство Linux
Шрифт:
примечание
Есть специальное окно, которое называется корневым окном, — это фон дисплея. Однако, возможно, вы его никогда не видели (см. пункт «Фон рабочего стола» подраздела 14.3.2).
14.3.1. X-события
X-клиенты получают данные ввода и другую информацию о состоянии сервера через систему событий. X-события устроены подобно любому другому асинхронному межпроцессному взаимодействию, такому как события
Поэкспериментировать с событиями можно с помощью команды xev. При ее запуске открывается новое окно, в котором вы можете перемещать указатель мыши, щелкать кнопкой мыши и набирать текст. Когда вы делаете это, команда xev генерирует вывод, описывающий X-события, которые она получает от сервера. Вот, например, фрагмент вывода, относящегося к перемещениям мыши:
$ xev
—snip—
MotionNotify event, serial 36, synthetic NO, window 0x6800001,
root 0xbb, subw 0x0, time 43937883, (47,174), root:(1692,486),
state 0x0, is_hint 0, same_screen YES
MotionNotify event, serial 36, synthetic NO, window 0x6800001,
root 0xbb, subw 0x0, time 43937891, (43,177), root:(1688,489),
state 0x0, is_hint 0, same_screen YES
Обратите внимание на координаты в скобках. Первая пара представляет координаты x и y для указателя мыши внутри окна, а вторая (root:) определяет положение указателя на всем дисплее.
В число других низкоуровневых событий входят нажатия на клавиши и кнопки мыши, а более сложные учитывают, был ли перемещен указатель в окно или из окна или получило ли окно фокус из менеджера окон. Вот, например, соответствующие события выхода за пределы окна и утраты фокуса:
LeaveNotify event, serial 36, synthetic NO, window 0x6800001,
root 0xbb, subw 0x0, time 44348653, (55,185), root:(1679,420),
mode NotifyNormal, detail NotifyNonlinear, same_screen YES,
focus YES, state 0
FocusOut event, serial 36, synthetic NO, window 0x6800001,
mode NotifyNormal, detail NotifyNonlinear
Одним распространенным способом применения команды xev является извлечение кодов клавиш и символов для различных клавиатур, когда выполняется настройка раскладки клавиатуры. Вот результат нажатия клавиши L; код клавиши при этом равен 46:
KeyPress event, serial 32, synthetic NO, window 0x4c00001,
root 0xbb, subw 0x0, time 2084270084, (131,120), root:(197,172),
state 0x0, keycode 46 (keysym 0x6c, l), same_screen YES,
XLookupString gives 1 bytes: (6c) "l"
XmbLookupString gives 1 bytes: (6c) "l"
XFilterEvent returns: False
Можно также прикрепить команду xev к существующему идентификатору окна с помощью параметра -id id (используйте для параметра id тот идентификатор, который получен с помощью команды xwininfo) или отслеживать корневое окно с помощью параметра -root.
14.3.2. Понятие о X-вводе и настройка предпочтений
Одной из потенциально вводящих в тупик характеристик X-системы является то, что зачастую есть несколько способов настройки предпочтений, и некоторые из них могут не работать. Например, одним из распространенных клавиатурных предпочтений в Linux является переназначение клавиши Caps Lock на клавишу Control. Это можно выполнить несколькими способами, начиная с небольших регулировок с помощью старой команды xmodmap и заканчивая созданием совершенно новой раскладки клавиатуры с помощью утилиты setxkbmap. Как понять, какой из них следует (и следует ли) применить? Все упирается в знание того, какие части системы отвечают за это, но выяснить бывает сложно. Помните о том, что окружение рабочего стола может обладать собственными настройками и переопределениями.
С учетом сказанного опишу некоторые моменты, относящиеся к основной инфраструктуре.
Устройства ввода (в целом)
X-сервер использует расширение X Input Extension, чтобы управлять вводом от различных устройств. Есть два основных типа устройств ввода — клавиатура и указатель (мышь), — и можно подключить столько устройств, сколько пожелаете. Чтобы одновременно использовать несколько устройств одного типа, расширение X Input Extension создает «виртуальное устройство ядра», которое направляет ввод от устройства на X-сервер. Устройство ядра называется ведущим; а физические устройства, подключаемые к компьютеру, — подчиненными.
Чтобы увидеть конфигурацию устройств на вашем компьютере, попробуйте запустить команду xinput —list:
$ xinput —list
Virtual core pointer id=2 [master pointer (3)]
Virtual core XTEST pointer id=4 [slave pointer (2)]
Logitech Unifying Device id=8 [slave pointer (2)]
Virtual core keyboard id=3 [master keyboard (2)
Virtual core XTEST keyboard id=5 [slave keyboard (3)]
Power Button id=6 [slave keyboard (3)]
Power Button id=7 [slave keyboard (3)]
Cypress USB Keyboard id=9 [slave keyboard (3)]
У каждого устройства есть связанный с ним идентификатор, который можно использовать в команде xinput и в других командах. В данном выводе идентификаторы 2 и 3 соответствуют устройствам ядра, а идентификаторы 8 и 9 — реальным устройствам. Обратите внимание на то, что кнопки включения компьютера также рассматриваются как устройства ввода.