IDEA-286810: cleanup menu on close

GitOrigin-RevId: 35d5543b8cebee02446bce1359f1779ab5b55ea9
This commit is contained in:
Artem Bochkarev
2022-01-20 19:54:56 +07:00
committed by intellij-monorepo-bot
parent 3d858cb3d5
commit a115c5ba82
3 changed files with 43 additions and 31 deletions

Binary file not shown.

View File

@@ -168,18 +168,24 @@ Java_com_intellij_ui_mac_screenmenu_Menu_nativeRefill
JNI_COCOA_ENTER();
// 1. create copy of array
jsize length = (*env)->GetArrayLength(env, newItems);
size_t lengthInBytes = length*sizeof(long);
long * newItemsPtrs = (long *)malloc(lengthInBytes);
jlong * ptrs = (*env)->GetLongArrayElements(env, newItems, NULL);
memcpy(newItemsPtrs, ptrs, lengthInBytes);
(*env)->ReleaseLongArrayElements(env, newItems, ptrs, 0);
jsize length = 0;
long * newItemsPtrs = NULL;
if (newItems != NULL) {
length = (*env)->GetArrayLength(env, newItems);
if (length > 0) {
size_t lengthInBytes = length * sizeof(long);
newItemsPtrs = (long *) malloc(lengthInBytes);
jlong *ptrs = (*env)->GetLongArrayElements(env, newItems, NULL);
memcpy(newItemsPtrs, ptrs, lengthInBytes);
(*env)->ReleaseLongArrayElements(env, newItems, ptrs, 0);
// 2. retain new items
for (int i = 0; i < length; i++) {
id newItem = (id)(newItemsPtrs[i]);
if (newItem != NULL) {
[newItem retain];
// 2. retain new items
for (int i = 0; i < length; i++) {
id newItem = (id) (newItemsPtrs[i]);
if (newItem != NULL) {
[newItem retain];
}
}
}
}
@@ -213,30 +219,32 @@ Java_com_intellij_ui_mac_screenmenu_Menu_nativeRefill
//
// add new items
//
for (int i = 0; i < length; i++) {
MenuItem * child = (MenuItem *)newItemsPtrs[i];
if (child == NULL) {
// add separator
if (menu != nil)
[menu->nsMenu addItem:[NSMenuItem separatorItem]];
else
[mainMenu addItem:[NSMenuItem separatorItem]];
} else {
// add menu item
if (menu != nil)
[menu addItem:child];
else {
if ([child isKindOfClass:[Menu class]]) {
// "validate", just for insurance
Menu * menuModified = (Menu *)child;
[menuModified->nsMenuItem setSubmenu:menuModified->nsMenu];
if (newItemsPtrs != NULL) {
for (int i = 0; i < length; i++) {
MenuItem *child = (MenuItem *) newItemsPtrs[i];
if (child == NULL) {
// add separator
if (menu != nil)
[menu->nsMenu addItem:[NSMenuItem separatorItem]];
else
[mainMenu addItem:[NSMenuItem separatorItem]];
} else {
// add menu item
if (menu != nil)
[menu addItem:child];
else {
if ([child isKindOfClass:[Menu class]]) {
// "validate", just for insurance
Menu *menuModified = (Menu *) child;
[menuModified->nsMenuItem setSubmenu:menuModified->nsMenu];
}
[mainMenu addItem:child->nsMenuItem];
}
[mainMenu addItem:child->nsMenuItem];
[child release];
}
[child release];
}
free(newItemsPtrs);
}
free(newItemsPtrs);
// remove first item (that wasn't removed before adding)
if (countBefore > 0) {

View File

@@ -164,6 +164,10 @@ public class Menu extends MenuItem {
// So we can destroy menu-item before item's action performed, and because of that action will not be executed.
// Defer clearing to avoid this problem.
disposeChildren(1000);
synchronized (this) {
// clean native NSMenu item
if (nativePeer != 0) nativeRefill(nativePeer, null, true);
}
if (myOnClose != null) invokeWithLWCToolkit(myOnClose, null, myComponent);
}