| ||||||||||||||||
| ||||||||||||||||
| ||||||||||||||||
Краткое введение в MOTIF Я решил посвятить небольшую оду библиотеке MOTIF и ее меньшой (и совершенно бесплатной) сестричке LESSTIF. Сведения, помещенные на этой странице будут полезны тем, кто только начинает знакомство с программированием под X-Window. Перед вами, по сути дела, русскоязычное предисловие к programmer guid'ам, размещенным Что такое MOTIF/LESSTIF      MOTIF - коммерческая сишная библиотека, предназначенная для создания графического пользовательского интерфейса. Однажды почитатели MOTIF, не желавшие платить за нее, собрались и написали совместимую с MOTIF библиотеку - LESSTIF. Как работает X Window и что такое Xt      Элементы интерфейса X Window (окна, поля ввода, списки и т.п.) называются WIDGET'ами.      X Window работает по технологии клиент-сервер. X сервер выполняет запросы WIDGET'ов, управляет очередями событий, направляет ввод на WIDGET'ы, имеющие фокус и т.д.      Для облегчения жизни программистов была создана библиотека Xt. С ее помощью можно создавать WIDGET'ы, задавать и изменять их параметры (цвет, геометрия, шрифты), управлять их поведением и т.п. Функции в Xtlib начинаются обычно с Xt: XtSetValues - установить некие значения; XtManageChild - показать WIDGET... В Xt описаны лишь базовые WIDGET'ы - окна. Все остальное создается при помощи библиотек, основывающихся на Xt: MOTIF, LESSTIF, QT и других. Ресурсы WIDGET'ов Каждый WIDGET обладает набором свойств(ресурсов). Сюда входят размеры, цвет, особенности поведения, предопределенные вызовы callback функций и т.п. Каждый ресурс имеет свое имя. Например: XmNvisibleItemCount - количество элементов, видимых в Scrolled List, XmNselectionPolicy - константа, определяющая возможность выбора элементов. Свойства устанавливаются функциями XtSetArg, XtSetValues, XtVaCreateWidget (см. ниже). MOTIF - программа     Программа состоит из двух главных частей:      1. инициализация WIDGET'ов      2. обработка событий включает в себя создание, изменение свойств, показ.      Обработка событий может вестись несколькими способами:      1.Использование callback функций      2.Использование функций-трансляторов      3.Создание собственных обработчиков. Callback функции вызываются при выполнении определенных действий с WIDGET'ом. Например, двойной щелчок в WIDGET'е List приводит к выполнению XmNdefaultActionCallback. Чтобы заставить WIDGET вызывать свою callback функцию нужно указать ее имя в вызове функции XtAddCallback. Например вызов XtAddCallback(list_w,XmNdefaultActionCallback , choose_item,list_w) приведет к тому, что двойной щелчок в WIDGET'е list_w будет обрабатываться пользовательской функцией "choose_item()". Под трансляцией понимается сопоставление событию, произошедшему в WIDGET'е одной или нескольких функций. Составляется таблица трансляции в следующем формате: <Btn1Down>,<Btn1Up> : click_action() <Key>space : action_2() Слева от двоеточия вводится описание события. Это может быть единичное событие (в нашем случае <Key>space - нажатие клавиши "пробел") или последовательность событий (<Btn1Down>,<Btn1Up> - нажата и отпущена правая кнопка мыши). Справа от двоеточия приводится список вызовов одной или нескольких функций. Это могут быть как функции пользователя так и предопределенные функции WIDGET'а. Пример использования транслятора: static XtActionsRec acts[] = { {"Action1", Action1}, {"Prv", Prv}, {"Nxt", Nxt} }; Widget list,rowcol; static XtTranslations parsed_xlations; static char addXlations[] = "\ #replace<Key>osfDown: ListNextItem() Nxt() Action1() \n\ <Key>osfUp: ListPrevItem() Prv() Action1()"; XtAppAddActions(app, acts, XtNumber(acts)); parsed_xlations = XtParseTranslationTable(addXlations); . . . list=XmCreateText(rowcol,"lst",al,ac); XtOverrideTranslations(list,parsed_xlations); . . . Nxt(){ . . . } Prv(){ . . . } Action1(){ . . . } В данном случае мы обрабатываем нажатия клавиш "стрелка вверх" (<Key>osfUp) и "стрелка вниз" (<Key>osfDown) в WIDGET'е ScrolledList. Nxt(), Prv(), Action1() - Функции пользователя; ListNextItem(), ListNextItem() - предопределенные функции WIDGET'а. Опция "#replace" в строке addXlations[] означает, что новая таблица трансляции заменит предопределенную. Возможны и другие опции. Обработчики событий можно добавить при помощи функции XtAddEventHandler. Например: XtAddEventHandler(text1, PointerMotionMask, FALSE,EH1, NULL); XtAddEventHandler(text1, ButtonPressMask , FALSE,EH2, NULL); XtAddEventHandler(text1, ButtonReleaseMask, FALSE,EH3, NULL); Здесь text1 - WIDGET; PointerMotionMask, ButtonPressMask, ButtonReleaseMask - события; EH1, EH2, EH3 - пользовательские функции - обработчики событий. Возможно, не самый лучший, но все же работающий пример приложения с использованием библиотеки Lesstif можно взять здесь. Залежалая новость: библиотеку Motif теперь можно получить совершенно бесплатно. Подробности на Пакет содержит множество примеров, которые после инсталляции попадают в каталог /usr/X11R6/xmdemos. Полный набор programmer guid'ов в формате ps находится в /usr/doc/openmotif-devel... Читать их с помощью gv - сущее наказание. Тем , кому PostScript не по душе предлагается скачать документацию в формате PDF с Первые впечаиления: то, что работало под Lesstif, под Motif не работает. В частности, программа слетает на вызове XmCreateText и любых других операциях с Text WIDGET'ом. Впрочем, в фирменных демонстрашках все работает, так что, возможно, это мои глюки. |
|
| ||||||||||||||||
|