输入法语言实现过程
来源:互联网 发布:用过淘宝的外国人 编辑:程序博客网 时间: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
- 输入法语言实现过程
- 手写输入法实现过程中的问题
- python实现三元语言模型与输入法推荐
- 输入法语言支持状态
- 实现输入法窗口自定义
- 输入法(IME)实现原理
- T9输入法的实现
- Direct3d 实现输入法
- 输入法(IME)实现原理
- 输入法算法实现
- CEGUI 输入法窗口实现
- Android 输入法表情实现
- 输入法(IME)实现原理
- 智能输入法的实现
- T9输入法 实现一个Android输入法
- Wince输入法换肤换语言机制
- 增加Android输入法键盘语言
- 系统语言改变时,输入法变成默认输入法分析
- 用eclipse手动写一个spring测试程序
- 关于32位os按“段寻址机制”最高64TB的“传说”
- 位图文件读写综述
- PHP技巧
- PHP学习笔记
- 输入法语言实现过程
- epoll I/O复用
- 关于自删除程序文件
- 根据数据库字段来创建一个页面
- java.util.Properties类的使用
- Camera 图像处理原理分析- 抗噪 变焦 频闪 等
- Camera 图像处理原理分析- 抗噪 变焦 频闪 等(2)
- Ubuntu : change timezone and synchronize computer time
- 【C#技术分享】 给自己的软件添加后门