diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 7131bcc2564..e179c911a58 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -137,8 +137,8 @@ RID PopupMenu::bind_global_menu() { nmenu->set_item_tooltip(global_menu, index, item.tooltip); if (!item.shortcut_is_disabled && item.shortcut.is_valid() && item.shortcut->has_valid_event()) { Array events = item.shortcut->get_events(); - for (int j = 0; j < events.size(); j++) { - Ref ie = events[j]; + for (const Variant &v : events) { + Ref ie = v; if (ie.is_valid() && _set_item_accelerator(index, ie)) { break; } @@ -2984,7 +2984,26 @@ void PopupMenu::_unref_shortcut(Ref p_sc) { void PopupMenu::_shortcut_changed() { for (int i = 0; i < items.size(); i++) { - items.write[i].dirty = true; + Item &item = items.write[i]; + item.dirty = true; + if (global_menu.is_valid() && !item.separator) { + NativeMenu *nmenu = NativeMenu::get_singleton(); + nmenu->set_item_accelerator(global_menu, i, Key::NONE); + if (!item.shortcut_is_disabled && item.shortcut.is_valid() && item.shortcut->has_valid_event()) { + Array events = item.shortcut->get_events(); + for (const Variant &v : events) { + Ref ie = v; + if (ie.is_valid() && _set_item_accelerator(i, ie)) { + break; + } + } + if (item.shortcut_is_global) { + nmenu->set_item_key_callback(global_menu, i, callable_mp(this, &PopupMenu::activate_item)); + } else { + nmenu->set_item_key_callback(global_menu, i, Callable()); + } + } + } } control->queue_redraw(); }