Приложения, работающие с методами ввода, должны содержать функции callback, предназначенные для взаимодействия редактора метода ввода (IMED) с пользователями. Для некоторых методов ввода функции callback не нужны, а для других - необходимы. Например, для работы с методами ввода однобайтовых символов функции callback не нужны, в то время как метод ввода японских символов активно работает с ними в ходе предварительной компоновки. Предварительная компоновка позволяет обработать символы до их передачи в приложение.
При работе с методом ввода только приложение может добавлять и удалять данные для предварительной компоновки и прокручивать текст. Следовательно, эхо введенных символов передается в приложение по запросу, направленному в метод ввода с помощью функций callback.
При нажатии клавиши на клавиатуре приложение вызывает функцию IMFilter. Перед возвратом из этой функции метод ввода может вызвать функцию callback, предназначенную для эхоповтора, и с ее помощью вставить новые коды клавиш. После образования символа функция IMFilter возвращает его, а коды нажатых клавиш удаляются.
В некоторых случаях метод ввода должен выполнить обратный вызов клиента. Для каждого из них определена своя функция callback. Клиент указывает, какую функцию callback следует вызвать в каждом случае.
Существует три типа функций callback:
Функции callback для работы с текстом применяются IMED для вывода текста, который в данный момент находится в стадии предварительной компоновки. В ситуациях, когда нужны функции callback, приложение и IMED работают с общим буфером длиной в одну строку, в котором выполняется предварительная компоновка. Кроме того, IMED выдает данные о положении курсора, которые затем передаются пользователю с помощью функций callback.
Функции callback для работы с
текстом:
IMTextDraw | Отправляет приложению запрос на вывод строки текста. |
IMTextHide | Отправляет приложению запрос на удаление области текста. |
IMTextStart | Передает приложению размер области компоновки. |
IMTextCursor | Отправляет приложению запрос на перемещение курсора. |
Для получения информации о внутреннем состоянии IMED применяет функции-индикаторы callback. Функция IMIoctl и команда IMQueryIndicatorString возвращают строку с информацией о внутреннем состоянии. Функции-индикаторы callback сходны с функциями для работы с текстом за исключением того, что вместо общего буфера длиной в одну строку они работают с информацией о состоянии.
IMIndicatorDraw | Отправляет приложению запрос на вывод индикатора состояния. |
IMIndicatorHide | Отправляет приложению запрос на удаление индикатора состояния. |
IMBeep | Передает приложению запрос на отправку звукового сигнала. |
Дополнительные функции callback применяются IMED для организации сложных диалогов с пользователем. Эти функции callback сложнее функций для работы с текстом и функций-индикаторов.
Дополнительные функции
callback:
IMAuxCreate | Отправляет приложению запрос на создание вспомогательной области. |
IMAuxDraw | Отправляет приложению запрос на вывод вспомогательной области. |
IMAuxHide | Отправляет приложению запрос на удаление с экрана вспомогательной области. |
IMAuxDestroy | Отправляет приложению запрос на удаление вспомогательной области. |
Содержимое вспомогательной области определяется структурой IMAuxInfo, расположенной в библиотеке /usr/include/im.h.
Структура IMAuxInfo состоит из шести полей.
IMTitle | Определяет заголовок вспомогательной области. Он представляет собой строку многобайтовых символов. Если title.len равно 0, заголовок отсутствует. |
IMMessage | Определяет список выводимых сообщений. В приложении структура
IMMessage должна быть доступна только для чтения. Однако в
некоторых методах ввода структура IMMessage применяется для
управления диалогом с пользователем, при этом сначала выполняется обработка
нажатий клавиш с помощью функции IMFilter или
IMLookupString, а затем обработанный ввод передается методу
ввода. В таких случаях метод ввода может работать со структурой
IMMessage, как со списком выбора или приглашением. В любом
случае приложение показывает на экране только содержание сообщения.
Вызов IMProcessAuxiliary не требуется, если структура IMSelection не содержит структур IMPanel, а поле IMButton пусто. В поле message.nline хранится число сообщений в структуре IMMessage. Предполагается, что каждое сообщение занимает ровно одну строку. Управляющие символы, например, \t, игнорируются. Текст сообщения определяется в структуре IMSTRATT, содержащей строку многобайтовых символов и строку атрибутов. При этом i-й атрибут соответствует i-тому байту текстовой строки. Если значение message.cursor равно True, то структура IMMessage определяет текстовый курсор в позиции message.cur_row, message.cur_col. Значение message.cur_col указывается в байтах. Поле message.maxwidth содержит максимальную ширину всех текстовых сообщений, выраженную в столбцах. |
IMButton | Обозначает кнопки, с которыми может работать пользователь. Поле
IMButton указывает приложению, какие управляющие элементы
пользовательского интерфейса следует вывести на экран. Элемент button
относится к типу int. Он может содержать следующие маски:
Для выбора кнопок в приложении служит функция IMProcessAuxiliary. |
IMSelection | Определяет список элементов, таких, как идеограммы, которые пользователь
может выбрать. Эта структура применяется, если метод ввода должен
вывести большое число элементов, но не должен управлять их представлением для
пользователя.
Структура IMSelection определена как список структур IMPanel. Некоторые приложения не поддерживают размещение структур IMSelection в структуре IMAuxInfo. Приложения с поддержкой структур IMSelection должны выполнить операцию IM_SupportSelection с помощью функции IMIoctl сразу после создания объекта IMObject. Кроме того, некоторые приложения не поддерживают несколько структур IMPanel. В связи с этим все методы ввода устанавливают значение 1 в полях panel_row и panel_col. Структура IMPanel состоит из списка полей IMItem, который следует интерпретировать как двумерный список, состоящий из строк и столбцов. Число строк и столбцов определяется значениями item_row и item_col. Если item_col равно 1, список содержит только один столбец. Размер структуры IMPanel выражен в байтах. Значение каждого элемента структуры IMPanel не превышает panel->maxwidth. Функция IMProcessAuxiliary позволяет узнать, какие элементы выбраны пользователем. Значение IM_SELECTED обозначает выбранный элемент. Значение IM_CANCEL означает, что пользователь намерен закрыть вспомогательный диалог. |
hint | Применяется методом ввода для предоставления информации о содержимом структуры IMAuxInfo. Значение IM_AtTheEvent указывает, что структура IMAuxInfo связана с последним событием, переданным в метод ввода функцией IMFilter или IMLookupString. Другие поля hint позволяют узнать, что выведено несколько структур IMAuxInfo. |
status | Применяется методом ввода для внутренней обработки. Приложения не
должны работать с этим полем.
Все структуры IMAuxInfo независимы друг от друга. Способ отображения элементов определяется приложением, вызвавшим метод ввода. Со структурой IMAuxInfo работает функция callback IMAuxDraw. |
К моменту вызова функции IMCreate должны быть определены все функции callback. Структура IMCallback содержит адреса всех функций callback. Программа, вызывающая функцию IMCreate, должна записать в структуру IMCallback соответствующие адреса.
Функции callback можно вызывать до передачи управления из функции IMCreate в вызывающую программу. Обычно функция IMTextStart вызывается для определения размера буфера предварительной компоновки.
Глава 16, Поддержка национальных языков .
Функции IMAuxCreate, IMAuxDestroy, IMAuxDraw, IMAuxHide, IMBeep, IMIndicatorDraw, IMIndicatorHide, IMTextCursor, IMTextDraw, IMTextHide, IMTextStart, IMIoctl.