使用回调

使用输入方法的应用程序应该提供回调函数,这样输入方法编辑器(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 结构来引入与用户的对话,在此对话中,通过 IMFilterIMLookupString 子例程收到的键事件被作为输入方法的输入。 在这样的情况下,输入方法可能将 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_rowpanel_col 字段限制为 1 的设置。

    每个 IMPanel 结构都由 IMItem 字段的列表组成,这些字段应被视为维度定义为 item_row times item_col的二维行/列列表。 如果 item_col 为 1 ,那么只有一列。 IMPanel 结构的大小以字节为单位定义。 IMPanel 结构中的每一项小于等于 panel->maxwidth

    应用程序应该使用 IMProcessAuxiliary 子例程来通报一个或多个用户的选中项。 IM_SELECTED 值指示选中了哪一项。 IM_CANCEL 值表示用户希望终止辅助对话。

    提示 由输入方法使用以提供有关 IMAuxInfo 结构的上下文的信息。 值 IM_AtTheEvent 指示 IMAuxInfo 结构与通过 IMFilterIMLookupString 子例程传递到输入方法的最后一个事件相关联。 当正在显示多个 IMAuxInfo 结构时,其他的 hint 用于相互区分。
    状态 由输入方法使用,用于内部处理。 应用程序不应该使用此字段。

    每个 IMAuxInfo 结构都相互独立。 用来显示成员的方法由输入方法的调用者决定。 IMAuxInfo 结构由 IMAuxDraw 回调使用。