next up previous contents
Next: Вывод символов на экран Up: Локализация Previous: Таблицы кодировки символов   Contents

Ввод символов с клавиатуры

Общение пользователя с компьютером в текстовом режиме осуществляется с помощью драйвера терминала, который входит в состав ядра Linux. Драйвер терминала состоит как бы из двух отдельных драйверов: драйвера клавиатуры и драйвера экрана. Драйвер клавиатуры обрабатывает нажатия клавиш пользователем и передает результат прикладной программе, которая, в свою очередь, посылает экранному драйверу символы, которые должны быть отображены на экране. Вначале рассмотрим подробнее процесс ввода символов с клавиатуры.

При нажатии на любую клавишу микропроцессор клавиатуры генерирует последовательность так называемых скан-кодов, которая представляет собой последовательность из 2 или большего числа байтов, и передает ее драйверу клавиатуры. Драйвер клавиатуры работает в одном из 4 возможных режимов:

  1. В простейшем случае (режим ввода скан-кодов K_RAW) прикладной программе передаются просто скан-коды, сгенерированные клавиатурой. Этот режим используется при работе с приложениями, которые имеют собственный драйвер клавиатуры. Примером такого приложения является система X Window.

  2. Во втором режиме (режим K_MEDIUMRAW) скан-код клавиши преобразуется в один из 127 возможных кодов, называемых кодами клавиш (keycodes). Каждый код клавиши состоит из кода нажатия клавиши и кода отпускания клавиши. Преобразование скан-кодов в коды клавиш осуществляется в соответствии с внутренней таблицей драйвера клавиатуры. Обычно эта таблица фиксирована и изменять ее не требуется, хотя в системе существуют команды getkeycodes и setkeycodes, с помощью которых можно просмотреть или изменить некоторые соответствия в этой таблице. Эти команды используются только в том случае, если у Вас программируемая клавиатура.
  3. В третьем режиме (режим ASCII или K_XLATE) код клавиши преобразуется в ASCII-код символа или некоторую последовательность ASCII-кодов символов в соответствии с таблицей раскладки клавиатуры, которая хранится в виде отдельного файла. Например, для Red Hat Linux 5.2 по умолчанию используется файл defkeymap.map в каталоге /usr/lib/kbd/keymaps/i386/qwerty. Команда dumpkeys(1) выводит на экран содержание действующей в данный момент таблицы раскладки клавиатуры, а команда loadkeys(1) загружает в драйвер таблицу раскладки клавиатуры из указанного файла.

  4. И, наконец, в четвертом варианте (режим K_UNICODE) скан-код клавиши преобразуется в символ UNICODE (этот режим пока используется очень редко).

Выбор режима работы драйвера терминала определяется прикладной программой, которая в данный момент времени выполняется компьютером. Чаще всего используется второй режим, когда код клавиши либо преобразуется в ASCII-код символа или строку таких кодов в соответствии с таблицей раскладки клавиатуры, либо выполняется действие, определенное для конкретной комбинации клавиш в таблице раскладки клавиатуры. Например, нажатие [Ctrl]-[Alt]-[Del] эквивалентно вызову команды shutdown -r 0, то есть приводит к останову системы и перезагрузке компьютера.

Режим работы драйвера клавиатуры можно узнать или изменить с помощью команды kbd_mode(1). Однако не торопитесь менять режим, так как перевод драйвера клавиатуры в режим RAW или MEDIUMRAW может сделать его недоступным для большинства приложений, то есть легко можно вообще потерять возможность ввода команд.

Не для всех клавиш и комбинаций клавиш процесс обработки проходит так прямолинейно, как это описано выше. Во-первых, имеется несколько особых клавиш, так называемых клавиш-переключателей. Это клавиши:

[Shift-L]
[Shift-R]
[Alt-L]
[Alt-R]
[Ctrl-L]
[Ctrl-R]
[Caps Lock]
[Num Lock]
[Ins]
Нажатие на клавишу-переключатель изменяет значение одного из разрядов (битов) в двух-байтовом слове, которое хранит состояние клавиш-переключателей. Поэтому драйвер клавиатуры вначале должен проанализировать состояние этого слова, а затем соответственно преобразовать коды.

Клавиша [Ins] является единственной из клавиш переключателей, нажатие которой не только заносит признак в слово состояния переключателей, но и порождает передачу соответствующего кода драйверу терминала.

С помощью ASCII-кодов можно представить 256 различных символов, а, значит, ASCII-коды можно сопоставить 256-ти кодам клавиш. Учитывая наличие клавиш переключателей, комбинаций клавиш существует гораздо больше. Поэтому некоторые комбинации клавиш драйвер клавиатуры преобразует в так называемые расширенные ASCII-коды. Эти коды состоят из нескольких байтов, первые два из которых - это так называемый символ Esc-последовательности, а последующие - собственно значащие байты. Расширенные ASCII-коды обычно представляют те комбинации клавиш, которые используются для управления работой программ, таких как стрелки, клавиши

[Page Down], [Page Up], [Home], [End], [F1] - [F12], [Ins], [Del]
и т.д.

В комплект Red Hat Linux входит программа showkey, которая показывает все три вида кодов, связанных с нажатиями клавиш. Если запустить эту программу с параметром -s, она будет показывать скан-коды нажатий клавиш (чтобы выйти из программы, надо просто выждать 10 секунд, не нажимая в это время ни одной клавиши). Ввод команды showkey -k приводит к выводу на экран кодов клавиш (выходим так же). Ввод команды showkey -a позволяет просмотреть ASCII-коды, причем они сразу выдаются в десятичной, восьмеричной и двоично-десятичной кодировках. Выход из программы в этом случае надо производить нажатием комбинации [Ctrl]-[D]. Попробуйте в этом режиме нажать [Ctrl]-[=] или [Ctrl]-[Esc], и Вы увидите, что не каждая комбинация клавиш порождает ASCII-код (попробуйте также клавиши-переключатели).

Примечание: Если Вы уже перешли в графический режим, то программа showkey может работать некорректно, о чем она вежливо сообщает при запуске. Обратите внимание на эти сообщения!

Итак, прикладной программе передан один из трех кодов нажатой клавиши - либо скан-код, либо код клавиши, либо ASCII-код. Теперь уже дело прикладной программы

как его обработать. Обычно (если не считать управляющих комбинаций) код нажатой клавиши либо записывается в файл, либо соответствующий символ отображается на экране. В файл, конечно, записываются последовательности байтов, но и они в конечном итоге записываются только для того, чтобы информацию потом смог прочитать человек, а человек воспринимает только изображения символов, которые он может увидеть на экране или на распечатке.



Alex Otwagin 2002-12-16