diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2007-09-06 02:13:47 +0000 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2007-09-06 02:13:47 +0000 |
commit | 9859458022d0884ae31257aaff7f231d75b8ab8f (patch) | |
tree | 3671e98ee9d1f28dd18330deb39f66ac9496436e | |
parent | fad930b66dfefc13e7e98e0a1b1da444a8e10197 (diff) | |
download | emacs-9859458022d0884ae31257aaff7f231d75b8ab8f.tar.gz emacs-9859458022d0884ae31257aaff7f231d75b8ab8f.tar.bz2 emacs-9859458022d0884ae31257aaff7f231d75b8ab8f.zip |
(redisplay_internal): Make sure Elisp code always sees
consistent values of selected_frame and selected_window.
-rw-r--r-- | src/ChangeLog | 5 | ||||
-rw-r--r-- | src/xdisp.c | 9 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index d5f43d3899c..e873cd12283 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -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. diff --git a/src/xdisp.c b/src/xdisp.c index d16e13ef722..618a53836a1 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -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; |