To: vim_dev@googlegroups.com Subject: Patch 9.0.1602 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.1602 Problem: Stray character is visible if 'smoothscroll' marker is displayed on top of a double-wide character. Solution: When overwriting a double-width character with the 'smoothscroll' marker clear the second half. (closes #12469) Files: src/drawline.c, src/testdir/test_scroll_opt.vim, src/testdir/dumps/Test_smooth_marker_over_double_width_1.dump, src/testdir/dumps/Test_smooth_marker_over_double_width_2.dump *** ../vim-9.0.1601/src/drawline.c 2023-05-31 18:57:10.513953154 +0100 --- src/drawline.c 2023-06-03 19:43:59.414137721 +0100 *************** *** 823,828 **** --- 823,829 ---- && !(wp->w_p_list && wp->w_lcs_chars.prec != 0)) { int off = (int)(current_ScreenLine - ScreenLines); + int max_off = off + screen_Columns; int skip = 0; if (wp->w_p_nu && wp->w_p_rnu) *************** *** 836,841 **** --- 837,846 ---- for (int i = 0; i < 3 && i + skip < wp->w_width; ++i) { + if ((*mb_off2cells)(off, max_off) > 1) + // When the first half of a double-width character is + // overwritten, change the second half to a space. + ScreenLines[off + 1] = ' '; ScreenLines[off] = '<'; if (enc_utf8) ScreenLinesUC[off] = 0; *** ../vim-9.0.1601/src/testdir/test_scroll_opt.vim 2023-05-19 14:04:23.133885852 +0100 --- src/testdir/test_scroll_opt.vim 2023-06-03 19:19:17.631718177 +0100 *************** *** 399,404 **** --- 399,462 ---- call StopVimInTerminal(buf) endfunc + " Check that 'smoothscroll' marker is drawn over double-width char correctly. + " Run with multiple encodings. + func Test_smoothscroll_marker_over_double_width() + " Run this in a separate Vim instance to avoid messing up. + let after =<< trim [CODE] + scriptencoding utf-8 + call setline(1, 'a'->repeat(&columns) .. '口'->repeat(10)) + setlocal smoothscroll + redraw + exe "norm \" + redraw + " Check the chars one by one. Don't check the whole line concatenated. + call assert_equal('<', screenstring(1, 1)) + call assert_equal('<', screenstring(1, 2)) + call assert_equal('<', screenstring(1, 3)) + call assert_equal(' ', screenstring(1, 4)) + call assert_equal('口', screenstring(1, 5)) + call assert_equal('口', screenstring(1, 7)) + call assert_equal('口', screenstring(1, 9)) + call assert_equal('口', screenstring(1, 11)) + call assert_equal('口', screenstring(1, 13)) + call assert_equal('口', screenstring(1, 15)) + call writefile(v:errors, 'Xresult') + qall! + [CODE] + + let encodings = ['utf-8', 'cp932', 'cp936', 'cp949', 'cp950'] + if !has('win32') + let encodings += ['euc-jp'] + endif + for enc in encodings + let msg = 'enc=' .. enc + if RunVim([], after, $'--clean --cmd "set encoding={enc}"') + call assert_equal([], readfile('Xresult'), msg) + endif + call delete('Xresult') + endfor + endfunc + + " Same as the test above, but check the text actually shown on screen. + " Only run with UTF-8 encoding. + func Test_smoothscroll_marker_over_double_width_dump() + CheckScreendump + + let lines =<< trim END + call setline(1, 'a'->repeat(&columns) .. '口'->repeat(10)) + setlocal smoothscroll + END + call writefile(lines, 'XSmoothMarkerOverDoubleWidth', 'D') + let buf = RunVimInTerminal('-S XSmoothMarkerOverDoubleWidth', #{rows: 6, cols: 40}) + call VerifyScreenDump(buf, 'Test_smooth_marker_over_double_width_1', {}) + + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_smooth_marker_over_double_width_2', {}) + + call StopVimInTerminal(buf) + endfunc + func s:check_col_calc(win_col, win_line, buf_col) call assert_equal(a:win_col, wincol()) call assert_equal(a:win_line, winline()) *** ../vim-9.0.1601/src/testdir/dumps/Test_smooth_marker_over_double_width_1.dump 2023-06-03 19:42:53.466626287 +0100 --- src/testdir/dumps/Test_smooth_marker_over_double_width_1.dump 2023-06-03 19:19:17.631718177 +0100 *************** *** 0 **** --- 1,6 ---- + >a+0&#ffffff0@39 + |口*&@9| +&@19 + |~+0#4040ff13&| @38 + |~| @38 + |~| @38 + | +0#0000000&@21|1|,|1| @10|A|l@1| *** ../vim-9.0.1601/src/testdir/dumps/Test_smooth_marker_over_double_width_2.dump 2023-06-03 19:42:53.474626225 +0100 --- src/testdir/dumps/Test_smooth_marker_over_double_width_2.dump 2023-06-03 19:19:17.631718177 +0100 *************** *** 0 **** --- 1,6 ---- + |<+0#4040ff13#ffffff0@2| +0#0000000&|口*&@6>口| +&@19 + |~+0#4040ff13&| @38 + |~| @38 + |~| @38 + |~| @38 + | +0#0000000&@21|1|,|6|8|-|5|9| @6|A|l@1| *** ../vim-9.0.1601/src/version.c 2023-06-03 17:56:26.632203045 +0100 --- src/version.c 2023-06-03 19:42:08.210990902 +0100 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 1602, /**/ -- hundred-and-one symptoms of being an internet addict: 108. While reading a magazine, you look for the Zoom icon for a better look at a photograph. /// 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 ///