Метод ввода - это программный интерфейс, позволяющий приложениям работать в международной среде, основанной Поддержке национальных языков (NLS). Ниже перечислены свойства метода ввода:
Для того чтобы узнать, нужно ли инициализировать метод ввода перед его вызовом, воспользуйтесь функцией IMQueryLanguage. Приложение инициализирует метод ввода для определенной локали путем вызова функции IMInitialize, которая инициализирует редактор для этого метода ввода (IMED). Эта функция определяет метод ввода, имя которого указано в переменной среды LANG, с помощью переменной среды LOCPATH. В переменной среды LOCPATH указаны имена каталогов, применяемых для поиска методов ввода.
Если нужный метод ввода найден, функция IMInitialize вызывает функцию load для загрузки метода ввода и подключения файла imkeymap. После получения доступа к методу ввода эта функция возвращает объект типа IMFep. Структура объектов типа IMFep недоступна пользователям.
Функция IMInitialize подключает функцию перекодировщика с помощью функции load. Функция load аналогична функции exec. Она подключает перекодировщик во время выполнения. Так как функция IMInitialize является библиотечной, в ней предусмотрены некоторые средства защиты. Если функция IMInitialize вызывается из программы, запущенной от имени пользователя root, значение переменной LOCPATH будет проигнорировано, и поиск перекодировщиков будет выполняться только в каталогах /usr/lib/nls/loc/iconv и /etc/nls/loc/iconv.
Объект IMFep наследует кодовый набор локали, которая является текущей в момент вызова функции IMInitialize. Следовательно, функции IMFilter и IMLookupString возвращают строки в кодовом наборе этой локали. Изменение локали после вызова функции IMInitialize не влияет на кодовый набор IMFep.
Для каждого объекта IMFep приложение может вызвать функцию IMCreate, позволяющую создать один или несколько экземпляров IMObject. Объект IMObject автоматически изменяет состояние и может управлять несколькими областями метода ввода (см. Области методов ввода). Способ обработки ввода, определяемый IMObject, зависит от кодового набора и раскладки клавиатуры, связанной с локалью. В простейшем случае, если приложение управляет одним диалогом с пользователем, необходим один объект IMObject. Метод ввода поддерживает и новые пользовательские интерфейсы, позволяющие поддерживать несколько диалогов с пользователем в рамках одного приложения, при этом для каждого диалога необходим отдельный объект IMObject.
Различие между IMFep и IMObject состоит в том, что IMFep - это указатель, ссылающийся в приложении на метод ввода, а IMObject - указатель на экземпляр набора параметров устройства ввода, например, клавиатуры. IMFep не отражает состояние метода ввода. Объект IMObject инициализируется предопределенными параметрами ввода и изменяется в соответствии с получаемой информацией о событиях.
После создания объекта IMObject приложение может обрабатывать нажатия клавиш. Приложение должно передавать информацию о нажатиях клавиш в IMObject с помощью функций IMFilter и IMLookupString. Эти функции предназначены для отделения внутренней обработки IMED от пользовательского процесса преобразования нажатий клавиш.
Ниже перечислены функции
управления методами ввода:
IMInitialize | Инициализирует стандартный метод ввода для указанного языка. Возвращает указатель на объект IMED, связанный с локалью. Этот указатель представляет собой непрозрачную структуру типа IMFep. |
IMQueryLanguage | Проверяет, поддерживается ли указанный язык. |
IMCreate | Создает один экземпляр указанного метода ввода. Эта функция должна быть вызвана перед обработкой событий, связанных с нажатием клавиш. |
IMClose | Закрывает метод ввода. |
IMDestroy | Удаляет экземпляр метода ввода. |
В рамках каждого метода ввода
предусмотрено несколько функций для преобразования нажатий клавиш в
строку. Это преобразование выполняется в соответствии с содержимым
файла imkeymap, расположенного в каталоге LOCPATH. Ниже
перечислены функции преобразования:
IMInitializeKeymap | Инициализирует imkeymap для указанного языка. |
IMFreeKeymap | Освобождает ресурсы, выделенные функцией IMInitializeKeymap. |
IMAIXMapping | Преобразует пару "клавиша/символ" в строку и возвращает указатель на эту строку. |
IMSimpleMapping | Преобразует пару "клавиша/символ" в строку и возвращает указатель на эту строку. |
Обработка ввода начинается в
момент нажатия клавиши на клавиатуре. Перед вызовом перечисленных ниже
функций обработки ввода приложение должно создать объект
IMObject:
IMFilter | Обращается к IMED для выяснения, не используется ли данное событие для внутренней обработки. Если IMED создает локализованную строку, он преобразует событие нажатия клавиши в эту строку. |
IMLookupString | Преобразует нажатие клавиши в локализованную строку. |
IMProcessAuxiliary | Сообщает методу ввода о том, что выполняется ввод для вспомогательной области. |
IMIoctl | Предназначена для выполнения управляющих операций и отправки запросов. |
IMED напрямую взаимодействует с пользователем, применяя для доступа к графическим функциям приложения функции callback метода ввода (IM-CB). В ходе инициализации приложение связывает функции callback, предназначенные для вывода и запросов, с IMObject. Весь ввод при этом обрабатывается приложением.
Набор функций callback, применяемых IMED для связи с пользователем, должен предоставляться вызывающим приложением. Функции API IM-CB обсуждаются в разделе Применение функций callback.
Основные структуры метода
ввода:
Глава 16, Поддержка национальных языков .
Функции IMClose, IMCreate, IMDestroy, IMInitialize, IMInitializeKeymap, IMloctl, IMFilter, IMLookupString, IMProcessAuxiliary, IMQueryLanguage.