To: vim_dev@googlegroups.com Subject: Patch 9.0.0891 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0891 Problem: Virtual text below after match has wrong highlight. Solution: Restore search_attr only after the virtual text. (closes #11446) Files: src/drawline.c, src/testdir/test_textprop.vim, src/testdir/dumps/Test_prop_with_text_below_after_match_1.dump *** ../vim-9.0.0890/src/drawline.c 2022-11-02 13:30:37.530314524 +0000 --- src/drawline.c 2022-11-16 22:09:45.173889596 +0000 *************** *** 130,141 **** --- 130,145 ---- char_u *p_extra; // string of extra chars, plus NUL, only used // when c_extra and c_final are NUL char_u *p_extra_free; // p_extra buffer that needs to be freed + int extra_attr; // attributes for p_extra int c_extra; // extra chars, all the same int c_final; // final char, mandatory if set + int extra_for_textprop; // wlv.n_extra set for textprop // saved "extra" items for when draw_state becomes WL_LINE (again) int saved_n_extra; char_u *saved_p_extra; + int saved_extra_attr; + int saved_extra_for_textprop; int saved_c_extra; int saved_c_final; int saved_char_attr; *************** *** 915,920 **** --- 919,926 ---- wlv->draw_state = WL_START; wlv->saved_n_extra = wlv->n_extra; wlv->saved_p_extra = wlv->p_extra; + wlv->saved_extra_attr = wlv->extra_attr; + wlv->saved_extra_for_textprop = wlv->extra_for_textprop; wlv->saved_c_extra = wlv->c_extra; wlv->saved_c_final = wlv->c_final; #ifdef FEAT_SYN_HL *************** *** 944,949 **** --- 950,957 ---- wlv->c_extra = wlv->saved_c_extra; wlv->c_final = wlv->saved_c_final; wlv->p_extra = wlv->saved_p_extra; + wlv->extra_attr = wlv->saved_extra_attr; + wlv->extra_for_textprop = wlv->saved_extra_for_textprop; wlv->char_attr = wlv->saved_char_attr; } else *************** *** 976,982 **** #ifdef FEAT_PROP_POPUP char_u *p_extra_free2 = NULL; // another p_extra to be freed #endif - int extra_attr = 0; // attributes when n_extra != 0 #if defined(FEAT_LINEBREAK) && defined(FEAT_PROP_POPUP) int in_linebreak = FALSE; // n_extra set for showing linebreak #endif --- 984,989 ---- *************** *** 987,993 **** // prec until it's been used int n_attr = 0; // chars with special attr ! int n_attr_skip = 0; // chars to skip before using extra_attr int saved_attr2 = 0; // char_attr saved for n_attr int n_attr3 = 0; // chars with overruling special attr int saved_attr3 = 0; // char_attr saved for n_attr3 --- 994,1000 ---- // prec until it's been used int n_attr = 0; // chars with special attr ! int n_attr_skip = 0; // chars to skip bef. using wlv.extra_attr int saved_attr2 = 0; // char_attr saved for n_attr int n_attr3 = 0; // chars with overruling special attr int saved_attr3 = 0; // char_attr saved for n_attr3 *************** *** 1028,1034 **** int *text_prop_idxs = NULL; int text_props_active = 0; proptype_T *text_prop_type = NULL; - int extra_for_textprop = FALSE; // wlv.n_extra set for textprop int text_prop_attr = 0; int text_prop_attr_comb = 0; // text_prop_attr combined with // syntax_attr --- 1035,1040 ---- *************** *** 1905,1911 **** ++text_prop_next; } ! if (wlv.n_extra == 0 || !extra_for_textprop) { text_prop_attr = 0; text_prop_attr_comb = 0; --- 1911,1917 ---- ++text_prop_next; } ! if (wlv.n_extra == 0 || !wlv.extra_for_textprop) { text_prop_attr = 0; text_prop_attr_comb = 0; *************** *** 1990,1997 **** wlv.c_extra = NUL; wlv.c_final = NUL; wlv.n_extra = (int)STRLEN(p); ! extra_for_textprop = TRUE; ! extra_attr = used_attr; n_attr = mb_charlen(p); // restore search_attr and area_attr when n_extra // is down to zero --- 1996,2003 ---- wlv.c_extra = NUL; wlv.c_final = NUL; wlv.n_extra = (int)STRLEN(p); ! wlv.extra_for_textprop = TRUE; ! wlv.extra_attr = used_attr; n_attr = mb_charlen(p); // restore search_attr and area_attr when n_extra // is down to zero *************** *** 2390,2401 **** #if defined(FEAT_PROP_POPUP) if (wlv.n_extra <= 0) { ! extra_for_textprop = FALSE; in_linebreak = FALSE; ! if (search_attr == 0) ! search_attr = saved_search_attr; ! if (area_attr == 0 && *ptr != NUL) ! area_attr = saved_area_attr; } #endif } --- 2396,2413 ---- #if defined(FEAT_PROP_POPUP) if (wlv.n_extra <= 0) { ! wlv.extra_for_textprop = FALSE; in_linebreak = FALSE; ! ! // only restore search_attr and area_attr after extra in the ! // next screen line is also done ! if (wlv.saved_n_extra <= 0) ! { ! if (search_attr == 0) ! search_attr = saved_search_attr; ! if (area_attr == 0 && *ptr != NUL) ! area_attr = saved_area_attr; ! } } #endif } *************** *** 2468,2474 **** if (area_attr == 0 && search_attr == 0) { n_attr = wlv.n_extra + 1; ! extra_attr = hl_combine_attr( wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = wlv.char_attr; // save current attr } --- 2480,2486 ---- if (area_attr == 0 && search_attr == 0) { n_attr = wlv.n_extra + 1; ! wlv.extra_attr = hl_combine_attr( wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = wlv.char_attr; // save current attr } *************** *** 2538,2544 **** if (area_attr == 0 && search_attr == 0) { n_attr = wlv.n_extra + 1; ! extra_attr = hl_combine_attr( wlv.win_attr, HL_ATTR(HLF_8)); // save current attr saved_attr2 = wlv.char_attr; --- 2550,2556 ---- if (area_attr == 0 && search_attr == 0) { n_attr = wlv.n_extra + 1; ! wlv.extra_attr = hl_combine_attr( wlv.win_attr, HL_ATTR(HLF_8)); // save current attr saved_attr2 = wlv.char_attr; *************** *** 2584,2590 **** if (area_attr == 0 && search_attr == 0) { n_attr = wlv.n_extra + 1; ! extra_attr = hl_combine_attr( wlv.win_attr, HL_ATTR(HLF_AT)); saved_attr2 = wlv.char_attr; // save current attr } --- 2596,2602 ---- if (area_attr == 0 && search_attr == 0) { n_attr = wlv.n_extra + 1; ! wlv.extra_attr = hl_combine_attr( wlv.win_attr, HL_ATTR(HLF_AT)); saved_attr2 = wlv.char_attr; // save current attr } *************** *** 2781,2787 **** if (area_attr == 0 && search_attr == 0) { n_attr = 1; ! extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = wlv.char_attr; // save current attr } --- 2793,2799 ---- if (area_attr == 0 && search_attr == 0) { n_attr = 1; ! wlv.extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = wlv.char_attr; // save current attr } *************** *** 2821,2827 **** if (!attr_pri) { n_attr = 1; ! extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = wlv.char_attr; // save current attr } --- 2833,2839 ---- if (!attr_pri) { n_attr = 1; ! wlv.extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = wlv.char_attr; // save current attr } *************** *** 2976,2982 **** wlv.c_extra = wp->w_lcs_chars.tab2; wlv.c_final = wp->w_lcs_chars.tab3; n_attr = tab_len + 1; ! extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = wlv.char_attr; // save current attr mb_c = c; --- 2988,2994 ---- wlv.c_extra = wp->w_lcs_chars.tab2; wlv.c_final = wp->w_lcs_chars.tab3; n_attr = tab_len + 1; ! wlv.extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = wlv.char_attr; // save current attr mb_c = c; *************** *** 3043,3049 **** --ptr; // put it back at the NUL if (!attr_pri) { ! extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_AT)); n_attr = 1; } --- 3055,3061 ---- --ptr; // put it back at the NUL if (!attr_pri) { ! wlv.extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_AT)); n_attr = 1; } *************** *** 3090,3096 **** if (!attr_pri) { n_attr = wlv.n_extra + 1; ! extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = wlv.char_attr; // save current attr } --- 3102,3108 ---- if (!attr_pri) { n_attr = wlv.n_extra + 1; ! wlv.extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = wlv.char_attr; // save current attr } *************** *** 3284,3292 **** } #endif ! // Use "extra_attr", but don't override visual selection highlighting, ! // unless text property overrides. ! // Don't use "extra_attr" until n_attr_skip is zero. if (n_attr_skip == 0 && n_attr > 0 && wlv.draw_state == WL_LINE && (!attr_pri --- 3296,3304 ---- } #endif ! // Use "wlv.extra_attr", but don't override visual selection ! // highlighting, unless text property overrides. ! // Don't use "wlv.extra_attr" until n_attr_skip is zero. if (n_attr_skip == 0 && n_attr > 0 && wlv.draw_state == WL_LINE && (!attr_pri *************** *** 3297,3306 **** { #ifdef LINE_ATTR if (line_attr) ! wlv.char_attr = hl_combine_attr(line_attr, extra_attr); else #endif ! wlv.char_attr = extra_attr; } #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) --- 3309,3318 ---- { #ifdef LINE_ATTR if (line_attr) ! wlv.char_attr = hl_combine_attr(line_attr, wlv.extra_attr); else #endif ! wlv.char_attr = wlv.extra_attr; } #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) *************** *** 3364,3370 **** wlv.c_final = NUL; wlv.n_extra = 1; n_attr = 2; ! extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_AT)); } mb_c = c; if (enc_utf8 && utf_char2len(c) > 1) --- 3376,3383 ---- wlv.c_final = NUL; wlv.n_extra = 1; n_attr = 2; ! wlv.extra_attr = ! hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_AT)); } mb_c = c; if (enc_utf8 && utf_char2len(c) > 1) *** ../vim-9.0.0890/src/testdir/test_textprop.vim 2022-11-13 12:54:46.718898500 +0000 --- src/testdir/test_textprop.vim 2022-11-16 22:06:00.230006258 +0000 *************** *** 2709,2714 **** --- 2709,2737 ---- call StopVimInTerminal(buf) endfunc + func Test_prop_with_text_below_after_match() + CheckRunVimInTerminal + + let lines =<< trim END + vim9script + + setline(1, ['vim9script', 'some text']) + set signcolumn=yes + matchaddpos('Search', [[1, 10]]) + prop_type_add('test', {highlight: 'Error'}) + prop_add(1, 0, { + type: 'test', + text: 'The quick brown fox', + text_align: 'below' + }) + END + call writefile(lines, 'XscriptPropsBelow', 'D') + let buf = RunVimInTerminal('-S XscriptPropsBelow', #{rows: 8, cols: 60}) + call VerifyScreenDump(buf, 'Test_prop_with_text_below_after_match_1', {}) + + call StopVimInTerminal(buf) + endfunc + func Test_props_with_text_after_joined() CheckRunVimInTerminal *** ../vim-9.0.0890/src/testdir/dumps/Test_prop_with_text_below_after_match_1.dump 2022-11-16 22:11:53.817838145 +0000 --- src/testdir/dumps/Test_prop_with_text_below_after_match_1.dump 2022-11-16 22:06:27.453989930 +0000 *************** *** 0 **** --- 1,8 ---- + | +0#0000e05#a8a8a8255@1>v+0#0000000#ffffff0|i|m|9|s|c|r|i|p|t+0&#ffff4012| +0&#ffffff0@47 + | +0#0000e05#a8a8a8255@1|T+0#ffffff16#ff404010|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| +0#0000000#ffffff0@38 + | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |t|e|x|t| @48 + |~+0#4040ff13&| @58 + |~| @58 + |~| @58 + |~| @58 + | +0#0000000&@41|1|,|1| @10|A|l@1| *** ../vim-9.0.0890/src/version.c 2022-11-16 20:33:17.088528372 +0000 --- src/version.c 2022-11-16 22:08:49.449914951 +0000 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 891, /**/ -- hundred-and-one symptoms of being an internet addict: 88. Every single time you press the 'Get mail' button...it does get new mail. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///