3.3.5. Акселераторы.

    Акселераторы в Xt похожи на action-процедуры с той лишь разницей, что событие (или последовательность событий), происходящее в одном widget, инициирует вызов соответствующей action-процедуры для другого объекта.

    Каждый widget в Xt (кроме объектов классов Object и RectObj) имеет ресурс XtNaccelerators, наследуемый от класса Core. Данный ресурс - это "таблица" акселераторов, которая по формату аналогична "таблице трансляции". Она содержит описание событий и соответствующих "действий". Задается данный ресурс так же, как и ресурс XtNtranslations. Ниже приводится пример его определения в ресурсном файле:

justas*XmDialogShell*mywidget.acceleratos :\n\ <KeyPress> : Set( ) Cancel( )

    Если значение ресурса XtNaccelerators задано для объекта W, то программа должна указать widget, в котором будут происходить события, вызывающие выполнение соответствующих action-процедур, указанных в "таблице" акселераторов. Для этого можно использовать процедуру XtInstallAccelerators( ) или XtInstallAllAccelerators( ). Первая из указанных функций имеет следующий прототип:

void XtInstallAccelerators (Widget prDestination, Widget prSource);

    Здесь prDestination - это widget, в котором будут происходить события, которые приводят к выполнению action-процедур, заданных в "таблице" акселераторов для объекта, определяемого вторым аргументом.

    Приведенная процедура может вызываться до и после реализации widget, указанных в качестве ее параметров.

    Когда создается объект, Xt переводит "таблицу" акселераторов во внутренний формат и размещает ее в соответствующей структуре widget. При вызове функции XtInstallAccelerators( ) "таблица" акселераторов объединяется с "таблицей соответствия" или замещает последнюю. Все зависит от директивы "#replace", "#override" или "#augment", указанной при описании "таблицы" акселераторов. По умолчанию действительным считается режим "#augment". Процедура XtRemovelAccelerators( ) имеет обратное действие - она восстанавливает "таблицу соответствия" для объекта.

    Процедура XtInstallAllAccelerators( ) имеет такой же прототип, что и описанная выше функция XtInstallAccelerators( ), и используется для задания акселераторов самого объекта и его "потомков".

    Порядок шагов при вызове акселератора описан ниже. Когда в объекте prDestination происходит какое-то событие, то для widget pSource делается следующее:

    В заключении отметим несколько особенностей, связанных с применением акселераторов.

  1. При определении "таблицы" акселераторов в файле ресурсов, не допускается применение сокращенной аббревиатуры события, кроме "Key" (в случае KeyPress). Необходимо использовать только полное описание события (см. приложение 1 ).
  2. Не разрешены символы None, Meta, Hyper, Super, Alt.
  3. Параметры, передаваемые в action-процедуры, должны быть заключены в двойные кавычки.
  4. Для конвертирования "таблицы" акселераторов во внутреннее представление Xt, используется процедура XtParseAcceleratorTable (String sTable), где строка sTable определяет "таблицу" акселераторов.
  5. Для задания всех акселераторов приложения можно использовать процедуру XtInstallAllAccelerators (prTopLevel, prTopLevel), где prTopLevel widget есть родительский для всех остальных объектов программы.