Windows: group accelerator and menu item collision

In the event that there is a collision between a menu group accelerator
and an individual menu item's accelerator, disregard the group
accelerator.

'$' is the only known collision in NetHack 5.0 presently.

Close #805
This commit is contained in:
nhmall
2026-07-31 14:53:19 -04:00
parent 9447bba227
commit 29cb8b7d9a
+14 -1
View File
@@ -35,6 +35,7 @@ typedef struct mswin_menu_item {
int color;
char str[NHMENU_STR_SIZE];
boolean presel;
boolean group_accelerator_collision;
unsigned int itemflags;
int count;
BOOL has_focus;
@@ -191,7 +192,18 @@ mswin_menu_window_select_menu(HWND hWnd, int how, MENU_ITEM_P **_selected,
/* collect group accelerators */
for (i = 0; i < data->menui.menu.size; i++) {
if (data->how != PICK_NONE) {
if (data->menui.menu.items[i].group_accel
/* Check for conflict between a specific selectable
* menu item and its group accelerator.
*/
if (NHMENU_IS_SELECTABLE(data->menui.menu.items[i])
&& data->menui.menu.items[i].group_accel
== data->menui.menu.items[i].accelerator) {
/* collision between specific menu item
and its group accelerator */
data->menui.menu.items[i].group_accelerator_collision = TRUE;
}
if (!data->menui.menu.items[i].group_accelerator_collision
&& data->menui.menu.items[i].group_accel
&& !strchr(data->menui.menu.gacc,
data->menui.menu.items[i].group_accel)) {
*ap++ = data->menui.menu.items[i].group_accel;
@@ -651,6 +663,7 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
/* prevent & being interpreted as a mnemonic start */
strNsubst(data->menui.menu.items[new_item].str, "&", "&&", 0);
data->menui.menu.items[new_item].presel = msg_data->presel;
data->menui.menu.items[new_item].group_accelerator_collision = FALSE;
data->menui.menu.items[new_item].itemflags = msg_data->itemflags;
/* calculate tabstop size */