(redisplay_internal): Make sure Elisp code always sees
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 6 Sep 2007 02:13:47 +0000 (02:13 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 6 Sep 2007 02:13:47 +0000 (02:13 +0000)
consistent values of selected_frame and selected_window.

src/ChangeLog
src/xdisp.c

index d5f43d3..e873cd1 100644 (file)
@@ -1,3 +1,8 @@
+2007-09-06  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * xdisp.c (redisplay_internal): Make sure Elisp code always sees
+       consistent values of selected_frame and selected_window.
+
 2007-09-04  Jason Rumney  <jasonr@gnu.org>
 
        * w32console.c (initialize_w32_display): Zero unused hooks.
index d16e13e..618a538 100644 (file)
@@ -10847,6 +10847,7 @@ redisplay_internal (preserve_echo_area)
   int count, count1;
   struct frame *sf;
   int polling_stopped_here = 0;
+  Lisp_Object old_frame = selected_frame;
 
   /* Non-zero means redisplay has to consider all windows on all
      frames.  Zero means, only selected_window is considered.  */
@@ -10908,6 +10909,14 @@ redisplay_internal (preserve_echo_area)
   }
 
  retry:
+  if (!EQ (old_frame, selected_frame)
+      && FRAME_LIVE_P (XFRAME (old_frame)))
+    /* When running redisplay, we play a bit fast-and-loose and allow e.g.
+       selected_frame and selected_window to be temporarily out-of-sync so
+       when we come back here via `goto retry', we need to resync because we
+       may need to run Elisp code (via prepare_menu_bars).  */
+    select_frame_for_redisplay (old_frame);
+
   pause = 0;
   reconsider_clip_changes (w, current_buffer);
   last_escape_glyph_frame = NULL;