mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 06:39:38 +07:00
IDEA-286810: cleanup menu on close
GitOrigin-RevId: 35d5543b8cebee02446bce1359f1779ab5b55ea9
This commit is contained in:
committed by
intellij-monorepo-bot
parent
3d858cb3d5
commit
a115c5ba82
Binary file not shown.
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user