emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master dc1d2d3: Fix bugs caused by running window change f


From: Martin Rudalics
Subject: [Emacs-diffs] master dc1d2d3: Fix bugs caused by running window change functions during redisplay
Date: Sat, 2 Feb 2019 03:45:04 -0500 (EST)

branch: master
commit dc1d2d3c22ab91b8b52188574680a028851fbda8
Author: Martin Rudalics <address@hidden>
Commit: Martin Rudalics <address@hidden>

    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).
---
 src/window.c |  1 +
 src/xdisp.c  | 27 +++------------------------
 2 files changed, 4 insertions(+), 24 deletions(-)

diff --git a/src/window.c b/src/window.c
index 1b474a6..49d7fc2 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 ec8dd86..b5034b5 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]