版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 技术文档 目录1概述42目的43参考文档44t9输入法文件说明44.1 h文件44.2 c文件44.3t9层次结构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 输入法图标156.7 输入法菜单156.8 改变ems默认的输入法166.9 其他166.10
2、 commonscreens.c176.11 editorpen.c176.12 wui_ems_categories.c186.13 wui_inputs.c:226.14资源文件226.15其他注意的问题:237问题与讨论231 概述该文档是输入法的技术说明文档2 目的供内部人员开发使用3 参考文档mtk 6226代码实现4 t9输入法文件说明中文输入方式: 中文输入方式即用手机在编写短信息或是电话簿等项目中用到的输入方式。 t9: t9输入法全名为智能输入法,字库容量九千多字,支持十多种语言,包括欧洲及中文繁体、简体、香港常用字等。4.1 h文件t9main.h,t9definition
3、.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.2 c文件t9lang.c,t9main.c4.3 t9层次结构t9采用了三层结构引擎层根据输入键值搜索数据。引擎api封装层主要是对t9引擎api的封装,mmi层只
4、要往这一层输入键值,然后该层直接提供可以显示的数据。输入:用户输入的一些按键信息。输出:引擎输出的一些buffer及一些辅助信息。显示:根据引擎输出的一些buffer及辅助信息显示出来。4.4 输入法的调用流程输入法模块调用流程图如下:4.4.1输入法的初始化:在文件mmitask.c 中的函数void initime(void).initinputmethod();/t9输入法的初始化进行了输入法的初始化.主要是初始化输入法的模式(全局变量),当前模式设置.imeres.h定义了一个数据结构定义输入法的模式所涵盖的细节typedef struct _imemodedetailssupport
5、_input_modes ime_mode_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 短消息编写短消息时会进入一个句柄绑定函数(smsmomtgu
6、iinterface.c)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_mult
7、iline_inputbox_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 void
8、 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. */ t9u8
9、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
10、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
11、bits 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 a
12、vailable)*/ 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 phra
13、se completion */ 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
14、user database */ 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
15、t9cc_private_s t9cprivate; /* 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 siz
16、e of text and key buffers. */ 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 dat
17、a base number. */ t9u8 bsymbolclass; /* 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
18、 * is 1.t9awmaxselectionobject */ t9u32 dwstatebits; /* current state bits */ /* see t9statebit above for legal values. */#ifdef t9eventapi t9_upauxapi ulangdata; /* union of ptrs referencing ldb specific apis */#endif struct t9_private_s t9private; /* persistent memory for t9s use. */ void *poempri
19、vate;/* pointer for oem use for callbacks */ t9u32 dwreserved; t9handlerequest_f t9handlerequest; t9readldbdata_f t9readldbdata; t9convertchar_f t9convertchar;3拼音拦信息键信息侯选字信息4智能联想例如你输入积极的积,将“积”字赋于变量phrase通过t9addexplicitchar(&fieldinfo.ccfieldinfo.g, phrase);就可以联想到与积相关的词组。4.4.4 相关的显示区域及状态4.4.4.1未定义_mm
20、i_touch_screen_在t9main.c中t9compositionarea上图中的拼音拦的显示区域t9selectionarea上图中的侯选栏的显示区域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)虚拟键盘
21、用虚拟键盘的显示函数void mmi_pen_editor_vk_show(void)虚拟键盘的相关文件:wgui_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_edi
22、tor_smart_bpmf_pinyin_key_down_handler(s32 key);/笔划void 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_chin
23、ese_stroke_get_candidates_by_key_sequencemmi_pen_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
24、_. 在设置话机设置-语言中,如果想添加或者减少语言的种类,只需打开或者屏蔽上述的宏即可.6字库的选择与添加下面我以国笔输入法的添加为例(项目:v520, 平台:6226 ),mtk平台的输入法没有按照模块化来设置,代码非常分散,所以移植起来有点麻烦。一般来说,所有出现过_mmi_ka_的地方我们都需要修改。6.1 加入库文件在目录plutommicustomercustresourcepluto_mmiinputmethod下增加两个文件夹:guobi_lib与guobi_inc,将相应的第三方软件提供的*.lib,*.a文件拷入guobi_lib其中,将引擎头文件文件拷入guobi_inc
25、。6.2 建立相关的文件夹在v520当前工程目录下建立一个文件夹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文件夹里加入你的输入法的目录g
26、uobi,并建立以下几个文件, 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_inc6.4 设置
27、按键处理函数主要在change_ems_inputbox_mode,change_singleline_inputbox_mode,change_multiline_inputbox_mode三个函数。这是系统在改变输入法时调用的函数,这时候输入法需要把自己的按键处理函数设置到系统。有关的按键包括所有的数字键、方向键、确定键和*#两个键。一般来说,mtk里面已经实现了数字输入法,multitap输入法,这几个输入法我们基本不需要修改。但是要修改这几个输入法里面的*和#键的调用。一般来说我们在input_mode_123、input_mode_multitap_uppercase_abc,inp
28、ut_mode_multitap_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_mod
29、e, change_singleline_inputbox_mode, change_multiline_inputbox_mode中的一个。6.5 候选窗口国笔的候选窗口比较复杂,所以我们建议自己画,而不是使用系统的控件。对于触摸屏的版本的mtk平台,我们建议使用一个空的虚拟键盘来做我们的候选窗口,候选窗口还可以通过点击进行操作。但是这个虚拟键盘一定要自己来画。对于非触摸屏的版本,建议建立一个空的singline inputbox 来做我们的候选窗口。(但是记得不要往这个inputbox插入字符。)对于singline inputbox 的候选窗口,需要注意的是有时候需要隐藏这个候选窗。画候
30、选窗口需要部首的图片。这些图片共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,input_type_sm_pinyin,s
31、tr_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_abc,str_input_method_sma
32、rt_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_implement_input_mode_set input_mo
33、de_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_alphanumeric_lowercase;#else u16 in
34、put_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 (_mmi_t9_) | defined (_mmi_zi_)
35、| 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: prefuncptrsj = wgui_chang
36、e_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_sm_stroke; break
37、;#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_method, key_po
38、und, key_event_down);改成(*键切换输入法功能)#ifdef _mmi_guobi_ clearkeyhandler(key_pound, key_event_down); setkeyhandler(mmi_pen_editor_switch_input_method, key_star, key_event_down);#else setkeyhandler(mmi_pen_editor_switch_input_method, key_pound, key_event_down);#endifvoid mmi_pen_editor_switch_input_metho
39、d(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_uppercase_abc
40、 = 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(); else
41、 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
42、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_m
43、ultitap_mode(input_mode_multitap_uppercase_abc); register_ems_multitap_function();#ifdef _mmi_guobi_/*键切换输入法setkeyhandler(mmi_pen_editor_switch_input_method, key_star, key_event_down);#endif break; case input_mode_multitap_lowercase_abc: change_multitap_mode(input_mode_multitap_lowercase_abc); regis
44、ter_ems_multitap_function();#ifdef _mmi_guobi_/*键切换输入法setkeyhandler(mmi_pen_editor_switch_input_method, key_star, key_event_down);#endif break;. case input_mode_123: change_multitap_mode(input_mode_123); clear_multitap_key_handlers(); register_mmi_key_input_handler(); register_key_down_handler(ems_i
45、nputbox_handle_key_down); register_keyboard_input_handler(ems_inputbox_numeric_keyboard_input_handler); wgui_set_ems_inputbox_rsk(); register_ems_inputbox_keys(); if (mmi_current_input_type & input_type_mask) = input_type_numeric_changeable) setkeyhandler(wgui_ems_inputbox_handle_symbol_picker_star_
46、key, key_star, key_event_down); #ifdef _mmi_guobi_setkeyhandler(mmi_pen_editor_switch_input_method, key_star, key_event_down);#endif break;.#ifdef _mmi_guobi_ case input_mode_sm_pinyin: case input_mode_sm_stroke:case input_mode_smart_uppercase_abc:case input_mode_smart_lowercase_abc: 输入法模式切换 这里面会把上下
47、左右设置ems处理*键处理#endifvoid handle_category28_change_input_mode(void)函数这个函数主要是改变输入法的图标只要把获取中文输入法图标里面#if defined(_mmi_t9_) | defined(_mmi_itap_) | defined(_mmi_ka_)加上| defined(_mmi_guobi_)就可以了。同时在wui_ems_categories.c,还有:#if defined(_mmi_t9_) | defined(_mmi_zi_) | defined(_mmi_ka_) | defined(_mmi_itap_)vo
48、id wgui_ems_inputbox_change_input_mode_smart_abc(void).void wgui_ems_inputbox_change_input_mode_smart_abc(void)void wgui_ems_inputbox_change_input_mode_tr_bpmf(void)我们在前面同样加上| defined(_mmi_guobi_)void showcategory28screen( u16 title, u16 title_icon, u16 left_softkey, u16 left_softkey_icon, u16 right
49、_softkey, u16 right_softkey_icon, emsdata *data, u8 *history_buffer)函数里面加入对gbinputmethodentercategory28函数的调用,如:#ifdef _mmi_t9_ inuptmethodentercategory28();#elif defined(_mmi_zi_) & defined(_mmi_messages_ems_) ziinuptmethodentercategory28();#elif defined(_mmi_ka_) konkainuptmethodentercategory28();#elif defined(_mmi_itap_) /已经处理过了/* under construction !*/* under construction
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院药房管理与使用规范(标准版)
- 2026 年中职大数据安全观测技术(大数据安全观测基础)试题及答案
- 2026年助听器验配师专业水平评估体系试题冲刺卷
- 函授旅游文化知识考核要点试卷及答案
- 火药爆炸事故应急演练方案
- 2025年医院麻疹风疹防控知识培训试题及参考答案
- 耐火材料培训试题及答案
- 2026年“全国安全生产活动月”《安全知识》考试题库及答案
- 路堤与桥梁过渡段施工作业指导书
- 校园食品安全事故应急演练方案
- 2026年辽宁轻工职业学院单招职业倾向性测试题库及答案详解一套
- 2025年机电产品出口贸易项目可行性研究报告
- 2025年秋期国家开放大学《理工英语4》期末机考精准复习题库
- 自来水厂设备介绍
- 消防管道供货合同范本
- 2025年轨道车司机中级职业技能鉴定参考试题库含答案
- 基于Unity3D的虚拟苏州园林漫游系统设计与实现
- 全球资本流动网络的稳定性研究
- 湖南省长沙市实验小学小学数学五年级下册期末试卷(培优篇)
- 大学高层次人才引进报名表
- 电脑打印机耗材采购项目方案投标文件(技术方案)
评论
0/150
提交评论