From f7e665be985a77429444988400f510f87b7d8837 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 8 May 2018 07:25:24 -0700 Subject: [PATCH] Fix for bug H7132. In nethackw, there can be conflicts between menu accelerators and an extra choice accelerator. For example, when engraving the using fingers options conflicts with the unselect all menu accelerator. The extra choice accelerator should take precedence. --- win/win32/mhmenu.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/win/win32/mhmenu.c b/win/win32/mhmenu.c index b541af305..c8d71b4e6 100644 --- a/win/win32/mhmenu.c +++ b/win/win32/mhmenu.c @@ -1208,6 +1208,21 @@ onListChar(HWND hWnd, HWND hwndList, WORD ch) data = (PNHMenuWindow) GetWindowLongPtr(hWnd, GWLP_USERDATA); + is_accelerator = FALSE; + for (i = 0; i < data->menu.size; i++) { + if (data->menu.items[i].accelerator == ch) { + is_accelerator = TRUE; + break; + } + } + + /* Don't use switch if input matched an accelerator. Sometimes + * accelerators can conflict with menu actions. For example, when + * engraving the extra choice of using fingers matches MENU_UNSELECT_ALL. + */ + if (is_accelerator) + goto accelerator; + switch (ch) { case MENU_FIRST_PAGE: i = 0; @@ -1402,6 +1417,7 @@ onListChar(HWND hWnd, HWND hwndList, WORD ch) } } break; + accelerator: default: if (strchr(data->menu.gacc, ch) && !(ch == '0' && data->menu.counting)) { @@ -1450,14 +1466,6 @@ onListChar(HWND hWnd, HWND hwndList, WORD ch) return -2; } - is_accelerator = FALSE; - for (i = 0; i < data->menu.size; i++) { - if (data->menu.items[i].accelerator == ch) { - is_accelerator = TRUE; - break; - } - } - if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || is_accelerator) { if (data->how == PICK_ANY || data->how == PICK_ONE) {