輸入法語言實現過程

     介紹:... 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

發佈了8 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章