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








Книги по Linux (с отзывами читателей)

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

Общие замечания о языке файлов конфигурации XKB.

Для описания конфигурации XKB используется язык с синтаксисом похожим на синтаксис языка C.

Поэтому, формат числовых и строковых констант, встречающихся в этих файлах, обычно соответствут формату констант языка C.

Так строковые константы представляют собой набор символов ограниченный "двойными кавычками" (например - "Num Lock"). Причем, внутри строк могут встречаться "спецсимволы", которые обозначаются так же как в языке C (\r, \n, \t, \v, \b, \f или через восьмеричный код - \0**).

Числовые константы могут записываться как в десятичном формате (например - 123), так и в шестнадцатеричном (0x123, 0xff) и восьмеричном (033).

Главное отличие от языка C в том, что во всех словах маленькие и большие буквы НЕ различаются (case insensitive). То есть, например - SETMODS, SetMods, setMods и setmods означают одно и то же.

Объявления в файлах конфигурации, общие для всех типов файлов.

Каждый файл или блок конфигурации состоит из группы объявлений (деклараций, инструкций, определений ?).

Какие именно объявления допустимы в конкретном файле (и как они выглядят) зависит от "Типа Файла".

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

Инструкция include.

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

  include "en_US(pc104)+ru"

Естественно, все "слова", соединенные плюсами, должны представлять собой имена существующих файлов и блоков в них, причем того же типа, что и блок, в котором встретилась эта инструкция.

Способ добавления.

Перед каждым отдельным объявлением может стоять дополнительное слово, которое определяет "способ добавления" или "замещения" (merge mode).

Оно определяет - как должна поступить программа, считывающая конфигурацию из файла, если такое объявление уже встречалось и новое объявление "конфликтует" с предыдущим. Например, это может быть определение кодов символов (блок типа xkb_symbols) для скан-кода, который уже был определен ранее или описание "поведения" модификатора (тип - xkb_compat) для модификатора, который уже описан. Итак, способ добавления может быть

  • augment - в случае конфликта оставить старое определение, новое игнорировать
  • override - заменить строе определение на новое
  • replace - обычно то же самое, что и override, но в файле xkb_symbols означает немного другое. Поскольку, каждому скан-коду соответствует целый массив возможных значений (какое именно выбирается - зависит от модификаторов), различные определения одного и того же скан-кода могут описывать значения только для части ячеек этого массива. Так вот, если новое описание определяет только некоторые ячейки и "способ добавления" - override, то переписаны будут только те ячейки, которые присутствуют в новом определении, остальные останутся без изменений. А вот если "способ добавления" - replace, то все старое описание уничтожается (включая те ячейки, которые отсутствуют в новом описании) и заменяется на новое, даже если оно не полное.
  • alternate - допустимо только для файлов типа xkb_keycodes, означает, что, если новое имя конфликтует с уже существующим, то просто рассматривать его как "alias скан-кода", то есть - просто другое имя для того же числового значения скан-кода.

Еще раз об include.

Кстати, возвращаясь к инструкции include. Если объявления из "включаемого" файла "перекрываются" с уже имеющимися, то "по умолчанию" считается, что они добавляются в режиме override (если внутри файла они не помечены другими "способами добавления"). То же самое "умолчание" действует, если в строке-аргументе include есть дополнительные файлы, через знак '+'.

А вот если вместо плюса стоит знак '|', то это означает, что следующий файл должен добавляться в режиме augment (опять же, некоторые объявления внутри него могут иметь свои "способы добавления").

Кроме того, "способ добавления" (кроме altrenate) может использоваться вместо инструкции include. То есть, вместо

include "group(toggle)"
можно использовать, например, инструкцию
replace "group(toggle)"

Нетрудно догадаться, что это означает, что все инструкции из файла (блока) "group(toggle)" должны быть вставлены в текущий файл (как по инструкции include), но при этом подразумевается, что у всех инструкций "способ добавления" - replace.


Иван Паскаль pascal@tsu.ru