# HG changeset patch # User Richard M. Stallman # Date 823065108 0 # Node ID e73b37519cdc205f372b2fd8bac5896efca0ee62 # Parent 1999513cc3b215611249b718642e4ea7a61e6a58 (Fset_window_buffer): Set buffer temporarily around running the window-scroll-functions. (Fset_window_buffer_unwind): New function. (window_initialized): New variable. (init_window_once): Set it. diff -r 1999513cc3b2 -r e73b37519cdc src/window.c --- a/src/window.c Wed Jan 31 02:23:25 1996 +0000 +++ b/src/window.c Wed Jan 31 05:11:48 1996 +0000 @@ -108,6 +108,9 @@ /* Incremented for each window created. */ static int sequence_number; +/* Nonzero after init_window_once has finished. */ +static int window_initialized; + #define min(a, b) ((a) < (b) ? (a) : (b)) extern Lisp_Object Qwindow_scroll_functions, Vwindow_scroll_functions; @@ -1825,6 +1828,14 @@ int window_select_count; +Lisp_Object +Fset_window_buffer_unwind (obuf) + Lisp_Object obuf; +{ + Fset_buffer (obuf); + return Qnil; +} + DEFUN ("set-window-buffer", Fset_window_buffer, Sset_window_buffer, 2, 2, 0, "Make WINDOW display BUFFER as its contents.\n\ BUFFER can be a buffer or buffer name.") @@ -1833,6 +1844,7 @@ { register Lisp_Object tem; register struct window *w = decode_window (window); + int count = specpdl_ptr - specpdl; buffer = Fget_buffer (buffer); CHECK_BUFFER (buffer, 1); @@ -1867,12 +1879,26 @@ w->force_start = Qnil; XSETFASTINT (w->last_modified, 0); windows_or_buffers_changed++; + + /* We must select BUFFER for running the window-scroll-functions. + If WINDOW is selected, switch permanently. + Otherwise, switch but go back to the ambient buffer afterward. */ if (EQ (window, selected_window)) Fset_buffer (buffer); + /* We can't check ! NILP (Vwindow_scroll_functions) here + because that might itself be a local variable. */ + else if (window_initialized) + { + record_unwind_protect (Fset_window_buffer_unwind, Fcurrent_buffer ()); + Fset_buffer (buffer); + } + if (! NILP (Vwindow_scroll_functions)) run_hook_with_args_2 (Qwindow_scroll_functions, window, Fmarker_position (w->start)); + unbind_to (count, Qnil); + return Qnil; } @@ -3464,6 +3490,8 @@ something newer than this. */ XSETFASTINT (XWINDOW (selected_window)->use_time, ++window_select_count); #endif /* not MULTI_FRAME */ + + window_initialized = 1; } syms_of_window ()