changeset 83903:e9cafec4b205

(redisplay_internal): Make sure Elisp code always sees consistent values of selected_frame and selected_window.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Thu, 06 Sep 2007 02:13:47 +0000
parents 4224061ee52d
children 2ca0336093b3
files src/ChangeLog src/xdisp.c
diffstat 2 files changed, 14 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Wed Sep 05 19:59:01 2007 +0000
+++ b/src/ChangeLog	Thu Sep 06 02:13:47 2007 +0000
@@ -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.
--- a/src/xdisp.c	Wed Sep 05 19:59:01 2007 +0000
+++ b/src/xdisp.c	Thu Sep 06 02:13:47 2007 +0000
@@ -10847,6 +10847,7 @@
   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 @@
   }
 
  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;