Главная страница Межпроцессное взаимодействие (состязание) интерпретации нажатия клавиши. Они имеют разное назначение. Например, флаг capslock переключается с TRUE на FALSE, и наоборот при нажатии клавиши Caps Lock. Флаг shift устанавливается в TRUE, когда нажимается клавиша SHIF, и сбрасывается, когда она отпускается. Переменная esc устанавливается, когда получен код опроса клавиатуры escape. Она всегда сбрасывается после того, как получен один символ. Структура kb s необходима для отслеживания введенных кодов опросов клавиатуры. Коды опроса в этой структуре хранятся в циклическом буфере, ibuf, имеющем размер KB IN BYTES. Объявляется массив из таких структур, kb lines[NR CONS], содержащий по одной структуре на консоль, но фактически используется только первый его элемент, так как текущая kb s всегда определяется макросом kbaddr. Тем не менее мы обычно будем ссылаться на kb lines[0] при помощи указателя на эту структзфу, например kb->ihead, ради единства с рассмотрением других устройств. Конечно, неиспользуемые ячейки массива отнимают небольшое количество памяти, но, с другой стороны, если кто-либо выпустит компьютер, поддерживающий несколько клавиатур, ОС MINIX будет готова к такому нововведению, потребуется только изменить макрос kbaddr. Макрос тар кеуО возвращает ASCII-код, соответствующий данному коду опроса, без учета модификаторов, то есть попадающий в первую колонку карты клавиатуры. Старший брат этого макроса тар кеу выполняет преобразование кода опроса в ASCII-код с учетом всех модификаторов, действующих при вводе символа. Когда нажимается или отпускается клавиша, вызывается обработчик прерываний клавиатуры, подпрофамма kbd hwjnt. Чтобы узнать от контроллера клавиатуры код опроса, она вызывает scan keyboard. Когда прерывание инициировано отпусканием клавиши, у кода опроса устанавливается старший значащий бит, и в этом случае нажатие игнорируется, если это не одна из клавиш модификаторов. Если же прерывание обусловлено нажатием любой клавиши или отпусканием модификатора, необработанный код опроса помещается в круговой буфер, при наличии в нем свободного места. После этого устанавливается флаг tp-> tty events и вызывается force timeout, чтобы гарантировать, что при следующем сигнале таймера задача часов запустит задачу терминала. В табл. 3.16 представлен пример содержимого кругового буфера для короткой строки, содержащей два символа в верхнем регистре, каждый из которых предваряется кодом опроса, соответствующим нажатию SHIFT, а следом за кодом символа идет код отпускания SHIFT. Таблица 3.16. Содержимое входного буфера для строки текста, введенной с клавиатуры. Вторая строка таблицы описывает нажатия клавиш. L+, L-, R+ и R-означают соответственно нажатие и отпускание правой и левой клавиши SHIFT. Код отпускания клавиши на 128 больше кода нажатия
Когда возникает прерывание от часов, задача терминала получит управление и, обнаружив, что у консоли установлен флаг tp->tty events, вызовет специфичную для данного устройства подпрофамму kb read, на которую ссылается поле tp->tty devread структуры tty консоли. Функция kb read извлекает из циклического буфера коды опроса и помещает в свой локальный буфер ASCII-коды. Этот локальный буфер должен быть достаточно емок для того, чтобы вместить ESC-последовательности, генерируемые в ответ на нажатия некоторых клавищ на цифровой клавиатуре. Затем, чтобы поместить символы во входную очередь, вызывается in process. Во избежание клавиатурного прерывания во время умень-щения значения переменной tp->icount, эта операция защищена вызовами lock и unlock. Вызов make bread возвращает ASCII-код в виде целого числа. В этой точке специальные клавищи, например клавищи цифровой клавиатуры и функциональные, имеют коды большие, чем ОхРР. Коды в диапазоне от НОМЕ до INSRT (от 0x101 до ОхЮС, эти константы задаются в include/minix/keymap.h) при помощи массива numpad map преобразуются в трехсимвольные ESC-последовательности, показанные в табл. 3.17. Эти последовательности затем передаются в in process. Большие по величине коды не передаются в in process, среди них ищутся коды, соответствующие комбинациям клавиш ALT-i-LEFT, ALT+RIGHT и от ALT4-F1 до ALT4-F12. Если обнаруживается одна из таких комбинаций, вызывается функция switch console, переключающая виртуальные консоли. Таблица 3.17. ESC-последовательности, генерируемые для клавиш цифровой клавиатуры. Когда коды опроса преобразуются в ASCII-коды, специальным клавишам присваиваются пceвдoASCII -кoды, большие OxFF
Функция make break преобразует коды опроса в ASCII и обновляет значение переменных, отслеживающих значения модификаторов. Но перед этим она ищет волшебную комбинацию клавиш CTRL+ALT-i-DEL, которую все пользователи PC знают как универсальный способ решения многих проблем (в MS-DOS). Тем не менее желательно, чтобы система корректно завершила свою работу, поэтому вместо передачи управления подпрофаммам BIOS, процессу init - корню дере- ва процессов - отправляется сигнал SIGABRT. Ожидается, что init обработает этот сигнал и в нормальном порядке завершит работу системы, прежде чем вернуться в монитор начальной загрузки, из которого можно управлять либо полным перезапуском системы, либо перезагрузкой MINIX. Конечно, было бы неправильно ожидать, что это сработает всегда. Большинство пользователей понимают опасность внезапной перезагрузки и не прибегают к CTRL+ALT+DEL до тех пор, пока не произойдет что-то действительно серьезное, после чего управлять системой будет невозможно. К этому моменту может сложиться ситуация, когда правильно отправить сигнал другому процессу уже невозможно. Именно потому в make break есть статическая переменная CAD count. При большинстве сбоев система обработки прерываний продолжает работать, значит, клавиатурный ввод продолжает поступать, и задача часов остается работоспособной. MINIX учитывает поведение пользователей, которые, когда система не реагирует на нажатия, начинают в сердцах лупцевать по клавишам. Если попытка отправить SIGABRT процессу init провалилась и пользователь обратился к магической комбинации CTRL+ALT+DEL во второй раз, делается прямой вызов wreboot, которая принудительно возвращает управление монитору начальной загрузки. Основная часть make break устроена не сложно. Б переменную make записывается признак, было ли прерывание вызвано нажатием или отпусканием клавиши, после чего в переменную ch помещается ASCII-код, возвращаемый функцией тар кеу. Далее следует оператор switch, проверяющий значение ch. Рассмотрим два случая: случай обычной клавиши и случай специальной клавиши. Если нажата обычная клавиша, ни одно из условий в switch не будет выполнено, в варианте по умолчанию также ничего не произойдет, поскольку обычные символы принимаются только при нажатии клавиши. Если каким-то образом обычная клавиша была воспринята при отпускании, ее код заменяется значением -1, которое игнорируется вызывающей функцией. Обработка клавиш ALT, CALOCK, NLOCK и SLOCK сложнее, но во всех этих вариантах действия похожи: в переменную записывается либо новое состояние модификатора (если модификатор действует только тогда, когда удерживается клавиша), либо инвертированное старое состояние (для клавиш наподобие Caps Lock). Нужно рассмотреть еще один вариант, код EXTKEY и переменную esc. Не путайте этот случай с клавишей ESC на клавиатуре, которой соответствует код опроса 0x1В. Код EXTKEY нельзя сгенерировать по отдельности, нажав какую-либо клавишу или их комбинацию. Это префикс расширенных клавиш для клавиатур PC, первый байт двухбайтового кода опроса, означающего, что передаваемый далее код опроса не является частью обычного набора клавиш PC. Во многих случаях профаммное обеспечение интерпретирует обычный и расширенный коды одинаково. Например, это почти всегда так для обычной клавиши / и серой клавиши / на цифровой клавиатуре. В других случаях может потребоваться различать их нажатия. Так, во многих раскладках клавиатур для языков, отличных от английского, левая и правая клавиши ALT интерпретируются по-разному, позволяя вводить три разных символа с одной клавиши. Код опроса у обеих клавиш одинаков и равен 56, но при нажатии правой ALT код опроса предваряется кодом EXTKEY. Когда получен код EXTKEY, устанавливается флаг esc, и в этом слу-
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |