# HG changeset patch # User Christian Brabandt # Date 1710666905 -3600 # Node ID 74baeec0f24fd7b85500147b89fc0698b69b8d57 # Parent 8d6ef1b3e394d43d6a8d6bed35d286628a024c59 patch 9.1.0185: 'wincolor' hl missing with 'rightleft', "below" virttext, 'nowrap' Commit: https://github.com/vim/vim/commit/f6272551bdae3f265b6948a4155b079c37fe110f Author: zeertzjq Date: Sun Mar 17 10:01:47 2024 +0100 patch 9.1.0185: 'wincolor' hl missing with 'rightleft', "below" virttext, 'nowrap' Problem: 'wincolor' highlight missing with 'rightleft', "below" virtual text and 'nowrap'. Solution: Handle 'rightleft' in draw_screen_line() (zeertzjq). closes: #14216 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt diff --git a/src/drawline.c b/src/drawline.c --- a/src/drawline.c +++ b/src/drawline.c @@ -886,6 +886,7 @@ draw_screen_line(win_T *wp, winlinevars_ { #ifdef FEAT_SYN_HL long v; + int wcol; // Highlight 'cursorcolumn' & 'colorcolumn' past end of the line. if (wp->w_p_wrap) @@ -893,9 +894,14 @@ draw_screen_line(win_T *wp, winlinevars_ else v = wp->w_leftcol; + wcol = +# ifdef FEAT_RIGHTLEFT + wp->w_p_rl ? wp->w_width - wlv->col - 1 : +# endif + wlv->col; // check if line ends before left margin - if (wlv->vcol < v + wlv->col - win_col_off(wp)) - wlv->vcol = v + wlv->col - win_col_off(wp); + if (wlv->vcol < v + wcol - win_col_off(wp)) + wlv->vcol = v + wcol - win_col_off(wp); # ifdef FEAT_CONCEAL // Get rid of the boguscols now, we want to draw until the right // edge for 'cursorcolumn'. @@ -918,11 +924,7 @@ draw_screen_line(win_T *wp, winlinevars_ # ifdef LINE_ATTR || wlv->line_attr != 0 # endif - || wlv->win_attr != 0) -# ifdef FEAT_RIGHTLEFT - && !wp->w_p_rl -# endif - ) + || wlv->win_attr != 0)) { int rightmost_vcol = 0; int i; @@ -935,13 +937,16 @@ draw_screen_line(win_T *wp, winlinevars_ if (rightmost_vcol < wlv->color_cols[i]) rightmost_vcol = wlv->color_cols[i]; - while (wlv->col < wp->w_width) + while ( +# ifdef FEAT_RIGHTLEFT + wp->w_p_rl ? (wlv->col >= 0) : +# endif + (wlv->col < wp->w_width)) { ScreenLines[wlv->off] = ' '; if (enc_utf8) ScreenLinesUC[wlv->off] = 0; - ScreenCols[wlv->off] = wlv->vcol; - ++wlv->col; + if (wlv->draw_color_col) wlv->draw_color_col = advance_color_col( VCOL_HLC, &wlv->color_cols); @@ -956,7 +961,20 @@ draw_screen_line(win_T *wp, winlinevars_ attr = hl_combine_attr(attr, HL_ATTR(HLF_CUC)); else if (wlv->draw_color_col && VCOL_HLC == *wlv->color_cols) attr = hl_combine_attr(attr, HL_ATTR(HLF_MC)); - ScreenAttrs[wlv->off++] = attr; + ScreenAttrs[wlv->off] = attr; + ScreenCols[wlv->off] = wlv->vcol; +# ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl) + { + --wlv->off; + --wlv->col; + } + else +# endif + { + ++wlv->off; + ++wlv->col; + } if (VCOL_HLC >= rightmost_vcol # ifdef LINE_ATTR diff --git a/src/testdir/dumps/Test_prop_wincolor_9.dump b/src/testdir/dumps/Test_prop_wincolor_9.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_prop_wincolor_9.dump @@ -0,0 +1,8 @@ +| +8&#af5f00255@29| +8&#ffd7d7255| +8&#af5f00255@1> @12|e|r|e|h| |t|x|e|t| |e|m|o|s +| @51|W+8fd7ff255|O|L|E|B| +8&#af5f00255@2 +| +0&#ffd7ff255@29| +0&#ffd7d7255| +0&#ffd7ff255@1| +0&#e0e0e08|e+0&#ffd7ff255|r|e|h| |t|x|e|t| |r|e|g|n|o|l| |h|c|u|m| |e|m|o|s +| @29| +0&#ffd7d7255| +0&#ffd7ff255@1| +0&#e0e0e08| +0&#ffd7ff255@3|R+0&#ffff4012|E|T|F|A| +0&#ffd7ff255@2|e|r|e|h| |t|x|e|t| |e|r|o|m +| +0#4040ff13&@58|~ +| @58|~ +| @58|~ +|:+0#0000000#ffffff0| @40|1|,|1|5|-|2|7| @6|A|l@1| diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -4535,6 +4535,11 @@ func Test_textprop_with_wincolor() call term_sendkeys(buf, 'k') call VerifyScreenDump(buf, 'Test_prop_wincolor_8', {}) + if has('rightleft') + call term_sendkeys(buf, ":set rightleft\:\") + call VerifyScreenDump(buf, 'Test_prop_wincolor_9', {}) + endif + call StopVimInTerminal(buf) endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 185, +/**/ 184, /**/ 183,