Описание "действий" (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 указывается вместо списка модификаторов, а не как отдельный флаг.
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