changeset 53143:49489d2151bf

(enum window_loop): Add REDISPLAY_BUFFER_WINDOWS. (window_loop): Handle REDISPLAY_BUFFER_WINDOWS. (Fforce_window_update): New defun. (syms_of_window): Defsubr it. (Fset_window_margins, Fset_window_fringes): Doc fix.
author Kim F. Storm <storm@cua.dk>
date Sun, 23 Nov 2003 21:47:24 +0000
parents ca4ed7c00061
children 99a669ece962
files src/window.c
diffstat 1 files changed, 61 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/window.c	Sun Nov 23 21:29:45 2003 +0000
+++ b/src/window.c	Sun Nov 23 21:47:24 2003 +0000
@@ -1829,6 +1829,7 @@
   DELETE_BUFFER_WINDOWS,	/* Arg is buffer */
   GET_LARGEST_WINDOW,
   UNSHOW_BUFFER,		/* Arg is buffer */
+  REDISPLAY_BUFFER_WINDOWS,	/* Arg is buffer */
   CHECK_ALL_WINDOWS
 };
 
@@ -2027,6 +2028,14 @@
 	      }
 	    break;
 
+	  case REDISPLAY_BUFFER_WINDOWS:
+	    if (EQ (w->buffer, obj))
+	      {
+		mark_window_display_accurate (window, 0);
+		best_window = window;
+	      }
+	    break;
+
 	    /* Check for a window that has a killed buffer.  */
 	  case CHECK_ALL_WINDOWS:
 	    if (! NILP (w->buffer)
@@ -3428,6 +3437,46 @@
   return display_buffer_1 (window);
 }
 
+
+DEFUN ("force-window-update", Fforce_window_update, Sforce_window_update,
+       0, 1, 0,
+       doc: /* Force redisplay of all windows.
+If optional arg OBJECT is a window, force redisplay of that window only.
+If OBJECT is a buffer or buffer name, force redisplay of all windows 
+displaying that buffer.  */)
+     (object)
+     Lisp_Object object;
+{
+  if (NILP (object))
+    {
+      windows_or_buffers_changed++;
+      return Qt;
+    }
+
+  if (WINDOWP (object))
+    {
+      mark_window_display_accurate (object, 0);
+      return Qt;
+    }
+    
+  if (STRINGP (object))
+    object = Fget_buffer (object);
+  if (BUFFERP (object) && !NILP (XBUFFER (object)->name))
+    {
+      /* Walk all windows looking for buffer, and force update
+	 of each of those windows.  */
+
+      object = window_loop (REDISPLAY_BUFFER_WINDOWS, object, 0, Qvisible);
+      return NILP (object) ? Qnil : Qt;
+    }
+
+  /* If nothing suitable was found, just return.
+     We could signal an error, but this feature will typically be used
+     asynchronously in timers or process sentinels, so we don't.  */
+  return Qnil;
+}
+
+
 void
 temp_output_buffer_show (buf)
      register Lisp_Object buf;
@@ -5844,11 +5893,11 @@
 DEFUN ("set-window-margins", Fset_window_margins, Sset_window_margins,
        2, 3, 0,
        doc: /* Set width of marginal areas of window WINDOW.
-If window is nil, set margins of the currently selected window.
-First parameter LEFT-WIDTH specifies the number of character
-cells to reserve for the left marginal area.  Second parameter
-RIGHT-WIDTH does the same for the right marginal area.
-A nil width parameter means no margin.  */)
+If WINDOW is nil, set margins of the currently selected window.
+Second arg LEFT-WIDTH specifies the number of character cells to
+reserve for the left marginal area.  Optional third arg RIGHT-WIDTH
+does the same for the right marginal area.  A nil width parameter
+means no margin.  */)
      (window, left, right)
      Lisp_Object window, left, right;
 {
@@ -5910,17 +5959,14 @@
 DEFUN ("set-window-fringes", Fset_window_fringes, Sset_window_fringes,
        2, 4, 0,
        doc: /* Set the fringe widths of window WINDOW.
-
 If WINDOW is nil, set the fringe widths of the currently selected
 window.
-
-The second parameter LEFT-WIDTH specifies the number of pixels to
-reserve for the left fringe.  The third parameter RIGHT-WIDTH
-specifies the right fringe width.  If a fringe width parameter is nil,
-that means to use the frame's default fringe width.  Default fringe
-widths can be set with the command `set-fringe-style'.
-
-If the fourth parameter OUTSIDE-MARGINS is non-nil, draw the fringes
+Second arg LEFT-WIDTH specifies the number of pixels to reserve for
+the left fringe.  Optional third arg RIGHT-WIDTH specifies the right
+fringe width.  If a fringe width arg is nil, that means to use the
+frame's default fringe width.  Default fringe widths can be set with
+the command `set-fringe-style'.
+If optional fourth arg OUTSIDE-MARGINS is non-nil, draw the fringes
 outside of the display margins.  By default, fringes are drawn between
 display marginal areas and the text area.  */)
      (window, left, right, outside_margins)
@@ -6605,6 +6651,7 @@
   defsubr (&Sspecial_display_p);
   defsubr (&Ssame_window_p);
   defsubr (&Sdisplay_buffer);
+  defsubr (&Sforce_window_update);
   defsubr (&Ssplit_window);
   defsubr (&Senlarge_window);
   defsubr (&Sshrink_window);