- •XSetNormalHints(dpy,win,&hint)
- •XDrawText() ( xDrawText16( ) ) позволяет рисовать несколько строк сразу, используя при этом разные шрифты. Каждая рисуемая единица задается структурой xTextItem.
- •IncludeInferiors — графика рисуется поверх всех подокон
- •XrmOptionDescRec pOptions [ ], Cardinal nNumOpt,
- •XtMainLoop( ) автоматически завершает программу по требованию менеджера окон.
- •VendorShell. Этот класс предназначен для того, чтобы дать возможность взаимодействия со специальными менеджерами окон.
- •XtArgVal value;
- •XtCreateWidget( ) возвращает идентификатор созданного объекта. В следующем примере создается widget класса Core, имеющий ширину и высоту равные 100 и 150 пикселов соответственно.
- •Void ActionProc (Widget prW, xEvent *prEvent, String *psParams, Cardinal *nNumParams);
- •XtActionProc proc;
- •Xt поддерживает набор специальных символов, употребляемых с модификаторами для расширения возможностей использования последних .
- •3. Обработчики событий.
- •Void HandlerProc (Widget prWidget, XtPointer pUserData, xEvent *prEvent, Boolean *pnContinue);
Xt поддерживает набор специальных символов, употребляемых с модификаторами для расширения возможностей использования последних .
Таблица 3
Символ Описание
None Ни одна клавиша-модификатор не должна быть нажата
! Событие должно сопровождаться только указанными модификаторами и никакими другими
: Позволяет различать события от нажатия клавиш в зависимости от регистра
~ Модификатор, непосредственно следующий за данным символом, не должен быть в нажатом состоянии
Например, запись
!Alt<Key>a : KeyboardPrint( )
означает, что соответствующая процедура будет вызвана только при нажатии комбинации <Alt+a>. Применение символа None эквивалентно использованию в трансляции символа "!" без модификаторов, например, следующие записи эквивалентны:
None<Key>a : KeyboardPrint( )
и
!<Key>a : KeyboardPrint( )
Это означает, что действие будет реализовано, когда клавиша "a" нажата, а все модификаторы находятся в не нажатом состоянии.
Использование в трансляции символа ":" позволяет различать события, соответствующие нажатию клавиш на разных регистрах: верхнем или нижнем (т.е. при нажатой или освобожденной клавише Shift или Caps Lock). Дело в том, что, например, следующие записи эквиваленты по выполняемому действию:
<Key>b : KeyboardPrint( )
и
<Key>B : KeyboardPrint( )
т.е. соответствуют вызову процедуры при нажатии клавиши "b" или комбинации <Shift+b>. Использование символа ":" позволяет различить эти две ситуации, в частности, следующие записи будут уже не идентичны:
: <Key>b : KeyboardPrint( )
и
: <Key>B : KeyboardPrint( )
первая определяет вызов соответствующей процедуры при нажатии клавиши "b"; вторая же трансляция соответствует вызову функции при нажатии комбинации < Shift+b>.
Символ "~" используется для отрицания модификаторам, т.е. следующий за символом модификатор не должен быть нажат. Например, запись:
Button2<Key> : KeyboardPrint( )
означает, что соответствующая процедура будет вызвана, когда нажата вторая кнопка мыши и произвольная клавиша на клавиатуре, в то же время запись
~Button2<Key> : KeyboardPrint( )
говорит, что соответствующая функция будет вызвана, когда нажимается произвольная клавиша, и, если при этом не нажата вторая кнопка мыши. Заметим, что использование символа "~" относится только к модификатору, непосредственно следующему за указанным символом, и не распространяется на остальные модификаторы. Например, "трансляция"
~Ctrl Alt<Key>a : KeyboardPrint( )
указывает, что соответствующая функция будет вызвана при нажатии комбинации <Alt+a>, если при этом не нажата клавиша Control.
Модификаторы, расположенные в начале "трансляции", относятся ко всем событиям, указанным в ней. Например, следующие записи эквивалентны:
Shift<Btn2Down>, <Btn2Up> : KeyboardPrint( )
и
Shift<Btn2Down>, Shift<Btn2Up> : KeyboardPrint( )
Для определения в трансляциях событий от кнопок мыши используются модификаторы Button1, Button2, Button3, Button4 и Button5, например, следующая запись
Button2<Key>a : KeyboardPrint( )
означает, что соответствующая процедура будет вызвана, когда нажимается вторая кнопка мыши и клавиша "a".
Каждая трансляция может определить одно или несколько событий, разделяемых запятыми. Например, для определения последовательности событий, соответствующих нажатию и отпусканию первой кнопки мыши, можно использовать следующую строку:
<Btn1Down>, <Btn1Up> : KeyboardPrint( )
Для задания нескольких нажатий и отпусканий используется поле число повторений события. Так, например, "трансляция
<Btn2Up> : KeyboardPrint( )
указывает, что соответствующая процедура будет вызвана при двойном нажатии второй кнопки мыши. Приведенная выше запись эквивалентна следующей
<Btn2Down>, <Btn2Up>, <Btn2Down>, <Btn2Up> :
KeyboardPrint( )
Для задания большего числа повторений можно использовать символ "+", например, следующая запись
<Btn3Up>(2+) : KeyboardPrint( )
означает, что соответствующая функция будет вызвана при 2-х и более нажатиях на третью кнопку мыши (максимальное число, которое может быть указано в поле повторений — 9 ). По умолчанию временной интервал, во время которого считаются нажатия кнопки мыши, составляет 200 миллисекунд. Если между очередным нажатием кнопки и следующим проходит меньше 200 миллисекунд, то система рассматривает это как одно двойное нажатие (double click) соответствующей кнопки мыши. Для изменения указанного интервала используется ресурс объекта XtNmultiClickTime. Он может быть установлен функцией XtSetMultiClickTime( ).
Поле аргументы в "трансляции" используется для задания третьего и четвертого аргументов action-процедуры. Например, если трансляция была определена следующим образом:
<Key>a : KeyboardPrint(1, JUSTAS, ALEX)
то при вызове соответствующей функции аргумент psParams будет указывать на список, содержащий строки 1, JUSTAS и ALEX, а аргумент nNumParams будет равен 3.
Ниже приведены примеры задания "таблицы соответствия" в файле ресурсов
justas*mywidget.translations : #augment \
<Btn2Down> : Arm( )\n\
<Btn2Down>, <Btn2Up> : Activate( ) Disarm( )\n\
<Btn2Down>(2+) : MultiArm( )\n\
<Btn2Up>(2+) : MultiActivate( )\n\
<LeaveWindow> : Leave( )
и коде программы:
static char *psTable : "#augment \
<Btn2Down> : Arm( )\n\
<Btn2Down>, <Btn2Up> : Activate( ) Disarm( )\n\
<Btn2Down>(2+) : MultiArm( )\n\
<Btn2Up>(2+) : MultiActivate( )\n\
<LeaveWindow> : Leave( )";
Как мы уже упоминали ранее, если таблица задана в коде программы, то перед использованием она должна быть переведена во внутренний формат Xt процедурой XtParseTranslationTable( ). Регистрируется таблица с помощью функций
XtAugmentTranslations (Widget prWidget,XtTranslations pTranslationsTable);
или
XtOverrideTranslations (Widget prWidget, XtTranslations pTranslationsTable);
обе они регистрируют таблицу трансляции для объекта, заданного widget, объединяя "таблицу pTranslationsTable, с таблицей, уже имеющейся у widget. При этом вторая процедура замещает существующие трансляции на новые, а первая оставляет их без изменения.
Следующий пример показывает, как добавить action-процедуру к объекту.
. . . . . . . .
Widget prWidget;
static XtActionRec actions [ ] = ("PressMe", KeyboardPrint);
static char UserTranslations [ ] =
"Alt <Key>a : PressMe";
. . . . . . . .
XtAugmentTranslations (prWidget,
XtParseTranslationTable (UserTranslations));
. . . . . . . .
В заключении сделаем еще одно замечание. Порядок расположения трансляций в соответствующей таблице существен, т.к. поиск нужного события в таблице начинается сверху и выполняется до первого найденного. Поэтому, Вам следует располагать записи таким образом, чтобы наиболее существенные события располагались раньше. Например, если таблица трансляции содержит следующий фрагмент
<Key> : InputSymbol( ) \n\
<Key>Return : EndInput( )
то процедура, соответствующая действию InputSymbol, будет вызвана при нажатии клавиши <Return>, а функция для EndInput никогда не будет вызвана.
