diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index a701fd2c60..87043cd4b4 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -703,7 +703,7 @@ namespace MainWindow break; case WM_KEYDOWN: { - static int mojs=0; + static int mojs = 0; mojs ^= 1; //SetSkinMode(mojs); } @@ -779,8 +779,8 @@ namespace MainWindow case WM_MENUSELECT: - // This happens when a menu drops down, so this is the only place - // we need to call UpdateMenus. + // Unfortunately, accelerate keys (hotkeys) shares the same enabled/disabled states + // with corresponding menu items. UpdateMenus(); break; @@ -832,24 +832,8 @@ namespace MainWindow CHECKITEM(ID_OPTIONS_FRAMESKIP, g_Config.iFrameSkip != 0); CHECKITEM(ID_OPTIONS_USEMEDIAENGINE, g_Config.bUseMediaEngine); CHECKITEM(ID_OPTIONS_MIPMAP, g_Config.bMipMap); - CHECKITEM(ID_EMULATION_SOUND, g_Config.bEnableSound); - CHECKITEM(ID_TEXTURESCALING_DEPOSTERIZE, g_Config.bTexDeposterize); - - EnableMenuItem(menu,ID_EMULATION_RUN, (Core_IsStepping() || globalUIState == UISTATE_PAUSEMENU) ? MF_ENABLED : MF_GRAYED); - EnableMenuItem(menu,ID_EMULATION_PAUSE, globalUIState == UISTATE_INGAME ? MF_ENABLED : MF_GRAYED); - EnableMenuItem(menu,ID_EMULATION_STOP, globalUIState == UISTATE_INGAME ? MF_ENABLED : MF_GRAYED); - EnableMenuItem(menu,ID_EMULATION_RESET, globalUIState == UISTATE_INGAME ? MF_ENABLED : MF_GRAYED); - - UINT enable = globalUIState == UISTATE_MENU ? MF_ENABLED : MF_GRAYED; - EnableMenuItem(menu,ID_FILE_LOAD,enable); - EnableMenuItem(menu,ID_FILE_LOAD_MEMSTICK,enable); - EnableMenuItem(menu,ID_FILE_SAVESTATEFILE,!enable); - EnableMenuItem(menu,ID_FILE_LOADSTATEFILE,!enable); - EnableMenuItem(menu,ID_FILE_QUICKSAVESTATE,!enable); - EnableMenuItem(menu,ID_FILE_QUICKLOADSTATE,!enable); - EnableMenuItem(menu,ID_CPU_DYNAREC,enable); - EnableMenuItem(menu,ID_CPU_INTERPRETER,enable); - EnableMenuItem(menu,ID_EMULATION_STOP,!enable); + CHECKITEM(ID_EMULATION_SOUND, g_Config.bEnableSound); + CHECKITEM(ID_TEXTURESCALING_DEPOSTERIZE, g_Config.bTexDeposterize); static const int zoomitems[4] = { ID_OPTIONS_SCREEN1X, @@ -881,6 +865,39 @@ namespace MainWindow for (int i = 0; i < 4; i++) { CheckMenuItem(menu, texscalingtypeitems[i], MF_BYCOMMAND | ((i == g_Config.iTexScalingType) ? MF_CHECKED : MF_UNCHECKED)); } + + UpdateCommands(); + } + + void UpdateCommands() + { + static GlobalUIState lastGlobalUIState = UISTATE_PAUSEMENU; + static CoreState lastCoreState = CORE_ERROR; + + if (lastGlobalUIState == globalUIState && lastCoreState == coreState) + return; + + lastCoreState = coreState; + lastGlobalUIState = globalUIState; + + HMENU menu = GetMenu(GetHWND()); + EnableMenuItem(menu,ID_EMULATION_RUN, (Core_IsStepping() || globalUIState == UISTATE_PAUSEMENU) ? MF_ENABLED : MF_GRAYED); + + UINT ingameEnable = globalUIState == UISTATE_INGAME ? MF_ENABLED : MF_GRAYED; + EnableMenuItem(menu,ID_EMULATION_PAUSE, ingameEnable); + EnableMenuItem(menu,ID_EMULATION_STOP, ingameEnable); + EnableMenuItem(menu,ID_EMULATION_RESET, ingameEnable); + + UINT menuEnable = globalUIState == UISTATE_MENU ? MF_ENABLED : MF_GRAYED; + EnableMenuItem(menu,ID_FILE_LOAD, menuEnable); + EnableMenuItem(menu,ID_FILE_LOAD_MEMSTICK, menuEnable); + EnableMenuItem(menu,ID_FILE_SAVESTATEFILE, !menuEnable); + EnableMenuItem(menu,ID_FILE_LOADSTATEFILE, !menuEnable); + EnableMenuItem(menu,ID_FILE_QUICKSAVESTATE, !menuEnable); + EnableMenuItem(menu,ID_FILE_QUICKLOADSTATE, !menuEnable); + EnableMenuItem(menu,ID_CPU_DYNAREC, menuEnable); + EnableMenuItem(menu,ID_CPU_INTERPRETER, menuEnable); + EnableMenuItem(menu,ID_EMULATION_STOP, !menuEnable); } diff --git a/Windows/WndMainWindow.h b/Windows/WndMainWindow.h index 7996aa920d..1b0485492a 100644 --- a/Windows/WndMainWindow.h +++ b/Windows/WndMainWindow.h @@ -11,6 +11,7 @@ namespace MainWindow BOOL Show(HINSTANCE hInstance, int nCmdShow); void Close(); void UpdateMenus(); + void UpdateCommands(); void Update(); void Redraw(); HWND GetHWND(); diff --git a/Windows/main.cpp b/Windows/main.cpp index e525dc9beb..280520f9e4 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -136,9 +136,15 @@ int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLin { //DSound_UpdateSound(); - //hack to make it possible to get to main window from floating windows with Esc - if (msg.hwnd != hwndMain && msg.message==WM_KEYDOWN && msg.wParam==VK_ESCAPE) - BringWindowToTop(hwndMain); + if (msg.message == WM_KEYDOWN) + { + //hack to enable/disable menu command accelerate keys + MainWindow::UpdateCommands(); + + //hack to make it possible to get to main window from floating windows with Esc + if (msg.hwnd != hwndMain && msg.wParam == VK_ESCAPE) + BringWindowToTop(hwndMain); + } //Translate accelerators and dialog messages... if (!TranslateAccelerator(hwndMain, hAccelTable, &msg))