summaryrefslogtreecommitdiff
path: root/src/screen.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2009-03-11 16:58:40 +0000
committerBram Moolenaar <Bram@vim.org>2009-03-11 16:58:40 +0000
commit2bea291af0fbbdcbcfd7812cf4f294699dfc00b9 (patch)
tree478b75adfd04e53310f968fb60dcc29a62dc6cca /src/screen.c
parentf837ef9e7b1a8de49f194e8d3b3cca397e97d2af (diff)
downloadvim-2bea291af0fbbdcbcfd7812cf4f294699dfc00b9.zip
updated for version 7.2-141
Diffstat (limited to 'src/screen.c')
-rw-r--r--src/screen.c83
1 files changed, 55 insertions, 28 deletions
diff --git a/src/screen.c b/src/screen.c
index 79cd689d0..d2785c46c 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -5132,8 +5132,8 @@ screen_line(row, coloff, endcol, clear_width
#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
+ /* 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,9 +6276,15 @@ screen_puts_len(text, len, row, col, attr)
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,10 +6294,21 @@ screen_puts_len(text, len, row, col, attr)
&& !gui.in_use
# endif
&& mb_fix_col(col, row) != col)
- screen_puts_len((char_u *)" ", 1, row, col - 1, 0);
+ {
+ 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
- off = LineOffset[row] + col;
#ifdef FEAT_MBYTE
max_off = LineOffset[row] + screen_Columns;
#endif
@@ -6355,7 +6372,12 @@ screen_puts_len(text, len, row, col, attr)
}
#endif
- if (ScreenLines[off] != c
+#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,20 +6389,20 @@ screen_puts_len(text, len, row, col, attr)
|| screen_comp_differs(off, u8cc)))
#endif
|| ScreenAttrs[off] != attr
- || exmode_active
+ || 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.
- * 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 (
+ * and for some xterms. */
+ if (need_redraw && ScreenLines[off] != ' ' && (
# ifdef FEAT_GUI
gui.in_use
# endif
@@ -6390,23 +6412,14 @@ screen_puts_len(text, len, row, col, attr)
# ifdef UNIX
term_is_xterm
# endif
- )
+ ))
{
- int n;
+ int n = ScreenAttrs[off];
- 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
+ if (n > HL_ALL)
+ n = syn_attr2attr(n);
+ if (n & HL_BOLD)
+ force_redraw_next = TRUE;
}
#endif
#ifdef FEAT_MBYTE
@@ -6493,6 +6506,20 @@ screen_puts_len(text, len, row, col, attr)
++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