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.
This commit is contained in:
warmCabin 2021-08-11 04:03:50 -04:00
parent 052be52323
commit a9205eac4a
4 changed files with 52 additions and 69 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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
/////////////////////////////////////////////////////////////////////////////
//

View File

@ -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