
  ОСНОВНЫЕ СВОЙСТВА ПРОГРАММЫ xxkb.

  Эта программа является индикатором и переключателем состояния клавиатуры
("группы" в терминах XKB).

  То есть, она
- показывает текущую группу ("картинкой" в своем окне)
- переключает группу "щелчком мыши".
При этом группа может переключаться и "штатным" переключателем - клавишей,
определенной в файлах настройки XKB.

  Кроме того xxkb позволяет
- устанавливать отдельно состояние клавиатуры для каждого запущенного
приложения. Состояние будет автоматически переключаться при изменении
фокуса окна.
- "подвешивать" кнопку ("иконку") на "обрамление" каждого отслеживаемого
окна. Эта кнопка сама является индикатором и переключателем ("щелчком мыши"
по ней) для данного окна.
- в случае, когда XKB настроен более чем для двух групп, "корректировать"
поведение клавиши переключателя так, чтобы она имела только два состояния -
"основная группа"-"альтернативная группа". Альтернативную группу можно
устанавливать отдельно для каждого отслеживаемого окна.

  Надо заметить, что xxkb может работать с любым Window Manager'ом.
(реально я проверял ее на twm, mwm, fvwm95, icewm, wmaker, enlightenment,
sawfish).
Естественно, для каждого конкретного WM придется подобрать размеры и положение
"иконки" на "обрамлении" окна (так, чтобы она гармонировала с вашим WM).

   УСТАНОВКА.

  Во-первых, у вас должен быть включен и настроен XKB.
Подробности о его настройке можно почитать на
http://www.tsu.ru/~pascal/other/xkb

  Во-вторых, для сборки xxkb нужна библиотека libXpm (она используется
и многими другими приложениями).
  Если этой библиотеки у вас нет, то можно взять ее на
ftp://avahi.inria.fr/pub/xpm/
или на других сайтах (искать надо архив типа xpm-*.*).

  Для установки собственно xxkb надо
- развернуть архив
- выполнить последовательно команды
xmkmf
make
make install

(Возможно вам захочется поменять PIXMAPDIR и LOCAL_LIBRARIES. Сделайте
это в Imakefile перед выполнением всех команд).

  После этого желательно вставить "запуск xxkb" (комманда - xxkb)
в стартовый файл для "иксов" или файлы настройки вашего Window Manager'а.
  Хотя можно запустить xxkb и "вручную".
  Лучше всего, если он будет стартовать после window manager'а, но до того,
как вы начнете запускать свои приложения.

   НАСТРОЙКА.

  Все параметры для настройки xxkb ищет в файлах
-  XXkb в директории, где размещаются app-defaults для всех приложений
(обычно это - /usr/X11R6/lib/X11/app-defaults)
- .xxkbrc в "домашней директории" пользователя
  Если xxkb собран с опцией XT_RESOURCE_SEARCH (по умолчанию), то
поиск файлов идет в следующем порядке
  /usr/X11R6/lib/X11/$(LANG)/app-defaults/XXkb
  /usr/X11R6/lib/X11/<lang>/app-defaults/XXkb
  /usr/X11R6/lib/X11/app-defaults/XXkb
и, соответственно, в
  $(HOME)/$(LANG)/.xxkbrc
  $(HOME)/<lang>/.xxkbrc
  $(HOME)/.xxkbrc
где <lang> - первые буквы из LANG, обозначающие language (для ru_RU.KOI8-R
это - 'ru').
  Если вам не нужна "мульти-локалевая" поддержка и хочется сэкономить
пару килобайт кода, можете отменить эту опцию в xxkb.h

  Общие параметры

XXkb.xpm.path - директория, откуда зачитываются все "картинки" (файлы *.xpm)

  Параметры "главного окна"

XXkb.mainwindow.enable - "включает" главное окно. По умолчанию - yes.
 Если вы не запретили выводить "кнопку" на каждое окно (см. ниже), то,
возможно, вам не нужно, чтобы главное окно "болталось" на экране.

XXkb.mainwindow.appicon - специально для Window Maker'а. Позволяет
"причаливать" (dock) xxkb. Можно использовать и с другими WM, но результат
сильно зависит от типа WM.

