SetKeyHandler()的流程--SetRightSoftkeyfunction()

设置按键处理的函数使用SetKeyHandler()

这个函数的大概实现如下(精简版哈):

void SetKeyHandler(FuncPtr funcPtr,U16 keyCode,U16 keyType)
{

    currKeyFuncPtrs[keyCode][keyType] = funcPtr;

}

其实就是把函数指针传递到currKeyFuncPtrs【】【】这个二维数组里。

 

然后exec_key_handler()这个函数就从这个数组里面取出对应的函数指针执行。

 

 

static void exec_key_handler(mmi_key_evt_struct *evt_p)//(精简了)
{

    U16 ucs2_value = 0;
    U32 special_key_flag = 0;
    FuncPtr curr_func_ptr;

 

     SetkeyInfo(evt_p->cvt_code, evt_p->mmi_key_type);
   
    if (mmi_frm_dispatch_key_event(evt_p->cvt_code, evt_p->mmi_key_type, ucs2_value, special_key_flag) == MMI_FALSE)
    {               
        /* get the key handler */
        curr_func_ptr = get_key_handler(evt_p->cvt_code, evt_p->mmi_key_type);
   
        /* invoke the key handler */
        if (curr_func_ptr)
        {
                (*curr_func_ptr)();   
        }
     }
 
    /* If finish the key up handler, we reset the current key info. */
    if (evt_p->mmi_key_type == KEY_EVENT_UP)
    {   
        SetkeyInfo(evt_p->cvt_code, MAX_KEY_TYPE);
    }


}

 

static FuncPtr get_key_handler(S16 mmi_key_code, S16 mmi_key_type)
{

    FuncPtr currFuncPtr = NULL;
    S32 i;
   
    for (i = 0; i < SPE_KEY_HDL_TBL_NUM; i++)
    {
        if ((currFuncPtr = (* g_key_handler[i])(mmi_key_code, mmi_key_type)) != NULL)
        {
            break;
        }
    }
    return currFuncPtr;    
}

 

 

const static get_func_ptr g_key_handler[] =
{
#if defined(__MMI_QWERTY_KEYPAD_SUPPORT__)   
    get_any_key_handler,
#endif
    get_repeat_key_handler,
#ifdef __MMI_WGUI_MINI_TAB_BAR__   
    get_mini_tab_bar_key_handler,
#endif
#ifdef __MMI_SCREEN_SNAPSHOT__   
    get_screen_snapshot_key_handler,
#endif
#ifdef __LSK_KEYSEND2_IN_ONE__      
/* under construction !*/
#endif
    get_default_key_handler  
};


 

get_default_key_handler   这里面就调用了currKeyFuncPtrs这个数组。流程就是这样的。

 

------------------------------------------------------------------------------------

void SetRightSoftkeyFunction(void (*f) (void), MMI_key_event_type k)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    register_right_softkey_handler();
    set_right_softkey_function(f, k);
    mmi_imc_key_setup_rsk_function(f);
}

 

 

#define register_right_softkey_handler()            register_softkey_handler(MMI_RIGHT_SOFTKEY)

 

 

 

void register_softkey_handler(WGUI_SOFTKEY_ENUM key)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if ((MMI_softkeys[key].text == NULL) && (MMI_softkeys[key].normal_up_icon == NULL))
    {
        return;
    }

    switch (key)
    {
        case MMI_LEFT_SOFTKEY:
            SetKeyHandler(left_softkey_down, KEY_LSK, KEY_EVENT_DOWN);
            SetKeyHandler(left_softkey_up, KEY_LSK, KEY_EVENT_UP);
            left_softkey_keyboard_handler_active = 1;
            break;

        case MMI_RIGHT_SOFTKEY:
            SetKeyHandler(right_softkey_down, KEY_RSK, KEY_EVENT_DOWN);
            SetKeyHandler(right_softkey_up, KEY_RSK, KEY_EVENT_UP);
            right_softkey_keyboard_handler_active = 1;
            break;

    #ifdef __MMI_WGUI_CSK_ENABLE__
        case MMI_CENTER_SOFTKEY:
            SetKeyHandler(center_softkey_down, KEY_CSK, KEY_EVENT_DOWN);
            SetKeyHandler(center_softkey_up, KEY_CSK, KEY_EVENT_UP);
            center_softkey_keyboard_handler_active = 1;
            break;
    #endif /* __MMI_WGUI_CSK_ENABLE__ */
    }
}

这是个按键的结构体

~~

 

 

void right_softkey_down(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (!(MMI_softkeys[MMI_RIGHT_SOFTKEY].flags & UI_BUTTON_STATE_CLICKED))
    {
        /* change the state of RSK button */
        MMI_softkeys[MMI_RIGHT_SOFTKEY].flags |= UI_BUTTON_STATE_CLICKED;
        MMI_softkeys[MMI_RIGHT_SOFTKEY].flags |= UI_BUTTON_STATE_DOWN;
        redraw_softkey(MMI_RIGHT_SOFTKEY);
        execute_softkey_function(KEY_EVENT_DOWN, MMI_RIGHT_SOFTKEY);
    }
}

 

void redraw_softkey(WGUI_SOFTKEY_ENUM key)

{

........

.......

   gdi_layer_lock_frame_buffer();

#if defined(__PWV_UI_BLACKBERRY_STYLE__)
    {
      extern MMI_BOOL g_bMainmenu;
   extern MMI_BOOL g_bCalculator;
   extern MMI_BOOL g_bSmartDial;

        if((g_bMainmenu == MMI_FALSE)&&(g_bCalculator==MMI_FALSE)&&(g_bSmartDial))
        {
            hide_softkey[key] ();
            show_softkey(key);
        }
    }
#else
    hide_softkey[key] ();
    show_softkey(key);
#endif

    gdi_layer_unlock_frame_buffer();

 

........

.........

}

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/toonny1985/archive/2009/10/12/4659555.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值