展讯6800平台MMK问题(二)
时间:10-02
整理:3721RD
点击:
最近做展讯6800,发现MMK存在几个问题,邮件问展讯同事,展讯答复说没问题。但我还是觉得有问题,所以发到论坛来,请各位大侠帮忙分析。
问题二:
文件:window_parse.c
函数:CreateSoftkeyCtrl()
问题:没有判断softkey是否创建成功,就给窗口设置了ctrl_id
LOCAL BOOLEAN CreateSoftkeyCtrl(
MMI_HANDLE_T win_handle,
uint32** value_pptr
)
{
......
ctrl_ptr = MMK_CreateControl( &create );
MMK_SetWinSoftkeyCtrlId(win_handle, ctrl_id);
......
}
应该修改为
LOCAL BOOLEAN CreateSoftkeyCtrl(
MMI_HANDLE_T win_handle,
uint32** value_pptr
)
{
......
ctrl_ptr = MMK_CreateControl( &create );
if (ctrl_ptr != NULL)
{
MMK_SetWinSoftkeyCtrlId(win_handle, ctrl_id);
}
......
}
分析:当ctrl_ptr==NULL时却强行给窗口设了ctrl_id,则在该窗口调用MMK_DestroyControl(MMITHEME_GetSoftkeyCtrlId())时,会删掉别的真正拥有softkey的窗口的softkey,造成回到有softkey的窗口时,这个窗口的softkey消失了。即使在调用MMK_DestroyControl()的窗口调用MMK_GetWinSoftkeyCtrlId(win_id)来判断窗口是否包含softkey也判断不出来,因为它会返回有效的softkey_id
问题二:
文件:window_parse.c
函数:CreateSoftkeyCtrl()
问题:没有判断softkey是否创建成功,就给窗口设置了ctrl_id
LOCAL BOOLEAN CreateSoftkeyCtrl(
MMI_HANDLE_T win_handle,
uint32** value_pptr
)
{
......
ctrl_ptr = MMK_CreateControl( &create );
MMK_SetWinSoftkeyCtrlId(win_handle, ctrl_id);
......
}
应该修改为
LOCAL BOOLEAN CreateSoftkeyCtrl(
MMI_HANDLE_T win_handle,
uint32** value_pptr
)
{
......
ctrl_ptr = MMK_CreateControl( &create );
if (ctrl_ptr != NULL)
{
MMK_SetWinSoftkeyCtrlId(win_handle, ctrl_id);
}
......
}
分析:当ctrl_ptr==NULL时却强行给窗口设了ctrl_id,则在该窗口调用MMK_DestroyControl(MMITHEME_GetSoftkeyCtrlId())时,会删掉别的真正拥有softkey的窗口的softkey,造成回到有softkey的窗口时,这个窗口的softkey消失了。即使在调用MMK_DestroyControl()的窗口调用MMK_GetWinSoftkeyCtrlId(win_id)来判断窗口是否包含softkey也判断不出来,因为它会返回有效的softkey_id
很想试试LZ所说的问题...可惜力有不逮
怎么才能人为的让ctrl_ptr==NULL呢
tonystreets正解。
mmk在关闭窗口时会释放控件,控件是挂在窗口下的(有个树和子树的关系),即使为空,也不会释放别的窗口下的控件!~希望能帮到你
小编的代码更加规范。但是tonystreets的解释来说就是盘不判断都没必要。所以也没错。