diff options
| author | Eli Zaretskii | 2011-02-13 20:55:07 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2011-02-13 20:55:07 +0200 |
| commit | a73d395bd9e31e29814d642bf35d412ccb6f0ee2 (patch) | |
| tree | 879214a20e03a576c8c304c69e829ef09c46e424 | |
| parent | 165bc5a066990bace024c04ba431f140a25d0bfd (diff) | |
| download | emacs-a73d395bd9e31e29814d642bf35d412ccb6f0ee2.tar.gz emacs-a73d395bd9e31e29814d642bf35d412ccb6f0ee2.zip | |
Fix bug #8020 with quick resizing of the selected frame.
xdisp.c (redisplay_internal): Resynchronize `w' if the selected
window is changed inside calls to do_pending_window_change.
| -rw-r--r-- | src/ChangeLog | 6 | ||||
| -rw-r--r-- | src/xdisp.c | 21 |
2 files changed, 25 insertions, 2 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index b90a9c02e8b..68e9c76a437 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | 2011-02-13 Eli Zaretskii <eliz@gnu.org> | ||
| 2 | |||
| 3 | * xdisp.c (redisplay_internal): Resynchronize `w' if the selected | ||
| 4 | window is changed inside calls to do_pending_window_change. | ||
| 5 | (Bug#8020) | ||
| 6 | |||
| 1 | 2011-02-12 Eli Zaretskii <eliz@gnu.org> | 7 | 2011-02-12 Eli Zaretskii <eliz@gnu.org> |
| 2 | 8 | ||
| 3 | * terminal.c (create_terminal): Use default-keyboard-coding-system | 9 | * terminal.c (create_terminal): Use default-keyboard-coding-system |
diff --git a/src/xdisp.c b/src/xdisp.c index d625b05075d..c2af4d68b6e 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -11261,6 +11261,7 @@ redisplay_internal (preserve_echo_area) | |||
| 11261 | int preserve_echo_area; | 11261 | int preserve_echo_area; |
| 11262 | { | 11262 | { |
| 11263 | struct window *w = XWINDOW (selected_window); | 11263 | struct window *w = XWINDOW (selected_window); |
| 11264 | struct window *sw; | ||
| 11264 | struct frame *f; | 11265 | struct frame *f; |
| 11265 | int pause; | 11266 | int pause; |
| 11266 | int must_finish = 0; | 11267 | int must_finish = 0; |
| @@ -11331,6 +11332,9 @@ redisplay_internal (preserve_echo_area) | |||
| 11331 | } | 11332 | } |
| 11332 | 11333 | ||
| 11333 | retry: | 11334 | retry: |
| 11335 | /* Remember the currently selected window. */ | ||
| 11336 | sw = w; | ||
| 11337 | |||
| 11334 | if (!EQ (old_frame, selected_frame) | 11338 | if (!EQ (old_frame, selected_frame) |
| 11335 | && FRAME_LIVE_P (XFRAME (old_frame))) | 11339 | && FRAME_LIVE_P (XFRAME (old_frame))) |
| 11336 | /* When running redisplay, we play a bit fast-and-loose and allow e.g. | 11340 | /* When running redisplay, we play a bit fast-and-loose and allow e.g. |
| @@ -11396,6 +11400,14 @@ redisplay_internal (preserve_echo_area) | |||
| 11396 | /* Notice any pending interrupt request to change frame size. */ | 11400 | /* Notice any pending interrupt request to change frame size. */ |
| 11397 | do_pending_window_change (1); | 11401 | do_pending_window_change (1); |
| 11398 | 11402 | ||
| 11403 | /* do_pending_window_change could change the selected_window due to | ||
| 11404 | frame resizing which makes the selected window too small. */ | ||
| 11405 | if (WINDOWP (selected_window) && (w = XWINDOW (selected_window)) != sw) | ||
| 11406 | { | ||
| 11407 | sw = w; | ||
| 11408 | reconsider_clip_changes (w, current_buffer); | ||
| 11409 | } | ||
| 11410 | |||
| 11399 | /* Clear frames marked as garbaged. */ | 11411 | /* Clear frames marked as garbaged. */ |
| 11400 | if (frame_garbaged) | 11412 | if (frame_garbaged) |
| 11401 | clear_garbaged_frames (); | 11413 | clear_garbaged_frames (); |
| @@ -11665,6 +11677,10 @@ redisplay_internal (preserve_echo_area) | |||
| 11665 | if (!must_finish) | 11677 | if (!must_finish) |
| 11666 | { | 11678 | { |
| 11667 | do_pending_window_change (1); | 11679 | do_pending_window_change (1); |
| 11680 | /* If selected_window changed, redisplay again. */ | ||
| 11681 | if (WINDOWP (selected_window) | ||
| 11682 | && (w = XWINDOW (selected_window)) != sw) | ||
| 11683 | goto retry; | ||
| 11668 | 11684 | ||
| 11669 | /* We used to always goto end_of_redisplay here, but this | 11685 | /* We used to always goto end_of_redisplay here, but this |
| 11670 | isn't enough if we have a blinking cursor. */ | 11686 | isn't enough if we have a blinking cursor. */ |
| @@ -11959,8 +11975,9 @@ redisplay_internal (preserve_echo_area) | |||
| 11959 | do_pending_window_change (1); | 11975 | do_pending_window_change (1); |
| 11960 | 11976 | ||
| 11961 | /* If we just did a pending size change, or have additional | 11977 | /* If we just did a pending size change, or have additional |
| 11962 | visible frames, redisplay again. */ | 11978 | visible frames, or selected_window changed, redisplay again. */ |
| 11963 | if (windows_or_buffers_changed && !pause) | 11979 | if ((windows_or_buffers_changed && !pause) |
| 11980 | || (WINDOWP (selected_window) && (w = XWINDOW (selected_window)) != sw)) | ||
| 11964 | goto retry; | 11981 | goto retry; |
| 11965 | 11982 | ||
| 11966 | /* Clear the face cache eventually. */ | 11983 | /* Clear the face cache eventually. */ |