Акселераторы в 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 делается следующее:
В заключении отметим несколько особенностей, связанных с применением акселераторов.