fix(ui): adjust 'smoothscroll' for inner dimensions

This commit is contained in:
Luuk van Baal 2023-05-02 12:00:42 +02:00
parent 3b906af27f
commit 5b111a8f00
4 changed files with 35 additions and 35 deletions

View File

@ -1451,7 +1451,7 @@ static void win_update(win_T *wp, DecorProviders *providers)
// width.
if (wp->w_skipcol > 0) {
int w = 0;
int width1 = wp->w_width - win_col_off(wp);
int width1 = wp->w_width_inner - win_col_off(wp);
int width2 = width1 + win_col_off2(wp);
int add = width1;

View File

@ -541,13 +541,13 @@ void grid_put_linebuf(ScreenGrid *grid, int row, int coloff, int endcol, int cle
if (wp->w_p_nu && wp->w_p_rnu) {
// do not overwrite the line number, change "123 text" to
// "123>>>xt".
while (skip < wp->w_width && ascii_isdigit(*linebuf_char[off])) {
while (skip < wp->w_width_inner && ascii_isdigit(*linebuf_char[off])) {
off++;
skip++;
}
}
for (int i = 0; i < 3 && i + skip < wp->w_width; i++) {
for (int i = 0; i < 3 && i + skip < wp->w_width_inner; i++) {
schar_from_ascii(linebuf_char[off], '<');
linebuf_attr[off] = HL_ATTR(HLF_AT);
off++;

View File

@ -1418,7 +1418,7 @@ bool mouse_comp_pos(win_T *win, int *rowp, int *colp, linenr_T *lnump)
if (win->w_skipcol > 0 && lnum == win->w_topline) {
// Adjust for 'smoothscroll' clipping the top screen lines.
// A similar formula is used in curs_columns().
int width1 = win->w_width - win_col_off(win);
int width1 = win->w_width_inner - win_col_off(win);
int skip_lines = 0;
if (win->w_skipcol > width1) {
skip_lines = (win->w_skipcol - width1) / (width1 + win_col_off2(win)) + 1;

View File

@ -65,7 +65,7 @@ static int adjust_plines_for_skipcol(win_T *wp, int n)
}
int off = 0;
int width = wp->w_width - win_col_off(wp);
int width = wp->w_width_inner - win_col_off(wp);
if (wp->w_skipcol >= width) {
off++;
int skip = wp->w_skipcol - width;
@ -88,8 +88,8 @@ static int plines_correct_topline(win_T *wp, linenr_T lnum, linenr_T *nextp, boo
if (lnum == wp->w_topline) {
n = adjust_plines_for_skipcol(wp, n);
}
if (n > wp->w_height) {
return wp->w_height;
if (n > wp->w_height_inner) {
return wp->w_height_inner;
}
return n;
}
@ -184,7 +184,7 @@ static int smoothscroll_marker_overlap(win_T *wp, int extra2)
/// physical lines we want to scroll down.
static int skipcol_from_plines(win_T *wp, int plines_off)
{
int width1 = wp->w_width - win_col_off(wp);
int width1 = wp->w_width_inner - win_col_off(wp);
int skipcol = 0;
if (plines_off > 0) {
@ -830,8 +830,8 @@ void curs_columns(win_T *wp, int may_scroll)
wp->w_wrow = wp->w_cline_row;
int n;
int width1 = wp->w_width - extra; // text width for first screen line
int width2 = 0; // text width for second and later screen line
int width1 = wp->w_width_inner - extra; // text width for first screen line
int width2 = 0; // text width for second and later screen line
bool did_sub_skipcol = false;
if (width1 <= 0) {
// No room for text, put cursor in last char of window.
@ -973,7 +973,7 @@ void curs_columns(win_T *wp, int may_scroll)
extra += 2;
}
if (extra == 3 || wp->w_height <= so * 2) {
if (extra == 3 || wp->w_height_inner <= so * 2) {
// not enough room for 'scrolloff', put cursor in the middle
n = wp->w_virtcol / width2;
if (n > wp->w_height_inner / 2) {
@ -1188,7 +1188,7 @@ bool scrolldown(long line_count, int byfold)
bool do_sms = curwin->w_p_wrap && curwin->w_p_sms;
if (do_sms) {
width1 = curwin->w_width - curwin_col_off();
width1 = curwin->w_width_inner - curwin_col_off();
width2 = width1 + curwin_col_off2();
}
@ -1307,8 +1307,8 @@ bool scrolldown(long line_count, int byfold)
row += (int)col / width2;
col = col % width2;
}
if (row >= curwin->w_height) {
curwin->w_curswant = curwin->w_virtcol - (row - curwin->w_height + 1) * width2;
if (row >= curwin->w_height_inner) {
curwin->w_curswant = curwin->w_virtcol - (row - curwin->w_height_inner + 1) * width2;
coladvance(curwin->w_curswant);
}
}
@ -1334,7 +1334,7 @@ bool scrollup(long line_count, int byfold)
int do_sms = curwin->w_p_wrap && curwin->w_p_sms;
if (scrolling_screenlines(byfold) || win_may_fill(curwin)) {
int width1 = curwin->w_width - curwin_col_off();
int width1 = curwin->w_width_inner - curwin_col_off();
int width2 = width1 + curwin_col_off2();
unsigned size = 0;
linenr_T prev_topline = curwin->w_topline;
@ -1424,12 +1424,12 @@ bool scrollup(long line_count, int byfold)
int col_off = curwin_col_off();
int col_off2 = curwin_col_off2();
int width1 = curwin->w_width - col_off;
int width1 = curwin->w_width_inner - col_off;
int width2 = width1 + col_off2;
int extra2 = col_off - col_off2;
long so = get_scrolloff_value(curwin);
long scrolloff_cols = so == 0 ? 0 : width1 + (so - 1) * width2;
int space_cols = (curwin->w_height - 1) * width2;
int space_cols = (curwin->w_height_inner - 1) * width2;
// If we have non-zero scrolloff, just ignore the <<< marker as we are
// going past it anyway.
@ -1474,7 +1474,7 @@ void adjust_skipcol(void)
return;
}
int width1 = curwin->w_width - curwin_col_off();
int width1 = curwin->w_width_inner - curwin_col_off();
if (width1 <= 0) {
return; // no text will be displayed
}
@ -1484,10 +1484,10 @@ void adjust_skipcol(void)
bool scrolled = false;
validate_cheight();
if (curwin->w_cline_height == curwin->w_height
// w_cline_height may be capped at w_height, check there aren't
if (curwin->w_cline_height == curwin->w_height_inner
// w_cline_height may be capped at w_height_inner, check there aren't
// actually more lines.
&& plines_win(curwin, curwin->w_cursor.lnum, false) <= curwin->w_height) {
&& plines_win(curwin, curwin->w_cursor.lnum, false) <= curwin->w_height_inner) {
// the line just fits in the window, don't scroll
reset_skipcol(curwin);
return;
@ -1519,13 +1519,13 @@ void adjust_skipcol(void)
row += (int)col / width2;
col = col % width2;
}
if (row >= curwin->w_height) {
if (row >= curwin->w_height_inner) {
if (curwin->w_skipcol == 0) {
curwin->w_skipcol += width1;
row--;
}
if (row >= curwin->w_height) {
curwin->w_skipcol += (row - curwin->w_height) * width2;
if (row >= curwin->w_height_inner) {
curwin->w_skipcol += (row - curwin->w_height_inner) * width2;
}
redraw_later(curwin, UPD_NOT_VALID);
}
@ -1885,14 +1885,14 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
if (loff.height == MAXCOL) {
break;
}
if (used + loff.height > curwin->w_height) {
if (used + loff.height > curwin->w_height_inner) {
if (curwin->w_p_sms && curwin->w_p_wrap) {
// 'smoothscroll' and 'wrap' are set. The above line is
// too long to show in its entirety, so we show just a part
// of it.
if (used < curwin->w_height) {
int plines_offset = used + loff.height - curwin->w_height;
used = curwin->w_height;
if (used < curwin->w_height_inner) {
int plines_offset = used + loff.height - curwin->w_height_inner;
used = curwin->w_height_inner;
curwin->w_topfill = loff.fill;
curwin->w_topline = loff.lnum;
curwin->w_skipcol = skipcol_from_plines(curwin, plines_offset);
@ -1950,7 +1950,7 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
// top line before we can move on to the other lines.
int top_plines = plines_win_nofill(curwin, curwin->w_topline, false);
int skip_lines = 0;
int width1 = curwin->w_width - curwin_col_off();
int width1 = curwin->w_width_inner - curwin_col_off();
int width2 = width1 + curwin_col_off2();
// similar formula is used in curs_columns()
if (curwin->w_skipcol > width1) {
@ -1960,9 +1960,9 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
}
top_plines -= skip_lines;
if (top_plines > curwin->w_height) {
scrolled += (top_plines - curwin->w_height);
min_scrolled += (top_plines - curwin->w_height);
if (top_plines > curwin->w_height_inner) {
scrolled += (top_plines - curwin->w_height_inner);
min_scrolled += (top_plines - curwin->w_height_inner);
}
}
}
@ -2073,7 +2073,7 @@ void scroll_cursor_bot(int min_scroll, int set_topbot)
if (curwin->w_p_wrap && curwin->w_p_sms && line_count < min_scrolled
&& (curwin->w_cursor.lnum < curwin->w_topline
|| (curwin->w_virtcol - curwin->w_skipcol >=
curwin->w_width - curwin_col_off()))) {
curwin->w_width_inner - curwin_col_off()))) {
line_count = min_scrolled;
}
if (line_count > 0) {
@ -2119,7 +2119,7 @@ void scroll_cursor_halfway(bool atend, bool prefer_above)
if (curwin->w_p_sms && curwin->w_p_wrap) {
// 'smoothscroll' and 'wrap' are set
smooth_scroll = true;
half_height = (curwin->w_height - used) / 2;
half_height = (curwin->w_height_inner - used) / 2;
used = 0;
}
@ -2268,7 +2268,7 @@ void cursor_correct(void)
if (curwin->w_p_sms && !curwin->w_p_wrap) {
// 'smoothscroll is active
if (curwin->w_cline_height == curwin->w_height) {
if (curwin->w_cline_height == curwin->w_height_inner) {
// The cursor line just fits in the window, don't scroll.
reset_skipcol(curwin);
return;