Call 'window-size-change-functions' for mini-windows

* 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'.
This commit is contained in:
Eli Zaretskii 2015-11-21 13:30:30 +02:00
parent 3858b7949f
commit 3ca44a1ad4
3 changed files with 38 additions and 8 deletions

View 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

View 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 ();
}

View 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,