[MTK FP]根据softkey flags来解决Center softkey text不居中的问题

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);

     ……

}

效果如下,第一次进入alarmCSK居中了:

posted @ 2013-04-02 21:49  洁静精微  阅读(298)  评论(0编辑  收藏  举报