Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Назад Введение в мир программирования
Глава 2. Архитектура компьютера
Вперед

Ввод текста. Взаимодействие с клавиатурой

Режимы работы драйвера клавиатуры

Драйвер клавиатуры может работать в одном и четырёх режимов:

  • режиме скан-кодов, scancode mode (RAW) --- коды, предоставляемые контроллером клавиатуры/хост-контроллером на материнской плате, никак не преобразовываются и выводятся в ``формате'' Set 1 (драйвер клавиатуры в ядрах ветки 2.6 может нарушать данное правило, ``на лету'' переводя скан-коды в коды клавиш; обратный перевод и вывод скан-кодов осуществляется по запросу пользователя или внешней программы) ;
  • режиме кодов клавиш, keycode mode (MEDIUMRAW) --- скан-коды преобразуются в коды клавиш (для преобразования применяются таблицы, правка которых возможна средствами setkeycodes, и udev а просмотр --- с помощью getkeycodes);
  • режиме ASCII (XLATE, т.е. translate) --- драйвер клавиатуры осуществляет преобразование скан-кодов (кодов клавиш) в вид, в котором они содержатся в таблице ASCII (к примеру, в режиме XLATE, при нажатии клавиши с латинским символом A [скан-коды 0x1e и 0x9e] будет сгенерирован код 0x41; после этого данный код обычно обрабатывается программами уровня пользователя и результируется, например, в появлении на экране буквы ``A'');
  • режиме UTF-8 (UNICODE).

Обсудим режим UNICODE подробно. В нём пользователь может вводить символы UTF-8 в десятичном виде (этот эксперимент лучше всего проделывать в консоли [перейти туда можно по нажатию <Ctrl>+<Alt>+<F2>, а вернуться в ``иксы'' по нажатию <Ctrl>+<Alt>+<F7> или <Ctrl>+<Alt>+<F8>]: система X Window обычно применяет режим скан-кодов, RAW). Для этого необходимо зажать клавишу Alt, а потом на цифровой клавиатуре ввести десятичное число соответствующее требуемому символу. Например, по нажатию <Alt>+1041 в консоли появится буква Б.

Узнать десятичный код символа можно переведя его из шестнадцатеричного вида, указанного в таблицах, распространяемых на сайте unicode.org (например, http://www.unicode.org/charts/PDF/U0400.pdf).

Есть ли какие-либо примеры перевода шестнадцатеричного кода символа в десятичный вид? Разумеется. Согласно стандарту Unicode, у заглавной буквы Б шестнадцатеричный код равен 0411. Получить десятичный код заглавной буквы Б удобнее всего если сначала перевести шестнадцатеричный код в двоичный. Как известно, каждый разряд шестнадцатеричного числа включает в себя четыре разряда двоичного числа. Для нашего примера верно следующее равенство: 041116 = 00000100000100012. Далее можно перевести двоичное число в десятичное. 00000100000100012 = 210 + 24 + 20 = 104110 (степень двойки соответствует номеру разряда двоичного числа, где есть единицы; разряды следует считать справа-налево, начиная с разряда под номером ``нуль'').

Для наглядности проделаем расчёт и для строчной буквы р (шестнадцатеричный код: 0440). 044016 = 00000100010000002 = 210 + 26 = 108810. Таким образом, если, находясь в консоли, нажать и удерживать клавишу Alt и одновременно с этим ввести на цифровой клавиатуре число 1088, а потом отпустить Alt, то на месте курсора появится кириллическая буква р.

Хорошей новостью является то, что в литературе (см. книгу Unicode Explained: Tables for Writing Characters) и Интернет (Unicode Table (Decimal) ) предлагаются уже готовые списки десятичных кодов для символов Unicode.

Дополненительная информация о режимах работы клавиатуры может быть найдена в публикации Андриеса Бруэра (Andries Brouwer), которая называется Интерфейс программирования клавиатуры (Keyboard Programming Interface). Бруэр относит режимы XLATE и UNICODE к подтипам режима MEDIUMRAW; в свою очередь, RAW и MEDIUMRAW в определённом смысле схожи (но не совпадают) с режимами ``raw'' (``сырой'' режим) и ``cooked'' (режим с обработкой: ``приготовленный''), в которых работает терминал.

Определить текущий режим работы клавиатуры можно с помощью программы kbd_mode:

#: kbd_mode
The keyboard is in raw (scancode) mode

Режим скан-кодов обычно применяется во время работы X сервера системы X Window от X.org. В случае, если вы переведёте клавиатуру в другой режим, например, в XLATE --- будет потерян ``клавиатурный'' контроль над устройством /dev/tty7 (вы не сможете печатать текст). Однако, даже когда клавиатура находится в режиме XLATE, сочетание клавиш <Ctrl>+<Alt>+<F2> должно сработать. В результате вы начнёте сеанс работы с устройством /dev/tty2, откуда можно отправить команду sudo kbd_mode -s в адрес /dev/tty7. Это будет выглядеть следующим образом.

sudo kbd_mode -a > /dev/tty7

После выполнения обозначенной выше команды, возвращение к работе с X сессией (в рамках которой клавиатура снова перешла в режим RAW), происходит по нажатию <Ctrl>+<Al>+<F7>.

В случае, если по каким-то причинам вам не удаётся перейти к устройству /dev/tty2, остаётся либо пытаться корректно завершить X сессию с помощью мыши, либо перезагрузить компьютер через кнопки, находящиеся на внешней панели его системного блока.

Очень подробный и наглядный материал об устройствах tty опубликован в статье ``The TTY demystified'' (на английском языке).

Ввод символов Unicode в системе X Window

Вводить символы Unicode в системе X Window можно применяя последовательность клавиш <Ctrl>+<Shift>+<u>. Нажмите их все, потом отпустите <u>. Затем введите шестнадцатеричный код символа. К сожалению, данный метод срабатывает не всегда, так как виртуальный терминал может перехватывать последовательности клавиш, содержащие, например, <Ctrl> и <C>. А вот если просто нажать <Ctrl>+<Shift>+<u>, отпустить все три клавиши и потом сразу ввести шестнадцатеричный код нужного символа, то никаких проблем с <Ctrl> и <C> не будет. При наличии подходящих шрифтов в системе таким образом можно вводить текст, содержащий всяческие иероглифы.

Давайте создадим файл, содержащий несколько фраз на китайском языке в кодировке UTF-8.

Для начала рекомендуем установить китайские шрифты (в том числе и те, что необходимы для отображения символов Unicode).

sudo apt-get install ttf-arphic-bkai00mp ttf-arphic-bsmi00lp ttf-arphic-gbsn00lp
sudo apt-get install ttf-arphic-gbsn00lp ttf-arphic-uming ttf-arphic-ukai
sudo apt-get install xfonts-intl-chinese xfonts-base unifont

Также важно, чтобы у вас была настроена локаль UTF-8 (en_US.UTF-8 вполне подойдёт).

В рамках X сессии запустим текстовый редактор (vim, gedit, nano или любой другой). Введём коды символов Unicode, соответствующие китайским иероглифам. Эти коды доступны, в частности, в формате HTML: CJK Unicode Table. Чтобы легче было отыскать нужный иероглиф, удобно воспользоваться онлайн-словарём, умеющим находить иероглифы по их Pinyin нотации: tigernt.com (копируете нужный символ, и ищите его на странице соответствий код--иероглиф через форму поиска, предлагаемую вашим веб-обозревателем).

Если ввести в режиме Unicode (после отжатия <Ctrl>+<Shift>+<u>) следующие коды символов (перед каждым символом следует заново нажимать и отпускать <Ctrl>+<Shift>+<u>), у нас получится целое предложение на китайском языке, которое переводится как ``По прогнозу погоды всю неделю будет хорошая погода.'' (tian1 qi4 yu4 bao4 shuo1 zhe4 ge4 xing1 qi1 dou1 shi4 hao3 tian1 qi4).

5929 6c14 9884 62a5 8bf4 8fd9 4e2a 661f 671f 90fd 597d 5929 6c14

Последовательность записанных в рассмотренном формате иероглифов вполне можно обрабатывать средствами команд echo, cat, less и прочих подобных (в частности, связанных в конвейер). Например, если сохранить файл с только что введёнными китайскими символами и присвоить ему имя 001.html, а потом осуществить в нём поиск средствами grep (аргумент для поиска также вводится после отжатия <Ctrl>+<Shift>+<u>), то мы получим очень приятный результат (см. картинку ниже). Всё это удалось организовать без установки китайской локали!

Подробнее о методах ввода символов Unicode см. стандарт ISO 14755 (его поддерживают, в частности, современные веб-обозреватели). Солидный список имён шрифтов (обычно совпадающих с именами пакетов, их содержащих), которые можно использовать для ввода текста на арабском и других языках доступен по адресу https://wiki.archlinux.org/index.php/Fonts. Главное --- не забудьте, что искать следует именно шрифты, поддерживающие Unicode.


Предыдущий раздел: Оглавление Следующий раздел:
Программная обработка скан-кодов и кодов клавиш   Управление светодиодами клавиатуры