Настройка и работа в Linux

         

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


    • Описание "действий".
    • Действия, изменяющие состояние XKB.

      • Изменение набора модификаторов (modifiers).
      • Изменение номер группы.
      • Изменение управляющих флагов (XKB Controls).
      • Действие ISO_Lock.

      • Действия для эмуляции событий мыши

        • Движение курсора
        • Нажатие кнопок мыши
        • Нажатие и удержание кнопки мыши
        • Определение "кнопки по умолчанию".

        • Другие действия.



          • Посылка сообщения.
          • Эмуляция нажатия другой клавиши.
          • Выключить X-сервер.
          • Переключение экранов (screen).
          • Нажатие кнопок на другом устройстве обслуживаемом XKB.

          • Действия "особого назначения".

            • "Пустышка".
            • "Сырое" действие.

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

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

              Описание действия похоже на объявление функции в языке C, то есть

              имя_действия '(' список_аргументов ');'

              Но отличие в том, что в списке аргументов указываются не просто значения, а пары имя-значение:

              имя_аргумента '=' значение_аргумента

              Например

              MovePointer(x=10, y=10, repeat=False);

              Кстати программа xkbcomp, которая компилирует файлы конфигурации, во многих случаях понимает разные названия для одного и того же действия и разные имена для одного и того же аргумента.

              Внутри XKB действия представляют собой некую структуру которая содержит

              • код (номер) действия;
              • поле битовых флагов, которые как-то модифицируют выполняемое действие;
              • поля содержащие аргументы действия (их может быть несколько или вообще ни одного)

              Понятно, что количество и смысл аргументов зависит от конкретного действия. А вот флаги у многих действий совпадают по названию и по смыслу. При этом надо заметить, что в файлах конфигурации не все флаги можно указать явно.


              Например некоторые действия имеют аргументы, которые могут быть как абсолютными значениями, так и приращениями к текущим значениям. Это могут быть координаты курсора на экране, номер группы XKB и т.п. Во внутренней структуре действия для различения этих двух типов аргументов предусмотрен специальный флаг Absolute. Но в описаниях функций он явно не указывается. О том какие значения вы имели ввиду (абсолютные или относительные) XKB догадывается по наличию знака "+" или "-" перед значением аргумента.
              То есть
              SomeAction(x=10, y=10)
              означает абсолютные значения для x и y, а
              SomeAction(x=+10, y=+10)
              означает положительные приращения для тех же переменных.
              Другой пример неявных флагов это флаги, которые указывают - в какой момент выполнять действие - при нажатии клавиши или при ее отпускании. Такие флаги есть почти у каждого действия, хотя во многих случаях они не имеют особого смысла (например, какая вам разница когда установится модификатор CapsLock - в момент нажатии соответствующей клавиши или при ее отпускании).
              Эти флаги в описаниях действий или вообще нельзя указать, или это указание делается через некий "псевдоаргумент" (в том смысле, что он не соответствует никакому полю во внутренней структуре XKB описывающей действие).
              (У вас может возникнуть вопрос - зачем вообще существуют флаги, которые никак нельзя задать в описании? Дело в том, что в XKB протоколе существуют специальные запросы к серверу, которые позволяют загрузить или модифицировать любое действие из прикладной программы. Вот они то не накладывают никаких ограничений и позволяют задать любые флаги, имеющие смысл для данного действия.)
              И еще несколько слов о том, как в описании действия указываются флаги. Хотя они предствляют собой отдельные биты в одном и том же поле внутренней структуры XKB, но в описании указываются как отдельные переменные типа boolean (то есть, их значением может быть только "да" или "нет"). При этом xkbcomp понимает в качестве значений логической переменной и другие слова - в качестве "да" вы можете писать yes, on, true, а качестве "нет" - no, off, false.


              Но и это еще не все. Специально для логических переменных предусмотрена еще более простая запись. Вы можете написать просто имя переменной (флага) безо всякого значения и знака присваивания, это будет означать, что соответствующая переменная имеет значение "да". А вот если перед именем переменной поставить знак "!" или "~", это будет означать, что переменная имеет значение "нет".
              Например следующие строчки полностью эквивалентны
              SomeAction(..., SomeFlag=yes, ...); SomeAction(..., SomeFlag=on, ...); SomeAction(..., SomeFlag=true, ...); SomeAction(..., SomeFlag, ...);
              и следующие строчки тоже эквивалентны
              SomeAction(..., SomeFlag=no, ...); SomeAction(..., SomeFlag=off, ...); SomeAction(..., SomeFlag=false, ...); SomeAction(..., !SomeFlag, ...); SomeAction(..., ~SomeFlag, ...);
              Но учтите, что каждый флаг имеет значение по умолчанию. Поэтому в большинстве случаев их вообще не указывают, если нужное значение совпадает с "умолчательным".

              Содержание раздела