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:
+14
-1
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user