Bram Moolenaar wrote:
> Yukihiro Nakadaira wrote:
> 
>> Bram Moolenaar wrote:
>>> Patch 7.2.119
>>> Problem:    Status line is redrawn too often.
>>> Solution:   Check ScreeenLinesUC[] properly. (Yukihiro Nakadaira)
>>> Files:      src/screen.c
>> Sorry, one more patch related to this.
>>
>> When bold character is overwritten, all of rest characters are redrawn.
>>
>> See following code in the screen_puts_len() function.  At line 6402
>> "attr + 1" is assigned to next cell.  And "n > HL_ALL" is always true
>> when syntax highlighting is used.  So once character is drawn, all of
>> rest characters are redrawn.
>>
>> Please check attached patch.
> 
> So, this patch avoids drawing more than needed, when there is a bold
> character and following characters have some highlighting attribute?
> I wonder how one can be 100% sure that the redraw isn't needed.
> 
> This code has already been changed mutiple times to fix problems.
> We should try to take it towards a more reliable, and thus easier to
> understand implementation.
> 
> Your other message didn't have an attachment...

I'm sorry.  File is attached.

Actually, I didn't have serious problem with current code.
So perhaps it would be better to keep the current code...

-- 
Yukihiro Nakadaira - yukihiro.nakada...@gmail.com

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Index: src/screen.c
===================================================================
RCS file: /cvsroot/vim/vim7/src/screen.c,v
retrieving revision 1.113
diff -u -r1.113 screen.c
--- src/screen.c	22 Feb 2009 00:14:54 -0000	1.113
+++ src/screen.c	22 Feb 2009 18:12:40 -0000
@@ -6275,6 +6275,11 @@
     int		pcc[MAX_MCO];
 # endif
 #endif
+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
+    int		redraw_this;
+    int		redraw_next = FALSE;
+#endif
+    int		overwrite;
 
     if (ScreenLines == NULL || row >= screen_Rows)	/* safety check */
 	return;
@@ -6287,7 +6292,25 @@
 	    && !gui.in_use
 # endif
 	    && mb_fix_col(col, row) != col)
-	screen_puts_len((char_u *)" ", 1, row, col - 1, 0);
+    {
+	int	i;
+
+	off = LineOffset[row] + col;
+	for (i = 0; i < 2; ++i)
+	{
+	    ScreenLines[off - i] = ' ';
+	    ScreenAttrs[off - i] = 0;
+	    if (enc_utf8)
+	    {
+		ScreenLinesUC[off - i] = 0;
+		ScreenLinesC[0][off - i] = 0;
+	    }
+	}
+	/* redraw only previous cell */
+	screen_char(off - 1, row, col - 1);
+	/* force the first cell be redrawn */
+	redraw_next = TRUE;
+    }
 #endif
 
     off = LineOffset[row] + col;
@@ -6354,7 +6377,12 @@
 	}
 #endif
 
-	if (ScreenLines[off] != c
+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
+	redraw_this = redraw_next;
+	redraw_next = FALSE;
+#endif
+
+	overwrite = ScreenLines[off] != c
 #ifdef FEAT_MBYTE
 		|| (mbyte_cells == 2
 		    && ScreenLines[off + 1] != (enc_dbcs ? ptr[1] : 0))
@@ -6366,20 +6394,20 @@
 			|| screen_comp_differs(off, u8cc)))
 #endif
 		|| ScreenAttrs[off] != attr
-		|| exmode_active
+		|| exmode_active;
+
+	if (overwrite
+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
+		|| 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 (overwrite && (
 # ifdef FEAT_GUI
 		    gui.in_use
 # endif
@@ -6389,23 +6417,16 @@
 # 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
+		if (n > HL_ALL)
+		    n = syn_attr2attr(n);
+		if (n & HL_BOLD)
+		    redraw_next = TRUE;
 	    }
 #endif
 #ifdef FEAT_MBYTE
@@ -6492,6 +6513,17 @@
 	    ++ptr;
 	}
     }
+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
+    if (redraw_next && col < screen_Columns)
+    {
+# if defined(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

Raspunde prin e-mail lui