XXkb.mainwindow.in_tray - сообщает GNOME или KDE, что xxkb должен встраиваться
в tray. Значение опции GNOME, KDE или KDE2, в зависимости от того, в чей tray
надо поместить xxkb. (К сожалению, такие docklet'ы имеют размер меньше, чем
размеры иконок для главного окна в дистрибутиве xxkb. Если хотите использовать
эту возможность, подберите подходящие иконки).

XXkb.mainwindow.geometry - размер главного окна  - "ширина"x"высота"
(желательно, чтобы они соответствовали размеру "картинок" для главного окна)

XXkb.mainwindow.xpm.1
XXkb.mainwindow.xpm.2
XXkb.mainwindow.xpm.3
XXkb.mainwindow.xpm.4 - название файлов "картинок" для четырех групп xkb.
  Если в xkb определены не все четыре группы, то можно не указывать
"картинки" для неиспользуемых групп.
  Если аргумент начинается со знака "/", то он трактуется как "полный путь"
к файлу. В противном случае, считается, что это только имя файла из директории
заданной "XXkb.xpm.path".

  Управление "режимами" работы.

XXkb.controls.add_when_start - если этот режим включен, то при старте xxkb
сам находит все запущенные к этому моменту приложения и начинает их
"отслеживать". По умолчанию - yes.
Но может работать некорректно с некоторыми window manager'ами.

XXkb.controls.add_when_create - добавлять окно в "список отслеживаемых" при
его создании. По умолчанию - yes.
Но может работать некорректно с некоторыми window manager'ами.

XXkb.controls.add_when_change - добавлять окно в "список отслеживаемых",
если произошло изменение состояния клавиатуры, фокус направлен в это окно
и оно отсутствует в "списке отслеживаемых". По умолчанию - no.
  Это вспомогательный режим. Имеет смысл только если выключен режим
"добавление при создании" или xxkb запущен слишком поздно (уже открыто
несколько окон, "создание" которых он не застал и не нашел их при старте).
  Надо заметить, что этот режим не отменяет действие других.

XXkb.controls.focusout - "сбрасывать" клавиатуру в состояние (группу)
по умолчанию, когда фокус "покидает окно". По умолчанию - no.
  Имеет смысл, когда используется только режим "добавлять при изменении
состояния клавиатуры". Тогда xxkb "помнит" только те окна, в которых
изменялось состояние клавиатуры и не будет переключать клавиатуру,
при "расфокусировки" этих окон. В этом случае может оказаться полезным
"сбрасывать" клавиатуру в исходное состоянии при "расфокусировке" окна.
  Если же отслеживаются все окна (включен режим "добавление при создании"),
то указанный режим только добавит кучу ненужных переключений клавиатуры.

XXkb.button.enable - помещать "кнопку" на отслеживаемое окно.
По умолчанию - yes.

XXkb.controls.button_delete - разрешить уничтожение "кнопки" при нажатии
"средней кнопки мыши". По умолчанию - yes.
  Дело в том, что xxkb может "вывешивать" свою "кнопку" на те окна, где
