Описание "действий".

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

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

Естественно, от типа "действия" зависит набор (и количество) аргументов и возможные значения этих аргументов.

Надо также заметить, что XKB отслеживает как нажатие, так и отпускание клавиши. При этом "действие" может срабатывать только при нажатии или только при отпускании клавиши. А может, также, выполнять различные действия при нажатии и при отпускании (обычно - противоположные, см. ниже).

Рассмотрим подробнее несколько "действий". Те, которые меняют модификаторы, номера групп и "управляющие флаги" в "состоянии XKB".

Изменение номера группы.

Напомню, что номер группы "размазан" по трем переменным (base, locked и latched). Поэтому для его измения используются три разных действия

Все эти действия имеют два аргумента

Флаги для этих "действий"

Заметьте, что этот флаг в описании "действий" явно не указывается. Если необходимо задать относительное значение для "номера группы" оно пишется со знаком (+ или -), абсолютное - без знака. Таким образом, "номер группы" = 2, означает, что в соответствующую переменную надо записать двойку, а "номер группы" = +2 означает, что к переменной надо добавить двойку.

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

Так вот. SetGroup и LatchGroup при нажатии заносят в соответствующие переменные номер группы (или добавляют/отнимают "добавку"), а при отпускании - делают обратное действие, возвращают "все как было".

И только LockGroup при отпускании "запоминает" значение в locked group.

Таким образом, изменения в base group и latched group "держатся" только пока соответствующая клавиша нажата.

Изменение виртуальных модификаторов.

Также, как и для номеров групп, для изменения виртуальных модификаторов в "состоянии XKB" предназначены три разных "действия"

Аргументы - список модификаторов и набор флагов.

Значение флагов

Рассмотрим немного подробнее поведение этих "действий" при нажатии и при отжатии кнопок.

Изменение управляющих флагов.

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

Аргумент только один - список "управляющих флагов".
Строго говоря, флаги у LockControls тоже есть, но при описании этой функции в файлах настройки они игнорируются (их можно установить, только если действие модифицируется прикладной программой с помощью специальных запросов к XKB).

Как описываются "действия" в файлах настройки.

Описание "действия" имеет такой же вид, как вызов функции в языке С. то есть

 название функции '(' список аргументов через запятую ')'

Небольшое отличие только внутри списка аргументов. Флаги, обычно, просто указываются по имени. А вот другие аргументы (номер группы, список модификаторов и т.п.) указываются как

 название аргумента '=' аргумент

Для описанных выше "действий" аргументы называются

Например

LockGroup(group=2)
заметьте, подразумевается флаг groupAbsolute
SetGroup(group=+1,clearLock)
здесь указывается относительная "добавка" и флаг clearLock
SetMods(modifiers=NumLock, clearLock)
здесь явно задан модификатор, и флаг clearLock
LockMods(modifiers=useModMapMods)
обратите внимание - флаг useModMapMods указывается вместо списка модификаторов, а не как отдельный флаг.
Кстати, флаги lockNoLock и lockNoUnlock в описаниях игнорируются (их можно выставить только с помощью отдельных программ).
LockControls(controls=Overlay1)
устанавливается флаг Overlay1 (включения "режима перекрытия" для "перекрытия" номер 1).

Объявление "умолчания".

В тех файлах, где могут появиться описания "действий" - xkb_compat и xkb_symbols, могут также использоваться объявления "умолчания".

Они выглядят как оператор присваивания полю структуры в языке C. То есть, в левой части присваивания стиот конструкция состоящая из двух слов, разделенных точкой.

Эти объявления могут использоваться для задания значений флагов "по умолчанию" для "действий" встречающихся в файле. В этом случае первое слово - название "действия", а второе - название флага. Естественно, справа от знака присваивания может быть только логическое значение - True/False.

Например

setMods.clearLock = True;
означает - во всех дальнейших описаниях SetMods, добавляется флаг clearlock.
latchMods.clearLock = True;
latchMods.latchToLock = True;
во всех дальнейших описаниях LatchMods, добавляются флаги clearLock и latchToLock.

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