| To: vim-dev@vim.org |
| Subject: Patch 7.2.141 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 /// |