static rt_bool_t rtgui_menu_on_deactivate(struct rtgui_object *object, rtgui_event_t* event) { rtgui_menu_t* menu; RTGUI_WIDGET_EVENT_HANDLER_PREPARE menu = RTGUI_MENU(object); if (menu->parent_menu != RT_NULL) { /* whether click on parent menu */ if (rtgui_win_is_activated(RTGUI_WIN(menu->parent_menu)) == RT_TRUE && menu->parent_menu->items[menu->parent_menu->items_list->current_item].submenu == (struct rtgui_menu_item_t *)menu->items) return RT_TRUE; } /* submenu is activate */ if (menu->items[menu->items_list->current_item].type == RTGUI_ITEM_SUBMENU) { /* if sub menu activated, not hide menu. But we cannot use the * activated flag as criteria since the old window is deactivated * before the new window got activated. But the window will be shown in * this context, so use 'is not hide'. */ if (menu->sub_menu != RT_NULL && !RTGUI_WIDGET_IS_HIDE(RTGUI_WIDGET(menu->sub_menu))) return RT_TRUE; } rtgui_win_hiden(RTGUI_WIN(menu)); if (menu->on_menuhide != RT_NULL) { menu->on_menuhide(RTGUI_OBJECT(menu), RT_NULL); } /* un-select item */ menu->items_list->current_item = -1; /* if it's a submenu, try to hide parent menu */ if (menu->parent_menu != RT_NULL && rtgui_win_is_activated(RTGUI_WIN(menu->parent_menu)) == RT_FALSE) { rtgui_menu_on_deactivate(RTGUI_OBJECT(menu->parent_menu), event); } return RT_TRUE; }
static rt_bool_t rtgui_menu_on_deactivate(rtgui_widget_t* widget, rtgui_event_t* event) { rtgui_menu_t* menu = (rtgui_menu_t*) widget; if (menu->parent_menu != RT_NULL) { /* whether click on parent menu */ if (rtgui_win_is_activated(RTGUI_WIN(menu->parent_menu)) == RT_TRUE && menu->parent_menu->items[menu->parent_menu->items_list->current_item].submenu == (struct rtgui_menu_item_t *)menu->items) return RT_TRUE; } /* submenu is activate */ if (menu->items[menu->items_list->current_item].type == RTGUI_ITEM_SUBMENU) { /* if sub menu activated, not hide menu */ if (menu->sub_menu != RT_NULL && rtgui_win_is_activated(RTGUI_WIN(menu->sub_menu)) == RT_TRUE) return RT_TRUE; } rtgui_win_hiden(RTGUI_WIN(menu)); if (menu->on_menuhide != RT_NULL) { menu->on_menuhide(RTGUI_WIDGET(menu), RT_NULL); } /* un-select item */ menu->items_list->current_item = -1; /* if it's a submenu, try to hide parent menu */ if (menu->parent_menu != RT_NULL && rtgui_win_is_activated(RTGUI_WIN(menu->parent_menu)) == RT_FALSE) { rtgui_menu_on_deactivate(RTGUI_WIDGET(menu->parent_menu), event); } return RT_TRUE; }