changeset 56584:e22bbc6b44d1

(compute_motion): Use actual window width if WIDTH is -1, properly accounting for continuation glyph on non-window systems. (Fcompute_motion): Use actual window width if WIDTH is nil, and actual window width/height if TOPOS is nil, properly accounting for continuation glyphs on non-window systems, and optional header lines. (vmotion): Let compute_motion calculate actual window width.
author Kim F. Storm <storm@cua.dk>
date Mon, 02 Aug 2004 15:06:06 +0000
parents 64ae47cb68ff
children f2ea7576ac6e
files src/indent.c
diffstat 1 files changed, 48 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/indent.c	Sun Aug 01 23:10:06 2004 +0000
+++ b/src/indent.c	Mon Aug 02 15:06:06 2004 +0000
@@ -1131,6 +1131,9 @@
 
    WIDTH is the number of columns available to display text;
    compute_motion uses this to handle continuation lines and such.
+   If WIDTH is -1, use width of window's text area adjusted for
+   continuation glyph when needed.
+
    HSCROLL is the number of columns not being displayed at the left
    margin; this is usually taken from a window's hscroll member.
    TAB_OFFSET is the number of columns of the first tab that aren't
@@ -1245,6 +1248,17 @@
   if (tab_width <= 0 || tab_width > 1000)
     tab_width = 8;
 
+  /* Negative width means use all available text columns.  */
+  if (width < 0)
+    {
+      width = window_box_text_cols (win);
+      /* We must make room for continuation marks if we don't have fringes.  */
+#ifdef HAVE_WINDOW_SYSTEM
+      if (!FRAME_WINDOW_P (XFRAME (win->frame)))
+#endif
+	width -= 1;
+    }
+
   immediate_quit = 1;
   QUIT;
 
@@ -1368,7 +1382,7 @@
 	{
 	  if (hscroll
 	      || (truncate_partial_width_windows
-		  && width + 1 < FRAME_COLS (XFRAME (WINDOW_FRAME (win))))
+		  && width < FRAME_COLS (XFRAME (WINDOW_FRAME (win))))
 	      || !NILP (current_buffer->truncate_lines))
 	    {
 	      /* Truncating: skip to newline, unless we are already past
@@ -1737,12 +1751,14 @@
 to position TO or position TOPOS--another cons of the form (HPOS . VPOS)--
 and return the ending buffer position and screen location.
 
+If TOPOS is nil, the actual width and height of the window's
+text area are used.
+
 There are three additional arguments:
 
 WIDTH is the number of columns available to display text;
-this affects handling of continuation lines.
-This is usually the value returned by `window-width', less one (to allow
-for the continuation glyph).
+this affects handling of continuation lines.  A value of nil
+corresponds to the actual number of available text columns.
 
 OFFSETS is either nil or a cons cell (HSCROLL . TAB-OFFSET).
 HSCROLL is the number of columns not being displayed at the left
@@ -1774,6 +1790,7 @@
      Lisp_Object from, frompos, to, topos;
      Lisp_Object width, offsets, window;
 {
+  struct window *w;
   Lisp_Object bufpos, hpos, vpos, prevhpos;
   struct position *pos;
   int hscroll, tab_offset;
@@ -1783,10 +1800,15 @@
   CHECK_NUMBER_CAR (frompos);
   CHECK_NUMBER_CDR (frompos);
   CHECK_NUMBER_COERCE_MARKER (to);
-  CHECK_CONS (topos);
-  CHECK_NUMBER_CAR (topos);
-  CHECK_NUMBER_CDR (topos);
-  CHECK_NUMBER (width);
+  if (!NILP (topos))
+    {
+      CHECK_CONS (topos);
+      CHECK_NUMBER_CAR (topos);
+      CHECK_NUMBER_CDR (topos);
+    }
+  if (!NILP (width))
+    CHECK_NUMBER (width);
+
   if (!NILP (offsets))
     {
       CHECK_CONS (offsets);
@@ -1802,6 +1824,7 @@
     window = Fselected_window ();
   else
     CHECK_LIVE_WINDOW (window);
+  w = XWINDOW (window);
 
   if (XINT (from) < BEGV || XINT (from) > ZV)
     args_out_of_range_3 (from, make_number (BEGV), make_number (ZV));
@@ -1810,9 +1833,20 @@
 
   pos = compute_motion (XINT (from), XINT (XCDR (frompos)),
 			XINT (XCAR (frompos)), 0,
-			XINT (to), XINT (XCDR (topos)),
-			XINT (XCAR (topos)),
-			XINT (width), hscroll, tab_offset,
+			XINT (to),
+			(NILP (topos)
+			 ? window_internal_height (w)
+			 : XINT (XCDR (topos))),
+			(NILP (topos)
+			 ? (window_box_text_cols (w)
+			    - (
+#ifdef HAVE_WINDOW_SYSTEM
+			       FRAME_WINDOW_P (XFRAME (w->frame)) ? 0 :
+#endif
+			       1))
+			 : XINT (XCAR (topos))),
+			(NILP (width) ? -1 : XINT (width)),
+			hscroll, tab_offset,
 			XWINDOW (window));
 
   XSETFASTINT (bufpos, pos->bufpos);
@@ -1837,7 +1871,6 @@
      register int from, vtarget;
      struct window *w;
 {
-  int width = window_box_text_cols (w);
   int hscroll = XINT (w->hscroll);
   struct position pos;
   /* vpos is cumulative vertical position, changed as from is changed */
@@ -1858,12 +1891,6 @@
 
   XSETWINDOW (window, w);
 
-  /* We must make room for continuation marks if we don't have fringes.  */
-#ifdef HAVE_WINDOW_SYSTEM
-  if (!FRAME_WINDOW_P (XFRAME (w->frame)))
-#endif
-    width -= 1;
-
   /* If the window contains this buffer, use it for getting text properties.
      Otherwise use the current buffer as arg for doing that.  */
   if (EQ (w->buffer, Fcurrent_buffer ()))
@@ -1905,7 +1932,7 @@
 				 1 << (BITS_PER_SHORT - 1),
 				 /* ... nor HPOS.  */
 				 1 << (BITS_PER_SHORT - 1),
-				 width, hscroll,
+				 -1, hscroll,
 				 /* This compensates for start_hpos
 				    so that a tab as first character
 				    still occupies 8 columns.  */
@@ -1964,7 +1991,7 @@
 			     1 << (BITS_PER_SHORT - 1),
 			     /* ... nor HPOS.  */
 			     1 << (BITS_PER_SHORT - 1),
-			     width, hscroll,
+			     -1, hscroll,
 			     (XFASTINT (prevline) == BEG ? -start_hpos : 0),
 			     w);
       did_motion = 1;
@@ -1978,7 +2005,7 @@
     }
   return compute_motion (from, vpos, pos.hpos, did_motion,
 			 ZV, vtarget, - (1 << (BITS_PER_SHORT - 1)),
-			 width, hscroll,
+			 -1, hscroll,
 			 pos.tab_offset - (from == BEG ? start_hpos : 0),
 			 w);
 }