diff --git a/source/gui/widgets/menubar.cpp b/source/gui/widgets/menubar.cpp index 63401c0f..0be611c5 100644 --- a/source/gui/widgets/menubar.cpp +++ b/source/gui/widgets/menubar.cpp @@ -296,14 +296,26 @@ namespace nana state_.menu->pick(); break; default: - if (2 != state_.menu->send_shortkey(arg.key)) + //Katsuhisa Yuasa: menubar key_press improvements + //send_shortkey has 3 states, 0 = UNKNOWN KEY, 1 = ITEM, 2 = GOTO SUBMENU + int sk_state = state_.menu->send_shortkey(arg.key); + switch(sk_state) { - _m_total_close(); - if (arg.key == 18) //ALT - state_.behavior = state_.behavior_focus; - } - else + case 0: //UNKNOWN KEY + break; + case 1: //ITEM + if (state_.active != npos) + { + _m_total_close(); + if (arg.key == 18) //ALT + state_.behavior = state_.behavior_focus; + } + break; + case 2: //GOTO SUBMENU state_.menu->goto_submen(); + break; + } + break; } } else @@ -315,12 +327,30 @@ namespace nana case keyboard::os_arrow_left: _m_move(keyboard::os_arrow_right != arg.key); break; + case keyboard::os_arrow_up: + case keyboard::os_arrow_down: + case keyboard::enter: + state_.menu_active = true; + if(_m_popup_menu()) + state_.menu->goto_next(true); + break; case keyboard::escape: if(state_.behavior == state_.behavior_focus) { state_.active= npos; state_.behavior = state_.behavior_none; } + break; + default: + std::size_t index = items_->find(arg.key); + if(index != npos) + { + state_.active = index; + state_.menu_active = true; + if(_m_popup_menu()) + state_.menu->goto_next(true); + } + break; } }