简单的分析一下History管理机制与EntryNewScreen的关系
1. 与EntryNewScreen函数有关的全局变量:
currEntryFuncPtr,
currExitScrnID, currTopScrnID,
currExitFuncPtr
2. EntryNewScreen函数部分流程:
Step1: 保存新屏幕ID(函数第一参数)-->currTopScrnID ;
Step2: 调用ExecuteCurrExitHandler ;
Step3: 保存新屏幕ID-->currExitScrnID ;
Step4: 调用SetGenericExitHandler ;
Step5: ......
......
3. 分析 ExecuteCurrExitHandler
函数原型: void ExecuteCurrExitHandler( void ) ;
A. 该函数主要流程就是依次调用了 ExecuteCurrExitHandler_Ext, ClearInputEventHandler
B. 主要分析 ExecuteCurrExitHandler_Ext函数的作用
函数原型: void ExecuteCurrExitHandler_Ext( void ) ;
函数功能: This function is used for executes current exit func handler without clear keys ;
函数主要流程(伪代码表示):
Step1: if(currEntryFuncPtr||currExitFuncPtr)
{
清除所有中断事件句柄 ;
}
Step2: if(currEntryFuncPtr)
{
ExitMyAppMenu( EntryNewMenu, SCR_ID_MYAPP_NEW );
// 将上次调用EntryNewScreen所记录的currExitScrnID, currEntryFuncPtr入栈
}
Step3: if(currExitFuncPtr)
{
mmu_frm_execute_scrn_exit_handler=MMI_TURE ;
(*currExitFuncPtr)( ) ;
mmu_frm_execute_scrn_exit_handler=MMI_FALSE ;
}
Step4: currEntryFuncPtr=currExitFuncPtr=NULL ;
Step5: DM屏幕模板退出函数 ;
Step6: ......
......
4. 分析 SetGenericExitHandler
函数原型: void SetGenericExitHandler( U16 scrnID, FuncPtr exitFuncPtr, FuncPtr entryFuncPtr ) ;
函数功能: currExitScrnID <-- scrnID ;
currExitFuncPtr <-- exitFuncPtr ;
currEntryFuncPtr <-- entryFuncPtr ;
说明 : 将EntryNewScreen的几个参数传递给全局变量,留待下次调用EntryNewScreen时调用
5. 牵涉到的退出函数:
static void ExitMyAppMenu( void * entry_screen_pfunc, U16 screen_id )
{
history currHistory ;
S16 nHistory=0 ;
currHistory.scrnID = screen_id ;
currHistory.entryFuncPtr = entry_screen_pfunc ;
pfnUnicodeStrcpy((S8*)currHistory.inputBuffer,(S8*)&nHistory);
GetCategoryHistory( currHistory.guiBuffer );
AddHistory( currHistory );
}
6. 小结:
EntryNewScreen函数先将上次执行EntryNewScreen时记录的 currEntryFuncPt, currExitScrnID以History结构为载体记录入栈;
然后执行了退出函数;最后讲本窗口的scrnID, exitFuncPtr, entryFuncPtr存入全局变量,留待下次调用EntryNewScreen时使用。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2150427