changeset 13266:d6bba071525c

(try_window_id): Stop the compute_motion at ZV, not Z, when checking if all changes are below the window. (Qredisplay_end_trigger_hook): New variable. (syms_of_xdisp): Set up Lisp variable. (display_text_line): Run the hook when appropriate.
author Richard M. Stallman <rms@gnu.org>
date Sat, 21 Oct 1995 23:16:16 +0000
parents dbc038e66ea6
children 12d329dd9940
files src/xdisp.c
diffstat 1 files changed, 33 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Sat Oct 21 23:15:21 1995 +0000
+++ b/src/xdisp.c	Sat Oct 21 23:16:16 1995 +0000
@@ -50,6 +50,7 @@
 
 Lisp_Object Qoverriding_local_map, Qoverriding_terminal_local_map;
 Lisp_Object Qwindow_scroll_functions, Vwindow_scroll_functions;
+Lisp_Object Qredisplay_end_trigger_hook;
 
 /* Nonzero means print newline to stdout before next minibuffer message.  */
 
@@ -1911,12 +1912,12 @@
     {
       if (PT < bp.bufpos)
 	{
-	  /* All changes are below the frame, and point is on the frame.
-	     We don't need to change the frame at all.
+	  /* All changes are beyond the window end, and point is on the screen.
+	     We don't need to change the text at all.
 	     But we need to update window_end_pos to account for
 	     any change in buffer size.  */
 	  bp = *compute_motion (start, 0, lmargin, 0,
-				Z, height, 0,
+				ZV, height, 0,
 				width, hscroll, pos_tab_offset (w, start), w);
 	  XSETFASTINT (w->window_end_vpos, height);
 	  XSETFASTINT (w->window_end_pos, Z - bp.bufpos);
@@ -2616,6 +2617,8 @@
     {
       if (pos >= pause)
 	{
+	  int e_t_h;
+
 	  while (pos == next_boundary)
 	    {
 	      Lisp_Object position, limit, prop, ww;
@@ -2707,6 +2710,27 @@
 					      &next_face_change, pos + 50, 0);
 #endif
 
+	  /* Figure out where (if at all) the
+	     redisplay_end_trigger-hook should run.  */
+	  if (MARKERP (current_buffer->redisplay_end_trigger))
+	    e_t_h = marker_position (current_buffer->redisplay_end_trigger);
+	  else if (INTEGERP (current_buffer->redisplay_end_trigger))
+	    e_t_h = XINT (current_buffer->redisplay_end_trigger);
+	  else
+	    e_t_h = ZV;
+
+	  /* If we've gone past the place to run a hook,
+	     run the hook.  */
+	  if (pos >= e_t_h && e_t_h != ZV)
+	    {
+	      call1 (Vrun_hooks, Qredisplay_end_trigger_hook);
+	      current_buffer->redisplay_end_trigger = Qnil;
+	      e_t_h = ZV;
+	    }
+
+	  /* Compute the next place we need to stop
+	     and do something special; set PAUSE.  */
+
 	  pause = ZV;
 
 	  if (pos < next_boundary && next_boundary < pause)
@@ -2714,6 +2738,9 @@
 	  if (pos < next_face_change && next_face_change < pause)
 	    pause = next_face_change;
 
+	  if (e_t_h < pause)
+	    pause = e_t_h;
+
 	  /* Wouldn't you hate to read the next line to someone over
              the phone?  */
 	  if (pos < PT && PT < pause)
@@ -4202,6 +4229,9 @@
   staticpro (&Qwindow_scroll_functions);
   Qwindow_scroll_functions = intern ("window-scroll-functions");
 
+  staticpro (&Qredisplay_end_trigger_hook);
+  Qredisplay_end_trigger_hook = intern ("redisplay-end-trigger-hook");
+
   staticpro (&last_arrow_position);
   staticpro (&last_arrow_string);
   last_arrow_position = Qnil;