2009-9-29
1.触摸屏事件与键盘事件是如何对应的(即为什么按触摸屏的1和键盘的1会有同样的效果)
键盘的事件种类及注册函数:
触摸屏的事件种类及注册函数:
非手写模式注册函数:
mmi_pen_register_down_handler(mmi_pen_hdlr pen_fp)
mmi_pen_register_up_handler(mmi_pen_hdlr pen_fp);
mmi_pen_register_move_handler(mmi_pen_hdlr pen_fp);
mmi_pen_register_repeat_handler(mmi_pen_hdlr pen_fp);
mmi_pen_register_long_tap_handler(mmi_pen_hdlr pen_fp);
手写模式注册函数:
mmi_pen_register_stroke_down_handler(mmi_pen_hdlr pen_fp)
mmi_pen_register_stroke_up_handler(mmi_pen_hdlr pen_fp)
mmi_pen_register_stroke_move_handler(void(* begin_fp)(void), void(* end_fp)(void), mmi_pen_hdlr pen_fp)
。。。。。
触摸屏与键盘的很大区别是:一般触摸屏需要判断Pen的位置,才能产生相应的动作,所以pen_fp中有相当一部分代码是在判断位置,如AudPly模块的函数mmi_pen_check_inside_polygon,Calc模块的函数gui_calculator_translate_pen_position
而键盘则相对简单,只需在注册时写明键盘码即可,不需要代码判断按在哪个键上
计算器添加键盘操作符响应的过程:
背景--------35上触摸屏处理完全正确,键盘支持数字键、pound键、del键,不支持操作符
基本思路-----参照数字键的触摸屏和键盘,添加操作符的键盘支持
计算器中数字键的注册位置在函数CalcRegisterKeyHandler中:
register_MMI_key_input_handler();
register_key_down_handler(CalcHandleNumKey);
这两句共同完成了数字键的响应,函数都定义在wgui.c,下面分析这两个函数
register_MMI_key_input_handler()
SetKeyHandler(MMI_key_1_down, KEY_1, KEY_EVENT_DOWN);
SetKeyHandler(MMI_key_1_down, KEY_1, KEY_REPEAT);
SetKeyHandler(MMI_key_1_up, KEY_0, KEY_EVENT_UP);
currKeyFuncPtrs[keyCode][keyType] = funcPtr;
在MMI_key_1_down中
MMI_key_input_handler(KEY_1, KEY_EVENT_DOWN);
MMI_key_down_handler_function(key_code);
register_key_down_handler的定义如下
void register_key_down_handler(void (*f) (MMI_key_code_type key_code))
{
MMI_key_down_handler_function = f;
}
关键就是这里了,两个函数的交接点是函数指针MMI_key_down_handler_function,即register_MMI_key_input_handler()要调用此函数指针指向的函数,而 register_key_down_handler()则是对此函数指针赋值!
MTK对develper提供的这两个函数很有用,简单来说register_MMI_key_input_handler注册了所有数字键的所有事件响应,register_key_down_handler(void (*f) (MMI_key_code_type key_code))提供了Down事件的响应函数注册入口,developer只需在自己的函数中定义用户的处理,将函数名传入即可。
所以通过register_key_down_handler(CalcHandleNumKey)就使MMI_key_down_handler_function指向函数CalcHandleNumKey。
下面是按下数字键2的断点分析,
按下key_2,产生down事件,执行ExecuteCurrKeyHandler,在其中通过currKeyFuncPtrs[keyCode][keyType] = funcPtr;找到响应函数MMI_key_2_down(entry时通过 register_MMI_key_input_handler()注册),然后顺序执行下去,当执行到MMI_key_input_handler(KEY_1, KEY_EVENT_DOWN)的
MMI_key_down_handler_function(key_code)时,就跳到了CalcHandleNumKey(entry时通过 register_key_down_handler(CalcHandleNumKey)赋值),结果就如图了。如果没有上面对两个注册函数的分析,就会对这里的执行很迷惑,因为断点调试是程序运行时调试,函数的注册在entry时已经完成了!
CalcHandleHiliteOperator()分析
g_calc_cntx
OpToExecute 上一次的的操作符 初始化时为CALC_OP_NONE
Operator 当前输入的操作符 初始化时为CALC_OP_NONE
CurrHilite
PreOperator = g_calc_cntx->Operator;
g_calc_cntx->Operator = g_calc_cntx->CurrHilite;
g_calc_cntx->OpToExecute = PreOperator
输入数字时保存到buff2中(以ASCII码保存,buff2是字符数组)
通过函数CalcGetPreOperand()转化成float型并存储到g_calc_cntx->Operand2
每输入操作符,此函数最后把buff2拷到buff1, Operand2Len拷到Operand1Len, Operand2置0,Operand2Len = CALC_ZERO_LEN,Operand2Buf[0] = CALC_SYM_NULL
g_calc_cntx->ExecFlag当按下=后再按下poundKey或者numKey,都会清掉计算器的全部值,开始新的计算,此成员就是用来作此判断的,
初始化false ,当按下=后置为true(即just after execution,刚刚完成),按下操作符置为false
g_calc_cntx->CurrHilite
初始化CALC_OP_EQUAL
g_calc_cntx的初始化
在函数CalcPreEntryApp 中initialize image+ CalcResetContext()
CalcComputeResult在按左软件或触摸=时才调用
函数间的关系:
1.三个reset函数