]> git.eshelyaron.com Git - emacs.git/commitdiff
Better fix for disappearing menu items on NS
authorPo Lu <luangruo@yahoo.com>
Sat, 14 May 2022 05:50:52 +0000 (13:50 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 14 May 2022 05:50:52 +0000 (13:50 +0800)
* 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
src/nsmenu.m

index 2fb91ca5e7bccdc9afb75a0e23b72628421109af..1391cef6287171123da0b88ead716b53c4a1c2b6 100644 (file)
@@ -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.  */
index 5599d5190635dfc0225b62b657eead4179bb6542..531f0d3bb6dda669dc41923b3c541355d2a8176f 100644 (file)
@@ -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