они нежелательны (например, на "менюшки" window manager'а).
  Этот режим позволяет убирать "нежелательные кнопки".

XXkb.controls.button_delete_and_forget - имеет смысл только если включен
button_delete и означает, что не только "кнопка" убирается с окна, но окно
исключается из списка отслеживаемых окон (xxkb не запоминает состояние для
этого окна). По умолчанию - yes.

XXkb.controls.mainwindow_delete - разрешить завершение программы при нажатии
"средней кнопки мыши" в главном окне xxkb. По умолчанию - yes.

XXkb.controls.two_state - режим "два состояния" переключателя клавиатуры.
По умолчанию - yes.
  Если в xkb описаны более чем две группы, можно выбрать одну из них
в качестве "базовой" и вторую в качестве "альтернативной". Тогда
переключатель групп ("рус/лат") будет переключаться между двумя выбранными
группами, а не перебирать их циклически.
  Эта "коррекция" действует как на переключение "щелчком мыши по иконке",
так и на клавишу "переключатель групп" (например - CapsLock).
  При этом каждое из окон может иметь свою "альтернативную" группу
("базовая" одна на всех).
  Если этот режим включен, то "левая кнопка мыши" действует как и клавиша
"переключатель групп", а "правая кнопка" позволяет выбрать "альтернативную"
группу, переключая группы циклически.

  Если этот режим включен, то имеют смысл еще два параметра

XXkb.group.base - "базовая" группа (число 1-4)
XXkb.group.alt - "альтернативная" группа по умолчанию (1-4).
 Напомню, что в процессе работы "альтернативную" группу конкретного окна
можно поменять (правой кнопкой мыши)

  Порядок перебора групп при переключении мышью.

  Если у вас раскладка клавиатуры содержит больше двух групп, то существует
по крайней мере два способа перебирать их - по возрастанию номера группы
и в обратном порядке (в XKB для этого используются два разных служебных
keysym - ISO_Next_Group и ISO_Prev_Group). По умолчанию xxkb при управлением
левой и правой кнопкой мыши перебирает группы в порядке возрастания.
  Для изменения этого порядка на обратный можно использовать параметры
XXkb.mousebutton.1.reverse - меняет порядок на обратный для левой кнопки.
XXkb.mousebutton.3.reverse - меняет порядок на обратный для правой кнопки.
  По умолчанию оба параметра - no.
  Обратите внимание, что левая кнопка в режиме two_state перебирает только
две группы, независимо от количества групп в раскладке. Если этот режим
включен, то значение mousebutton.1.reverse смысла не имеет.

  Параметры "кнопки".

  Все эти параметры имеют смысл, если включен режим XXkb.button.enable.
  Напомню, что xxkb сам "вляпывает" кнопку на "обрамление окна".
Поэтому, чтобы кнопка "гармонировала" с тем "обрамлением", которое делает
ваш window manager, возможно понадобится подобрать ее размеры и положение
на "обрамлении".

XXkb.button.geometry - "геометрия кнопки".
  Имеет вид "ширина"x"высота"+/-"координата X"+/-"координата Y".
  Если координата указана "со знаком плюс", то она отсчитывается от
"левого верхнего угла". Если "со знаком минус", то от противоположной
стороны. То есть "координата X" отсчитывается от правого края окна,
а "координата Y" от нижнего края.
  По умолчанию - 15x15-60+7 (вполне подходит для fvwm95).

XXkb.button.gravity - "притяжение" кнопки.
  Определяет - как будет меняться положение кнопки при изменении размеров
окна. Другими словами - относительно какого угла (или стороны) "обрамления"
положение кнопки должно оставаться неизменным. Для большинства window
manager'ов - относительно правого-верхнего (северо-восточного) или
левого-верхнего (северо-западного).
  Значение этого параметра может быть только - North, NorthEast, NorthWest,
South, SouthEast, SouthWest, East, West и Center.
  По умолчанию - NorthEast (правый-верхний угол).

XXkb.button.xpm.1
XXkb.button.xpm.2
XXkb.button.xpm.3
XXkb.button.xpm.4 - название файлов "картинок" для кнопки (для четырех групп).
  Подробности те же, что и для XXkb.mainwindow.xpm.

  Параметры "пищалки".

XXkb.bell.enable - включает/выключает "писк" на каждое изменение группы;
по умолчанию - no
XXkb.bell.percent - параметр, который передается XBell.

  Списки приложений (окон) для которых нужны какие-нибудь особые действия.

XXkb.app_list.<критерий>.<действие>: <список>

<Действие> может быть
- ignore - приложения из этого списка игнорируются и не отслеживаются.
  Дополнительная опция ignore.reverse (см. ниже) меняет смысл этого
  списка на обратный.
- start_alt - для приложений из этого списка при старте сразу включается
  альтернативная группа (обычно - русская).
- alt_group1
  alt_group2
  alt_group3
  alt_group4 - позволяют указать, что для приложений из этого списка
  надо сразу установить альтернативную группу, указанную цифрой, а не
  ту, что задана опцией XXkb.group.alt.
<Критерий> может быть wm_class_class, wm_class_name, wm_name, property.
Xxkb отличает приложения по их "свойствам" (properties) - WM_CLASS или
WM_NAME. WM_CLASS в свою очередь состоит из двух частей res_class и
res_name. <Критерий> как-раз определяет - по каким свойствам (или их
частям) идентифицировать окно.
  Критерий property означает, что проверяется просто наличие у окна
некоторого свойства (property), указанного в <списке>. Например приложение,
окно которого помещено в трей KDE, всегда имеет свойство
_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR, по наличию которого эти окна можно
отследить и проигнорировать.
  Замечу, что у многооконных приложений обычно все окна имеют один и тот же
WM_CLASS:res_class и разные WM_CLASS:res_name. А "свойство" WM_NAME
сдужит для того, чтобы объяснить Window Manager'у - какой заголовок
окна высвечивать в titlebar'е и может меняться от вызова к вызову (например -
имя редактируемого/просматриваемого документа).
  Поэтому -
