diff options
author | Martin Rudalics <rudalics@gmx.at> | 2019-02-02 09:43:34 +0100 |
---|---|---|
committer | Martin Rudalics <rudalics@gmx.at> | 2019-02-02 09:43:34 +0100 |
commit | dc1d2d3c22ab91b8b52188574680a028851fbda8 (patch) | |
tree | 1b77668b8b5f0eba7ce1ce07ad5f7f7ea4098c7d | |
parent | c0052dd43dc1c4a7a68e6b26edf6cd30d926373a (diff) | |
download | emacs-dc1d2d3c22ab91b8b52188574680a028851fbda8.tar.gz |
Fix bugs caused by running window change functions during redisplay
* src/xdisp.c (redisplay_internal): Run window change
functions before updating the display so changes induced by
these functions can get caught by redisplay (Bug#34138).
* src/window.c (run_window_change_functions): Bind
Qinhibit_redisplay to avoid that the minibuffer window gets
resized while running window change functions (Bug#34179,
Bug#34260).
-rw-r--r-- | src/window.c | 1 | ||||
-rw-r--r-- | src/xdisp.c | 27 |
2 files changed, 4 insertions, 24 deletions
diff --git a/src/window.c b/src/window.c index 1b474a663a4..49d7fc2426b 100644 --- a/src/window.c +++ b/src/window.c @@ -3710,6 +3710,7 @@ run_window_change_functions (void) ptrdiff_t count_outer = SPECPDL_INDEX (); record_unwind_protect_void (window_change_record); + specbind (Qinhibit_redisplay, Qt); FOR_EACH_FRAME (tail, frame) { diff --git a/src/xdisp.c b/src/xdisp.c index ec8dd862302..b5034b513e6 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -14153,6 +14153,9 @@ redisplay_internal (void) clear_garbaged_frames (); } + if (!NILP (Vrun_hooks)) + run_window_change_functions (); + if (windows_or_buffers_changed && !update_mode_lines) /* Code that sets windows_or_buffers_changed doesn't distinguish whether only the windows's contents needs to be refreshed, or whether the @@ -14332,18 +14335,6 @@ redisplay_internal (void) && (w = XWINDOW (selected_window)) != sw) goto retry; - if (!NILP (Vrun_hooks)) - { - run_window_change_functions (); - - /* If windows or buffers changed or selected_window - changed, redisplay again. */ - if ((windows_or_buffers_changed) - || (WINDOWP (selected_window) - && (w = XWINDOW (selected_window)) != sw)) - goto retry; - } - /* We used to always goto end_of_redisplay here, but this isn't enough if we have a blinking cursor. */ if (w->cursor_off_p == w->last_cursor_off_p) @@ -14707,18 +14698,6 @@ redisplay_internal (void) && (w = XWINDOW (selected_window)) != sw)) goto retry; - if (!NILP (Vrun_hooks)) - { - run_window_change_functions (); - - /* If windows or buffers changed or selected_window changed, - redisplay again. */ - if ((windows_or_buffers_changed) - || (WINDOWP (selected_window) - && (w = XWINDOW (selected_window)) != sw)) - goto retry; - } - /* Clear the face and image caches. We used to do this only if consider_all_windows_p. But the cache |