From 004c2ced6e1eb71a54ea58e78c714ae69e215f63 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 14 May 2022 13:50:52 +0800 Subject: [PATCH] Better fix for disappearing menu items on NS * src/frame.c (delete_frame): Revert last change. * src/nsmenu.m (free_frame_menubar): Only free if that frame's menu bar is actually being displayed. (ns_update_menubar): Note the last frame to have updated the menu bar. --- src/frame.c | 6 +----- src/nsmenu.m | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/frame.c b/src/frame.c index 2fb91ca5e7b..1391cef6287 100644 --- a/src/frame.c +++ b/src/frame.c @@ -2334,12 +2334,8 @@ delete_frame (Lisp_Object frame, Lisp_Object force) } /* Cause frame titles to update--necessary if we now have just one - frame. On NS the menu bar becomes empty after a tooltip frame is - deleted for an unknown reason, so this serves to restore the - contents of the menu bar as well. */ -#ifndef HAVE_NS + frame. */ if (!is_tooltip_frame) -#endif update_mode_lines = 15; /* Now run the post-deletion hooks. */ diff --git a/src/nsmenu.m b/src/nsmenu.m index 5599d519063..531f0d3bb6d 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -52,6 +52,10 @@ EmacsMenu *svcsMenu; /* Nonzero means a menu is currently active. */ static int popup_activated_flag; +/* The last frame whose menubar was updated. (This is the frame whose + menu bar is currently being displayed.) */ +static struct frame *last_menubar_frame; + /* NOTE: toolbar implementation is at end, following complete menu implementation. */ @@ -71,6 +75,12 @@ void free_frame_menubar (struct frame *f) { id menu = [NSApp mainMenu]; + + if (f != last_menubar_frame) + return; + + last_menubar_frame = NULL; + for (int i = [menu numberOfItems] - 1 ; i >= 0; i--) { NSMenuItem *item = (NSMenuItem *)[menu itemAtIndex:i]; @@ -135,9 +145,9 @@ ns_update_menubar (struct frame *f, bool deep_p) #endif return; } - XSETFRAME (Vmenu_updating_frame, f); -/*fprintf (stderr, "ns_update_menubar: frame: %p\tdeep: %d\tsub: %p\n", f, deep_p, submenu); */ + XSETFRAME (Vmenu_updating_frame, f); + last_menubar_frame = f; block_input (); /* Menu may have been created automatically; if so, discard it. */ @@ -155,7 +165,7 @@ ns_update_menubar (struct frame *f, bool deep_p) #if NSMENUPROFILE ftime (&tb); - t = -(1000*tb.time+tb.millitm); + t = -(1000 * tb.time + tb.millitm); #endif if (deep_p) @@ -413,7 +423,7 @@ ns_update_menubar (struct frame *f, bool deep_p) #if NSMENUPROFILE ftime (&tb); - t += 1000*tb.time+tb.millitm; + t += 1000 * tb.time + tb.millitm; fprintf (stderr, "Menu update took %ld msec.\n", t); #endif -- 2.39.2