/* * Copyright (c) 2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @addtogroup InputMethod * @{ * * @brief InputMethod模块提供C语言接口来使用输入法。"使用输入法"面向应用侧调用。 *
*
功能定位:该模块为应用侧开发者提供自绘输入框与输入法服务交互的完整C API,支持应用绑定/解绑输入法服务、向输入法发送请求 * 和通知、接收输入法的回调通知、配置输入框属性、管理光标和避让信息等核心功能。 *
*
使用场景:适用于使用NDK开发自绘输入框的应用,需要与系统输入法服务进行交互的场景。典型流程为:应用创建TextEditorProxy * (文本编辑器代理)和AttachOptions(绑定配置选项),通过Controller绑定输入法服务,绑定成功后通过InputMethodProxy(输入法代 * 理)与输入法交互,使用完毕后通过Controller解绑。 *
*
使用后效果:绑定输入法后,应用可接收输入法的文本插入、删除、光标移动等回调通知,也可主动向输入法发送光标更新、选区变 * 更、私有命令等请求。解绑后,所有交互通道关闭,相关资源释放。 *
*
生命周期管理:本模块遵循严格的创建/销毁配对原则和绑定/解绑配对原则: *
*
- 绑定/解绑配对:OH_InputMethodController_Attach必须与OH_InputMethodController_Detach配对调用,未解绑会导致输入法 * 资源泄漏。 *
- 创建/销毁配对:所有Create函数创建的对象必须通过对应的Destroy函数销毁,否则会导致内存泄漏。 *
- 调用顺序:先创建依赖对象(TextEditorProxy、AttachOptions),再执行Attach绑定,绑定成功后使用InputMethodProxy交 * 互,最后Detach解绑并销毁所有创建的对象。 *
*
线程安全:本模块的API非线程安全,建议在主线程调用。TextEditorProxy的回调执行线程可通过 * OH_TextEditorProxy_SetCallbackInMainThread配置。 * *
模块架构: 本模块由9个头文件组成,按职责分为四层: *
*
- 控制层:inputmethod_controller_capi.h —— 模块核心入口,提供绑定/解绑输入法服务的能力,是所有交互的起点和终点。 *
- 交互层:inputmethod_text_editor_proxy_capi.h和inputmethod_inputmethod_proxy_capi.h —— 双向交互通道。 * TextEditorProxy是输入法→应用方向的回调注册通道,应用通过它接收输入法的文本插入、删除等通知;InputMethodProxy是应用→输入法方 * 向的请求发送通道,应用通过它向输入法发送光标更新、选区变更等通知。 *
- 配置层:inputmethod_attach_options_capi.h、inputmethod_text_config_capi.h、inputmethod_cursor_info_capi.h、 * inputmethod_text_avoid_info_capi.h —— 各类配置和信息的承载对象,分别管理绑定选项、输入框配置、光标位置信息、避让区域信息。 *
- 数据层:inputmethod_private_command_capi.h和inputmethod_types_capi.h —— 私有命令数据和公共类型定义(枚举、错误 * 码等)。 *
*
典型调用流程: *
1. 通过inputmethod_text_editor_proxy_capi.h创建TextEditorProxy并注册回调。 *
2. 通过inputmethod_attach_options_capi.h创建AttachOptions配置绑定选项。 *
3. 通过inputmethod_controller_capi.h调用Attach绑定输入法,获取InputMethodProxy。 *
4. 通过inputmethod_inputmethod_proxy_capi.h使用InputMethodProxy与输入法交互。 *
5. 通过inputmethod_text_config_capi.h、inputmethod_cursor_info_capi.h等管理配置信息。 *
6. 通过inputmethod_controller_capi.h调用Detach解绑。 *
7. 销毁所有创建的对象。 * * @library libohinputmethod.so * @kit IMEKit * @syscap SystemCapability.MiscServices.InputMethodFramework * @since 12 */ /** * @file inputmethod_controller_capi.h * * @brief 输入法控制器的头文件,提供绑定(Attach)和解绑(Detach)输入法服务的核心方法,是应用与输入法服务交互的入口和终点。 * Attach必须在创建TextEditorProxy和AttachOptions之后调用,Detach必须在不再使用输入法时调用以释放资源。Attach/Detach必须配对使 * 用。 *
*
功能:通过OH_InputMethodController_Attach将应用绑定到输入法服务,建立双向交互通道;通过 * OH_InputMethodController_Detach将应用从输入法服务解除绑定,关闭交互通道并释放相关资源。 *
*
使用场景:适用于使用NDK开发自绘输入框的应用,需要在应用启动或输入框获得焦点时绑定输入法服务,在应用退出或输入框失去焦点 * 时解绑输入法服务的场景。 *
*
使用后效果:OH_InputMethodController_Attach成功后,应用可通过返回的InputMethodProxy与输入法交互(如显示/隐藏键盘、 * 通知光标更新等),同时输入法可通过TextEditorProxy的回调向应用发送文本插入、删除等通知。OH_InputMethodController_Detach后,交 * 互通道关闭,inputMethodProxy不再有效。 * * @include * @library libohinputmethod.so * @kit IMEKit * @syscap SystemCapability.MiscServices.InputMethodFramework * @since 12 * @version 1.0 */ #ifndef OHOS_INPUTMETHOD_CONTROLLER_CAPI_H #define OHOS_INPUTMETHOD_CONTROLLER_CAPI_H #include #include #include "inputmethod_text_editor_proxy_capi.h" #include "inputmethod_inputmethod_proxy_capi.h" #include "inputmethod_attach_options_capi.h" #include "../arkui/drag_and_drop.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * @brief 将应用绑定到输入法服务,建立应用与输入法之间的双向交互通道。必须在创建TextEditorProxy和AttachOptions之后调用,绑定成功 * 后,应用可通过返回的InputMethodProxy主动向输入法发送请求和通知,同时输入法可通过TextEditorProxy中注册的回调函数向应用发送文本 * 插入、删除等通知。 *
*
前置条件: *
1. 必须先通过OH_TextEditorProxy_Create创建InputMethod_TextEditorProxy实例,并通过OH_TextEditorProxy_SetXXXFunc * 系列函数注册必要的回调(如InsertTextFunc、DeleteForwardFunc、GetTextConfigFunc等)。 *
2. 必须先通过OH_AttachOptions_Create或OH_AttachOptions_CreateWithRequestKeyboardReason创建 * InputMethod_AttachOptions实例。 *
3. TextEditorProxy中注册的回调函数必须已正确实现,否则输入法交互将不完整。 *
*
配对调用: *
- 调用OH_InputMethodController_Attach后,必须在使用完毕后调用OH_InputMethodController_Detach解除绑定。 *
- 未调用OH_InputMethodController_Detach会导致输入法资源泄漏。 *
- 建议在应用退出或输入框不再需要输入法时及时调用OH_InputMethodController_Detach。 *
*
调用顺序: *
1. OH_TextEditorProxy_Create → 创建TextEditorProxy *
2. OH_TextEditorProxy_SetXXXFunc → 注册回调函数 *
3. OH_AttachOptions_Create → 创建AttachOptions *
4. OH_InputMethodController_Attach → 绑定输入法(返回InputMethodProxy) *
5. OH_InputMethodProxy_ShowKeyboard / NotifyCursorUpdate 等 → 使用输入法功能 *
6. OH_InputMethodController_Detach → 解绑输入法 *
7. OH_TextEditorProxy_Destroy / OH_AttachOptions_Destroy → 销毁创建的对象 *
*
生命周期管理: *
- textEditorProxy:调用者自行管理生命周期。若OH_InputMethodController_Attach成功,在下次 * OH_InputMethodController_Attach或OH_InputMethodController_Detach完成之前不可释放textEditorProxy,否则会导致输入法回调时 * 访问无效内存。 *
- options:调用者自行管理生命周期。OH_InputMethodController_Attach调用完成后,options可立即通过 * OH_AttachOptions_Destroy销毁,因为OH_InputMethodController_Attach过程已读取完options中的配置信息。 *
- inputMethodProxy:由OH_InputMethodController_Attach函数通过双指针输出参数分配内存,调用者在 * OH_InputMethodController_Detach之前需保持inputMethodProxy有效,OH_InputMethodController_Detach后该指针不可继续使用。 *
*
线程安全:非线程安全,建议在主线程调用。 * @param textEditorProxy 输入指针,表示指向InputMethod_TextEditorProxy实例的指针。 *
**含义/功能:** 作为应用接收输入法回调通知的通道载体,绑定后输入法将通过此对象中注册的回调函数与应用交互。 *
**使用场景:** 在绑定输入法前,应用需先创建TextEditorProxy并注册必要的回调函数。 *
**使用后效果:** 若OH_InputMethodController_Attach成功,输入法将通过此对象中的回调函数向应用发送通知;若失败,此对象 * 不受影响可继续使用。 *
**前置条件:** 必须通过OH_TextEditorProxy_Create创建,并通过SetXXXFunc系列函数注册回调。 *
**NULL指针处理:** 不可为NULL,传入NULL将返回IME_ERR_NULL_POINTER。 *
**生命周期管理:** 调用者自行管理。若Attach成功, * 在下次OH_InputMethodController_Attach或OH_InputMethodController_Detach完成之前不可释放textEditorProxy, * 否则输入法回调时将访问已释放的内存导致未定义行为。 *
**内存分配责任:** 由调用者通过OH_TextEditorProxy_Create分配,通过OH_TextEditorProxy_Destroy释放。 * @param options 输入指针,表示指向InputMethod_AttachOptions实例的指针。 *
**含义/功能:** 指定绑定输入法时的行为配置,包括是否在绑定时显示键盘以及请求键盘的原因。 *
**使用场景:** 在绑定前创建并配置好AttachOptions,用于控制绑定时的键盘显示行为。 *
**使用后效果:** OH_InputMethodController_Attach函数将读取options中的配置参数来决定绑定行为。 *
**前置条件:** 必须通过OH_AttachOptions_Create或OH_AttachOptions_CreateWithRequestKeyboardReason创建。 *
**NULL指针处理:** 不可为NULL,传入NULL将返回IME_ERR_NULL_POINTER。 *
**生命周期管理:** OH_InputMethodController_Attach完成后options可立即销毁,因为绑定过程已读取完配置信息。 * 建议在OH_InputMethodController_Attach成功后调用OH_AttachOptions_Destroy释放内存。 *
**内存分配责任:** 由调用者通过Create函数分配,通过OH_AttachOptions_Destroy释放。 * @param inputMethodProxy 输出双指针,表示指向InputMethod_InputMethodProxy指针的指针。 *
**含义/功能:** 用于接收OH_InputMethodController_Attach成功后返回的InputMethodProxy实例,该实例是应用主动向输入法 * 发送请求和通知的交互通道。 *
**使用场景:** OH_InputMethodController_Attach成功后,调用者通过此指针获取InputMethodProxy,后续调用 * ShowKeyboard、HideKeyboard、 NotifyCursorUpdate等函数时需传入此指针。 *
**使用后效果:** 若OH_InputMethodController_Attach成功,*inputMethodProxy将被赋值为有效的InputMethodProxy指针; * 若失败,*inputMethodProxy的值不确定,不应使用。 *
**双指针说明:** 此参数为双指针(Pointer to Pointer), * OH_InputMethodController_Attach函数内部将分配InputMethodProxy的内存并通过此双指针输出给调用者。调用者需提供有效的指针变 * 量地址,不可为NULL。 *
**NULL指针处理:** inputMethodProxy本身不可为NULL,传入NULL将返回IME_ERR_NULL_POINTER。 *
**内存管理:** InputMethodProxy的内存由OH_InputMethodController_Attach函数内部分配, * 其生命周期由框架管理直到OH_InputMethodController_Detach完成。调用者不可自行释放此内存。 * OH_InputMethodController_Detach后inputMethodProxy指向的内存将被释放,该指针不可继续使用。 *
**相关参数制约:** 此指针仅在OH_InputMethodController_Attach返回IME_ERR_OK时有效; * OH_InputMethodController_Detach后此指针立即失效, * 不可继续使用,否则会导致未定义行为或崩溃。 * @return 返回一个特定的错误码。 *
{@link IME_ERR_OK} - 表示成功。此时*inputMethodProxy有效,可用于后续交互。 *
{@link IME_ERR_PARAMCHECK} - 表示参数错误。检查textEditorProxy、options、inputMethodProxy是否为有效指针。 *
{@link IME_ERR_IMCLIENT} - 输入法客户端错误。可能是输入法服务未就绪或连接异常。 *
{@link IME_ERR_IMMS} - 输入法服务错误。可能是系统输入法管理服务异常。 *
{@link IME_ERR_NULL_POINTER} - 非预期的空指针。textEditorProxy、options或inputMethodProxy为NULL时返回。 *
**错误处理建议:** 若返回非IME_ERR_OK,应检查参数有效性后重试;若返回IME_ERR_IMCLIENT或IME_ERR_IMMS,说明服务异常, * 建议稍后重试。具体错误码可以参考 * {@link InputMethod_ErrorCode}。 * @since 12 */ InputMethod_ErrorCode OH_InputMethodController_Attach(InputMethod_TextEditorProxy *textEditorProxy, InputMethod_AttachOptions *options, InputMethod_InputMethodProxy **inputMethodProxy); /** * @brief 将应用绑定到输入法服务,同时携带UI上下文信息。适用于需要将输入法与特定UI页面关联的场景(如多窗口场景下指定绑定到哪个页 * 面)。与OH_InputMethodController_Attach的区别在于,此函数额外接受一个ArkUI_ContextHandle参数,用于在多窗口或多页面场景下指 * 定绑定到具体的UI上下文,使输入法服务能精确关联到当前活跃的页面。 *
*
前置条件: *
1. 必须先获取有效的ArkUI_ContextHandle(通过ArkUI模块创建UI上下文获取)。 *
2. 必须先通过OH_TextEditorProxy_Create创建InputMethod_TextEditorProxy实例,并通过OH_TextEditorProxy_SetXXXFunc * 系列函数注册必要的回调。 *
3. 必须先通过OH_AttachOptions_Create或OH_AttachOptions_CreateWithRequestKeyboardReason创建 * InputMethod_AttachOptions实例。 *
*
配对调用: *
- 调用OH_InputMethodController_AttachWithUIContext后,必须在使用完毕后调用OH_InputMethodController_Detach解除绑 * 定。 *
- 未调用OH_InputMethodController_Detach会导致输入法资源泄漏。 *
*
调用顺序: *
1. 获取ArkUI_ContextHandle *
2. OH_TextEditorProxy_Create → 创建TextEditorProxy *
3. OH_TextEditorProxy_SetXXXFunc → 注册回调函数 *
4. OH_AttachOptions_Create → 创建AttachOptions *
5. OH_InputMethodController_AttachWithUIContext → 绑定输入法(携带UI上下文) *
6. OH_InputMethodProxy_ShowKeyboard / NotifyCursorUpdate 等 → 使用输入法功能 *
7. OH_InputMethodController_Detach → 解绑输入法 *
8. 销毁创建的对象 *
*
生命周期管理: *
- context:由ArkUI模块管理,需在绑定期间保持有效。 *
- textEditorProxy:调用者自行管理。若OH_InputMethodController_AttachWithUIContext成功,在下次 * OH_InputMethodController_AttachWithUIContext或OH_InputMethodController_Detach完成之前不可释放。 *
- options:OH_InputMethodController_AttachWithUIContext完成后可立即销毁。 *
- inputMethodProxy:由AttachWithUIContext函数内部分配,OH_InputMethodController_Detach后释放。 *
*
使用场景:适用于多窗口或多页面应用场景,需要将输入法绑定到特定UI页面的场景。当应用有多个UI上下文(如多窗口),使用此函 * 数可确保输入法与正确的页面关联,避免输入法事件发送到错误的窗口。 *
*
线程安全:非线程安全,建议在主线程调用。 * * @param context 输入指针,表示指向ArkUI_Context实例的指针。 *
**含义/功能:** 指定输入法绑定到哪个UI上下文(页面/窗口),使输入法服务能精确关联到当前活跃的页面。 *
**使用场景:** 在多窗口或多页面应用中,需要将输入法绑定到特定UI上下文时使用。 *
**使用后效果:** 输入法事件将发送到与此上下文关联的页面。 *
**前置条件:** 必须通过ArkUI模块获取有效的ArkUI_ContextHandle。 *
**NULL指针处理:** 不可为NULL,传入NULL将返回IME_ERR_NULL_POINTER。 *
**生命周期管理:** 需在绑定期间保持ArkUI_Context有效,OH_InputMethodController_Detach前不可销毁对应的UI上下文。 * @param textEditorProxy 输入指针,表示指向InputMethod_TextEditorProxy实例的指针。 *
**含义/功能:** 与OH_InputMethodController_Attach中的textEditorProxy参数相同,作为应用接收输入法回调通知的通道载 * 体。使用场景、前置条件、NULL指针处理、 * 生命周期管理均与OH_InputMethodController_Attach中textEditorProxy参数一致。 * @param options 输入指针,表示指向InputMethod_AttachOptions实例的指针。含义/功能:与OH_InputMethodController_Attach中的 * options参数相同, * 用于指定绑定时的行为配置。使用场景、前置条件、NULL指针处理、生命周期管理均与OH_InputMethodController_Attach中options参数 * 一致。 * @param inputMethodProxy 输出双指针,表示指向InputMethod_InputMethodProxy指针的指针。含义/功能、使用场景、双指针说明、NULL * 指针处理、内存管理、 * 相关参数制约均与OH_InputMethodController_Attach中的inputMethodProxy参数一致。 * @return 返回一个特定的错误码。 *
{@link IME_ERR_OK} - 表示成功。此时*inputMethodProxy有效,可用于后续交互。 *
{@link IME_ERR_PARAMCHECK} - 表示参数错误。检查context、textEditorProxy、options、inputMethodProxy是否为有效指 * 针。 *
{@link IME_ERR_IMCLIENT} - 输入法客户端错误。 *
{@link IME_ERR_IMMS} - 输入法服务错误。 *
{@link IME_ERR_NULL_POINTER} - 非预期的空指针。context、textEditorProxy、options或inputMethodProxy为NULL时返 * 回。 *
**错误处理建议:** 若返回非IME_ERR_OK,应检查参数有效性后重试;若返回IME_ERR_IMCLIENT或IME_ERR_IMMS,说明服务异常, * 建议稍后重试。具体错误码可以参考 * {@link InputMethod_ErrorCode}。 * @since 23 */ InputMethod_ErrorCode OH_InputMethodController_AttachWithUIContext(ArkUI_ContextHandle context, InputMethod_TextEditorProxy *textEditorProxy, InputMethod_AttachOptions *options, InputMethod_InputMethodProxy **inputMethodProxy); /** * @brief 将应用从输入法服务解除绑定,关闭交互通道。OH_InputMethodController_Detach后,inputMethodProxy不再有效,不可继续使用 * 任何通过inputMethodProxy调用的函数(如ShowKeyboard、HideKeyboard、NotifyCursorUpdate等),否则会导致未定义行为或崩溃。 *
*
前置条件: *
- 必须先调用OH_InputMethodController_Attach或OH_InputMethodController_AttachWithUIContext成功绑定输入法,并获得 * 有效的inputMethodProxy。 *
*
调用顺序: *
- 必须先调用OH_InputMethodController_Attach或OH_InputMethodController_AttachWithUIContext绑定输入法。 *
- 调用OH_InputMethodController_Detach完成输入法使用后,不能再使用inputMethodProxy。 *
- OH_InputMethodController_Detach完成后,可安全销毁TextEditorProxy(通过OH_TextEditorProxy_Destroy)。 *
*
错误处理: *
- 如果inputMethodProxy无效或未绑定,调用OH_InputMethodController_Detach会返回IME_ERR_NULL_POINTER或 * IME_ERR_IMCLIENT。 *
- 重复调用OH_InputMethodController_Detach使用同一个inputMethodProxy可能导致未定义行为,应避免。 *
- OH_InputMethodController_Detach失败后不应继续使用inputMethodProxy。 *
*
生命周期管理: *
- OH_InputMethodController_Detach后,inputMethodProxy指向的内存由框架释放,调用者不可再使用此指针。 *
- OH_InputMethodController_Detach后,应用可安全销毁TextEditorProxy,因为输入法不再会通过回调访问TextEditorProxy。 *
- 建议OH_InputMethodController_Detach成功后立即调用OH_TextEditorProxy_Destroy和OH_AttachOptions_Destroy释放所有 * 创建的对象。 *
*
线程安全:非线程安全,建议在主线程调用。 * * @param inputMethodProxy 输入指针,表示指向InputMethod_InputMethodProxy实例的指针。含义/功能:指定要解除绑定的输入法代理实 * 例, * OH_InputMethodController_Detach将关闭此代理对应的交互通道并释放相关资源。使用场景:在应用不再需要输入法交互时调用,如应用 * 退出、输入框失去焦点等。使用后效果: * OH_InputMethodController_Detach成功后,inputMethodProxy立即失效,不可继续使用;输入法不再向应用发送回调通知。 *
**前置条件:** 此指针必须由OH_InputMethodController_Attach或OH_InputMethodController_AttachWithUIContext成功返 * 回。 *
**NULL指针处理:** 不可为NULL,传入NULL将返回IME_ERR_NULL_POINTER。 *
**生命周期管理:** 此指针由OH_InputMethodController_Attach/AttachWithUIContext函数分配, * OH_InputMethodController_Detach成功后由框架释放,调用者不可自行释放,也不可在OH_InputMethodController_Detach后继续使 * 用。 *
**使用注意:** Detach后此指针立即失效,将此指针传入任何InputMethodProxy相关函数会导致未定义行为。 * 同一inputMethodProxy不可重复调用OH_InputMethodController_Detach。 * @return 返回一个特定的错误码。 *
{@link IME_ERR_OK} - 表示成功。解绑完成,inputMethodProxy不再有效。 *
{@link IME_ERR_IMCLIENT} - 表示输入法客户端错误。可能是客户端连接异常或已断开。 *
{@link IME_ERR_IMMS} - 表示输入法服务错误。可能是服务端异常。 *
{@link IME_ERR_NULL_POINTER} - 非预期的空指针。inputMethodProxy为NULL时返回。 *
**错误处理建议:** 若返回IME_ERR_OK,解绑成功,后续可安全销毁所有创建的对象;若返回IME_ERR_IMCLIENT,说明客户端状态 * 异常,建议记录日志并销毁相关对象; * 若返回IME_ERR_NULL_POINTER,说明传入的指针无效,应检查是否已OH_InputMethodController_Detach或指针已失效。具体错误码可以 * 参考{@link InputMethod_ErrorCode}。 * * @since 12 */ InputMethod_ErrorCode OH_InputMethodController_Detach(InputMethod_InputMethodProxy *inputMethodProxy); #ifdef __cplusplus } #endif /* __cplusplus */ /** @} */ #endif // OHOS_INPUTMETHOD_CONTROLLER_CAPI_H