diff src/xdisp.c @ 90573:858cb33ae39d

Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 357-381) - Merge from gnus--rel--5.10 - Update from CVS - Merge from erc--emacs--21 * gnus--rel--5.10 (patch 116-122) - Update from CVS - Merge from emacs--devo--0 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-98
author Miles Bader <miles@gnu.org>
date Thu, 03 Aug 2006 11:45:23 +0000
parents a4c3599e9f9b 06d60c338318
children 6823a91487f2
line wrap: on
line diff
--- a/src/xdisp.c	Thu Aug 03 00:41:54 2006 +0000
+++ b/src/xdisp.c	Thu Aug 03 11:45:23 2006 +0000
@@ -909,7 +909,7 @@
 static Lisp_Object redisplay_window_error ();
 static Lisp_Object redisplay_window_0 P_ ((Lisp_Object));
 static Lisp_Object redisplay_window_1 P_ ((Lisp_Object));
-static void update_menu_bar P_ ((struct frame *, int));
+static int update_menu_bar P_ ((struct frame *, int, int));
 static int try_window_reusing_current_matrix P_ ((struct window *));
 static int try_window_id P_ ((struct window *));
 static int display_line P_ ((struct it *));
@@ -9190,6 +9190,9 @@
     {
       Lisp_Object tail, frame;
       int count = SPECPDL_INDEX ();
+      /* 1 means that update_menu_bar has run its hooks
+	 so any further calls to update_menu_bar shouldn't do so again.  */
+      int menu_bar_hooks_run = 0;
 
       record_unwind_save_match_data ();
 
@@ -9221,7 +9224,7 @@
 	    }
 
 	  GCPRO1 (tail);
-	  update_menu_bar (f, 0);
+	  menu_bar_hooks_run = update_menu_bar (f, 0, menu_bar_hooks_run);
 #ifdef HAVE_WINDOW_SYSTEM
 	  update_tool_bar (f, 0);
 #ifdef MAC_OS
@@ -9236,7 +9239,7 @@
   else
     {
       struct frame *sf = SELECTED_FRAME ();
-      update_menu_bar (sf, 1);
+      update_menu_bar (sf, 1, 0);
 #ifdef HAVE_WINDOW_SYSTEM
       update_tool_bar (sf, 1);
 #ifdef MAC_OS
@@ -9257,12 +9260,18 @@
    before we start to fill in any display lines, because it can call
    eval.
 
-   If SAVE_MATCH_DATA is non-zero, we must save and restore it here.  */
-
-static void
-update_menu_bar (f, save_match_data)
+   If SAVE_MATCH_DATA is non-zero, we must save and restore it here.
+
+   If HOOKS_RUN is 1, that means a previous call to update_menu_bar
+   already ran the menu bar hooks for this redisplay, so there
+   is no need to run them again.  The return value is the
+   updated value of this flag, to pass to the next call.  */
+
+static int
+update_menu_bar (f, save_match_data, hooks_run)
      struct frame *f;
      int save_match_data;
+     int hooks_run;
 {
   Lisp_Object window;
   register struct window *w;
@@ -9327,15 +9336,21 @@
 	      specbind (Qoverriding_local_map, Qnil);
 	    }
 
-	  /* Run the Lucid hook.  */
-	  safe_run_hooks (Qactivate_menubar_hook);
-
-	  /* If it has changed current-menubar from previous value,
-	     really recompute the menu-bar from the value.  */
-	  if (! NILP (Vlucid_menu_bar_dirty_flag))
-	    call0 (Qrecompute_lucid_menubar);
-
-	  safe_run_hooks (Qmenu_bar_update_hook);
+	  if (!hooks_run)
+	    {
+	      /* Run the Lucid hook.  */
+	      safe_run_hooks (Qactivate_menubar_hook);
+
+	      /* If it has changed current-menubar from previous value,
+		 really recompute the menu-bar from the value.  */
+	      if (! NILP (Vlucid_menu_bar_dirty_flag))
+		call0 (Qrecompute_lucid_menubar);
+
+	      safe_run_hooks (Qmenu_bar_update_hook);
+
+	      hooks_run = 1;
+	    }
+
 	  FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
 
 	  /* Redisplay the menu bar in case we changed it.  */
@@ -9364,6 +9379,8 @@
 	  set_buffer_internal_1 (prev);
 	}
     }
+
+  return hooks_run;
 }