Hardware platform: MT6250M
Software platform: MTK 11B
Lcd size: 220X176
1. 问题描述
如上图,在进入闹铃界面时,Center softkey(简称CSK)显示不居中。而当用户按Down键选择下一项时,CSK会居中,如下图:
2. 跟踪Center softkey的位置和flag信息
因为void redraw_softkey(WGUI_SOFTKEY_ENUM key)函数是绘制softkey的,所以在这里打断点,并观察MMI_softkeys[MMI_CENTER_SOFTKEY]定义中CSK对应的值。这里有一个技巧,就是跟踪进入alarm界面后最后一次redraw_softkey()即可。
CSK不居中时MMI_softkeys[MMI_CENTER_SOFTKEY]的值:
CSK居中时MMI_softkeys[MMI_CENTER_SOFTKEY]的值:
对比CSK居中和不居中的情况,则会发现除flags外,其它参数都一致,所以我们需要从flags入手来分析。
3. flags的差异
CSK不居中时的flags: 0x01b21000
CSK居中时的flags: 0x01a31000
差异为:
0x00100000
0x00010000
查找这两者的定义,分别为:
#define UI_BUTTON_CENTER_ICON_X 0x00100000
#define UI_BUTTON_CENTER_TEXT_X 0x00010000
得出结论:
CSK居中时置位了UI_BUTTON_CENTER_TEXT_X,没有置位UI_BUTTON_CENTER_ICON_X
CSK不居中时置位了UI_BUTTON_CENTER_ICON_X,没有置位UI_BUTTON_CENTER_TEXT_X
所以,CSK不居中,应该是因为错误置位了UI_BUTTON_CENTER_ICON_X。
4. 查找置位UI_BUTTON_CENTER_ICON_X的位置
把UI_BUTTON_CENTER_ICON_X赋值给flags的地方不多,最终跟踪下面函数找到了元凶:
void wgui_softkey_set_icon_for_IME(PU8 icon, WGUI_SOFTKEY_ENUM key)
{
if (MMI_softkeys[key].text == NULL)
{
MMI_softkeys[key].flags &= ~UI_BUTTON_CENTER_TEXT_X;
MMI_softkeys[key].flags |= UI_BUTTON_CENTER_ICON_X;//这里打断点
}
}
上面位置打断点,当看到EnableCenterSoftkey()时的函数堆栈如下:
MoDIS.exe!wgui_softkey_set_icon_for_IME()
MoDIS.exe!set_softkey_icon()
MoDIS.exe!EnableCenterSoftkey()
MoDIS.exe!mmi_alm_entry_alm_list_scrn()
MoDIS.exe!mmi_frm_scrn_first_enter_ex()
MoDIS.exe!mmi_frm_scrn_first_enter()
MoDIS.exe!EntryAlmMenu()
查看代码,确认是如下代码引起UI_BUTTON_CENTER_ICON_X置位的:
static void mmi_alm_entry_alm_list_scrn(mmi_scrn_essential_struct* scrn_data)
{
……
EnableCenterSoftkey(0, IMG_GLOBAL_COMMON_CSK);
……
}
因为Tigris平台并没有在softkey上使用图片,所以不需要使用IMG_GLOBAL_COMMON_CSK。
5. 修改后的效果
修改方案如下:
static void mmi_alm_entry_alm_list_scrn(mmi_scrn_essential_struct* scrn_data)
{
……
EnableCenterSoftkey(0, 0);
……
}
效果如下,第一次进入alarm后CSK居中了: