static void WidgetFocusProc( LCUI_Event *event, void *unused ) { LCUI_Widget *widget = NULL, *valid_widget = NULL, *focus_widget; /* 如果输入法需要处理这个键,则退出本函数 */ if( LCUIIME_ProcessKey( &event->key ) ) { return; } //_DEBUG_MSG("key code: %d\n", event->key.key_code ); /* 否则,将这个键盘消息发送给当前获得焦点的部件 */ while( 1 ) { /* 获取当前容器中已获得焦点的部件 */ focus_widget = Get_FocusWidget( widget ); //_DEBUG_MSG("focus_widget: %p\n", focus_widget); //print_widget_info( focus_widget ); if( !focus_widget ) { if( !valid_widget ) { break; } Widget_DispatchKeyboardEvent( valid_widget, &event->key ); break; } /* 切换到子部件 */ widget = focus_widget; /* 保存已关联按键事件的部件指针 */ if( EventSlots_Find( &widget->event, EVENT_KEYBOARD ) ) { valid_widget = widget; } } }
static void WidgetFocusProc( LCUI_Key *key_data, void *arg ) { LCUI_Widget *widget, *tmp = NULL, *focus_widget; widget = NULL; //printf("key, code: %d, status:%d\n", // key_data->code, key_data->status); while( 1 ) { focus_widget = Get_FocusWidget( widget ); if( !focus_widget ) { if( tmp ) { Handle_Widget_KeyboardEvent( tmp, *key_data ); } break; } widget = focus_widget; /* 保存已关联按键事件的部件指针 */ if( Find_Event( &widget->event, EVENT_KEYBOARD ) ) { tmp = widget; } } }