收藏 分享(赏)

MTK输入法介绍.doc

上传人:精品资料 文档编号:10275144 上传时间:2019-10-27 格式:DOC 页数:22 大小:330KB
下载 相关 举报
MTK输入法介绍.doc_第1页
第1页 / 共22页
MTK输入法介绍.doc_第2页
第2页 / 共22页
MTK输入法介绍.doc_第3页
第3页 / 共22页
MTK输入法介绍.doc_第4页
第4页 / 共22页
MTK输入法介绍.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、 技术文档 目录1 概述 42 目的 43 参考文档 44 T9 输入法文件说明 44.1 H 文件 44.2 C 文件 44.3 T9 层次结构 54.4 输入法的调用流程 54.4.1 输入法的初始化: .64.4.2 进入需要输入法的短消息界面 74.4.3 引擎输出的 buffer 及一些辅助信息 84.4.4 相关的显示区域及状态 114.5 反查码表 .135 语言种类的选择 136 字库的选择与添加 .136.1 加入库文件 .136.2 建立相关的文件夹 .146.3 ADS 编译需用到的一些设置文件 .146.4 设置按键处理函数 .146.5 候选窗口 .156.6 输入法

2、图标 .156.7 输入法菜单 .156.8 改变 EMS 默认的输入法 166.9 其他 .166.10 CommonScreens.c .176.11 EditorPen.c176.12 Wui_ems_categories.c .186.13 Wui_inputs.c:.226.14 资源文件 226.15 其他注意的问题: 237 问题与讨论 23技术文档 1 概述该文档是输入法的技术说明文档2 目的供内部人员开发使用3 参考文档MTK 6226 代码实现4 T9 输入法文件说明中文输入方式: 中文输入方式即用手机在编写短信息或是电话簿等项目中用到的输入方式。 T9: T9 输入法全名

3、为智能输入法,字库容量九千多字,支持十多种语言,包括欧洲及中文繁体、简体、香港常用字等。4.1 H 文件t9main.h,t9definition.h,t9.h ,t9api.h,t9awapi.h,t9ccapi.h,t9cgen.h,t9env.h,t9gen.h,t9lang.h,t9ver.h 其中 t9main.h,t9definition.h 为 MMIFrameWork 需要用到的头文件,而 t9.h,t9api.h,t9awapi.h, t9ccapi.h,t9cgen.h ,t9env.h ,t9gen.h ,t9lang.h ,t9ver.h 为引擎 API 层需要用到的头

4、文件。4.2 C 文件t9lang.c,t9main.c技术文档 4.3 T9 层次结构T9 采用了三层结构M M I引擎 A P I 封装层引擎层K e y i n p u tK e y i n p u to u t p u to u t p u t引擎层根据输入键值搜索数据。引擎 API 封装层主要是对 T9 引擎 API 的封装,MMI层只要往这一层输入键值,然后该层直接提供可以显示的数据。输入:用户输入的一些按键信息。输出:引擎输出的一些 buffer 及一些辅助信息。显示:根据引擎输出的一些 buffer 及辅助信息显示出来。4.4 输入法的调用流程输入法模块调用流程图如下:技术文档

5、 123开机 , 初始输入法进入输入法模块刷新输入法相关的显示区域及主屏区进入某个需要输入法的界面 , 如短消息重新进入输入法模块向引擎 A P I 封装层传入键消息4关机 , 退出输入法模块4.4.1 输入法的初始化:在文件 MMITask.c 中的函数void InitIME(void)InitInputMethod();/t9 输入法的初始化进行了输入法的初始化.主要是初始化输入法的模式(全局变量), 当前模式设置.IMERES.h 定义了一个数据结构定义输入法的模式所涵盖的细节typedef struct _IMEModeDetailsSUPPORT_INPUT_MODES IME_M

6、ode_ID;SUPPORT_INPUT_TYPES IME_Type_ID;U16 Common_Screen_StringID;U16 Prefered_IMEStringID;MMI_BOOL English_Only_Flag; sIMEModeDetails;在 IMERES.c 定义了一个全局的输入法模式数组,如果要增加或者删减相关的模式,在此数组技术文档 下修改.const sIMEModeDetails mtk_gIMEModeArray =4.4.2 进入需要输入法的短消息界面4.4.2.1 短消息编写短消息时会进入一个句柄绑定函数(SMSMoMtGuiInterface.c

7、)void HighlightWMessageHandler (void).SetLeftSoftkeyFunction (mmi_msg_entry_write_msg, KEY_EVENT_UP);void mmi_msg_entry_write_msg (void)ShowCategory28Screen()void ShowCategory28Screen()/如果是非触摸屏/关联*键,用于切换特殊字符SetKeyHandler(change_input_mode,KEY_STAR,KEY_EVENT_DOWN);/注册一个回调函数register_multiline_inputbox

8、_input_callback(handle_category28_input);/关联#键,用于切换输入模式SetKeyHandler(handle_category28_change_input_mode,KEY_POUND,KEY_EVENT_DOWN);/与 T9 联系起来,关联 09 键change_EMS_inputbox_input_mode();/如果是触摸屏mmi_pen_editor_setup_input_box(。 。 。 )/进入 editorpen.c 文件,相关的键处理都在此文件下进行技术文档 4.4.2.2 彩信在 widget_ctk.c 中static vo

9、id widget_ctk_show_smil_editor(ctk_layout_handle layoutid)ShowCategory275Screen(.).4.4.3 引擎输出的 buffer 及一些辅助信息经过相关的键输入信息 T9STATUS T9FARCALL T9HandleKey(T9FieldInfo *pFieldInfo, T9KEY eKeyID)可以得到相关的引擎输出的 buffer 及一些辅助信息,此是利用几个结构的数据类型来进入输入信息显示的。1struct T9CCFieldInfo_s T9FieldInfo G; /* Generic data. */T

10、9U8 pbKeyBufT9CCKEYBUFMAXSIZE; /* Buffer of keystrokes */T9UINT nKeyBufLen; /* Number of keystrokes currently in the buffer */T9U16 pwSelectPageT9CCSELECTPAGEMAXSIZE; /* Buffer of the selection page */T9UINT nSelectPageMax; /* Current max size of selection page */T9UINT nSelectPageLen; /* Current nu

11、mber of valid entries in selection page */T9UINT nSelectPageNum; /* 0-based current page number of selection page */T9U8 bToneCode; /* Filter value to provide only 1 tone for keys */T9U8 bSpellCode; /* Filter value to provide only 1 phonetic form for keys */T9U16 wChineseState; /* Current state bits

12、 for Chinese */T9U8 pbSpellBufT9CCSPELLBUFMAXSIZE;/* Buffer for Pinyin or BoPoMoFo spellings */T9U16 wComponent; /* Selected component (0 if none) */T9U8 bNumCompStrokes; /* Number of strokes in current component */T9U16 wFirstComponent;/* First available component code (0 if no components available

13、)*/T9U16 wLastComponent; /* Last available component code */T9UINT nDymCtxtFence; /* the fence of Dynamic context */T9UINT nDymCtxtSearchDepth; /* Dynamic context Search Depth */T9U8 bPhraseCompFence; /* Phrase completion fence */T9U8 bPhraseCompLen; /* Length of completion part of phrase completion

14、 */T9U16 wPhraseCompCursor; /* Original cursor before phrase completion occurs */T9CCUdbInfo T9FARUDBPOINTER *pCudbInfo; /*Pointer to Chinese UDB */T9CCUdbObj UdbCacheObj; /* cache copy of the current UDB object */技术文档 T9CCAudbInfo T9FARUDBPOINTER *pCAUdbInfo; /* Pointer to Chinese Auto User databas

15、e */T9UINT nCAUdbFence; /* AUDB fence */T9U8 bLdbModuleFlag; /* Flags to indicate which modules are available in current LDB */T9U8 bSpellMatchFromLdb; /* record how many matched spells are from ldb */T9U8 bSpellMatchFromCudb; /* record how many matched spells are from cudb*/struct T9CC_Private_s T9

16、CPrivate; /* Persistent memory for T9 Chinese */void *pOEMPrivate; /* pointer for OEM use for callbacks */T9CCLoadLdb_f T9CCLoadLdb;2struct T9FieldInfo_s T9SYMB *psTxtBuf; /* Shared text buffer. */T9AuxType *paAuxBuf; /* Shared auxillary buffer. */T9UINT nBufLenMax; /* Memory Size of text and key bu

17、ffers. */T9UINT nBufLen; /* Number characters in text and key buffers.*/T9UINT nCursor; /* Current cursor position. */T9UINT nWordLen; /* Length of active keystrokes. */T9UINT nComplLen; /* Length of word beyond active keystrokes. */T9UINT nLdbNum; /* Current linguistics data base number. */T9U8 bSy

18、mbolClass; /* Symbol class of LDB */T9U8 bNumDbKeys; /* Number of ambiguous keys LDB specifies */T9U8 bNumTapKeys; /* Number of multitap keys LDB specifies */T9UINT nCurSelObj; /* The current selected object in the selection list* when nexting/pre-ing. The valid value* is 1T9AWMAXSELECTIONOBJECT*/T9

19、U32 dwStateBits; /* Current State bits */* See T9STATEBIT above for legal values. */#ifdef T9EVENTAPIT9_upAuxAPI uLangData; /* union of ptrs referencing LDB specific APIs */#endifstruct T9_Private_s T9Private; /* Persistent memory for T9s use. */void *pOEMPrivate;/* pointer for OEM use for callbacks

20、 */T9U32 dwReserved;T9HandleRequest_f T9HandleRequest;技术文档 T9ReadLdbData_f T9ReadLdbData;T9ConvertChar_f T9ConvertChar;3拼音拦信息键信息侯选字信息4智能联想例如你输入积极的积,将“积”字赋于变量 phrase通过 T9AddExplicitChar(就可以联想到与积相关的词组。技术文档 4.4.4 相关的显示区域及状态4.4.4.1 未定义_MMI_TOUCH_SCREEN_在 t9main.c 中t9CompositionArea 上图中的拼音拦的显示区域t9Selecti

21、onArea 上图中的侯选栏的显示区域T9_SCREEN_STATE_A 初始状态T9_SCREEN_STATE_B_PRE 上图中的拼音栏选择状态T9_SCREEN_STATE_B 上图中的侯选栏的选择状态T9_SCREEN_STATE_C 侯选栏连续选择状态T9_SCREEN_STATE_D 删除状态非触摸屏通过 void T9InputBoxDisplayForEMSInputBox(void)技术文档 4.4.4.2 定义了_MMI_TOUCH_SCREEN_(1)虚拟键盘用虚拟键盘的显示函数 void mmi_pen_editor_vk_show(void)虚拟键盘的相关文件:wgu

22、i_virtual_keyboad.h, gui_virtual_keyboad.hwgui_virtual_keyboad.c, gui_virtual_keyboad.c(2)键处理函数/触摸响应函数void mmi_pen_editor_smart_latin_key_down_handler(S32 key);/智能英语void mmi_pen_editor_smart_latin_key_down_handler(S32 key);/智能拼音void mmi_pen_editor_smart_bpmf_pinyin_key_down_handler(S32 key);/笔划void

23、mmi_pen_editor_chinese_stroke_key_down_handler(S32 key);/按#键执行函数void mmi_pen_editor_switch_input_method(void)技术文档 (3)显示区域及显示函数g_pen_editor_composition_input_box 上图中的拼音拦的显示区域gPenEditorCandidateInputBox 上图中的侯选栏的显示区域在按键的过程中通过诸如以下函数来显示的mmi_pen_editor_chinese_stroke_get_candidates_by_key_sequencemmi_pen_

24、editor_smart_bpmf_pinyin_get_candidates_by_key_sequence 等等。4.5 反查码表在电话簿快速查找时需要用到反查码表,用下列函数T9CCGetCharStrokes(.);T9CCGetCharSpell();5 语言种类的选择在文件 MMI_features*.h,中定义了以下的宏:#define _MMI_LANG_ENGLISH_#define _MMI_LANG_TR_CHINESE_#define _MMI_LANG_SM_CHINESE_在设置话机设置-语言中 ,如果想添加或者减少语言的种类,只需打开或者屏蔽上述的宏即可.6 字库

25、的选择与添加下面我以国笔输入法的添加为例(项目:V520, 平台:6226 ),MTK 平台的输入法没有按照模块化来设置,代码非常分散,所以移植起来有点麻烦。一般来说,所有出现过_MMI_KA_的地方我们都需要修改。6.1 加入库文件在目录plutommiCustomerCustResourcePLUTO_MMIInputMethod 下增加两个文件夹:GUOBI_LIB 与 GUOBI_INC,将相应的第三方软件提供的*.lib,*.a 文件拷入 GUOBI_LIB 其中,将引擎头文件文件拷入 GUOBI_INC。技术文档 6.2 建立相关的文件夹在 V520 当前工程目录下建立一个文件夹

26、GUOBI(仿照 T9),其下建立文件夹 SRC 与include,.c 与.h 文件分别拷入其中,另外建立自己的接口文件 gbmain.c 与 gbmain.h.6.3 ADS 编译需用到的一些设置文件(1)在文件*_GSM.mak (make)中有如下的语句 INPUT_METHOD= MMI_T9,将其替换为MMI_GUOBI.并且搜索 MMI_T9,将相应位置添加 MMI_GUOBI,将需要用到*.lib,*.a 依样加入,同样在 REL_MMI_GPRS.mak 也需要仿照 MMI_T9,加入其相应的文件。(2)在make文件夹里加入你的输入法的目录GUOBI,并建立以下几个文件,

27、guobi.def: 需要使用的一些特殊的宏定义guobi.inc:需要使用的一些头文件的引用guobi.lis:包含的文件guobi.pth:包含文件的路径(3)在custominfo.pl下push(thatdirs, “inputmethod$mmi_versioninc“);语句后加入push(thatdirs, “inputmethod$mmi_versionguobi_inc“);(4)在plutommimmiGlobalSimulatorPathDef文件最后加入/I “custominputmethodPLUTO_MMIguobi_inc“6.4 设置按键处理函数主要在chan

28、ge_EMS_inputbox_mode,change_singleline_inputbox_mode,change_multiline_inputbox_mode 三个函数。这是系统在改变输入法时调用的函数,这时候输入法需要把自己的按键处理函数设置到系统。有关的按键包括所有的数字键、方向键、确定键和*#两个键。一般来说,MTK 里面已经实现了数字输入法, MULTITAP 输入法,这几个输入法我们基本不需要修改。但是要修改这几个输入法里面的*和#键的调用。一般来说我们在INPUT_MODE_123、INPUT_MODE_MULTITAP_UPPERCASE_ABC,INPUT_MODE_M

29、ULTITAP_LOWERCASE_ABC 的输入模式的处理程序后面加入#ifdef _MMI_GUOBI_GBClearKeyHandler(gbKeyStarPound);SetKeyHandler(mmi_pen_editor_switch_input_method, KEY_STAR, KEY_EVENT_DOWN);#endif并且我们要加入我们自己的 4 个输入模式的处理函数:mmi_pen_editor_switch_input_method 是触摸屏版本 MTK 里面切换输入法的统一函数,在非触摸屏的版本里面,可能要把它改为 change_EMS_inputbox_mode,

30、change_singleline_inputbox_mode, change_multiline_inputbox_mode 中的一个。技术文档 6.5 候选窗口国笔的候选窗口比较复杂,所以我们建议自己画,而不是使用系统的控件。对于触摸屏的版本的 MTK 平台,我们建议使用一个空的虚拟键盘来做我们的候选窗口,候选窗口还可以通过点击进行操作。但是这个虚拟键盘一定要自己来画。对于非触摸屏的版本,建议建立一个空的 singline inputbox 来做我们的候选窗口。 (但是记得不要往这个 inputbox 插入字符。 )对于 singline inputbox 的候选窗口,需要注意的是有时候需

31、要隐藏这个候选窗。画候选窗口需要部首的图片。这些图片共 5*29=145 个,要全部加入到资源里面。6.6 输入法图标EMS 里面左上角有一个输入法图标,这个图标主要在 wgui_EMS_show_input_mode 函数处理。我们需要跟着_MMI_T9_进行处理。6.7 输入法菜单IMERes.c 里面有一个数组:const sIMEModeDetails mtk_gIMEModeArray这个数组当前可用的输入法和输入法的顺序。这里面我们需要加入 4 个输入法。#if defined(_MMI_GUOBI_)/*Smart Pinyin*/INPUT_MODE_SM_PINYIN,INP

32、UT_TYPE_SM_PINYIN,STR_INPUT_METHOD_MENU_PINYIN,STR_INPUT_METHOD_PINYIN,0,INPUT_MODE_SM_STROKE,INPUT_TYPE_SM_STROKE,STR_INPUT_METHOD_MENU_SIMPLIFIED_CHINESE_STROKE,STR_INPUT_METHOD_SM_STROKE,0,/*Smart abc*/INPUT_MODE_SMART_LOWERCASE_ABC,技术文档 INPUT_TYPE_SMART_LOWERCASE_ABC,STR_INPUT_METHOD_MENU_SMART_

33、abc,STR_INPUT_METHOD_SMART_L_ABC,1,/*Smart ABC*/INPUT_MODE_SMART_UPPERCASE_ABC,INPUT_TYPE_SMART_UPPERCASE_ABC,STR_INPUT_METHOD_MENU_SMART_ABC,STR_INPUT_METHOD_SMART_U_ABC,1,#endif /_MMI_GUOBI_Wgui_categories_inputs.c 里面有一个数组 MMI_implement_input_mode_set,这个数组也需要加入:#if defined(_MMI_GUOBI_)/MMI_impleme

34、nt_input_mode_setINPUT_MODE_SM_PINYIN,INPUT_MODE_SM_STROKE,INPUT_MODE_SMART_UPPERCASE_ABC,INPUT_MODE_SMART_LOWERCASE_ABC,#endif6.8 改变 EMS 默认的输入法ShowCategory28Screen 函数的开头有一个语句:U16 input_type = (U16) INPUT_TYPE_ALPHANUMERIC_LOWERCASE;把它改成:#ifndef _MMI_GUOBI_U16 input_type = (U16) INPUT_TYPE_ALPHANUME

35、RIC_LOWERCASE;#elseU16 input_type = (U16) INPUT_TYPE_SM_PINYIN;#endif6.9 其他MTK 代码里面有很多:#if defined(_MMI_T9_) | defined(_MMI_ITAP_) | defined(_MMI_KA_)一般来说我们在后面加上 | defined(_MMI_GUOBI_)就好了。基本我们需要加入的地方都会有_MMI_KA_,移植的时候把 _MMI_KA_全部找出来,然后每一个看看,慢慢加入。技术文档 6.10 CommonScreens.c在 SetSavedInputType#if defined

36、 (_MMI_T9_) | defined (_MMI_ZI_) | defined(_MMI_KA_)后面加入 defined(_MMI_GUOBI_)U32 InputMethodSetKeyHandler(FuncPtr *preFuncPtrs,FuncPtr *postPtrs,const sIMEModeDetails *IMEModeArray,BOOL EnglishOnly,BOOL AP_required)函数里面:switch (input_mode_id)里面加入:#ifdef _MMI_GUOBI_case INPUT_MODE_SMART_UPPERCASE_ABC

37、:preFuncPtrsj = wgui_change_inputbox_mode_smart_ABC;break;case INPUT_MODE_SMART_LOWERCASE_ABC:preFuncPtrsj = wgui_change_inputbox_mode_smart_abc;break;case INPUT_MODE_SM_PINYIN:preFuncPtrsj = wgui_change_inputbox_mode_sm_pinyin;break;case INPUT_MODE_SM_STROKE:preFuncPtrsj = wgui_change_inputbox_mode

38、_sm_stroke;break;#endif6.11 EditorPen.cvoid mmi_pen_editor_setup_input_box(mmi_pen_handwriting_area_struct *stroke_area,mmi_pen_handwriting_area_struct *ext_stroke,U16 input_type,U8 information_bar_flag,mmi_pen_editor_input_box_type_enum input_box_type).SetKeyHandler(mmi_pen_editor_switch_input_meth

39、od, KEY_POUND, 技术文档 KEY_EVENT_DOWN);改成(*键切换输入法功能)#ifdef _MMI_GUOBI_ClearKeyHandler(KEY_POUND, KEY_EVENT_DOWN);SetKeyHandler(mmi_pen_editor_switch_input_method, KEY_STAR, KEY_EVENT_DOWN);#elseSetKeyHandler(mmi_pen_editor_switch_input_method, KEY_POUND, KEY_EVENT_DOWN);#endifvoid mmi_pen_editor_switch

40、_input_method(void);输入法切换之后有一段if (INPUT_MODE_TR_MULTITAP_BOPOMO = MMI_current_input_mode |INPUT_MODE_SM_MULTITAP_PINYIN = MMI_current_input_mode)mmi_pen_editor_bpmf_pinyin_create_multitap(MMI_current_input_mode);mmi_pen_editor_bpmf_pinyin_register_multitap_function();else if (INPUT_MODE_SMART_UPPERC

41、ASE_ABC = MMI_current_input_mode |INPUT_MODE_SMART_LOWERCASE_ABC = MMI_current_input_mode)mmi_pen_editor_smart_latin_register_key_function();else if (INPUT_MODE_TR_STROKE = MMI_current_input_mode | INPUT_MODE_SM_STROKE = MMI_current_input_mode)mmi_pen_editor_chinese_stroke_register_key_function();el

42、se if (INPUT_MODE_TR_BOPOMO = MMI_current_input_mode | INPUT_MODE_SM_PINYIN = MMI_current_input_mode)mmi_pen_editor_smart_bpmf_pinyin_register_key_function();在国笔输入法里面,把这段去掉。6.12 Wui_ems_categories.cvoid change_EMS_inputbox_mode(U8 mode);这个函数主要是将输入法模式改过来。然后在每一次切换输入法之后把*键的功能改为切换输入法。void change_EMS_inp

43、utbox_mode(U8 mode)技术文档 /*-*/* Local Variables */*-*/*-*/* Code Body */*-*/* PMT dara added for Multitap thai */#if defined(_MMI_MULTITAP_THAI_)SetKeyHandler(handle_category28_change_input_mode, KEY_POUND, KEY_EVENT_DOWN);#endif switch (mode)case INPUT_MODE_MULTITAP_UPPERCASE_ABC:change_multitap_mod

44、e(INPUT_MODE_MULTITAP_UPPERCASE_ABC);register_EMS_multitap_function();#ifdef _MMI_GUOBI_/*键切换输入法SetKeyHandler(mmi_pen_editor_switch_input_method, KEY_STAR, KEY_EVENT_DOWN);#endifbreak;case INPUT_MODE_MULTITAP_LOWERCASE_ABC:change_multitap_mode(INPUT_MODE_MULTITAP_LOWERCASE_ABC);register_EMS_multitap

45、_function();#ifdef _MMI_GUOBI_/*键切换输入法SetKeyHandler(mmi_pen_editor_switch_input_method, KEY_STAR, KEY_EVENT_DOWN);#endifbreak;case INPUT_MODE_123:change_multitap_mode(INPUT_MODE_123);clear_multitap_key_handlers();register_MMI_key_input_handler();register_key_down_handler(EMS_inputbox_handle_key_down

46、);register_keyboard_input_handler(EMS_inputbox_numeric_keyboard_input_handler);技术文档 wgui_set_EMS_inputbox_RSK();register_EMS_inputbox_keys();if (MMI_current_input_type #ifdef _MMI_GUOBI_SetKeyHandler(mmi_pen_editor_switch_input_method, KEY_STAR, KEY_EVENT_DOWN);#endifbreak;.#ifdef _MMI_GUOBI_case IN

47、PUT_MODE_SM_PINYIN:case INPUT_MODE_SM_STROKE:case INPUT_MODE_SMART_UPPERCASE_ABC:case INPUT_MODE_SMART_LOWERCASE_ABC:输入法模式切换这里面会把上下左右设置 EMS 处理*键处理#endifvoid handle_category28_change_input_mode(void)函数这个函数主要是改变输入法的图标只要把获取中文输入法图标里面#if defined(_MMI_T9_) | defined(_MMI_ITAP_) | defined(_MMI_KA_)加上| defined(_M

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报