Библиотека сайта rus-linux.net
Previos | Contents | Next |
Описание "действий".
- "Действия" для -
- Как описываются "действия" в файлах настройки.
- Объявление "умолчания".
Описание "действий" (actions) используются в файлах типа xkb_symbols, где они "привязываются" к скан-кодам клавиш, и в файлах типа xkb_compat, где они "привязываются" к управляющим символам. (Напомню, что в xkb_compat, описываются "интерпретации" - таблички, которые помогают менять привязку "действия" к скан-кодам, когда прикладные программы меняют привязку соответствующих "управляющих символов").
В XKB определен большой набор возможных "действий" (функций). Поэтому, описывать все действия здесь я не буду. Упомяну только, что с помощью действий можно
- менять номера групп, наборы модификаторов и управляющие флаги
- менять положение и состояние кнопок "указателя" ("мышки")
- посылать сообщения программам
- перключать виртуальные экраны X-сервера
- и т.п.
Естественно, от типа "действия" зависит набор (и количество) аргументов и возможные значения этих аргументов.
Надо также заметить, что XKB отслеживает как нажатие, так и отпускание клавиши. При этом "действие" может срабатывать только при нажатии или только при отпускании клавиши. А может, также, выполнять различные действия при нажатии и при отпускании (обычно - противоположные, см. ниже).
Рассмотрим подробнее несколько "действий". Те, которые меняют модификаторы, номера групп и "управляющие флаги" в "состоянии XKB".
Изменение номера группы.
Напомню, что номер группы "размазан" по трем переменным (base, locked и latched). Поэтому для его измения используются три разных действия
- SetGroup - меняет переменную base group
- LockGroup - меняет переменную locked group
- LatchGroup - меняет переменную latched group
Все эти действия имеют два аргумента
- номер группы (естественно)
- набор флагов
Флаги для этих "действий"
- groupAbsolute - определяет, что аргумент "номер группы" задает абсолютное значение, которое нужно занести в соответствующую переменную. В противном случае в поле "номер группы" задана "добавка", которую нужно добавить или вычесть из соответствующей переменной.
Заметьте, что этот флаг в описании "действий" явно не указывается. Если необходимо задать относительное значение для "номера группы" оно пишется со знаком (+ или -), абсолютное - без знака. Таким образом, "номер группы" = 2, означает, что в соответствующую переменную надо записать двойку, а "номер группы" = +2 означает, что к переменной надо добавить двойку.
- clearLock - применяется в "действиях" SetGroup и LatchGroup и означает, что попутно с этим действием надо "почистить" переменную lock group (точнее установить в ней group = 1).
- latchToLock - применяется только в LatchGroup и означает, что при нажатии кнопки значение "номер группы" помещается в latched group (точнее, это всегда делается при выполнении LatchGroup), а вот при отпускании кнопки, перенсти значение из latched group в locked group.
Есть еще одна тонкость в поведении этих трех "действий". Как уже говорилось, "действие" может по разному вести снебя при нажатии и при отпускании кнопки.
Так вот. SetGroup и LatchGroup при нажатии заносят в соответствующие переменные номер группы (или добавляют/отнимают "добавку"), а при отпускании - делают обратное действие, возвращают "все как было".
И только LockGroup при отпускании "запоминает" значение в locked group.
Таким образом, изменения в base group и latched group "держатся" только пока соответствующая клавиша нажата.
Изменение виртуальных модификаторов.
Также, как и для номеров групп, для изменения виртуальных модификаторов в "состоянии XKB" предназначены три разных "действия"
- SetMods - меняет переменную base modifiers
- LatchMods - меняет переменную latched modifiers
- LockMods - меняет переменную locked modifiers
Аргументы - список модификаторов и набор флагов.
Значение флагов
- useModMapMods - означает, что аргумент "список модификаторов" игнорируется, а сами модификаторы берутся из переменных "привязанных" к клавише (скан-коду). Напомню, что с каждой клавишей могут быть связаны набор реальных модификаторов (modmap) и набор виртуальных модификаторов (vmodmap), именно эти два набора и используются в качестве аргумента.
- clearLocks - имеет смысл только для SetMods и LatchMods, означает, что попутно надо очистить locked modifiers (имеется ввиду - "сбросить" указанные модификаторы).
- latchToLock - имеет смысл только для LatchMods, означает, что при отжатии кнопки значение из latched modifiers переписывается в locked modifiers.
- LockNoLock - имеет смысл только для LockMods, означает, что указанные модификаторы не записываются по нажатию в locked modifiers (какой в этом смысл - см.ниже)
- LockNoUnlock - также имеет смысл только для LockMods и означает, что при отжатии кнопки модификаторы не "сбрасываются".
Рассмотрим немного подробнее поведение этих "действий" при нажатии и при отжатии кнопок.
- SetMods
- при нажатии: заносит модификаторы в base modifiers
- при отжатии: "сбрасывает" модификаторы в base modifiers; если стоит флаг clearLocks, то эти модификаторы "сбрасываются" также и в locked modifiers.
- LatchMods
- при нажатии: заносит модификаторы в latched modifiers
- при отжатии: "сбрасывает" модификаторы в latched modifiers; если стоит флаг clearLocks, то эти модификаторы "сбрасываются" также и в locked modifiers, если стоит флаг latchToLock, то эти модификаторы переносятся в locked modifiers (получается аналог LockMods)
- LockMods
- при нажатии: заносит модификаторы в base modifiers, если при этом в locked modifiers указанный модификатор не активен, то он "взводится" в locked modifiers, в противном случае - наоборот, "сбрасывается". если стоит флаг LockNoLock, модификаторы устанавливаются только в base (получается аналог SetMods).
- при отжатии: "сбрасывает" модификаторы в base modifiers, но оставляет его в locked modifiers (если, конечно, он там "взвелся", а не "сбросился") То есть, при первом нажатии/отжатии модификаторы запоминаются в (и после отжатия клавиши), а при повторном - сбрасываются (по нажатию).
Изменение управляющих флагов.
Поскольку набор управляющих флагов в XKB только один (а не три, как для модификаторов и номера группы), для изменения это набора существует только два действия
- SetControls - действует как Set(Group|Mods), то есть - при нажатии кнопки устанавливает флаги, при отжатии - сбрасывает
- LockControls - действует как Lock(Group|Mods), то есть - не сбрасывает установленные флаги при отжатии кнопки.
Аргумент только один - список "управляющих флагов".
Строго говоря, флаги у LockControls тоже есть, но при описании этой
функции в файлах настройки они игнорируются (их можно установить, только
если действие модифицируется прикладной программой с помощью специальных
запросов к XKB).
Как описываются "действия" в файлах настройки.
Описание "действия" имеет такой же вид, как вызов функции в языке С. то есть
название функции '(' список аргументов через запятую ')'
Небольшое отличие только внутри списка аргументов. Флаги, обычно, просто указываются по имени. А вот другие аргументы (номер группы, список модификаторов и т.п.) указываются как
название аргумента '=' аргумент
Для описанных выше "действий" аргументы называются
- для xxxGroup - group
- для xxxMods - modifiers
- для xxxControls - controls
Например
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
Previos | Contents | Next |