- лучше всего отслеживать приложения по их WM_CLASS:res_class
  ("критерий" - wm_class_class);
- WM_CLASS:res_name ("критерий" - wm_class_name) можно использовать для
"тонкой подстройки", когда требуется выделить только отдельные окна
(меню, диалоги) приложения;
- WM_NAME  ("критерий" - wm_name) имеет смысл использовать только в крайнем
случае, если окно не имеет WM_CLASS.
  Напомню, что посмотреть WM_CLASS и/или WM_NAME окна можно с помощью
команды xprop.

  По умолчанию списки пустые.
Список представляет собой просто набор слов (без кавычек, через
пробел/табуляцию). В словах можно использовать "звездочку" - '*'.
Длинные списки можно продолжать на следующие строки с помощью знака '\'.
Например -
XXkb.app_list.wm_name.ignore: Fvwm* *clock \
                              Xman

XXkb.ignore.reverse  - считать окна в списке игнорируемые или наоборот -
                       отображаемыми.
По умолчанию - no. То есть, списки c "действием" ignore определяют окна,
которые нужно игнорировать (как и следует из названия).
Если этот параметр - yes, то те же списки задают перечень окон, которые
наоборот - нужно отслеживать, а все остальные игнорируются.

  УПРАВЛЕНИЕ В ПРОЦЕССЕ РАБОТЫ.

  Во время работы можно переключать состояние клавиатуры клавишей
переключателем, который определен в файлах настройки XKB.
  Напомню, что если включен режим "two_state" и групп больше двух, то
клавиша переключает состояние между "базовым" и "альтернативным".

  Кнопки мыши (mouse buttons).

  Левая кнопка - полный аналог клавиши переключателя. Меняет группу
в "фокусированном" окне.
  Правая кнопка - если включен режим "two_state", то меняет альтернативную
группу (и текущее состояние клавиатуры). В противном случае - делает то же
самое, что и левая кнопка.
  Средняя кнопка. В "главном окне" завершает работу xxkb. В "кнопке окна" -
убирает эту кнопку (если включен режим button_delete) и исключает окно из
списка отслеживаемых (если к тому же включен режим button_delete_and_forget).
  Если во время клика мышкой нажата клавиша Control, Shift или обе вместе,
то xxkb заносит приложение в один из списков (app_list) игнорируемых. То есть,
при последующем запуске этого приложения xxkb уже не обращает на него внимания.
  Список выбирается так:
- клик с Control - приложение добавляется в список wm_class_class,
- клик с Shift - приложение добавляется в список wm_name,
- с Control и Shift - в список wm_class_name.
  Если соответствующее свойство (WM_CLASS или WM_NAME) у окна отсутствует,
то xxkb выдает звуковой сигнал и, естественно, ничего никуда не добавляет.
  Обновленный список записывается автоматически в "юзерский" файл конфигурации -
~/.xxkbrc. (Если будете пользоваться этой feature, на всякий случай
просматривайте иногда получившийся файл конфигурации. xxkb не отслеживает
повторяющиеся названия приложений, и уж конечно не будет сам ставить в
названиях "звездочки".)
-------
Ivan Pascal
pascal@tsu.ru
