changeset 31431:552ca9b4218d v9.0.1048

patch 9.0.1048: with "screenline" in 'culopt' cursorline highlight is wrong Commit: https://github.com/vim/vim/commit/b7acea1806996a9afb9fb8ebfe571b5181063070 Author: zeertzjq <zeertzjq@outlook.com> Date: Mon Dec 12 13:20:43 2022 +0000 patch 9.0.1048: with "screenline" in 'culopt' cursorline highlight is wrong Problem: With "screenline" in 'culopt' cursorline highlight is wrong. Solution: Apply the priority logic also when "screenline is in 'culopt'. (closes #11696)
author Bram Moolenaar <Bram@vim.org>
date Mon, 12 Dec 2022 14:30:05 +0100
parents e5e95e8c78a7
children 564574ecbe03
files src/drawline.c src/testdir/dumps/Test_quickfix_cwindow_3.dump src/testdir/dumps/Test_quickfix_cwindow_4.dump src/testdir/test_quickfix.vim src/testdir/test_signs.vim src/version.c
diffstat 6 files changed, 49 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -985,6 +985,36 @@ win_line_continue(winlinevars_T *wlv)
 	wlv->char_attr = wlv->win_attr;
 }
 
+#ifdef FEAT_SYN_HL
+    static void
+apply_cursorline_highlight(
+	winlinevars_T *wlv,
+	int sign_present UNUSED)
+{
+    wlv->cul_attr = HL_ATTR(HLF_CUL);
+# ifdef FEAT_SIGNS
+    // Combine the 'cursorline' and sign highlighting, depending on
+    // the sign priority.
+    if (sign_present && wlv->sattr.sat_linehl > 0)
+    {
+	if (wlv->sattr.sat_priority >= 100)
+	    wlv->line_attr = hl_combine_attr(wlv->cul_attr, wlv->line_attr);
+	else
+	    wlv->line_attr = hl_combine_attr(wlv->line_attr, wlv->cul_attr);
+    }
+    else
+# endif
+# if defined(FEAT_QUICKFIX)
+	// let the line attribute overrule 'cursorline', otherwise
+	// it disappears when both have background set;
+	// 'cursorline' can use underline or bold to make it show
+	wlv->line_attr = hl_combine_attr(wlv->cul_attr, wlv->line_attr);
+# else
+	wlv->line_attr = wlv->cul_attr;
+# endif
+}
+#endif
+
 /*
  * Display line "lnum" of window 'wp' on the screen.
  * Start at row "startrow", stop when "endrow" is reached.
@@ -1728,35 +1758,10 @@ win_line(
 	    wlv.cul_screenline = (wp->w_p_wrap
 				   && (wp->w_p_culopt_flags & CULOPT_SCRLINE));
 
-	    // Only set wlv.line_attr here when "screenline" is not present in
-	    // 'cursorlineopt'.  Otherwise it's done later.
+	    // Only apply CursorLine highlight here when "screenline" is not
+	    // present in 'cursorlineopt'.  Otherwise it's done later.
 	    if (!wlv.cul_screenline)
-	    {
-		wlv.cul_attr = HL_ATTR(HLF_CUL);
-# ifdef FEAT_SIGNS
-		// Combine the 'cursorline' and sign highlighting, depending on
-		// the sign priority.
-		if (sign_present && wlv.sattr.sat_linehl > 0)
-		{
-		    if (wlv.sattr.sat_priority >= 100)
-			wlv.line_attr = hl_combine_attr(
-						  wlv.cul_attr, wlv.line_attr);
-		    else
-			wlv.line_attr = hl_combine_attr(
-						  wlv.line_attr, wlv.cul_attr);
-		}
-		else
-# endif
-# if defined(FEAT_QUICKFIX)
-		    // let the line attribute overrule 'cursorline', otherwise
-		    // it disappears when both have background set;
-		    // 'cursorline' can use underline or bold to make it show
-		    wlv.line_attr = hl_combine_attr(
-						  wlv.cul_attr, wlv.line_attr);
-# else
-		    wlv.line_attr = wlv.cul_attr;
-# endif
-	    }
+		apply_cursorline_highlight(&wlv, sign_present);
 	    else
 	    {
 		line_attr_save = wlv.line_attr;
@@ -1850,8 +1855,7 @@ win_line(
 		&& wlv.vcol >= left_curline_col
 		&& wlv.vcol < right_curline_col)
 	{
-	    wlv.cul_attr = HL_ATTR(HLF_CUL);
-	    wlv.line_attr = wlv.cul_attr;
+	    apply_cursorline_highlight(&wlv, sign_present);
 	}
 #endif
 
--- a/src/testdir/dumps/Test_quickfix_cwindow_3.dump
+++ b/src/testdir/dumps/Test_quickfix_cwindow_3.dump
@@ -9,4 +9,4 @@
 |X+0#0000e05#ffffff0|C|w|i|n|d|o|w||+0#0000000&|4+0#af5f00255&| |c|o|l| |6|-|7||+0#0000000&| |m|a|t|c|h|e|s| @47
 |~+0#4040ff13&| @73
 |[+3#0000000&|Q|u|i|c|k|f|i|x| |L|i|s|t|]| |:|v|i|m|g|r|e|p| |e| |X|C|w|i|n|d|o|w| @20|2|,|1| @12|A|l@1
-|:+0&&|s|e|t| |c|u|r|s|o|r|l|i|n|e| @59
+|:+0&&| @73
--- a/src/testdir/dumps/Test_quickfix_cwindow_4.dump
+++ b/src/testdir/dumps/Test_quickfix_cwindow_4.dump
@@ -9,4 +9,4 @@
 >X+8#0000e05#ffffff0|C|w|i|n|d|o|w||+8#0000000&|4+8#af5f00255&| |c|o|l| |6|-|7||+8#0000000&| |m|a|t|c|h|e|s| @47
 |~+0#4040ff13&| @73
 |[+3#0000000&|Q|u|i|c|k|f|i|x| |L|i|s|t|]| |:|v|i|m|g|r|e|p| |e| |X|C|w|i|n|d|o|w| @20|3|,|1| @12|A|l@1
-|:+0&&|s|e|t| |c|u|r|s|o|r|l|i|n|e| @59
+|:+0&&| @73
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -3120,6 +3120,11 @@ func Test_cwindow_highlight()
   call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {})
 
   call term_sendkeys(buf, "\<C-W>j:set cursorline\<CR>")
+  call term_sendkeys(buf, ":\<CR>")
+  call VerifyScreenDump(buf, 'Test_quickfix_cwindow_3', {})
+
+  call term_sendkeys(buf, ":set cursorlineopt=number,screenline\<CR>")
+  call term_sendkeys(buf, ":\<CR>")
   call VerifyScreenDump(buf, 'Test_quickfix_cwindow_3', {})
 
   call term_sendkeys(buf, "j")
--- a/src/testdir/test_signs.vim
+++ b/src/testdir/test_signs.vim
@@ -1805,12 +1805,18 @@ func Test_sign_cursor_position()
   call term_sendkeys(buf, "2G")
   call term_sendkeys(buf, ":\<CR>")
   call VerifyScreenDump(buf, 'Test_sign_cursor_5', {})
+  call term_sendkeys(buf, ":set cursorlineopt=number,screenline\<CR>")
+  call term_sendkeys(buf, ":\<CR>")
+  call VerifyScreenDump(buf, 'Test_sign_cursor_5', {})
 
   " sign highlighting overrules 'cursorline'
   call term_sendkeys(buf, ":sign unplace 12\<CR>")
   call term_sendkeys(buf, ":sign place 13 line=2 priority=100 name=s2\<CR>")
   call term_sendkeys(buf, ":\<CR>")
   call VerifyScreenDump(buf, 'Test_sign_cursor_6', {})
+  call term_sendkeys(buf, ":set cursorlineopt&\<CR>")
+  call term_sendkeys(buf, ":\<CR>")
+  call VerifyScreenDump(buf, 'Test_sign_cursor_6', {})
 
   " clean up
   call StopVimInTerminal(buf)
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1048,
+/**/
     1047,
 /**/
     1046,