From a9205eac4ac10e0845e9bf56e0b24d784059d0c0 Mon Sep 17 00:00:00 2001 From: warmCabin Date: Wed, 11 Aug 2021 04:03:50 -0400 Subject: [PATCH] down with hotkeys, long live accelerators! Hotkeys are SUPER jank. There should be some kind of warning in the docs or something. They are an operating system-level message, and if consumed, NO OTHER APPLICATION GETS TO HAVE IT. So this Ctrl+A hotkey meant the hex editor couldn't use it anymore. Neither could Visual Studio. Or Notepad++. Or Chrome. That's BAD. --- src/drivers/win/debugger.cpp | 103 ++++++++++++----------------------- src/drivers/win/main.cpp | 7 +++ src/drivers/win/res.rc | 10 ++++ src/drivers/win/resource.h | 1 + 4 files changed, 52 insertions(+), 69 deletions(-) diff --git a/src/drivers/win/debugger.cpp b/src/drivers/win/debugger.cpp index ea6bc69c..bfb13bfe 100644 --- a/src/drivers/win/debugger.cpp +++ b/src/drivers/win/debugger.cpp @@ -1684,14 +1684,6 @@ BOOL CALLBACK IDC_DEBUGGER_DISASSEMBLY_WndProc(HWND hwndDlg, UINT uMsg, WPARAM w #define MENU_OPTIONS_COLORS_POS 2 -#define HKEY_STEP_ONE_ID 0 -#define HKEY_STEP_OUT_ID 1 -#define HKEY_STEP_OVER_ID 2 -#define HKEY_RUN_ID 3 -#define HKEY_SEEK_ADDR_ID 4 -#define HKEY_SEEK_PC_ID 5 -#define HKEY_SET_PC_ID 6 - HMENU toolsPopup, symbolsPopup, optionsPopup; INT_PTR CALLBACK DebuggerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -1815,16 +1807,6 @@ void DebuggerInitDialog(HWND hwndDlg) for (int i = 0; i < sizeof(dbgcolormenu) / sizeof(DBGCOLORMENU); ++i) InsertColorMenu(hwndDlg, hcolorpopupmenu, &dbgcolormenu[i].menu, i, ID_COLOR_DEBUGGER + i); - // Register default hotkeys - // TODO: Be sure to unregister all these!! - RegisterHotKey(hwndDlg, HKEY_STEP_ONE_ID, 0, VK_F11); - RegisterHotKey(hwndDlg, HKEY_STEP_OUT_ID, MOD_SHIFT, VK_F11); - RegisterHotKey(hwndDlg, HKEY_STEP_OVER_ID, 0, VK_F10); - RegisterHotKey(hwndDlg, HKEY_RUN_ID, 0, VK_F5); - - RegisterHotKey(hwndDlg, HKEY_SEEK_ADDR_ID, MOD_CONTROL, 0x41); // A - RegisterHotKey(hwndDlg, HKEY_SEEK_PC_ID, MOD_CONTROL, 0x50); // P - debugger_open = 1; inDebugger = true; } @@ -2513,36 +2495,6 @@ void DebuggerEnChange(HWND hwndDlg, uint16 textBoxId, HWND hwndTextbox) } } -void DebuggerHotKey(HWND hwndDlg, UINT hotkeyId, uint16 keycode, uint16 mods) -{ - // No idea if this is good programming. Should we use accelerators instead? - if (GetForegroundWindow() != hwndDlg) - return; - - switch (hotkeyId) - { - // Do we want autorepeat on these? MOD_NOREPEAT doesn't seem to exist so idk what to do. - case HKEY_STEP_ONE_ID: - DebuggerBnClicked(hwndDlg, IDC_DEBUGGER_STEP_IN, NULL); - break; - case HKEY_STEP_OUT_ID: - DebuggerBnClicked(hwndDlg, IDC_DEBUGGER_STEP_OUT, NULL); - break; - case HKEY_STEP_OVER_ID: - DebuggerBnClicked(hwndDlg, IDC_DEBUGGER_STEP_OVER, NULL); - break; - case HKEY_RUN_ID: - DebuggerBnClicked(hwndDlg, IDC_DEBUGGER_RUN, NULL); - case HKEY_SEEK_ADDR_ID: - SetFocus(GetDlgItem(hwndDlg, IDC_DEBUGGER_VAL_PCSEEK)); - SetDlgItemText(hDebug, IDC_DEBUGGER_VAL_PCSEEK, ""); - break; - case HKEY_SEEK_PC_ID: - DebuggerBnClicked(hwndDlg, IDC_DEBUGGER_SEEK_PC, NULL); - break; - } -} - INT_PTR CALLBACK DebuggerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) @@ -2563,24 +2515,40 @@ INT_PTR CALLBACK DebuggerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP DebuggerMoveWindow(hwndDlg, LOWORD(lParam), HIWORD(lParam)); break; case WM_COMMAND: - switch (HIWORD(wParam)) - { - case BN_CLICKED: - DebuggerBnClicked(hwndDlg, LOWORD(wParam), (HWND)lParam); - break; - case LBN_DBLCLK: - DebuggerLbnDblClk(hwndDlg, LOWORD(wParam), (HWND)lParam); - break; - case LBN_SELCANCEL: - DebuggerLbnSelCancel(hwndDlg, LOWORD(wParam), (HWND)lParam); - break; - case LBN_SELCHANGE: - DebuggerLbnSelChange(hwndDlg, LOWORD(wParam), (HWND)lParam); - break; - case EN_CHANGE: - DebuggerEnChange(hwndDlg, LOWORD(wParam), (HWND)lParam); - break; - } + // I know you can cleverly ignore this difference and have all your menu messages come through as BN_CLICKED messagse. + // But then your accelerators come through as LBN_SELCHANGE messages, which makes absolutely no sense. + if (lParam) + // Normal messages + switch (HIWORD(wParam)) + { + case BN_CLICKED: + DebuggerBnClicked(hwndDlg, LOWORD(wParam), (HWND)lParam); + break; + case LBN_DBLCLK: + DebuggerLbnDblClk(hwndDlg, LOWORD(wParam), (HWND)lParam); + break; + case LBN_SELCANCEL: + DebuggerLbnSelCancel(hwndDlg, LOWORD(wParam), (HWND)lParam); + break; + case LBN_SELCHANGE: + DebuggerLbnSelChange(hwndDlg, LOWORD(wParam), (HWND)lParam); + break; + case EN_CHANGE: + DebuggerEnChange(hwndDlg, LOWORD(wParam), (HWND)lParam); + break; + } + else + switch (HIWORD(wParam)) + { + case 0: + // Menu items + DebuggerBnClicked(hwndDlg, LOWORD(wParam), (HWND)lParam); + break; + case 1: + // Accelerators + DebuggerBnClicked(hwndDlg, LOWORD(wParam), (HWND)lParam); + break; + } case WM_INITMENUPOPUP: DebuggerInitMenuPopup(hwndDlg, (HMENU)wParam, LOWORD(lParam), HIWORD(lParam)); break; @@ -2608,9 +2576,6 @@ INT_PTR CALLBACK DebuggerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP case WM_MBUTTONDOWN: DebuggerMButtonDown(hwndDlg, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), wParam); break; - case WM_HOTKEY: - DebuggerHotKey(hwndDlg, wParam, HIWORD(lParam), LOWORD(lParam)); - break; case WM_KEYDOWN: MessageBox(hwndDlg, "Die!", "I'm dead!", MB_YESNO | MB_ICONINFORMATION); break; diff --git a/src/drivers/win/main.cpp b/src/drivers/win/main.cpp index 54147dbc..9e356f6c 100644 --- a/src/drivers/win/main.cpp +++ b/src/drivers/win/main.cpp @@ -186,6 +186,7 @@ int ffbskip = 32; //Blit skips per blit when FF-ing HINSTANCE fceu_hInstance; HACCEL fceu_hAccel; +HACCEL debugger_hAccel; HRESULT ddrval; @@ -377,6 +378,11 @@ int BlockingCheck() if(!handled && taseditorWindow.hwndFindNote && IsChild(taseditorWindow.hwndFindNote, msg.hwnd)) handled = IsDialogMessage(taseditorWindow.hwndFindNote, &msg); + // Debugger + if(!handled && hDebug) + if(!(handled = TranslateAccelerator(hDebug, debugger_hAccel, &msg))) + handled = IsDialogMessage(hDebug, &msg); + // Sound Config extern HWND uug; if(!handled && uug && IsChild(uug, msg.hwnd)) @@ -711,6 +717,7 @@ int main(int argc,char *argv[]) fceu_hInstance = GetModuleHandle(0); fceu_hAccel = LoadAccelerators(fceu_hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1)); + debugger_hAccel = LoadAccelerators(fceu_hInstance,MAKEINTRESOURCE(IDR_DEBUGGER_ACCELERATOR)); // Get the base directory GetBaseDirectory(); diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index 63ad10ff..e50b577e 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -3129,6 +3129,16 @@ BEGIN "R", IDC_C_WATCH_REMOVE, VIRTKEY END +IDR_DEBUGGER_ACCELERATOR ACCELERATORS +BEGIN + VK_F11, IDC_DEBUGGER_STEP_IN, VIRTKEY + VK_F11, IDC_DEBUGGER_STEP_OUT, VIRTKEY, SHIFT + VK_F10, IDC_DEBUGGER_STEP_OVER, VIRTKEY + VK_F5, IDC_DEBUGGER_RUN, VIRTKEY + "A", IDC_DEBUGGER_VAL_PCSEEK, VIRTKEY, CONTROL + "P", IDC_DEBUGGER_SEEK_PC, VIRTKEY, CONTROL +END + ///////////////////////////////////////////////////////////////////////////// // diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index 12ff1380..c93d4fe2 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -1218,6 +1218,7 @@ #define ID_DEBUGGER_SHOW_TRACE_INFO 45554 #define ID_DEBUGGER_BREAK_UNLOGGED_CODE 45555 #define ID_DEBUGGER_BREAK_UNLOGGED_DATA 45556 +#define IDR_DEBUGGER_ACCELERATOR 45557 #define MW_VALUELABEL2 65423 #define MW_VALUELABEL1 65426 #define IDC_STATIC_SLASHTEXT 65442