To: vim-dev@vim.org Subject: Patch 7.2.141 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 7.2.141 Problem: When redrawing a character for bold spill this causes the next character to be redrawn as well. Solution: Only redraw one extra character. (Yukihiro Nakadaira) Files: src/screen.c *** ../vim-7.2.140/src/screen.c Wed Mar 11 17:44:38 2009 --- src/screen.c Wed Mar 11 13:59:24 2009 *************** *** 5132,5139 **** #endif #if defined(FEAT_GUI) || defined(UNIX) ! /* The bold trick makes a single row of pixels appear in the next ! * character. When a bold character is removed, the next * character should be redrawn too. This happens for our own GUI * and for some xterms. */ if ( --- 5132,5139 ---- #endif #if defined(FEAT_GUI) || defined(UNIX) ! /* The bold trick makes a single column of pixels appear in the ! * next character. When a bold character is removed, the next * character should be redrawn too. This happens for our own GUI * and for some xterms. */ if ( *************** *** 6276,6284 **** --- 6276,6290 ---- int pcc[MAX_MCO]; # endif #endif + #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) + int force_redraw_this; + int force_redraw_next = FALSE; + #endif + int need_redraw; if (ScreenLines == NULL || row >= screen_Rows) /* safety check */ return; + off = LineOffset[row] + col; #ifdef FEAT_MBYTE /* When drawing over the right halve of a double-wide char clear out the *************** *** 6288,6297 **** && !gui.in_use # endif && mb_fix_col(col, row) != col) ! screen_puts_len((char_u *)" ", 1, row, col - 1, 0); #endif - off = LineOffset[row] + col; #ifdef FEAT_MBYTE max_off = LineOffset[row] + screen_Columns; #endif --- 6294,6314 ---- && !gui.in_use # endif && mb_fix_col(col, row) != col) ! { ! ScreenLines[off - 1] = ' '; ! ScreenAttrs[off - 1] = 0; ! if (enc_utf8) ! { ! ScreenLinesUC[off - 1] = 0; ! ScreenLinesC[0][off - 1] = 0; ! } ! /* redraw the previous cell, make it empty */ ! screen_char(off - 1, row, col - 1); ! /* force the cell at "col" to be redrawn */ ! force_redraw_next = TRUE; ! } #endif #ifdef FEAT_MBYTE max_off = LineOffset[row] + screen_Columns; #endif *************** *** 6355,6361 **** } #endif ! if (ScreenLines[off] != c #ifdef FEAT_MBYTE || (mbyte_cells == 2 && ScreenLines[off + 1] != (enc_dbcs ? ptr[1] : 0)) --- 6372,6383 ---- } #endif ! #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) ! force_redraw_this = force_redraw_next; ! force_redraw_next = FALSE; ! #endif ! ! need_redraw = ScreenLines[off] != c #ifdef FEAT_MBYTE || (mbyte_cells == 2 && ScreenLines[off + 1] != (enc_dbcs ? ptr[1] : 0)) *************** *** 6367,6386 **** || screen_comp_differs(off, u8cc))) #endif || ScreenAttrs[off] != attr ! || exmode_active ) { #if defined(FEAT_GUI) || defined(UNIX) /* The bold trick makes a single row of pixels appear in the next * character. When a bold character is removed, the next * character should be redrawn too. This happens for our own GUI ! * and for some xterms. ! * Force the redraw by setting the attribute to a different value ! * than "attr", the contents of ScreenLines[] may be needed by ! * mb_off2cells() further on. ! * Don't do this for the last drawn character, because the next ! * character may not be redrawn. */ ! if ( # ifdef FEAT_GUI gui.in_use # endif --- 6389,6408 ---- || screen_comp_differs(off, u8cc))) #endif || ScreenAttrs[off] != attr ! || exmode_active; ! ! if (need_redraw ! #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) ! || force_redraw_this ! #endif ) { #if defined(FEAT_GUI) || defined(UNIX) /* The bold trick makes a single row of pixels appear in the next * character. When a bold character is removed, the next * character should be redrawn too. This happens for our own GUI ! * and for some xterms. */ ! if (need_redraw && ScreenLines[off] != ' ' && ( # ifdef FEAT_GUI gui.in_use # endif *************** *** 6390,6412 **** # ifdef UNIX term_is_xterm # endif ! ) { ! int n; ! n = ScreenAttrs[off]; ! # ifdef FEAT_MBYTE ! if (col + mbyte_cells < screen_Columns ! && (n > HL_ALL || (n & HL_BOLD)) ! && (len < 0 ? ptr[mbyte_blen] != NUL ! : ptr + mbyte_blen < text + len)) ! ScreenAttrs[off + mbyte_cells] = attr + 1; ! # else ! if (col + 1 < screen_Columns ! && (n > HL_ALL || (n & HL_BOLD)) ! && (len < 0 ? ptr[1] != NUL : ptr + 1 < text + len)) ! ScreenLines[off + 1] = 0; ! # endif } #endif #ifdef FEAT_MBYTE --- 6412,6425 ---- # ifdef UNIX term_is_xterm # endif ! )) { ! int n = ScreenAttrs[off]; ! if (n > HL_ALL) ! n = syn_attr2attr(n); ! if (n & HL_BOLD) ! force_redraw_next = TRUE; } #endif #ifdef FEAT_MBYTE *************** *** 6493,6498 **** --- 6506,6525 ---- ++ptr; } } + + #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) + /* If we detected the next character needs to be redrawn, but the text + * doesn't extend up to there, update the character here. */ + if (force_redraw_next && col < screen_Columns) + { + # ifdef FEAT_MBYTE + if (enc_dbcs != 0 && dbcs_off2cells(off, max_off) > 1) + screen_char_2(off, row, col); + else + # endif + screen_char(off, row, col); + } + #endif } #ifdef FEAT_SEARCH_EXTRA *** ../vim-7.2.140/src/version.c Wed Mar 11 17:44:38 2009 --- src/version.c Wed Mar 11 17:55:22 2009 *************** *** 678,679 **** --- 678,681 ---- { /* Add new patch number below this line */ + /**/ + 141, /**/ -- Some of the well know MS-Windows errors: ETIME Wrong time, wait a little while ECRASH Try again... EDETECT Unable to detect errors EOVER You lost! Play another game? ENOCLUE Eh, what did you want? /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///