Skip to content

Commit d56efcd

Browse files
committed
Merge pull request godotengine#104977 from bruvzg/mac_menu_action
[macOS] Fix native menu submenu items have wrong action and accelerators set.
2 parents b1465b9 + 65129d2 commit d56efcd

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

platform/macos/godot_menu_item.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ enum GlobalMenuCheckType {
5050
Callable key_callback;
5151
Callable hover_callback;
5252
Variant meta;
53+
Key accel;
5354
GlobalMenuCheckType checkable_type;
5455
bool checked;
5556
int max_states;

platform/macos/godot_menu_item.mm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ - (id)init {
4141
self->checked = false;
4242
self->max_states = 0;
4343
self->state = 0;
44+
self->accel = Key::NONE;
4445

4546
return self;
4647
}

platform/macos/native_menu_macos.mm

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@
415415
obj->callback = p_callback;
416416
obj->key_callback = p_key_callback;
417417
obj->meta = p_tag;
418+
obj->accel = p_accel;
418419
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
419420
[menu_item setRepresentedObject:obj];
420421
}
@@ -433,6 +434,7 @@
433434
obj->key_callback = p_key_callback;
434435
obj->meta = p_tag;
435436
obj->checkable_type = CHECKABLE_TYPE_CHECK_BOX;
437+
obj->accel = p_accel;
436438
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
437439
[menu_item setRepresentedObject:obj];
438440
}
@@ -450,6 +452,7 @@
450452
obj->callback = p_callback;
451453
obj->key_callback = p_key_callback;
452454
obj->meta = p_tag;
455+
obj->accel = p_accel;
453456
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
454457
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
455458
obj->img = p_icon->get_image();
@@ -479,6 +482,7 @@
479482
obj->key_callback = p_key_callback;
480483
obj->meta = p_tag;
481484
obj->checkable_type = CHECKABLE_TYPE_CHECK_BOX;
485+
obj->accel = p_accel;
482486
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
483487
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
484488
obj->img = p_icon->get_image();
@@ -508,6 +512,7 @@
508512
obj->key_callback = p_key_callback;
509513
obj->meta = p_tag;
510514
obj->checkable_type = CHECKABLE_TYPE_RADIO_BUTTON;
515+
obj->accel = p_accel;
511516
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
512517
[menu_item setRepresentedObject:obj];
513518
}
@@ -526,6 +531,7 @@
526531
obj->key_callback = p_key_callback;
527532
obj->meta = p_tag;
528533
obj->checkable_type = CHECKABLE_TYPE_RADIO_BUTTON;
534+
obj->accel = p_accel;
529535
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
530536
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
531537
obj->img = p_icon->get_image();
@@ -556,6 +562,7 @@
556562
obj->meta = p_tag;
557563
obj->max_states = p_max_states;
558564
obj->state = p_default_state;
565+
obj->accel = p_accel;
559566
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
560567
[menu_item setRepresentedObject:obj];
561568
}
@@ -1096,6 +1103,8 @@
10961103
NSMenuItem *menu_item = [md->menu itemAtIndex:p_idx];
10971104
if (menu_item) {
10981105
[md->menu setSubmenu:md_sub->menu forItem:menu_item];
1106+
[menu_item setAction:nil];
1107+
[menu_item setKeyEquivalent:@""];
10991108
}
11001109
} else {
11011110
int item_start = _get_system_menu_start(md->menu);
@@ -1108,7 +1117,11 @@
11081117
ERR_PRINT("Can't remove open menu!");
11091118
return;
11101119
}
1120+
GodotMenuItem *obj = [menu_item representedObject];
1121+
String keycode = KeyMappingMacOS::keycode_get_native_string(obj->accel & KeyModifierMask::CODE_MASK);
11111122
[md->menu setSubmenu:nil forItem:menu_item];
1123+
[menu_item setAction:@selector(globalMenuCallback:)];
1124+
[menu_item setKeyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
11121125
}
11131126
}
11141127
}
@@ -1124,12 +1137,17 @@
11241137
ERR_FAIL_COND(p_idx >= item_start + item_count);
11251138
NSMenuItem *menu_item = [md->menu itemAtIndex:p_idx];
11261139
if (menu_item) {
1127-
if (p_keycode == Key::NONE) {
1128-
[menu_item setKeyEquivalent:@""];
1129-
} else {
1130-
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_keycode)];
1131-
String keycode = KeyMappingMacOS::keycode_get_native_string(p_keycode & KeyModifierMask::CODE_MASK);
1132-
[menu_item setKeyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
1140+
GodotMenuItem *obj = [menu_item representedObject];
1141+
obj->accel = p_keycode;
1142+
NSMenu *sub_menu = [menu_item submenu];
1143+
if (!sub_menu) {
1144+
if (p_keycode == Key::NONE) {
1145+
[menu_item setKeyEquivalent:@""];
1146+
} else {
1147+
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_keycode)];
1148+
String keycode = KeyMappingMacOS::keycode_get_native_string(p_keycode & KeyModifierMask::CODE_MASK);
1149+
[menu_item setKeyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
1150+
}
11331151
}
11341152
}
11351153
}

0 commit comments

Comments
 (0)