клавиатуры
клавиатуры
Клавиатура :: Linux SoftWare Library - Российский портал Linux
Теперь рассмотрим ту часть syscons, которая работает с клавиатурой. Начнем с самого "низа" - "железного" контроллера клавиатуры. При нажатии на любую клавишу он выдает ее скан-код - некий номер кнопки на клавиатуре. Сразу замечу, что этот скан-код не имеет ничего общего с ASCII-кодами тех символов, которые "нарисованы на кнопках". Более того, для каждой кнопки контроллер выдает по крайней мере два разных кода - один, когда вы нажимаете кнопку, другой - когда отпускаете ее. Эти коды всегда отличаются на величину 128 (старший бит в байте кода), хотя в данном случае это не так уж и важно. Кроме этого, при нажимании некоторых кнопок (и отпускании) контроллер генерирует скан-коды состоящие из двух байт - "префикса" (обычно это E0) и собственно кода кнопки. Обычно такие скан-коды называют "расширенными". Основная задача syscons - преобразовать эти скан-коды в соответствующие коды символов. Причем, он делает это в два этапа. Сначала "сырые" скан-коды (которые считываются из контроллера) преобразуются во внутренние коды syscons. В основном это касается "расширенных" кодов. Для обычных клавиш в качестве внутреннего кода берется просто скан-код, а вот "расширенные" коды заменяются на однобайтные коды (естественно, те, которые не заняты обычными клавишами). Кстати, в документации они обычно тоже называются скан-кодами, но учтите, что это "немного не те" скан-коды. На втором этапе уже внутренние коды по специальной таблице "раскладки клавиатуры" (keyboard map) преобразуются в обычные ASCII коды символов. Надо заметить, что при этом используется только скан-код "нажатия клавиши". Наконец, для некоторых клавиш существует еще и третий этап. На этом этапе коды, уже преобразованные через таблицу раскладки, превращаются в последовательность из нескольких кодов (такие клавиши называются "функциональными", но об этом чуть ). То есть, при нажатии таких клавиш, получаются опять как бы "расширенные" коды. Естественно, это уже не те "расширенные" скан-коды, которые выдает контроллер клавиатуры (да и клавиши другие). Надо отметить, что первый этап (преобразование "сырых" скан-кодов во "внутренние") жестко "зашит" в программе syscons. То есть, изменить соответствие между каким-нибудь "расширенным" скан-кодом и внутренним кодом, в который его превратит syscons, нельзя. А вот преобразованием в ASCII-коды, напротив, можно управлять. Таблица раскладки клавиатуры может быть загружена в syscons с помощью соответствующей утилиты ( ). Естественно, если вы не будете загружать никакую таблицу, это не значит, что syscons не сможет перевести скан-коды в символы ASCII. В нем есть "встроенная" таблица раскладки "по умолчанию". Но, как я уже сказал, в любой момент можно поменять все соответствия кодов. Также можно менять и последовательности, которые "навешиваются" на "функциональные" клавиши на третьем этапе. Прежде чем перейти к более подробному рассмотрению "раскладки клавиатуры", надо отметить, что syscons можно переключить в режим, когда он будет отдавать в систему просто "сырые" скан-коды ( RAW ) или в режим выдачи "внутренних" скан-кодов ( CODE ). (В "нормальном" режиме выдаются "транслированные" ( XLATE ) коды.) Если вам захочется посмотреть скан-коды вашей клавиатуры, можете воспользоваться моими программками ( ), которые используют эти режимы. Только хочу еще раз подчеркнуть, что наиболее интересными являются не "сырые" ( RAW ) скан-коды, а "внутренние" коды syscons ( CODE ), поскольку в таблице раскладки клавиатуры указываются именно они (причем, только "код нажатия"). Итак, что собой представляет таблица раскладки клавиатуры (keyboard map)? Во-первых, напомню, что есть несколько вспомогательных клавиш - "модификаторов" ( Shift, Ctrl и Alt ), которые меняют код выдаваемый другими клавишами. Поэтому, каждая строчка в "таблице раскладки" состоит из скан-кода клавиши ("внутреннего", не "сырого") и нескольких значений для этой клавиши. (В зависимости от комбинации "модификаторов" syscons выберет одно из них.) - клавиши, которые изменяют значения для других клавиш клавиши (рестарт компьютера, переход в отладчик и т.п.) Это клавиши, которые меняют значения выдаваемые другими клавишами. Рассмотрим подробнее - какие модификаторы использует syscons и каким образом они влияют на коды других клавиш. В таблице раскладки клавиатуры (keyboard map) каждому скан-коду соответствует восемь значений. Как я уже сказал, какое из этих значений будет выбрано при нажатии клавиши, определяется "состоянием модификаторов". Так вот, это "состояние" задается тремя модификаторами - shift, ctrl и alt . В общем-то, если вы заглянете в какой-нибудь файл "раскладки клавиатуры", то увидите, что все колонки значений сверху подписаны - какая колонка, при какой комбинации модификаторов выбирается. Так что, высчитывать номер колонки по приведенной формуле вам не придется. Однако, эту формулу полезно знать, чтобы правильно понимать действие двух других модификаторов ( CapsLock и NumLock ) о которых речь пойдет ниже. Говоря о модификаторах shift, ctrl и alt надо отметить, что ... Строго говоря, поскольку на современных клавиатурах каждая такая клавиша присутствует в двух экземплярах (слева и справа основной клавиатуры), и значений тоже не три, а шесть - lshift, rshift, lctrl, rctrl, lalt, ralt . Буквы l и r в названиях означают левый (left) и правый (right) соответственно. Но для выбора одного из восьми состояний syscons не делает различий для левой и правой клавиши. То есть, в любом случае - нажмете ли вы клавишу, которой "прикреплено" значение lalt или клавишу со значением ralt или обе вместе, syscons будет считать, что активен модификатор alt . Все эти три (или шесть) модификаторов "не фиксирующиеся". То есть, они действуют только пока вы держите соответствующие клавиши нажатыми (впрочем, об этом и так все знают). По умолчанию, все эти шесть значений "навешены" на привычные клавиши - lshift на левую кнопку [Shift] , rshift - на правую кнопку [Shift] и т.д. Однако, еще раз замечу, что речь идет о не о физических кнопках на клавиатуре, а о значениях, которые драйвер им присваивает. То есть, при желании, можно клавишу [Alt] заставить действовать как Shift , например, хотя в этом ничего полезного нет. Более полезным может оказаться одну из парных клавиш [Shift] , [Ctrl] или [Alt] (например, левую) использовать по ее прямому назначению, а на правую "повесить" какую-нибудь другую функцию. Следующие два модификатора - clock ( CapsLock ) и nlock ( NumLock ). Их влияние на другие клавиши по сути одинаково. Отличаются они только "областью действия". Как вы можете заметить, в файлах "раскладки клавиатуры", кроме восьми колонок с кодами, есть еще одна колонка, озаглавленная "lock state". Она и определяет - подвержена ли соответствующая кнопка действию clock или nlock . Если в этой колонке стоит буква " O ", то клавиша никак не реагирует ни на нажатие clock , ни на nlock . Обычно, это клавиши с цифрами на основной клавиатуре, функциональные клавиши и сами клавиши модификаторов. Если в "lock state" стоит " C ", значит выбор значения зависит от состояния модификатора clock . Обычно, это клавиши с буквами. Буква " N " помечает клавиши, зависимые от состояния nlock . Традиционно - это клавиши на дополнительной цифровой клавиатуре. Наконец, в последней колонке может стоять буква " B " (от слова both - оба). Это должно означать, что клавиша реагирует и на clock и на nlock . Однако, ни в одной "раскладке клавиатуры" из дистрибутива FreeBSD такие клавиши не предусмотрены. Действие же этих модификаторов заключается в том, что при нажатии соответствующего 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 и т.д) широко используют такие комбинации