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








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

Библиотека сайта 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