Рейтинг@Mail.ru
[Войти] [Зарегистрироваться]

Наши друзья и партнеры

UnixForum
Беспроводные выключатели nooLite

Lines Club

Ищем достойных соперников.




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

Библиотека сайта или "Мой Linux Documentation Project"


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


Эта статья еще не оценивалась
Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Комментарии отсутствуют