patch 8.2.4389: screenpos() does not handle a position in a closed fold
Problem: screenpos() does not handle a position in a closed fold.
Solution: Check if the position is inside a closed fold. (closes #9778)
diff --git a/src/move.c b/src/move.c
index f52e4c0..1c88e6e 100644
--- a/src/move.c
+++ b/src/move.c
@@ -1236,39 +1236,54 @@
if (pos->lnum >= wp->w_topline && pos->lnum <= wp->w_botline)
{
- colnr_T off;
- colnr_T col;
- int width;
+ colnr_T off;
+ colnr_T col;
+ int width;
+ linenr_T lnum = pos->lnum;
+#ifdef FEAT_FOLDING
+ int is_folded;
- row = plines_m_win(wp, wp->w_topline, pos->lnum - 1) + 1;
- getvcol(wp, pos, &scol, &ccol, &ecol);
-
- // similar to what is done in validate_cursor_col()
- col = scol;
- off = win_col_off(wp);
- col += off;
- width = wp->w_width - off + win_col_off2(wp);
-
- // long line wrapping, adjust row
- if (wp->w_p_wrap
- && col >= (colnr_T)wp->w_width
- && width > 0)
+ is_folded = hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL);
+#endif
+ row = plines_m_win(wp, wp->w_topline, lnum - 1) + 1;
+#ifdef FEAT_FOLDING
+ if (is_folded)
{
- // use same formula as what is used in curs_columns()
- rowoff = ((col - wp->w_width) / width + 1);
- col -= rowoff * width;
- }
- col -= wp->w_leftcol;
- if (col >= wp->w_width)
- col = -1;
- if (col >= 0 && row + rowoff <= wp->w_height)
- {
- coloff = col - scol + wp->w_wincol + 1;
row += W_WINROW(wp);
+ coloff = wp->w_wincol + 1;
}
else
- // character is left, right or below of the window
- row = rowoff = scol = ccol = ecol = 0;
+#endif
+ {
+ getvcol(wp, pos, &scol, &ccol, &ecol);
+
+ // similar to what is done in validate_cursor_col()
+ col = scol;
+ off = win_col_off(wp);
+ col += off;
+ width = wp->w_width - off + win_col_off2(wp);
+
+ // long line wrapping, adjust row
+ if (wp->w_p_wrap
+ && col >= (colnr_T)wp->w_width
+ && width > 0)
+ {
+ // use same formula as what is used in curs_columns()
+ rowoff = ((col - wp->w_width) / width + 1);
+ col -= rowoff * width;
+ }
+ col -= wp->w_leftcol;
+ if (col >= wp->w_width)
+ col = -1;
+ if (col >= 0 && row + rowoff <= wp->w_height)
+ {
+ coloff = col - scol + wp->w_wincol + 1;
+ row += W_WINROW(wp);
+ }
+ else
+ // character is left, right or below of the window
+ row = rowoff = scol = ccol = ecol = 0;
+ }
}
*rowp = row + rowoff;
*scolp = scol + coloff;