Теперь рассмотрим ту часть syscons, которая работает с клавиатурой.
Начнем с самого "низа" - "железного" контроллера клавиатуры. При нажатии на любую клавишу он выдает ее скан-код - некий номер кнопки на клавиатуре. Сразу замечу, что этот скан-код не имеет ничего общего с ASCII-кодами тех символов, которые "нарисованы на кнопках".
Более того, для каждой кнопки контроллер выдает по крайней мере два разных кода - один, когда вы нажимаете кнопку, другой - когда отпускаете ее. Эти коды всегда отличаются на величину 128 (старший бит в байте кода), хотя в данном случае это не так уж и важно. Кроме этого, при нажимании некоторых кнопок (и отпускании) контроллер генерирует скан-коды состоящие из двух байт - "префикса" (обычно это E0) и собственно кода кнопки. Обычно такие скан-коды называют "расширенными".
Основная задача syscons - преобразовать эти скан-коды в соответствующие коды символов. Причем, он делает это в два этапа.
Сначала "сырые" скан-коды (которые считываются из контроллера) преобразуются во внутренние коды syscons. В основном это касается "расширенных" кодов. Для обычных клавиш в качестве внутреннего кода берется просто скан-код, а вот "расширенные" коды заменяются на однобайтные коды (естественно, те, которые не заняты обычными клавишами). Кстати, в документации они обычно тоже называются скан-кодами, но учтите, что это "немного не те" скан-коды.
На втором этапе уже внутренние коды по специальной таблице "раскладки клавиатуры" (keyboard map) преобразуются в обычные ASCII коды символов. Надо заметить, что при этом используется только скан-код "нажатия клавиши".
Наконец, для некоторых клавиш существует еще и третий этап. На этом этапе
коды, уже преобразованные через таблицу раскладки, превращаются в
последовательность из нескольких кодов (такие клавиши называются
"функциональными", но об этом чуть позже).
То есть, при нажатии таких клавиш, получаются опять как бы "расширенные" коды.
Естественно, это уже не те "расширенные" скан-коды, которые выдает контроллер
клавиатуры (да и клавиши другие).
Надо отметить, что первый этап (преобразование "сырых" скан-кодов во "внутренние") жестко "зашит" в программе syscons. То есть, изменить соответствие между каким-нибудь "расширенным" скан-кодом и внутренним кодом, в который его превратит syscons, нельзя.
А вот преобразованием в ASCII-коды, напротив, можно управлять. Таблица раскладки клавиатуры может быть загружена в syscons с помощью соответствующей утилиты (kbdcontrol). Естественно, если вы не будете загружать никакую таблицу, это не значит, что syscons не сможет перевести скан-коды в символы ASCII. В нем есть "встроенная" таблица раскладки "по умолчанию". Но, как я уже сказал, в любой момент можно поменять все соответствия кодов.
Также можно менять и последовательности, которые "навешиваются" на "функциональные" клавиши на третьем этапе.
Прежде чем перейти к более подробному рассмотрению "раскладки клавиатуры", надо отметить, что syscons можно переключить в режим, когда он будет отдавать в систему просто "сырые" скан-коды (RAW) или в режим выдачи "внутренних" скан-кодов (CODE). (В "нормальном" режиме выдаются "транслированные" (XLATE) коды.)
Если вам захочется посмотреть скан-коды вашей клавиатуры, можете воспользоваться моими программками ("Приложение 4. Несколько мелких полезных программок.), которые используют эти режимы. Только хочу еще раз подчеркнуть, что наиболее интересными являются не "сырые" (RAW) скан-коды, а "внутренние" коды syscons (CODE), поскольку в таблице раскладки клавиатуры указываются именно они (причем, только "код нажатия").
Итак, что собой представляет таблица раскладки клавиатуры (keyboard map)?
Во-первых, напомню, что есть несколько вспомогательных клавиш - "модификаторов"
(Shift, Ctrl и Alt), которые меняют код выдаваемый другими клавишами.
Поэтому, каждая строчка в "таблице раскладки" состоит из скан-кода клавиши
("внутреннего", не "сырого") и нескольких значений для этой клавиши. (В
зависимости от комбинации "модификаторов" syscons выберет одно из них.)
Все возможные значения для клавиш можно разделить на несколько групп
Это клавиши, которые меняют значения выдаваемые другими клавишами.
Рассмотрим подробнее - какие модификаторы использует syscons и каким
образом они влияют на коды других клавиш.
В таблице раскладки клавиатуры (keyboard map) каждому скан-коду соответствует восемь значений. Как я уже сказал, какое из этих значений будет выбрано при нажатии клавиши, определяется "состоянием модификаторов".
Так вот, это "состояние" задается тремя модификаторами - shift, ctrl и alt.
Состояние модификаторов (номер кода в таблице) syscons вычисляет по формуле:
1 (если shift) + 2 (если ctrl) + 4 (если alt)
В общем-то, если вы заглянете в какой-нибудь файл "раскладки клавиатуры", то увидите, что все колонки значений сверху подписаны - какая колонка, при какой комбинации модификаторов выбирается. Так что, высчитывать номер колонки по приведенной формуле вам не придется. Однако, эту формулу полезно знать, чтобы правильно понимать действие двух других модификаторов (CapsLock и NumLock) о которых речь пойдет ниже.
Говоря о модификаторах shift, ctrl и alt надо отметить, что ...
Следующие два модификатора - clock (CapsLock) и nlock (NumLock). Их влияние на другие клавиши по сути одинаково. Отличаются они только "областью действия". Как вы можете заметить, в файлах "раскладки клавиатуры", кроме восьми колонок с кодами, есть еще одна колонка, озаглавленная "lock state". Она и определяет - подвержена ли соответствующая кнопка действию clock или nlock.
Действие же этих модификаторов заключается в том, что при нажатии соответствующего lock, значение модификатора shift инвертируется. То есть, если shift не нажат (но действует соответствующий lock), то выбирается такое значение для клавиши, которое соответствует "активному состоянию" модификатора shift. И наоборот - при нажатом shift выбирается значение соответствующее "не нажатому" shift'у.
То есть, в таблице раскладки меняются местами колонки "с shift'ом" и "без shift'а". Обратите внимание, что в соответствии с формулой, определяющей номер колонки, меняются местами не только первые две, но и все четные с нечетными (то есть, "просто ctrl" и "ctrl+shift", "просто alt" и "alt+shift" и т.д.).
Обе клавиши - clock и nlock, являются "фиксирующимися". То есть, после нажатия и отпускания clock (например) клавиатура переходит в состояние clock. А при повторном нажатии/отпускании возвращается в исходное состояние (что тоже всем известно).
По умолчанию, значение nlock "навешено" на клавишу [Num Lock]. А вот с clock все немного сложнее. Вообще-то, оно изначально соответствует клавише [Caps Lock], но если у вас загружена раскладка для русской клавиатуры (что бывает чаще всего), то на эту клавишу "навешивается" еще и другой модификатор - alock (Alt Group Lock), который служит для переключения на русский алфавит (о нем поговорим немного позднее). Для того, чтобы получить именно clock вам придется нажимать клавишу [Caps Lock] вместе с одним из основных модификаторов (не важно - shift, ctrl или alt).
Следующие два модификатора - alock (Alt Group Lock) и ashift (Alt Group Shift). Они действуют на другие клавиши одинаково, причем, на все клавиши. Разница только в том, что alock "фиксирующаяся" (как clock и nlock), а ashift - "не фиксирующаяся" (как и обычный shift).
Действие же этих модификаторов заключается в том, что в состоянии AltGroup syscons к скан-коду каждой клавиши добавляет постоянное смещение (а именно - 128), а только после этого подбирает подходящее значение из таблицы "раскладки клавиатуры".
То есть каждая клавиша имеет как бы два разных скан-кода, один в обычном состоянии и другой скан-код (на 128 больше) в состоянии AltGroup. Таким образом получается для того же набора физических кнопок еще одна раскладка - "альтернативная".
Обычно альтернативная раскладка используется, чтобы на "буквенные" клавиши "навесить" буквы (точнее, коды букв) какого-нибудь национального языка, алфавит которого отличается от английского. По крайней мере, именно эта "альтернативная раскладка" используется для русификации клавиатуры.
Таким образом, руссифицированная раскладка отличается от обычной тем, что в нее дописывается еще столько же строчек (сколько в обычной) с номерами скан-кодов больше на 128. При этом, для "небуквенных" клавиш все значения обычно такие же, как и в первой части таблицы, а для "буквенных" подставляются соответствующие коды русских букв. (Надо отметить, что в дистрибутиве FreeBSD есть раскладки для кодировок koi8 и cp866. Если вам захочется иметь раскладку для cp1251 ее можно изготовить самостоятельно).
Естественно, что по умолчанию эти два модификатора не назначены ни на какие клавиши. Но если загружается одна из русских раскладок, то alock присвоена клавише [Caps Lock], но только в первой колонке. То есть в таком качестве [Caps Lock] выступает только тогда, когда не нажат ни один из основных модификаторов (shift, ctrl или alt). Если вас это не устраивает и вы хотели бы, чтобы [Caps Lock] была именно CapsLock'ом, можно "подвесить" alock на любую другую клавишу или комбинацию клавиш (например "два Shift'а" или "Ctrl+Shift"). Подробнее можете посмотреть в "Несколько примеров изменения назначения клавиш"..
Значение ashift в стандартных раскладках отсутствует (даже в русских). Если она вам нужна, выберите подходящую для нее клавишу и отредактируйте соответствующий файл "раскладки клавиатуры".
Наконец, последняя клавиша, которую можно отнести к модификаторам - клавиша meta.
Клавиша эта не фиксируется, то есть она активна только пока вы ее удерживаете в нажатом состоянии.
Когда она активна, syscons при выдаче кода другой нажатой клавиши, сначала вставляет код Esc (27). То есть обычные клавиши (алфавитноцифровые) начинают выдавать последовательность из двух кодов (например, клавиша [A] - EscA). Дело в том, что некоторые программы (Midnight Comander, emacs и т.д) широко используют такие комбинации в качестве "горячих клавиш". Без модификатора meta их можно получать, последовательно нажимая [Esc] и нужную клавишу.
По умолчанию эта клавиша на клавиатуре отсутствует. Если вы считаете,
что с ней вам будет удобнее, можно назначить ее на одну из парных кнопок
модификаторов (Shift, Ctrl или Alt), а вторую оставить для ее "прямого
назначения". Если же у вас имеется клавиатура "от Microsoft", с
дополнительными кнопками (два "окошка" - слева и справа и "меню") то под meta
можно задействовать одну из этих кнопок (или даже все три :-).
Подробнее можете посмотреть в "Несколько примеров
изменения назначения клавиш"..
Это клавиши, при нажатии которых выдается просто одиночный код (в отличии от "функциональных" клавиш). Кроме обычных символов (буквы, цифры, знаки препинания и т.п.) к ним относятся "управляющие" коды, которые генерируют клавиши [Esc], [Enter], [Tab] и [Backspace].
Кроме того, в зависимости от состояния модификаторов (обычно, модификатора ctrl), "символьные" клавиши тоже могут выдавать "управляющие" коды (CtrlA - 1, CtrlB - 2 и т.д.).
В таблице раскладки клавиатуры, коды таких обычных клавиш можно указывать просто числом или соответствующим символов в "одиночных кавычках" - 'a', 'b' и т.п. Для управляющих кодов существуют специальные названия (хотя их тоже можно указать просто числом). Полный список этих кодов можно посмотреть в "Приложение 2. Управляющие ("контроловые") символы".
Кроме того, в таблице раскладки клавиатуры можно встретить код nop.
Строго говоря, это не код, а просто указание syscons, что при нажатии
на соответствующую клавишу никакого кода вообще выдавать не надо.
Обычно этим словом помечаются не клавиши, а только некоторые "состояния"
клавиш (например, клавиша [&] при нажатом [Ctrl]). А также, скан-коды, которые
не соответствуют никаким физическим кнопкам на клавиатуре.
Эти клавиши отличаются от "нормальных" знаковых клавиш тем, что при нажатии выдают не просто одиночный код, а последовательность кодов (обычно это последовательности типа Esc [ 'буква'). Причем эти последовательности при желании можно "перепрограммировать" с помощью, например, утилиты kbdcontrol.
Вообще-то, правильнее сказать "могут выдавать последовательности", поскольку, по умолчанию, некоторые из этих "последовательностей" состоят из одного знака или вообще пустые. Важно только то, что при желании вы можете их "удлинить", в то время как для обычных знаковых клавиш это сделать невозможно. Максиммальная длина последовательности - 16 байт.
Называются эти клавиши в таблицах "раскладки клавиатуры" fkey01 - fkey96. Так много их потому, что к таким клавишам (порождающим целую "пачку" кодов) относятся не только клавиши F1 - F12, но и "стрелки", Home, End, Delete и т.п. Кроме того, несколько fkey оставлено "про запас", для будущих возможных кнопок.
На всякий случай я привожу список соответствий - какие fkey'и каким физическим клавишам соответствуют. Естественно, речь идет о значениях "по умолчанию". При желании их можно "перевесить" на другие кнопки. Первые 48 fkey распределены между клавишами [F1] - [F12]. Из них первые двенадцать (fkey01 - fkey12) получаются просто при нажатии соответствующих физических клавиш ([F1] - [F12]), следующие двенадцать (fkey13 - fkey24) при нажатии тех же клавиш с модификатором Shift (то есть, по умолчанию - [F1]+[Shift] - [F12]+[Shift]), следующая "пачка" (fkey25 - fkey36) - то же самое, но с модификатором Ctrl, и, наконец, последние (fkey37 - fkey48) получатся когда будут активны оба модификатора - и Shift, и Ctrl. Следующие fkey'и "достались" физическим клавишам
fkey49 - [Home] fkey50 - [стрелка вверх] fkey51 - [Page Up] fkey53 - [стрелка влево] fkey55 - [стрелка вправо] fkey57 - [End] fkey58 - [стрелка вниз] fkey59 - [Page Down] fkey60 - [Insert] fkey61 - [Delete]
Эти же значения (кроме fkey61 - [Delete]) могут выдавать клавиши
дополнительной цифровой клавиатуры (keypad), когда она находится не в
"режиме цифр" (неактивный Num Lock).
А несколько fkey (пропущенных выше) можно получить только с кнопок
этой дополнительной клавиатуры (опять же в "нецифровом режиме")
fkey52 - [-] fkey54 - [5] fkey56 - [+]И, наконец, "микрософтовская" клавиатура имеет еще три дополнительные кнопки, на которые по умолчанию тоже назначены fkey'и
fkey62 - ["окошко" слева] fkey63 - ["окошко" справа] fkey64 - ["меню"]
Остальные fkey'и fkey65 - fkey96 зарезервированы для дальнейших расширений клавиатуры. То есть, они не назначены ни на какие клавиши, и не генерируют никаких последовательностей.
Можно отметить, что существует еще одна клавиша, которая выдает
последовательность кодов, и которую можно также отнести к "функциональным".
Обозначается она btab (back tab) и назначена по умолчанию на [Tab]+[Shift].
Однако, в отличии от fkey он всегда выдает цепочку "Esc[Z", которую
изменить нельзя (разве что, подправив "исходники").
Ну и, наконец, сами последовательности, которые по умолчанию соответствуют fkey'ям, можно посмотреть в "Приложение 3. Функциональные клавиши".
Эти клавиши вызывают немедленное переключение на другой "виртуальный терминал".
В таблице "раскладки клавиатуры" они называются scr01, scr02 ... scr16
(от слова screen). Понятно, что цифры в конце названия обозначают номер
"виртуального терминала".
Кроме того существует еще одна клавиша - nscr (next screen) которая
переключает syscons просто на следующий терминал.
По умолчанию, переключатели scr01 - scr10 назначены на комбинации клавиш [F1]+[Alt] - [F10]+[Alt], а оставшиеся scr11 - scr16 на комбинации [F1]+[Alt]+[Shift] - [F6]+[Alt]+[Shift]. Точнее, на клавиши [F1]-[F10] "при активном модификаторе alt" и "активном модификаторе shift", поскольку модификаторы alt и shift только "по умолчанию" находятся на одноименных клавишах и могут быть "переназначены" на любые другие.
Надо также отметить, что для того, чтобы реально переключиться на другой "виртуальный терминал", надо, чтобы он действительно существовал (как это описано в "Виртуальные терминалы") и был активным, то есть, чтобы на нем была запущена хоть какая-нибудь задача (getty, шелл, X-сервер и т.п.)
Клавиша nscr по умолчанию находится на физической клавише [Print Screen].
Это клавиши, которые не выдают никакие коды, а вызывают немедленно какое-нибудь действие, типа "рестарт компьютера", "запуск встроенного отладчика" и т.п.
Прежде всего, клавиша, которая имеет смысл только для самого syscons. Это slock (scroll lock). Она переводит syscons в особый режим - просмотра буфера "истории" (history buffer). Как уже говорилось (в "Основные возможности syscons: Буфер экрана (history buffer)") каждый "виртуальный терминал" имеет буфер экрана, который больше чем физический экран (по умолчанию - 100 строчек или 4 обычных 25-строчных экрана). То есть, он помнит 100 строчек (если, конечно, вы не меняли этот размер) из которых мы видим только последние 25. В режиме просмотра буфера вы можете посмотреть остальные предыдущие строчки.
В этом режиме работают только клавиши [стрелка вниз], [стрелка вверх],
[Page up], [Page Down], [Home] и [End]. Естественно, при этом ваш экран
как бы "отсоединяется" от машины, то есть, если какая-то программа в это время
что-нибудь выводит, весь ее вывод копится внутри системы и не попадает на экран.
А вот клавиши (кроме перечисленных выше) обрабатываются в обычном порядке.
Эта клавиша "фиксирующаяся" (как и другие Lock'и), то есть, чтобы попасть обратно в нормальный режим, надо нажать ее повторно.
По умолчанию находится на физической клавише [Scroll Lock].
Клавиша boot вызывает немедленную перезагрузку системы (как при вводе команды reboot).
Изначально находится на комбинации - [Ctrl]+[Alt]+[Delete].
Клавиша debug включает "ядерный" отладчик (встроенный в ядро). Естественно, для того, чтобы он включился у вас должно быть ядро с встроенным отладчиком (то ядро, которое ставится при инсталляции, отладчика в себе не имеет), иначе вы просто получите сообщение на самом первом "виртуальном терминале" - "No debugger in kernel".
По умолчанию эта команда "повешена" на две комбинации - [Ctrl]+[Alt]+[Esc] и [Ctrl]+[Print Screen].
Клавиша susp имеет значения только для "лаптопов". Она дает команду устройству apm (Advanced Power Management) "пригасить" компьютер.
Поскольку, это довольно "экзотическая" команда, по умолчанию, она не присвоена никакой физической клавише.
И, наконец, надо сказать о клавише Compose. С ее помощью можно получить любой код, набрав его цифрами на клавиатуре. Для этого нужно прижать ее (как shift или ctrl) и набрать на дополнительной цифровой клавиатуре нужное число. После отпускания Compose syscons выдаст соответствующий код.
Особенность этой клавиши в том, что это именно физическая клавиша (со скан-кодом 56 - левый [Alt]) и она не может быть "переприсвоена" через таблицу раскладки. Кстати, и цифры с "дополнительной цифровой клавиатуры" "снимаются" на уровне скан-кодов. То есть, если вы даже поменяете их значения в таблице раскладки, для Compose они останутся обычными цифрами, причем независимо от состояния каких-либо модификаторов.
Иван Паскаль pascal@tsu.ru