输入法语言实现过程

来源:互联网 发布:用过淘宝的外国人 编辑:程序博客网 时间:2024/05/01 05:46

     介绍:... 3

2     相关地方说明:... 3

3     代码处理过程:... 3

 

 


 

1          介绍:
本文不详细介绍输入法的实现过程和实现原理,只讲解在实现一种语言的过程中,如

何分析问题,简要介绍一些关键性的地方,主要是一个学习方法方面的总结。并且文档也要结合代码来分析才比较有价值。

文档的对象是具有开发输入法经验的人,但不熟悉MTK平台,如何快速上手并实现新语言的添加。

简单来说,输入法需要修改的地方是:功能控制、平台接口部分、输入法引擎接口部分。

 

2  相关地方说明:
 

2.1开关控制:

在MAK文件里需要关注的关于ZI输入法的地方是:

Custom_Release.mak(519):

ifeq ($(strip $(INPUT_METHOD)),MMI_ZI)

 

Option.mak(7636): 

ifeq ($(strip $(INPUT_METHOD)),MMI_ZI_V6)

      COM_DEFS    += __MMI_ZI_V7__

 

COMPLIST    += zi

 

REL_CR_MMI_GPRS.mak(702):

ifeq ($(findstring MMI_ZI,$(RELEASE_INPUT_METHODS_SRC)),MMI_ZI)

 

XPMT23C_08B_GPRS.mak(164):

INPUT_METHOD               = MMI_ZI_V7  

 

 

相关宏开关:

INPUT_METHOD

__MMI_ZI__

MMI_ZI_V7

__MMI_LANG_INDONESIAN__

__MMI_ZI_INDONESIAN__

__MMI_MULTITAP_INDONESIAN__

__MMI_ZI_MULTITAP__

CFG_MMI_ZI_INDONESIAN

CFG_MMI_LANG_INDONESIAN

 

 

 

 

2.2 需要关注的一些函数及说明:

 

mmi_imc_init_all

 

wgui_inputs_ml_setup_ext()

 

平台MULTITAP输入法数组列表:

g_mtk_multitap_mode_info[]

 

3          代码处理过程:
3.1  要修改的地方

3.1.1  语言的设置,在头文件里控制

3.1.2  MAK文件控制输入法引擎的地方;

3.1.3  字库头文件、库文件的更换;

3.1.7  默认语言的设置。

3.1.7  恢复出厂设置。

 

 

3.2  平台处理逻辑

 

 

进入MMS使用输入法的函数调用栈:

(之后会调用wgui_inputs_ml_setup_ext()函数, 而该函数在普通短信编写的时候是不被调用的。)

wgui_inputs_ml_setup_ext(int 0, int 20, int 128, int 103, unsigned char * 0x032bb744, int 2049, unsigned short 153, unsigned short * 0x012c26b2, unsigned char * 0x00000000, unsigned int 128, unsigned char * 0x00000000, int * 0x00000000, unsigned char 1, unsigned int 134217728, short 38, short 19, short 0, short 0, ...) line 6138

ShowCategory280Screen(unsigned short 15261, unsigned short 15183, unsigned short 24012, unsigned short 23885, unsigned short 15199, unsigned short 23882, int 1, unsigned int 128, unsigned char * 0x00000000) line 1899 + 133 bytes

mmi_uc_entry_write_msg() line 2080 + 66 bytes

mmi_uc_get_mms_setting_rsp(void * 0x018751fc) line 1622

mmi_frm_execute_current_protocol_handler(unsigned short 6578, void * 0x018751fc, int 111, void * 0x05f8ff54) line 482 + 17 bytes

ProtocolEventHandler(unsigned short 6578, void * 0x018751fc, int 111, void * 0x05f8ff54) line 2918 + 22 bytes

MMI_task(task_entry_struct * 0x01887a54) line 2364 + 22 bytes

MODIS! 0070f17a() line 347 + 15 bytes

_threadstartex(void * 0x0471c4e0) line 212 + 13 bytes

KERNEL32! 7c80b699()

 

 

 

写普通短信进入输入法的函数调用栈:

 

mmi_imc_connect(void * 0x0330f3d0 _g_mmi_editor_hanler, unsigned int (void *, mmi_imc_message_struct *)* 0x0095a98d mmi_input_box_msg_call_back_ems(void *, mmi_imc_message_struct *)) line 1196

ShowCategory28Screen(unsigned short 13183, unsigned short 13183, unsigned short 24012, unsigned short 13182, unsigned short 23907, unsigned short 13182, EMSData * 0x02d233b8 bufForEdit, unsigned char * 0x00000000) line 5182 + 15 bytes

mmi_msg_entry_write_msg() line 3609 + 43 bytes

mmi_msg_pre_entry_write_msg(int 1) line 3552

mmi_msg_um_entry_write() line 8232 + 7 bytes

execute_softkey_function(int 1, int 0) line 1197 + 18 bytes

