]> code.delx.au - gnu-emacs/commitdiff
(compute_motion): Use actual window width if WIDTH is -1,
authorKim F. Storm <storm@cua.dk>
Mon, 2 Aug 2004 15:06:06 +0000 (15:06 +0000)
committerKim F. Storm <storm@cua.dk>
Mon, 2 Aug 2004 15:06:06 +0000 (15:06 +0000)
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.

src/indent.c

index 091c702ac2cfd2bd92b8b834083d6d881ec042ef..6cb82c18f0493a8236a7e058de782e89ba2cdafb 100644 (file)
@@ -1131,6 +1131,9 @@ struct position val_compute_motion;
 
    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 @@ compute_motion (from, fromvpos, fromhpos, did_motion, to, tovpos, tohpos, width,
   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 @@ compute_motion (from, fromvpos, fromhpos, did_motion, to, tovpos, tohpos, width,
        {
          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 @@ assuming it is at position FROMPOS--a cons of the form (HPOS . VPOS)--
 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 @@ visible section of the buffer, and pass LINE and COL as TOPOS.  */)
      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 @@ visible section of the buffer, and pass LINE and COL as TOPOS.  */)
   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 @@ visible section of the buffer, and pass LINE and COL as TOPOS.  */)
     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 @@ visible section of the buffer, and pass LINE and COL as TOPOS.  */)
 
   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 @@ vmotion (from, vtarget, w)
      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 @@ vmotion (from, vtarget, w)
 
   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 @@ vmotion (from, vtarget, w)
                                 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 @@ vmotion (from, vtarget, w)
                             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 @@ vmotion (from, vtarget, w)
     }
   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);
 }