Внутренняя работа обработки событий клавиатуры под Linux - PullRequest
8 голосов
/ 25 сентября 2010

Когда я нажимаю клавишу клавиатуры в каком-либо приложении GTK под Linux, что именно происходит? Как ключ получен (от какого устройства), интерпретирован, передан программе, а затем обработан?

1 Ответ

14 голосов
/ 25 сентября 2010

На самом деле это довольно сложный процесс ...


  1. Клавиатура имеет двумерную матрицу соединений клавиш и собственный микропроцессор или матрицу вентилей, содержащую микропроцессор.Он постоянно сканирует матрицу, чтобы выяснить, нажаты ли какие-либо клавиши.(Чтобы сохранить контакты, клавиши не тестируются по отдельности.) Микро клавиатура говорит по протоколу с контроллером клавиатуры вашего ЦП и передает сообщение, указывающее нажатие клавиши.
  2. Контроллер клавиатуры записывает код и прерывает ЦП.
  3. Драйвер клавиатуры получает прерывание, считывает код ключа из регистра контроллера и помещает код ключа в буфер, который связывает сторону прерывания ядра с потоками для процесса.Он отмечает поток, ожидающий ввода с клавиатуры, как «работоспособный»
  4. Этот поток активируется.Оказывается, это X-сервер.X-сервер читает код ключа из ядра.
  5. Сервер проверит, какое окно имеет фокус клавиатуры.Окно будет подключено к одному из различных клиентов.
  6. Сервер отправляет событие клиенту, который отобразил это конкретное окно.(Обратите внимание, что для сервера каждое текстовое поле и тому подобное является «окном», а не только целыми приложениями.)
  7. Цикл событий в клиенте ожидает следующего сообщения о событии сервера.Это соединение может быть через TCP или локальную функцию Unix.Он использует read (2) или оператор сокета для фактического получения сообщения о следующем событии.
  8. Низкоуровневая подпрограмма xlib передает нажатие клавиш виджетам более высокого уровня, в конечном итоге получая какую-то функцию GTK.
  9. Элемент GTK API передает символ в вашу программу.

Я не обращал внимания на языковые отображения, мультиплексирование консоли и некоторые другие вещи ...

Обновление: Итак, /dev/input/* и на самом деле все вещи /dev/* называются специальными файлами блоков или символов.Важно то, что у них нет хранимых данных в файловой системе, только основной и вспомогательный номер устройства, которые служат для поиска драйвера в ядре в таблице.Это почти так просто.Если вы введете ls -l / dev / input, вместо размера файла вы увидите старший и младший номер устройства.Старший номер идентифицирует драйвер устройства, а младший номер является своего рода номером экземпляра, который передается (в ядре) в качестве параметра драйверу.

...