left_softkey_up() line 1513 + 9 bytes

ExecuteCurrKeyHandler(short 10, short 1) line 2009 + 5 bytes

KeyEventHandler(KEYBRD_MESSAGE * 0x05f8fe40) line 3416 + 21 bytes

ProcessKeyEvent(unsigned int 1, unsigned short 20) line 1714 + 9 bytes

mmi_frm_convert_process_key_event(unsigned int 1, unsigned short 20) line 2158 + 14 bytes

mmi_frm_key_handle(void * 0x018647cc) line 2384 + 15 bytes

mmi_frm_execute_current_protocol_handler(unsigned short 2498, void * 0x018647cc, int 16, void * 0x05f8ff54) line 482 + 17 bytes

ProtocolEventHandler(unsigned short 2498, void * 0x018647cc, int 16, void * 0x05f8ff54) line 2918 + 22 bytes

MMI_task(task_entry_struct * 0x01887a54) line 2364 + 22 bytes

MODIS! 0070f17a() line 347 + 15 bytes

_threadstartex(void * 0x0471c4e0) line 212 + 13 bytes

KERNEL32! 7c80b699()

 

 

 

按“#”进行输入法切换的调用栈:

mmi_imc_change_input_mode(int 20, unsigned int 0) line 1617

mmi_imc_key_change_input_mode() line 13345 + 13 bytes

mmi_imc_key_smart_alphabetic_key_down_handler(int 21, unsigned short 0) line 7122

mmi_imc_key_group_key_down() line 13066 + 20 bytes

ExecuteCurrKeyHandler(short 21, short 0) line 2009 + 5 bytes

KeyEventHandler(KEYBRD_MESSAGE * 0x05f8fe48) line 3416 + 21 bytes

ProcessKeyEvent(unsigned int 0, unsigned short 11) line 1693 + 9 bytes

mmi_frm_convert_process_key_event(unsigned int 0, unsigned short 11) line 2158 + 14 bytes

mmi_frm_key_handle(void * 0x0186578c) line 2384 + 15 bytes

mmi_frm_execute_current_protocol_handler(unsigned short 2498, void * 0x0186578c, int 16, void * 0x05f8ff54) line 482 + 17 bytes

ProtocolEventHandler(unsigned short 2498, void * 0x0186578c, int 16, void * 0x05f8ff54) line 2918 + 22 bytes

MMI_task(task_entry_struct * 0x01887a54) line 2364 + 22 bytes

MODIS! 0070f17a() line 347 + 15 bytes

_threadstartex(void * 0x0471c4e0) line 212 + 13 bytes

KERNEL32! 7c80b699()

    其中,mmi_imc_key_smart_alphabetic_key_down_handler()在函数mmi_imc_key_attach_smart_alphabecit_key_handler()里注册为g_imc_key的key_down处理函数:

    g_imc_key.key_info.key_down_handler = mmi_imc_key_smart_alphabetic_key_down_handler;

程序在执行mmi_imc_key_group_key_down()的时候,通过函数指针调用它,在这个函数的一个执行分支:

            else if (key_code == MMI_IMC_KEY_CHANGE_MODE)

            {

                mmi_imc_key_change_input_mode();

            }

处进入输入法模式切换。

   mmi_imc_key_change_input_mode()会获取输入法模式列表,是在函数mmi_imm_set_required_mode_list()里来初始化的,而不是在mmi_imm_create_input_method_list()来初始化的。

  只有在智能输入法才调用mmi_ime_word_change_mode()。

  普通的MULTITAP调用mmi_ime_multitap_change_mode()。

 

 

 

开机初始化输入法模式表的调用栈:

mmi_imm_set_required_mode_list(unsigned int 0, int * 0x00000000, int 0) line 3908

mmi_imc_init_all() line 1114 + 11 bytes

InitIME() line 3773

InitializeAll() line 3955

mmi_frm_power_on_init_procedure() line 1935

mmi_bootup_exit_disk_check() line 1581

mmi_bootup_entry_disk_check() line 1484

MMI_task(task_entry_struct * 0x01887a54) line 2197

MODIS! 0070f17a() line 347 + 15 bytes

_threadstartex(void * 0x0471c4e0) line 212 + 13 bytes

KERNEL32! 7c80b699()

    其中在建立列表的时候,会依据gIMEModeArray[]来做判断,通过分析代码发现,在函数InitializeResourceVariables中,

        gIMEModeArray = (sIMEModeDetails*) (langpack2ndJumpTbl[3]); 

而langpack2ndJumpTbl[]跳转表又关联到IMERes.c文件中的数组   mtk_gIMEModeArray[] ,它是通过开关来控制各个输入法模式的。

 

只有

 

 

 

 

3.3  引擎处理逻辑


ZiEngine.c

MMI_BOOL mmi_ime_word_init( void )


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiashaohua/archive/2009/12/25/5073486.aspx

原创粉丝点击