From cd308e2358c57acafd6b834352cebdcdb0b9e45d Mon Sep 17 00:00:00 2001 From: smelenchuk Date: Mon, 14 Feb 2011 01:18:01 +0000 Subject: [PATCH] * If a hotkey is pressed within the render window, pass it over to the main window properly; this means that e.g. the frame advance hotkey works from the render window (and that savestates aren't hard-bound to Fx / Shift+Fx therein). * Update menu accelerators for all hotkeys, not just the ones in the original hotkey dialogue. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7169 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/DolphinWX/Src/Frame.cpp | 113 ++++++++++++++++++++++- Source/Core/DolphinWX/Src/Frame.h | 1 + Source/Core/DolphinWX/Src/FrameTools.cpp | 10 +- 3 files changed, 112 insertions(+), 12 deletions(-) diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index 5bf5b9cfeb..71e8301937 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -799,6 +799,84 @@ bool IsHotkey(wxKeyEvent &event, int Id) event.GetModifiers() == SConfig::GetInstance().m_LocalCoreStartupParameter.iHotkeyModifier[Id]); } +int GetCmdForHotkey(unsigned int key) +{ + if (key == HK_OPEN) + return wxID_OPEN; + if (key == HK_CHANGE_DISC) + return IDM_CHANGEDISC; + if (key == HK_REFRESH_LIST) + return wxID_REFRESH; + + if (key == HK_PLAY_PAUSE) + return IDM_PLAY; + if (key == HK_STOP) + return IDM_STOP; + if (key == HK_RESET) + return IDM_RESET; + if (key == HK_FRAME_ADVANCE) + return IDM_FRAMESTEP; + + if (key == HK_START_RECORDING) + return IDM_RECORD; + if (key == HK_PLAY_RECORDING) + return IDM_PLAYRECORD; + if (key == HK_EXPORT_RECORDING) + return IDM_RECORDEXPORT; + if (key == HK_READ_ONLY_MODE) + return IDM_RECORDREADONLY; + + if (key == HK_FULLSCREEN) + return IDM_TOGGLE_FULLSCREEN; + if (key == HK_SCREENSHOT) + return IDM_SCREENSHOT; + + if (key == HK_WIIMOTE1_CONNECT) + return IDM_CONNECT_WIIMOTE1; + if (key == HK_WIIMOTE2_CONNECT) + return IDM_CONNECT_WIIMOTE2; + if (key == HK_WIIMOTE3_CONNECT) + return IDM_CONNECT_WIIMOTE3; + if (key == HK_WIIMOTE4_CONNECT) + return IDM_CONNECT_WIIMOTE4; + + if (key == HK_LOAD_STATE_SLOT_1) + return IDM_LOADSLOT1; + if (key == HK_LOAD_STATE_SLOT_2) + return IDM_LOADSLOT2; + if (key == HK_LOAD_STATE_SLOT_3) + return IDM_LOADSLOT3; + if (key == HK_LOAD_STATE_SLOT_4) + return IDM_LOADSLOT4; + if (key == HK_LOAD_STATE_SLOT_5) + return IDM_LOADSLOT5; + if (key == HK_LOAD_STATE_SLOT_6) + return IDM_LOADSLOT6; + if (key == HK_LOAD_STATE_SLOT_7) + return IDM_LOADSLOT7; + if (key == HK_LOAD_STATE_SLOT_8) + return IDM_LOADSLOT8; + + if (key == HK_SAVE_STATE_SLOT_1) + return IDM_SAVESLOT1; + if (key == HK_SAVE_STATE_SLOT_2) + return IDM_SAVESLOT2; + if (key == HK_SAVE_STATE_SLOT_3) + return IDM_SAVESLOT3; + if (key == HK_SAVE_STATE_SLOT_4) + return IDM_SAVESLOT4; + if (key == HK_SAVE_STATE_SLOT_5) + return IDM_SAVESLOT5; + if (key == HK_SAVE_STATE_SLOT_6) + return IDM_SAVESLOT6; + if (key == HK_SAVE_STATE_SLOT_7) + return IDM_SAVESLOT7; + if (key == HK_SAVE_STATE_SLOT_8) + return IDM_SAVESLOT8; + + return -1; +} + void CFrame::OnKeyDown(wxKeyEvent& event) { if(Core::GetState() != Core::CORE_UNINITIALIZED) @@ -808,7 +886,8 @@ void CFrame::OnKeyDown(wxKeyEvent& event) if (IsHotkey(event, HK_FULLSCREEN)) DoFullscreen(!RendererIsFullscreen()); // Send Debugger keys to CodeWindow - else if (g_pCodeWindow && (event.GetKeyCode() >= WXK_F9 && event.GetKeyCode() <= WXK_F11)) + //else + if (g_pCodeWindow && (event.GetKeyCode() >= WXK_F9 && event.GetKeyCode() <= WXK_F11)) event.Skip(); // Pause and Unpause else if (IsHotkey(event, HK_PLAY_PAUSE)) @@ -829,7 +908,7 @@ void CFrame::OnKeyDown(wxKeyEvent& event) else if (IsHotkey(event, HK_WIIMOTE4_CONNECT)) WiimoteId = 3; // State save and state load hotkeys - else if (event.GetKeyCode() >= WXK_F1 && event.GetKeyCode() <= WXK_F8) + /*else if (event.GetKeyCode() >= WXK_F1 && event.GetKeyCode() <= WXK_F8) { int slot_number = event.GetKeyCode() - WXK_F1 + 1; if (event.GetModifiers() == wxMOD_NONE) @@ -838,7 +917,7 @@ void CFrame::OnKeyDown(wxKeyEvent& event) State_Save(slot_number); else event.Skip(); - } + }*/ else if (event.GetKeyCode() == WXK_F11 && event.GetModifiers() == wxMOD_NONE) State_LoadLastSaved(); else if (event.GetKeyCode() == WXK_F12) @@ -851,6 +930,30 @@ void CFrame::OnKeyDown(wxKeyEvent& event) event.Skip(); } else + { + unsigned int i = NUM_HOTKEYS; + if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain) + { + for (i = 0; i < NUM_HOTKEYS; i++) + { + if (IsHotkey(event, i)) + { + int cmd = GetCmdForHotkey(i); + if (cmd >= 0) + { + wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED, cmd); + wxMenuItem *item = GetMenuBar()->FindItem(cmd); + if (item && item->IsCheckable()) + { + item->wxMenuItemBase::Toggle(); + evt.SetInt(item->IsChecked()); + } + main_frame->GetEventHandler()->AddPendingEvent(evt); + break; + } + } + } + } // On OS X, we claim all keyboard events while // emulation is running to avoid wxWidgets sounding // the system beep for unhandled key events when @@ -859,8 +962,10 @@ void CFrame::OnKeyDown(wxKeyEvent& event) #ifndef __APPLE__ // On other platforms, we leave the key event alone // so it can be passed on to the windowing system. - event.Skip(); + if (i == NUM_HOTKEYS) + event.Skip(); #endif + } // Actually perform the wiimote connection or disconnection if (WiimoteId >= 0) diff --git a/Source/Core/DolphinWX/Src/Frame.h b/Source/Core/DolphinWX/Src/Frame.h index 06d7d37eae..3aa8a0b1f5 100644 --- a/Source/Core/DolphinWX/Src/Frame.h +++ b/Source/Core/DolphinWX/Src/Frame.h @@ -343,6 +343,7 @@ class CFrame : public CRenderFrame DECLARE_EVENT_TABLE(); }; +int GetCmdForHotkey(unsigned int key); #endif // __FRAME_H_ diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index a184654d3f..e60d386819 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -1464,14 +1464,8 @@ void CFrame::UpdateGUI() GetMenuBar()->FindItem(IDM_TOGGLE_FULLSCREEN)->Enable(Running || Paused); // Update Menu Accelerators - GetMenuBar()->FindItem(IDM_TOGGLE_FULLSCREEN)->SetItemLabel(GetMenuLabel(HK_FULLSCREEN)); - GetMenuBar()->FindItem(IDM_PLAY)->SetItemLabel(GetMenuLabel(HK_PLAY_PAUSE)); - GetMenuBar()->FindItem(IDM_STOP)->SetItemLabel(GetMenuLabel(HK_STOP)); - GetMenuBar()->FindItem(IDM_SCREENSHOT)->SetItemLabel(GetMenuLabel(HK_SCREENSHOT)); - GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE1)->SetItemLabel(GetMenuLabel(HK_WIIMOTE1_CONNECT)); - GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE2)->SetItemLabel(GetMenuLabel(HK_WIIMOTE2_CONNECT)); - GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE3)->SetItemLabel(GetMenuLabel(HK_WIIMOTE3_CONNECT)); - GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE4)->SetItemLabel(GetMenuLabel(HK_WIIMOTE4_CONNECT)); + for (unsigned int i = 0; i < NUM_HOTKEYS; i++) + GetMenuBar()->FindItem(GetCmdForHotkey(i))->SetItemLabel(GetMenuLabel(i)); GetMenuBar()->FindItem(IDM_LOADSTATE)->Enable(Initialized); GetMenuBar()->FindItem(IDM_SAVESTATE)->Enable(Initialized);