(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.
This commit is contained in:
Kim F. Storm 2004-08-02 15:06:06 +00:00
parent 39b1da208b
commit 361f14bf11

View 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);
}