使用回调
使用输入方法的应用程序应该提供回调函数,这样输入方法编辑器(IMED)就可以和用户通信。 您所使用的输入方法类型决定了回调是否必要。 例如,单字节输入方法不需要回调,而日语输入方法则将回调大量用于预编辑工具。 预编辑工具允许在字符提交至应用程序之前先对字符进行处理。
在使用输入方法时,只有应用程序可以插入或删除预编辑的数据以及滚动文本。 因此,击键的回送(echo)由应用程序在请求输入方法逻辑时通过回调获得。
当用户输入击键时,应用程序调用 IMFilter 子例程。 在返回之前,输入方法可调用回送回调函数来插入新的击键。 组成字符之后,IMFilter 子例程返回该字符,然后删除击键。
有几种情况,输入方法逻辑不得不回调客户机。 这些情况中的每一种都由回调操作定义。 客户机指定了对于每种操作,应调用哪一种回调。
回调类型描述如下:
- 文本绘制
IMED 使用文本回调来绘制当前正在组成的预编辑文本。 在需要回调的时候,应用程序和 IMED 共享一个单行缓冲区,编辑就在这里执行。 IMED 还提供了光标信息, 回调随后将这一信息提供给用户。
文本回调如下:
- IMTextDraw
- 请求应用程序绘制文本字符串。
- IMTextHide
- 告诉应用程序隐藏文本区域。
- IMTextStart
- 通知应用程序预编辑空间的长度。
- IMTextCursor
- 请求应用程序移动文本光标。
- 指示器(状态)
IMED 使用指示器回调来请求内部状态。 IMIoctl子程序与IMQueryIndicatorString命令配合使用,以检索提供内部状态的文本字符串。 指示器回调类似于文本回调,但不是共享一个单行缓冲区,而是使用状态值。
指示器回调如下:
- IMIndicatorDraw
- 告诉应用程序绘制状态指示器。
- IMIndicatorHide
- 告诉应用程序隐藏状态指示器。
- IMBeep
- 告诉应用程序发出蜂鸣。
- 辅助
IMED 使用辅助回调来请求与用户的复杂对话。 因此,这些回调比文本或指示器回调更加复杂。
辅助回调如下:
- IMAuxCreate
- 告诉应用程序创建辅助区域。
- IMAuxDraw
- 告诉应用程序绘制辅助区域。
- IMAuxHide
- 告诉应用程序隐藏辅助区域。
- IMAuxDestroy
- 告诉应用程序销毁辅助区域。
IMAuxInfo 结构定义了 IMED 所需要的对话。
辅助区域的内容由 IMAuxInfo 结构定义,该结构可在 /usr/include/im.h 库中找到。
子例程内容 描述 IMTitle 定义辅助区域的标题。 这是一个多字节字符串。 如果 title.len为 0,那么不显示标题。IMMessage 定义要显示的消息列表。 从应用程序的角度看,IMMessage 结构应被视为参考性的、仅仅是为了输出的文本。 但是,有些输入方法使用 IMMessage 结构来引入与用户的对话,在此对话中,通过 IMFilter 或 IMLookupString 子例程收到的键事件被作为输入方法的输入。 在这样的情况下,输入方法可能将 IMMessage 结构作为一个可选列表或者一个提示区域。 无论何种情况,应用程序只显示消息内容。 如果 IMSelection 结构不包含 IMPanel 结构,并且 IMButton 字段为空,就无需调用 IMProcessAuxiliary子例程。
message.nline指出了 IMMessage 结构中包含的消息数量。 每条消息都假设为单行消息。 不识别控制字符,如 \t。 每条消息的文本由 IMSTRATT 结构定义,该结构既含多字节字符串,也含属性字符串。 每个属性为文本字符串中的每个字节进行一对一的映射。IMButton 表示可提供给用户的可能的按钮。 IMButton 字段告诉应用程序应向最终用户提供哪些用户界面控件。 按钮成员变量的类型为 int,并且可能含以下掩码: - IM_OK
- 提供 OK 按钮。
- IM_CANCEL
- 提供 CANCEL 按钮。
- IM_ENTER
- 提供 ENTER 按钮。
- IM_RETRY
- 提供 RETRY 按钮。
- IM_ABORT
- 提供 ABORT 按钮。
- IM_YES
- 提供 YES 按钮。
- IM_NO
- 提供 NO 按钮。
- IM_HELP
- 提供 HELP 按钮。
- IM_PREV
- 提供 PREV 按钮。
- IM_NEXT
- 提供 NEXT 按钮。
应用程序应使用 IMProcessAuxiliary 子例程来通报所选的按钮。
IMSelection 定义最终用户可选择的项目(如象形文字)的列表。 当输入方法希望显示大量项目,但又不希望控制如果将该列表呈现给用户的时候,可用到这一结构。 IMSelection 结构被定义为一个含多个 IMPanel 结构的列表。 并非所有应用程序在 IMAuxInfo 结构内都支持 IMSelection 结构。 支持 "IMSelection结构的应用程序应在创建 "IMObject后立即使用 "IMIoctl子程序执行 "IM_SupportSelection"操作。 另外,并非所有应用程序都支持多个 IMPanel 结构。 因此,所有输入方法都将
panel_row和panel_col字段限制为 1 的设置。每个 IMPanel 结构都由
IMItem字段的列表组成,这些字段应被视为维度定义为item_rowtimesitem_col的二维行/列列表。 如果item_col为 1 ,那么只有一列。 IMPanel 结构的大小以字节为单位定义。 IMPanel 结构中的每一项小于等于panel->maxwidth。应用程序应该使用 IMProcessAuxiliary 子例程来通报一个或多个用户的选中项。 IM_SELECTED 值指示选中了哪一项。 IM_CANCEL 值表示用户希望终止辅助对话。
提示 由输入方法使用以提供有关 IMAuxInfo 结构的上下文的信息。 值 IM_AtTheEvent指示 IMAuxInfo 结构与通过 IMFilter 或 IMLookupString 子例程传递到输入方法的最后一个事件相关联。 当正在显示多个 IMAuxInfo 结构时,其他的 hint 用于相互区分。状态 由输入方法使用,用于内部处理。 应用程序不应该使用此字段。 每个 IMAuxInfo 结构都相互独立。 用来显示成员的方法由输入方法的调用者决定。 IMAuxInfo 结构由 IMAuxDraw 回调使用。