]> git.eshelyaron.com Git - emacs.git/commitdiff
Call 'window-size-change-functions' for mini-windows
authorEli Zaretskii <eliz@gnu.org>
Sat, 21 Nov 2015 11:30:30 +0000 (13:30 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 21 Nov 2015 11:30:30 +0000 (13:30 +0200)
* src/window.c (grow_mini_window, shrink_mini_window): Set the
frame's 'window_sizes_changed' flag.
* src/xdisp.c (redisplay_internal): Call the hooks on
'window-size-change-functions' if the call to 'echo_area_display'
sets the frame's 'window_sizes_changed' flag.
(syms_of_xdisp) <window-size-change-functions>:
Update doc string to indicate the mini-window resizes trigger a
call to the hooks, and don't promise that will happen "before
redisplay".  (Bug#19576, Bug#21333)

* doc/lispref/windows.texi (Window Hooks): Update the description
of 'window-size-change-functions'.

doc/lispref/windows.texi
src/window.c
src/xdisp.c

index 357247ef433af18c93223e5c71507cd87df0d346..d0f62549a5b87a2db886e91ef26a4e429b39647f 100644 (file)
@@ -4264,10 +4264,10 @@ work.
 @end defvar
 
 @defvar window-size-change-functions
-This variable holds a list of functions to be called if the size of any
-window changes for any reason.  The functions are called just once per
-redisplay, and just once for each frame on which size changes have
-occurred.
+This variable holds a list of functions to be called if the size of
+any window changes for any reason.  The functions are called at the
+beginning of a redisplay cycle, and just once for each frame on which
+size changes have occurred.
 
 Each function receives the frame as its sole argument.  There is no
 direct way to find out which windows on that frame have changed size, or
index 0ac76d418613bc59bcb161d02ae61c8db5a2c1eb..753c4ab81236b7ebb04643cf83b352fc7c8b6305 100644 (file)
@@ -4555,6 +4555,7 @@ grow_mini_window (struct window *w, int delta, bool pixelwise)
          /* Enforce full redisplay of the frame.  */
          /* FIXME: Shouldn't window--resize-root-window-vertically do it?  */
          fset_redisplay (f);
+         FRAME_WINDOW_SIZES_CHANGED (f) = true;
          adjust_frame_glyphs (f);
          unblock_input ();
        }
@@ -4594,6 +4595,7 @@ shrink_mini_window (struct window *w, bool pixelwise)
          /* Enforce full redisplay of the frame.  */
          /* FIXME: Shouldn't window--resize-root-window-vertically do it?  */
          fset_redisplay (f);
+         FRAME_WINDOW_SIZES_CHANGED (f) = true;
          adjust_frame_glyphs (f);
          unblock_input ();
        }
index 30dfac556014a1419bee08a292db8f5879a9ea00..85d356e9ba51f425891565012c90a1e66e2ef2bb 100644 (file)
@@ -13536,6 +13536,32 @@ redisplay_internal (void)
     {
       echo_area_display (false);
 
+      /* If echo_area_display resizes the mini-window, the redisplay and
+        window_sizes_changed flags of the selected frame are set, but
+        it's too late for the hooks in window-size-change-functions,
+        which have been examined already in prepare_menu_bars.  So in
+        that case we call the hooks here only for the selected frame.  */
+      if (sf->redisplay && FRAME_WINDOW_SIZES_CHANGED (sf))
+       {
+         Lisp_Object functions;
+         ptrdiff_t count1 = SPECPDL_INDEX ();
+
+         record_unwind_save_match_data ();
+
+         /* Clear flag first in case we get an error below.  */
+         FRAME_WINDOW_SIZES_CHANGED (sf) = false;
+         functions = Vwindow_size_change_functions;
+
+         while (CONSP (functions))
+           {
+             if (!EQ (XCAR (functions), Qt))
+               call1 (XCAR (functions), selected_frame);
+             functions = XCDR (functions);
+           }
+
+         unbind_to (count1, Qnil);
+       }
+
       if (message_cleared_p)
        update_miniwindow_p = true;
 
@@ -31132,11 +31158,13 @@ the buffer when it becomes large.  */);
   Vmessage_log_max = make_number (1000);
 
   DEFVAR_LISP ("window-size-change-functions", Vwindow_size_change_functions,
-    doc: /* Functions called before redisplay, if window sizes have changed.
+    doc: /* Functions called during redisplay, if window sizes have changed.
 The value should be a list of functions that take one argument.
-Just before redisplay, for each frame, if any of its windows have changed
-size since the last redisplay, or have been split or deleted,
-all the functions in the list are called, with the frame as argument.  */);
+During the first part of redisplay, for each frame, if any of its windows
+have changed size since the last redisplay, or have been split or deleted,
+all the functions in the list are called, with the frame as argument.
+If redisplay decides to resize the minibuffer window, it calls these
+functions on behalf of that as well.  */);
   Vwindow_size_change_functions = Qnil;
 
   DEFVAR_LISP ("window-scroll-functions", Vwindow_scroll_functions,