Melis4.0[D1s]:3.消息响应部分跟踪笔记
文章目录
源码看到消息循环部分,继续做阅读笔记。
1.init.axf 消息处理
1.1启动系统消息死循环
上篇笔记《Melis4.0[D1s]:2.启动流程(GUI桌面加载部分)跟踪笔记》提到了application_init_process()启动消息死循环:
void application_init_process(void *arg)
{
.....
init_mainwin = init_mainwin_create();
.....
_process_init();
/* message loop*/
while (GUI_GetMessageEx(&msg, init_mainwin)) // 消息循环
{
ret = GUI_DispatchMessage(&msg); // 分发消息到回调
if (msg.p_arg) // 同步消息回应
{
GUI_SetSyncMsgRetVal(&msg, ret);
GUI_PostSyncSem(&msg);
}
}
.....
}
本函数在进入消息死循环之前,调用了2个和消息处理相关的函数init_mainwin_create()、_process_init()。
今天跟踪一下消息处理的相关源码。
1.2.init_mainwin_create()设置消息处理回调函数init_mainwin_cb()
回调函数代码很多,这里删除掉大部分代码,保留部分框架:
static __s32 init_mainwin_cb(__gui_msg_t *msg)
{
switch (msg->id)
{
case GUI_MSG_CREATE:break;
case GUI_MSG_DESTROY:break;
case DSK_MSG_POWER_OFF: /* power off */
return EPDK_OK;
case DSK_MSG_STANDBY_WAKE_UP:break;
case DSK_MSG_TVDAC_PLUGIN:break;
case DSK_MSG_TVDAC_PLUGOUT:
case DSK_MSG_HDMI_PLUGOUT:
case DSK_MSG_SCREEN_SWITCH:break;
case DSK_MSG_ASSISTANT_SCENE_CREATE:break;
case DSK_MSG_SET_SCN_CLOSE:break;
case DSK_MSG_HOME:break
case DSK_MSG_FW_UPDATE:break;
......
......
default:
GUI_ManWinDefaultProc(msg);
break;
}
return EPDK_OK;
}
1.3 _process_init()加载app_root.axf,启动界面消息处理
static void _process_init(void)
{
.....
activity_set_load_para("root", "", load_para, sizeof(load_para));
activity_load_app("application://app_root");
}
2.app_root.axf 的消息处理
2.1 主函数 app_root_start()调用app_root_wincreate()创建根窗口
app_root_start()在文件 《livedesk\beetles\sun20iw1_app\apps\app_root\app_root.c》 中:
/**********************************************************************************************************************
插件接口实现
**********************************************************************************************************************/
static int32_t app_root_start(Activity *activity)
{
......
happ_root_manwin = app_root_wincreate(activity);
......
}
2.1.1app_root_wincreate()创建根窗口,设置根窗口消息处理回调函数app_root_win_proc():
app_root_wincreate()、app_root_win_proc()都在 《livedesk\beetles\sun20iw1_app\apps\app_root\app_root_scene.c》 中。
/* 创建根窗口 */
H_WIN app_root_wincreate(Activity *activity)
{
......
create_info.ManWindowProc = (__pGUI_WIN_CB)esKRNL_GetCallBack((__pCBK_t)app_root_win_proc);
......
}
2.1.1.1 app_root_win_proc()调用app_root_command_proc()处理命令类消息
app_root_win_proc()将属于command类型的MSG传给app_root_command_proc()处理:
int32_t app_root_win_proc(__gui_msg_t *msg)
{
......
switch (msg->id)
{
case GUI_MSG_CREATE:
root_para->h_parent = msg->h_deswin;
root_para->font = SWFFont;
root_para->root_type = 0;
root_ctrl->root_para = root_para;
root_ctrl->h_app_home = app_home_create(root_para);
case GUI_MSG_COMMAND:
{
__log("svabed......GUI_MSG_COMMAND");
app_root_command_proc(msg);
return EPDK_OK;
}
......
}
app_home_create()函数使用单独一节介绍。
app_root_command_proc()函数主要是处理按键消息,如界面切换;在功能界面下实现各种功能操作。函数比较大,大约900行,这里删掉大部分,剩下几十行,供速览:
static int32_t app_root_command_proc(__gui_msg_t *msg)
{
......
__log("*****************app_root_command_proc**************");
switch (LOWORD(msg->dwAddData1))
{
case APP_HOME_ID:
switch (HIWORD(msg->dwAddData1))
{
case SWITCH_TO_OTHER_APP:
{
......
switch (msg->dwAddData2)
{
case ID_HOME_EXPLORER:
......
}
}
}
break;
case APP_EXPLORER_ID :break;
case APP_MOVIE_ID :break;
case APP_MUSIC_ID :break;
case APP_PHOTO_ID :break;
case APP_FM_ID :break;
case APP_SETTING_ID :break;
case APP_EBOOK_ID :break;
case APP_RECORD_ID :break;
default:break;
}
}
2.2 app_home_create()创建桌面UI,设置消息处理回调函数_home_manager_win_proc()
本节函数均在 《livedesk\beetles\sun20iw1_app\apps\multi_screen_home\app_multi_screen_home.c》 中。
app_home_create()源码:
H_WIN app_home_create(root_para_t *para)
{
create_info.name = APP_MULTI_SCREEN_HOME;
create_info.hParent = para->h_parent;
create_info.ManWindowProc = (__pGUI_WIN_CB)esKRNL_GetCallBack((__pCBK_t)_home_manager_win_proc);
create_info.attr = (void *)pmulti_screen_home_attr;
create_info.id = APP_MULTI_SCREEN_HOME_ID;
create_info.hHosting = NULL;
return (GUI_ManWinCreate(&create_info));
}
2.2.1 _home_manager_win_proc()把按键消息传给_home_on_command()
static int32_t _home_manager_win_proc(__gui_msg_t *msg)
// livedesk\beetles\sun20iw1_app\apps\multi_screen_home\app_multi_screen_home.c
{
switch (msg->id)
{
case GUI_MSG_CREATE:
return _home_on_create(msg);
case ALARM_MSG_CLOSE:
return _home_on_alarm_closed(msg);
case GUI_MSG_COMMAND:
return _home_on_command(msg);
2.2.1.1_home_on_command()处理界面刷新和进入功能界面
static int32_t _home_on_command(__gui_msg_t *msg)
{
switch (msg->dwAddData1)
{
case DESKTOP_REFRESH_MSG:
.....
return EPDK_OK;
case EXIT_MULTI_SCREEB_HOME_TO_AP_MSG:
.....
return EPDK_OK;
3.由控制台log信息观察从桌面进入音乐界面的过程
当桌面的音乐图标变为焦点时,按下Enter按钮,就进入音乐界面,此时控制台log信息输出如下:
[DBG]: [_home_on_command:0451]: ++++EXIT_MULTI_SCREEB_HOME_TO_AP_MSG+++
[DBG]: [_home_on_command:0452]: &&&&&&&&&&&&&&msg->dwAddData1=10, msg->dwAddData2=2
[DBG]: [_home_on_command:0477]: sarbafe....EXIT_MULTI_SCREEB_HOME_TO_AP_MSG
[DBG]: [uninit_multi_screen_res:0101]: i = 0
[DBG]: [uninit_multi_screen_res:0101]: i = 1
[DBG]: [uninit_multi_screen_res:0101]: i = 2
[DBG]: [uninit_multi_screen_res:0101]: i = 3
[DBG]: [app_root_win_proc:4198]: svabed......GUI_MSG_COMMAND
[DBG]: [app_root_command_proc:0374]: *****************app_root_command_proc**************
[ERR]: [_home_manager_win_proc:0606]: app GUI_MSG_DESTROY
[DBG]: [app_root_command_proc:0483]: root_para->root_type=2
[DBG]: [app_root_command_proc:0486]: exist = 0
[DBG]: [app_music_create:0064]: ****************************************************************************************
[DBG]: [app_music_create:0065]: ******** enter music player application **************
[DBG]: [app_music_create:0066]: **********************************************************