




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
MTKMMIevent小結(jié)1MTK都有相應(yīng)的處理方式,跟交互相關(guān)的按鍵(KeyBrd.c)和觸摸屏(TouchScreen.c)各有各種其他事件,它主要分為普通事件和interruptevent,interruptevent主要用于需要MTKMMIevent小結(jié)2t池電量,信號(hào)量等等都是通過(guò)這個(gè)函數(shù)來(lái)注冊(cè)消息。當(dāng)L4層處理完封裝事件后,就會(huì)把這kMMItask過(guò)這個(gè)event機(jī)制,找到相應(yīng)的處理函數(shù),進(jìn)行處理。實(shí)現(xiàn)這種機(jī)制,也是考慮到靈活性和擴(kuò)性。如果都在MMItask里面,用switchcase來(lái)處理,那就很瘋狂了,長(zhǎng)度不說(shuō),寫個(gè)應(yīng)用,定義個(gè)消息,都要去改MMItask,所以這個(gè)機(jī)制實(shí)現(xiàn)雖然比較簡(jiǎn)單,但是還是處理這個(gè)消息,還有些應(yīng)用需要在這個(gè)事件處理完畢后處理。還是看代碼吧ent里被#define到mmi_frm_execute_current_protocol_handler)//MsgStruct是具體事件的消息體voidmmi_frm_execute_current_protocol_handler(U16eventID,void*MsgStruct,intmod_src,void*peerBuf){U16count=0;PsExtPeerFuncPtrcurrFuncPtr=NULL;MMI_BOOLquery_result=MMI_FALSE,execute_result=MMI_FALSE;interrupt_event_hdlrint_func=NULL,post_int_func=NULL;mmi_frm_int_event_typecurrent_frm_int_event;idx=mmi_frm_search_event();{//遍歷protocolEventHandler查找是否有event注冊(cè)了回調(diào)函數(shù)//雖然這個(gè)方法感覺(jué)比較笨,就一個(gè)數(shù)組,實(shí)際上對(duì)速度沒(méi)有什么影響for(count=0;count<maxProtocolEvent;count++){if(protocolEventHandler[count].eventID==eventID){//找到處理函數(shù)currFuncPtr=(PsExtPeerFuncPtr)protocolEventHandler[count].entryFuncPtr;//這個(gè)地方時(shí),一個(gè)優(yōu)化//處理的事情就是把剛才現(xiàn)在處理的eventid往前移動(dòng)一個(gè)單位這個(gè)優(yōu)化還是很有必要的if(count>0){protocolEventHandler[count].eventID=protocolEventHandler[count-1].eventID;protocolEventHandler[count].entryFuncPtr=protocolEventHandler[count-1].entryFuncPtr;protocolEventHandler[count-1].eventID=eventID;protocolEventHandler[count-1].entryFuncPtr=(PsFuncPtr)currFuncPtr;}break;}}}//這個(gè)就是查找是否是中斷事件current_frm_int_event=mmi_frm_interrupt_event_converter(eventID,MsgStruct);if(current_frm_int_event>0){//查看該中斷事件是否有注冊(cè)提前處理函數(shù)query_result=mmi_frm_query_interrupt_event_information(current_frm_int_event,&int_func,&post_int_func);}//如果有調(diào)用該函數(shù)if(query_result&&int_func){/*Newinterruptionmechanism*/execute_result=(*int_func)(current_frm_int_event);}//根據(jù)event相應(yīng)的回調(diào)函數(shù)以及前面處理的結(jié)果,來(lái)決定是否處理該事件//要注意的是,如果interrput提前處理函數(shù)返回true,那么這里就不會(huì)執(zhí)行if((currFuncPtr)&&(!interrup_result)&&(!execute_result)){(*currFuncPtr)(MsgStruct,mod_src,peerBuf);}{MMI_TRACE(MMI_FW_TRC_G1_FRM,MMI_FRM_INFO_EVENT_EXECURPTO_NO_HDLR,eventID);}//interruptevent最后處理函數(shù)if(query_result&&post_int_func){execute_result=(*post_int_func)(current_frm_int_event);}}看完這個(gè),其實(shí)覺(jué)得挺簡(jiǎn)單的,對(duì)吧。就是一個(gè)數(shù)組,數(shù)組里關(guān)聯(lián)了eventid和對(duì)應(yīng)的還有就是增加了一種intrruptevent??梢宰?cè)這種event的pre_handlerandpost_handler。這樣如果需要,可以提前做處理或者不響應(yīng)該事件。MTKMMIevent小結(jié)3昨天大概的說(shuō)了下,普通event的執(zhí)行過(guò)程。中間還有幾個(gè)函數(shù)沒(méi)有介紹,這里簡(jiǎn)單介紹staticmmi_frm_int_event_typemmi_frm_interrupt_event_converter(U16event_id,void*msg){mmi_frm_int_event_typefrm_interrupt_event=0;switch(event_id){//GPIO消息casePRT_EQ_GPIO_DETECT_IND:{mmi_eq_gpio_detect_ind_struct*gpio_detect_ind=(mmi_eq_gpio_detect_ind_struct*)msg;switch(gpio_detect_ind->gpio_device){//翻蓋關(guān)閉caseEXT_DEV_CLAM_CLOSE:{frm_interrupt_event=MMI_FRM_INT_CLAM_CLOSE;break;}//翻蓋打開caseEXT_DEV_CLAM_OPEN:{frm_interrupt_event=MMI_FRM_INT_CLAM_OPEN;break;}//耳機(jī)插入拔出caseEXT_DEV_EARPHONE:{if(gpio_detect_ind->on_off==1){frm_interrupt_event=MMI_FRM_INT_EARPHONE_PLUG_IN;}{frm_interrupt_event=MMI_FRM_INT_EARPHONE_PLUG_OUT;}break;}}break;}casePRT_BATTERY_STATUS_IND:{mmi_eq_battery_status_ind_struct*battery_status_ind=(mmi_eq_battery_status_ind_struct*)msg;frm_interrupt_event=mmi_frm_get_frm_int_event_macro(battery_status_ind->battery_status,mmi_frm_int_event_battery_table,sizeof(mmi_frm_int_event_battery_table)/sizeof(mmi_frm_int_event_battery_table[0]));/*Forlowbatteryindication*/if(battery_status_ind->battery_status==PMIC_VBAT_STATUS){if(battery_status_ind->battery_voltage==BATTERY_LOW_WARNING){frm_interrupt_event=MMI_FRM_INT_BATTERY_LOW_WARNING;}elseif(battery_status_ind->battery_voltage==BATTERY_LOW_TX_PROHIBIT){frm_interrupt_event=MMI_FRM_INT_BATTERY_LOW_TX_PROHIBIT;}}break;}caseMSG_ID_TIMER_EXPIRY:caseMSG_ID_MMI_EQ_POWER_ON_IND:caseMSG_ID_MMI_EQ_KEYPAD_DETECT_IND:{break;}default:{//其他interruptevent,主要是彈出框相關(guān),短信報(bào)告等等f(wàn)rm_interrupt_event=mmi_frm_get_frm_int_event_macro(event_id,mmi_frm_int_event_convert_table,sizeof(mmi_frm_int_event_convert_table)/sizeof(mmi_frm_int_event_convert_table[0]));break;}}returnfrm_interrupt_event;}這個(gè)函數(shù)就是把L4C的消息轉(zhuǎn)換到MMI的消息,然后通過(guò)n函數(shù)比較簡(jiǎn)單,就是數(shù)組里去比較。也沒(méi)有什么可說(shuō)的,無(wú)非就是循環(huán)查找是否有這個(gè)event。1,如果有,看func是否為空,為空表示去掉這個(gè)event的注冊(cè),不為空,就直接修改這個(gè)event的func(定時(shí)器到時(shí)時(shí)所要實(shí)現(xiàn)的功能函數(shù))效,那么減少總注冊(cè)event的個(gè)數(shù)。這個(gè)樣可以減少循環(huán)查詢的次數(shù)。MTKMMIevent小結(jié)4key事件產(chǎn)生時(shí),該機(jī)制就去找到相應(yīng)的回調(diào)函數(shù),進(jìn)行回調(diào)。1keydown按鍵按下KEY_EVENT_DOWN2keyup按鍵彈起KEY_EVENT_UP3keylongpress按鍵長(zhǎng)按KEY_LONG_PRESS。默認(rèn)好像是長(zhǎng)按1.5記不清楚了,可以自己設(shè)置,函數(shù)Kbd_SetLongPressTime,不過(guò)除非必不得已,不要去隨便修改,可能會(huì)引起其他應(yīng)用出問(wèn)題,要修改,也要先獲得當(dāng)前值,退出應(yīng)用時(shí)設(shè)置回原來(lái)的值。也就是按住鍵0.5s之后,每隔0.5s,就會(huì)發(fā)送一個(gè)repeat消息。設(shè)置函數(shù)是說(shuō)的2step可以。先講一下按鍵的處理流程。統(tǒng)初始化的時(shí)候,已經(jīng)注冊(cè)了這個(gè)消息的處理函數(shù)mmi_frm_key_handle。也就是說(shuō)mmi_frm_key_handle是處理按鍵過(guò)程的函數(shù)。這個(gè)函數(shù)mmi_frm_key_handle收到這個(gè)消息后,會(huì)通過(guò)該消息帶的函數(shù),去取當(dāng)前發(fā)生的按鍵事件(實(shí)際這個(gè)函數(shù)就是一個(gè)按鍵緩MMI層,驅(qū)動(dòng)產(chǎn)生按鍵事件很快而MMI有可能比較慢,可以簡(jiǎn)單的理解為生產(chǎn)者和消費(fèi)者的MTKMMIevent小結(jié)5昨天說(shuō)了一下keyevent的基本情況,今天直接從代碼開始吧先看執(zhí)行keyevent函數(shù)mmi_frm_key_handlevoidmmi_frm_key_handle(void*paraBuff){kbd_datak;U32msg_count;mmi_eq_keypad_detect_ind_struct*p;//判斷參數(shù)是否為空//在初始化時(shí),系統(tǒng)就注冊(cè)了MSG_ID_MMI_EQ_KEYPAD_DETECT_IND的回調(diào)函數(shù)為mmi_frm_key_handle//當(dāng)收到這個(gè)消息時(shí),表示有按鍵事件要處理,//這個(gè)paraBuff是keyTask傳過(guò)來(lái)的參數(shù),里面的容是獲取按鍵信息的函數(shù)指針if(paraBuff!=NULL){drv_get_key_funcnew_key_ptr;p=(mmi_eq_keypad_detect_ind_struct*)paraBuff;new_key_ptr=(drv_get_key_func)(p->func);//判斷是否是新的函數(shù)指針,如果是的話,需要進(jìn)行一些清理工作if(new_key_ptr!=keypad_ptr){//新的函數(shù)指針,則進(jìn)行清理,并且判斷是否有按鍵需要處理if(!mmi_kbd_process_keyptr_change((void*)new_key_ptr)){return;}ClearKeyEvents();keypad_ptr=new_key_ptr;}}//通過(guò)while(1)來(lái)不停的從按鍵緩存里獲取按鍵信息//當(dāng)然這里不會(huì)無(wú)限死循環(huán),后面會(huì)進(jìn)行相應(yīng)處理while(1){==MMI_TRUE)){if(k.Keydata[0]!=KEY_INVALID){#ifdefined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)kal_boolis_pen_enabled,is_pen_down;//獲得觸摸屏狀態(tài)mmi_pen_get_state(&is_pen_enabled,&is_pen_down);#endif/*defined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)*/#ifdefined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)//如果觸摸屏按下,那么保存狀態(tài)if(is_pen_down&&(k.Keyevent==WM_KEYPRESS)){U16KeyMapIndex;//不允許按鍵處理is_allow_key_action=MMI_FALSE;把驅(qū)動(dòng)的按鍵和MMI按鍵進(jìn)行轉(zhuǎn)換KeyMapIndex=mmi_frm_get_idx_from_device_key_code(k.Keydata[0]);if(nKeyPadStatus[KeyMapIndex]==KEY_EVENT_UP){KEYBRD_MESSAGEKeyBrdMsg;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;if(mmi_frm_is_2step_keyCode(KeyBrdMsg.nKeyCode)){nKeyPadStatus[KeyMapIndex]=KEY_HALF_PRESS_DOWN;pressKey=HALF_DOWN_STATUS;key_is_pressing_count++;}{nKeyPadStatus[KeyMapIndex]=KEY_EVENT_DOWN;pressKey=FULL_DOWN_STATUS;key_is_pressing_count++;}}}#endif/*defined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)*///如果按鍵是彈起,那么還原原來(lái)按鍵狀態(tài),也就是彈起狀態(tài)if((k.Keyevent==WM_KEYRELEASE)&&(is_allow_key_action==MMI_FALSE)){#ifdefined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)/*ResetallowkeyflagandUpdatekeystatusevenifpenisdown*/U16KeyMapIndex;KeyMapIndex=mmi_frm_get_idx_from_device_key_code(k.Keydata[0]);if((nKeyPadStatus[KeyMapIndex]==KEY_EVENT_DOWN)||(nKeyPadStatus[KeyMapIndex]==KEY_HALF_PRESS_DOWN)||(nKeyPadStatus[KeyMapIndex]==KEY_LONG_PRESS)||(nKeyPadStatus[KeyMapIndex]==KEY_REPEAT)){nKeyPadStatus[KeyMapIndex]=KEY_EVENT_UP;key_is_pressing_count--;}prevKeyMapIndex=prevKeyMapIndex;#endif/*defined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)*/is_allow_key_action=MMI_TRUE;}//按鍵是否可以處理if(is_allow_key_action==MMI_TRUE){if(((k.Keyevent==WM_KEYPRESS)&&(mmi_kbd_get_key_is_pressing_count()==0))||k.Keyevent==DRV_WM_KEYLONGPRESS||k.Keyevent==DRV_WM_KEYREPEATED||k.Keyevent==DRV_WM_KEYFULLPRESS){#ifdefined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)//關(guān)閉觸摸屏mmi_pen_disable();#endif}//真正處理按鍵事件mmi_frm_convert_process_key_event(k.Keyevent,k.Keydata[0]);if((k.Keyevent==WM_KEYRELEASE)&&(mmi_kbd_get_key_is_pressing_count()==0)){#ifdefined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)//重新打開觸摸屏mmi_pen_enable();#endif}}}獲得MMItask消息隊(duì)列消息個(gè)數(shù)msg_get_ext_queue_info(mmi_ext_qid,&msg_count);//如果外部有消息或者部消息,則跳出該循環(huán)if(msg_count>0||OslNumOfCircularQMsgs()>0){//表示還有key需要處理,在MMItask里會(huì)直接調(diào)用這個(gè)函數(shù)進(jìn)行再處理g_keypad_flag=MMI_TRUE;break;}}{g_keypad_flag=MMI_FALSE;break;}}/*while(1)*/MMI_TRACE(MMI_FW_TRC_G1_FRM,MMI_FRM_KEY_HDLR_END);}這么做可以防止task中不停的發(fā)送消息,可以理解為共享存。同樣當(dāng)有其他消息來(lái)時(shí),需要跳出來(lái)處理其他消息,處理完畢后還需要再來(lái)處理。2)這里跟觸摸屏的事件進(jìn)行了沖突處理,也就是按鍵和觸摸屏不能同時(shí)工作,這兩者也沒(méi)3)實(shí)際真正處理按鍵是在mmi_frm_convert_process_key_event里面,下次在分析MTKMMIevent小結(jié)6在MTKMMIevent小結(jié)5中,提到了event處理函數(shù)mmi_frm_key_handle,這個(gè)函數(shù)主要作用是判斷是否需要處理按鍵,從按鍵緩存里面持續(xù)的讀取按鍵信息,然后調(diào)用旋轉(zhuǎn)的情況下,把導(dǎo)航鍵轉(zhuǎn)換一下,接著它調(diào)用了ProcessKeyEvent,這個(gè)函數(shù)主要是voidProcessKeyEvent(U32MsgType,U16DeviceKeyCode){MMI_BOOLisKeyPaired;U16KeyMapIndex;/*----------------------------------------------------------------*//*CodeBody*//*----------------------------------------------------------------*///按鍵影射,把驅(qū)動(dòng)的按鍵碼,轉(zhuǎn)換成MMI的按鍵消息KeyMapIndex=mmi_frm_get_idx_from_device_key_code(DeviceKeyCode);if(KeyMapIndex>=MAX_KEYS){return;}//處理各種按鍵事件,沒(méi)有什么可以多說(shuō)的,//1判斷狀態(tài)是否正常KeyEventHandler忽略該事件if(MsgType==WM_KEYPRESS){//這里處理多按鍵同時(shí)按下的情況。這里需要硬件支持if((KeyMapIndex!=prevKeyMapIndex)&&(g_kbd_concurrent_key_mode==CONCURRENT_KEY_MODE_1_KEY)){isKeyPaired=(nKeyPadStatus[prevKeyMapIndex]==KEY_EVENT_UP);prevKeyMapIndex=KeyMapIndex;}//判斷按鍵狀態(tài)是否正常,防止不匹配if(nKeyPadStatus[KeyMapIndex]==KEY_EVENT_UP){KEYBRD_MESSAGEKeyBrdMsg;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;if(mmi_frm_is_2step_keyCode(KeyBrdMsg.nKeyCode)){nKeyPadStatus[KeyMapIndex]=KEY_HALF_PRESS_DOWN;key_is_pressing_count++;KeyBrdMsg.nMsgType=KEY_HALF_PRESS_DOWN;}{nKeyPadStatus[KeyMapIndex]=KEY_EVENT_DOWN;/*samewithKEY_FULL_PRESS_DOWN*/key_is_pressing_count++;KeyBrdMsg.nMsgType=KEY_EVENT_DOWN;}//處理按鍵事件KeyEventHandler((KEYBRD_MESSAGE*)&KeyBrdMsg);}{/*Ignoretheevent*/}}elseif(MsgType==WM_KEYRELEASE){if((nKeyPadStatus[KeyMapIndex]==KEY_EVENT_DOWN)||(nKeyPadStatus[KeyMapIndex]==KEY_LONG_PRESS)||(nKeyPadStatus[KeyMapIndex]==KEY_REPEAT)||(nKeyPadStatus[KeyMapIndex]==KEY_HALF_PRESS_DOWN)){KEYBRD_MESSAGEKeyBrdMsg;nKeyPadStatus[KeyMapIndex]=KEY_EVENT_UP;key_is_pressing_count--;KeyBrdMsg.nMsgType=KEY_EVENT_UP;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;KeyEventHandler((KEYBRD_MESSAGE*)&KeyBrdMsg);}{/*Ignoretheevent*/}}/*++Robin,modifiedbyMaxChen*/elseif(MsgType==DRV_WM_KEYLONGPRESS){if(nKeyPadStatus[KeyMapIndex]==KEY_EVENT_DOWN){KEYBRD_MESSAGEKeyBrdMsg;nKeyPadStatus[KeyMapIndex]=KEY_LONG_PRESS;KeyBrdMsg.nMsgType=KEY_LONG_PRESS;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;KeyEventHandler((KEYBRD_MESSAGE*)&KeyBrdMsg);}{/*Ignoretheevent*/}}elseif(MsgType==DRV_WM_KEYREPEATED){if((nKeyPadStatus[KeyMapIndex]==KEY_LONG_PRESS)||(nKeyPadStatus[KeyMapIndex]==KEY_REPEAT)){KEYBRD_MESSAGEKeyBrdMsg;nKeyPadStatus[KeyMapIndex]=KEY_REPEAT;KeyBrdMsg.nMsgType=KEY_REPEAT;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;KeyEventHandler((KEYBRD_MESSAGE*)&KeyBrdMsg);}{/*Ignoretheevent*/}}elseif(MsgType==DRV_WM_KEYFULLPRESS){*Onlyintwo-stagekeywillhaveKEY_FULL_PRESS_DOWN,anditfollowedafterKEY_HALF_PRESS_DOWNif(nKeyPadStatus[KeyMapIndex]==KEY_HALF_PRESS_DOWN){KEYBRD_MESSAGEKeyBrdMsg;nKeyPadStatus[KeyMapIndex]=KEY_EVENT_DOWN;KeyBrdMsg.nMsgType=KEY_EVENT_DOWN;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;KeyEventHandler((structKEYBRD_MESSAGE*)&KeyBrdMsg);}{/*Ignoretheevent*/}}elseif((MsgType==DRV_WM_ENABLE_TWOKEY_DETECTION)||(MsgType==DRV_WM_ENABLE_THREEKEY_DETECTION)||(MsgType==DRV_WM_DISABLE_MULTIKEY_DETECTION)){/*Ignoretheevent*/}{MMI_TRACE(MMI_FW_TRC_G6_FRM_DETAIL,MMI_FRM_ERROR_PROC_KEYEVENT_HDLR);MMI_ASSERT(0);}}KeyEventHandler函數(shù)主要判斷是否要真的處理該事件,可以看成是一個(gè)按鍵事件的攔截,比如應(yīng)用切換過(guò)程中,需要一個(gè)切換動(dòng)畫,而這個(gè)動(dòng)畫工程中,需要處理忽略這些按鍵。就staticvoidKeyEventHandler(KEYBRD_MESSAGE*eventKey){MMI_BOOLis_hdlr_enabled=MMI_TRUE;//主要處理一些特殊響應(yīng):屏幕背光,屏幕鎖定,按鍵聲音mmi_kbd_app_key_hdlr(eventKey);//判斷是否有前置處理函數(shù)if(g_mmi_frm_cntx.kbd_pre_func){is_hdlr_enabled=g_mmi_frm_cntx.kbd_pre_func(eventKey);}//根據(jù)前置處理函數(shù)結(jié)果,判斷是否要處理該keyeventif(is_hdlr_enabled){//處理案件事件ExecuteCurrKeyHandler((S16)eventKey->nKeyCode,(S16)eventKey->nMsgType);}//是否有后置處理函數(shù),可以進(jìn)行一些監(jiān)視if(g_mmi_frm_cntx.kbd_post_func){g_mmi_frm_cntx.kbd_post_func(eventKey);}}voidExecuteCurrKeyHandler(S16keyCode,S16keyType){FuncPtrcurrFuncPtr=NULL;鍵盤鎖和屏保timermmi_idle_restart_keypad_lock_timer();mmi_idle_restart_screensaver_timer();frm_p->currKeyCode=keyCode;frm_p->currKeyType=keyType;//對(duì)狀態(tài)下,掛鍵的特殊處理.if(frm_p->currKeyType==KEY_EVENT_DOWN&&isInCall()&&!GetWapCallPresent()&&IsBitReset(g_mmi_frm_cntx.end_key_flag,frm_p->currKeyType)){RegisterEndKeyHandlerInCall();}//獲得按鍵處理函數(shù)currFuncPtr=currKeyFuncPtrs[keyCode][keyType];//導(dǎo)航的選擇鍵,默認(rèn)和左功能鍵的效果一樣。if(keyCode==KEY_ENTER&&currFuncPtr==NULL){if(currKeyFuncPtrs[KEY_ENTER][KEY_EVENT_UP]==NULL&&currKeyFuncPtrs[KEY_ENTER][KEY_EVENT_DOWN]==NULL&&currKeyFuncPtrs[KEY_ENTER][KEY_HALF_PRESS_DOWN]==NULL&&currKeyFuncPtrs[KEY_ENTER][KEY_REPEAT]==NULL&&currKeyFuncPtrs[KEY_ENTER][KEY_LONG_PRESS]==NULL){currFuncPtr=currKeyFuncPtrs[KEY_LSK][keyType];}}//處理按鍵消息if(currFuncPtr){rFuncPtr}}//重置狀態(tài)if(keyType==KEY_EVENT_UP){frm_p->currKeyCode=KEY_INVALID;frm_p->currKeyType=MAX_KEY_TYPE;}}個(gè)消息后,在MMItask調(diào)用mmi_frm_key_handle繼續(xù)處理剩下的按鍵事件。這里無(wú)非多層一層函數(shù),每一層函數(shù)的功能還是比較獨(dú)立的,所以也不是很難看懂。MTKMMIevent小結(jié)7到這,keyevent的處理基本上就算完成了。其他幾個(gè)常用的函數(shù)注冊(cè)key處理函數(shù)了。相應(yīng)key和event的數(shù)組里放入一個(gè)回調(diào)函數(shù)的指針。比如voidSetKeyHandler(FuncPt
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZNZ 286-2024 土壤中抗生素抗性基因檢測(cè) 高通量熒光定量PCR 法
- T-ZZB 3679-2024 汽車用熱塑性彈性體(TPE)腳墊
- 2025年度股權(quán)變更與員工激勵(lì)相結(jié)合的協(xié)議書
- 二零二五年度商標(biāo)共營(yíng)協(xié)議及市場(chǎng)推廣合同
- 二零二五年度婚禮婚禮策劃與現(xiàn)場(chǎng)協(xié)調(diào)免責(zé)合同
- 2025年度綠化樹木修剪與智慧城市管理系統(tǒng)合同
- 2025隱名股東股權(quán)轉(zhuǎn)讓及公司股權(quán)激勵(lì)終止及補(bǔ)償協(xié)議
- 二零二五年度杉木木材行業(yè)人才培養(yǎng)與合作合同
- 二零二五年度健康養(yǎng)生產(chǎn)品傭金合作協(xié)議
- 2025年度車庫(kù)車位使用權(quán)股權(quán)轉(zhuǎn)讓合同
- 2025年湖南大眾傳媒職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)學(xué)生專用
- 開學(xué)安全第一課主題班會(huì)課件
- 一年級(jí)珍惜糧食主題班會(huì)學(xué)習(xí)教案
- 新版《醫(yī)療器械經(jīng)營(yíng)質(zhì)量管理規(guī)范》(2024)培訓(xùn)試題及答案
- 2025年高縣縣屬國(guó)企業(yè)公開招聘工作人員高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年人教版數(shù)學(xué)五年級(jí)下冊(cè)教學(xué)計(jì)劃(含進(jìn)度表)
- 海岸動(dòng)力學(xué)英文課件Coastal Hydrodynamics-復(fù)習(xí)
- 2025年初級(jí)社會(huì)工作者綜合能力全國(guó)考試題庫(kù)(含答案)
- 部編人教版二年級(jí)道德與法治下冊(cè)同步練習(xí)(全冊(cè))
- ME基礎(chǔ)知識(shí)培訓(xùn)PPT學(xué)習(xí)教案
- 有關(guān)物質(zhì)、含量測(cè)定方法學(xué)驗(yàn)證指標(biāo)的可接受標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論