You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
[macOS] Fix native menu submenu items have wrong action and accelerators set.
This commit is contained in:
@@ -50,6 +50,7 @@ enum GlobalMenuCheckType {
|
|||||||
Callable key_callback;
|
Callable key_callback;
|
||||||
Callable hover_callback;
|
Callable hover_callback;
|
||||||
Variant meta;
|
Variant meta;
|
||||||
|
Key accel;
|
||||||
GlobalMenuCheckType checkable_type;
|
GlobalMenuCheckType checkable_type;
|
||||||
bool checked;
|
bool checked;
|
||||||
int max_states;
|
int max_states;
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
self->checked = false;
|
self->checked = false;
|
||||||
self->max_states = 0;
|
self->max_states = 0;
|
||||||
self->state = 0;
|
self->state = 0;
|
||||||
|
self->accel = Key::NONE;
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -415,6 +415,7 @@ int NativeMenuMacOS::add_item(const RID &p_rid, const String &p_label, const Cal
|
|||||||
obj->callback = p_callback;
|
obj->callback = p_callback;
|
||||||
obj->key_callback = p_key_callback;
|
obj->key_callback = p_key_callback;
|
||||||
obj->meta = p_tag;
|
obj->meta = p_tag;
|
||||||
|
obj->accel = p_accel;
|
||||||
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
||||||
[menu_item setRepresentedObject:obj];
|
[menu_item setRepresentedObject:obj];
|
||||||
}
|
}
|
||||||
@@ -433,6 +434,7 @@ int NativeMenuMacOS::add_check_item(const RID &p_rid, const String &p_label, con
|
|||||||
obj->key_callback = p_key_callback;
|
obj->key_callback = p_key_callback;
|
||||||
obj->meta = p_tag;
|
obj->meta = p_tag;
|
||||||
obj->checkable_type = CHECKABLE_TYPE_CHECK_BOX;
|
obj->checkable_type = CHECKABLE_TYPE_CHECK_BOX;
|
||||||
|
obj->accel = p_accel;
|
||||||
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
||||||
[menu_item setRepresentedObject:obj];
|
[menu_item setRepresentedObject:obj];
|
||||||
}
|
}
|
||||||
@@ -450,6 +452,7 @@ int NativeMenuMacOS::add_icon_item(const RID &p_rid, const Ref<Texture2D> &p_ico
|
|||||||
obj->callback = p_callback;
|
obj->callback = p_callback;
|
||||||
obj->key_callback = p_key_callback;
|
obj->key_callback = p_key_callback;
|
||||||
obj->meta = p_tag;
|
obj->meta = p_tag;
|
||||||
|
obj->accel = p_accel;
|
||||||
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
|
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
|
||||||
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
|
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
|
||||||
obj->img = p_icon->get_image();
|
obj->img = p_icon->get_image();
|
||||||
@@ -479,6 +482,7 @@ int NativeMenuMacOS::add_icon_check_item(const RID &p_rid, const Ref<Texture2D>
|
|||||||
obj->key_callback = p_key_callback;
|
obj->key_callback = p_key_callback;
|
||||||
obj->meta = p_tag;
|
obj->meta = p_tag;
|
||||||
obj->checkable_type = CHECKABLE_TYPE_CHECK_BOX;
|
obj->checkable_type = CHECKABLE_TYPE_CHECK_BOX;
|
||||||
|
obj->accel = p_accel;
|
||||||
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
|
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
|
||||||
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
|
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
|
||||||
obj->img = p_icon->get_image();
|
obj->img = p_icon->get_image();
|
||||||
@@ -508,6 +512,7 @@ int NativeMenuMacOS::add_radio_check_item(const RID &p_rid, const String &p_labe
|
|||||||
obj->key_callback = p_key_callback;
|
obj->key_callback = p_key_callback;
|
||||||
obj->meta = p_tag;
|
obj->meta = p_tag;
|
||||||
obj->checkable_type = CHECKABLE_TYPE_RADIO_BUTTON;
|
obj->checkable_type = CHECKABLE_TYPE_RADIO_BUTTON;
|
||||||
|
obj->accel = p_accel;
|
||||||
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
||||||
[menu_item setRepresentedObject:obj];
|
[menu_item setRepresentedObject:obj];
|
||||||
}
|
}
|
||||||
@@ -526,6 +531,7 @@ int NativeMenuMacOS::add_icon_radio_check_item(const RID &p_rid, const Ref<Textu
|
|||||||
obj->key_callback = p_key_callback;
|
obj->key_callback = p_key_callback;
|
||||||
obj->meta = p_tag;
|
obj->meta = p_tag;
|
||||||
obj->checkable_type = CHECKABLE_TYPE_RADIO_BUTTON;
|
obj->checkable_type = CHECKABLE_TYPE_RADIO_BUTTON;
|
||||||
|
obj->accel = p_accel;
|
||||||
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
|
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
|
||||||
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
|
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
|
||||||
obj->img = p_icon->get_image();
|
obj->img = p_icon->get_image();
|
||||||
@@ -556,6 +562,7 @@ int NativeMenuMacOS::add_multistate_item(const RID &p_rid, const String &p_label
|
|||||||
obj->meta = p_tag;
|
obj->meta = p_tag;
|
||||||
obj->max_states = p_max_states;
|
obj->max_states = p_max_states;
|
||||||
obj->state = p_default_state;
|
obj->state = p_default_state;
|
||||||
|
obj->accel = p_accel;
|
||||||
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
||||||
[menu_item setRepresentedObject:obj];
|
[menu_item setRepresentedObject:obj];
|
||||||
}
|
}
|
||||||
@@ -1096,6 +1103,8 @@ void NativeMenuMacOS::set_item_submenu(const RID &p_rid, int p_idx, const RID &p
|
|||||||
NSMenuItem *menu_item = [md->menu itemAtIndex:p_idx];
|
NSMenuItem *menu_item = [md->menu itemAtIndex:p_idx];
|
||||||
if (menu_item) {
|
if (menu_item) {
|
||||||
[md->menu setSubmenu:md_sub->menu forItem:menu_item];
|
[md->menu setSubmenu:md_sub->menu forItem:menu_item];
|
||||||
|
[menu_item setAction:nil];
|
||||||
|
[menu_item setKeyEquivalent:@""];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int item_start = _get_system_menu_start(md->menu);
|
int item_start = _get_system_menu_start(md->menu);
|
||||||
@@ -1108,7 +1117,11 @@ void NativeMenuMacOS::set_item_submenu(const RID &p_rid, int p_idx, const RID &p
|
|||||||
ERR_PRINT("Can't remove open menu!");
|
ERR_PRINT("Can't remove open menu!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
GodotMenuItem *obj = [menu_item representedObject];
|
||||||
|
String keycode = KeyMappingMacOS::keycode_get_native_string(obj->accel & KeyModifierMask::CODE_MASK);
|
||||||
[md->menu setSubmenu:nil forItem:menu_item];
|
[md->menu setSubmenu:nil forItem:menu_item];
|
||||||
|
[menu_item setAction:@selector(globalMenuCallback:)];
|
||||||
|
[menu_item setKeyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1124,12 +1137,17 @@ void NativeMenuMacOS::set_item_accelerator(const RID &p_rid, int p_idx, Key p_ke
|
|||||||
ERR_FAIL_COND(p_idx >= item_start + item_count);
|
ERR_FAIL_COND(p_idx >= item_start + item_count);
|
||||||
NSMenuItem *menu_item = [md->menu itemAtIndex:p_idx];
|
NSMenuItem *menu_item = [md->menu itemAtIndex:p_idx];
|
||||||
if (menu_item) {
|
if (menu_item) {
|
||||||
if (p_keycode == Key::NONE) {
|
GodotMenuItem *obj = [menu_item representedObject];
|
||||||
[menu_item setKeyEquivalent:@""];
|
obj->accel = p_keycode;
|
||||||
} else {
|
NSMenu *sub_menu = [menu_item submenu];
|
||||||
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_keycode)];
|
if (!sub_menu) {
|
||||||
String keycode = KeyMappingMacOS::keycode_get_native_string(p_keycode & KeyModifierMask::CODE_MASK);
|
if (p_keycode == Key::NONE) {
|
||||||
[menu_item setKeyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
|
[menu_item setKeyEquivalent:@""];
|
||||||
|
} else {
|
||||||
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_keycode)];
|
||||||
|
String keycode = KeyMappingMacOS::keycode_get_native_string(p_keycode & KeyModifierMask::CODE_MASK);
|
||||||
|
[menu_item setKeyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user