diff --git a/hiro/windows/application.cpp b/hiro/windows/application.cpp index de70a800c..33b8e045f 100755 --- a/hiro/windows/application.cpp +++ b/hiro/windows/application.cpp @@ -3,6 +3,7 @@ namespace hiro { static auto Application_keyboardProc(HWND, UINT, WPARAM, LPARAM) -> bool; +static auto Application_processDeferred() -> void; static auto Application_processDialogMessage(MSG&) -> void; static auto CALLBACK Window_windowProc(HWND, UINT, WPARAM, LPARAM) -> LRESULT; @@ -44,6 +45,14 @@ auto pApplication::processEvents() -> void { Application_processDialogMessage(msg); } } + Application_processDeferred(); +} + +auto Application_processDeferred() -> void { + for (auto menu : pApplication::state().staleMenus) { + menu->_updateDeferred(); + } + pApplication::state().staleMenus.reset(); } auto Application_processDialogMessage(MSG& msg) -> void { diff --git a/hiro/windows/application.hpp b/hiro/windows/application.hpp index 241d7fe08..e50e6523f 100644 --- a/hiro/windows/application.hpp +++ b/hiro/windows/application.hpp @@ -17,6 +17,7 @@ struct pApplication { int modalCount = 0; //number of modal loops Timer modalTimer; //to run Application during modal events pToolTip* toolTip = nullptr; //active toolTip + vector staleMenus; //menubars to update }; static auto state() -> State&; }; diff --git a/hiro/windows/menu-bar.cpp b/hiro/windows/menu-bar.cpp index fc2c5bc54..39fc95603 100644 --- a/hiro/windows/menu-bar.cpp +++ b/hiro/windows/menu-bar.cpp @@ -7,6 +7,7 @@ auto pMenuBar::construct() -> void { } auto pMenuBar::destruct() -> void { + pApplication::state().staleMenus.removeByValue(this); if(hmenu) { DestroyMenu(hmenu); hmenu = nullptr; } if(auto parent = _parent()) { SetMenu(parent->hwnd, nullptr); @@ -44,6 +45,20 @@ auto pMenuBar::_parent() -> maybe { } auto pMenuBar::_update() -> void { + bool updateNow = false; + if(auto parent = _parent()) { + updateNow = GetMenu(parent->hwnd) == nullptr; + } + + if (updateNow) { + _updateDeferred(); + } else { + pApplication::state().staleMenus.removeByValue(this); + pApplication::state().staleMenus.append(this); + } +} + +auto pMenuBar::_updateDeferred() -> void { if(hmenu) DestroyMenu(hmenu); hmenu = CreateMenu(); diff --git a/hiro/windows/menu-bar.hpp b/hiro/windows/menu-bar.hpp index b804f256d..9a7bcd038 100644 --- a/hiro/windows/menu-bar.hpp +++ b/hiro/windows/menu-bar.hpp @@ -13,7 +13,8 @@ struct pMenuBar : pObject { auto _parent() -> maybe; auto _update() -> void; - + auto _updateDeferred() -> void; + HMENU hmenu = 0; vector objects; };