changeset 19824:09a621bdb0bc v8.2.0468

patch 8.2.0468: GUI: pixel dust with some fonts and characters Commit: https://github.com/vim/vim/commit/7c003aa314337ce732e18c541fa93d71cafedf03 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 28 20:44:41 2020 +0100 patch 8.2.0468: GUI: pixel dust with some fonts and characters Problem: GUI: pixel dust with some fonts and characters. Solution: Always redraw the character before the cursor. (Nir Lichtman, closes #5549, closes #5856)
author Bram Moolenaar <Bram@vim.org>
date Sat, 28 Mar 2020 20:45:04 +0100
parents fafab4bec82f
children 17feab93763a
files src/gui.c src/proto/gui.pro src/screen.c src/version.c
diffstat 4 files changed, 17 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/gui.c
+++ b/src/gui.c
@@ -2630,18 +2630,19 @@ gui_outstr_nowrap(
 
 /*
  * Un-draw the cursor.	Actually this just redraws the character at the given
- * position.  The character just before it too, for when it was in bold.
+ * position.
  */
     void
 gui_undraw_cursor(void)
 {
     if (gui.cursor_is_valid)
     {
-	if (gui_redraw_block(gui.cursor_row, gui.cursor_col,
-			      gui.cursor_row, gui.cursor_col, GUI_MON_NOCLEAR)
-		&& gui.cursor_col > 0)
-	    (void)gui_redraw_block(gui.cursor_row, gui.cursor_col - 1,
-			 gui.cursor_row, gui.cursor_col - 1, GUI_MON_NOCLEAR);
+	// Redraw the character just before too, if there is one, because with
+	// some fonts and characters there can be a one pixel overlap.
+	gui_redraw_block(gui.cursor_row,
+		      gui.cursor_col > 0 ? gui.cursor_col - 1 : gui.cursor_col,
+		      gui.cursor_row, gui.cursor_col, GUI_MON_NOCLEAR);
+
 	// Cursor_is_valid is reset when the cursor is undrawn, also reset it
 	// here in case it wasn't needed to undraw it.
 	gui.cursor_is_valid = FALSE;
@@ -2662,7 +2663,7 @@ gui_redraw(
     row2 = Y_2_ROW(y + h - 1);
     col2 = X_2_COL(x + w - 1);
 
-    (void)gui_redraw_block(row1, col1, row2, col2, GUI_MON_NOCLEAR);
+    gui_redraw_block(row1, col1, row2, col2, GUI_MON_NOCLEAR);
 
     /*
      * We may need to redraw the cursor, but don't take it upon us to change
@@ -2678,10 +2679,8 @@ gui_redraw(
 /*
  * Draw a rectangular block of characters, from row1 to row2 (inclusive) and
  * from col1 to col2 (inclusive).
- * Return TRUE when the character before the first drawn character has
- * different attributes (may have to be redrawn too).
  */
-    int
+    void
 gui_redraw_block(
     int		row1,
     int		col1,
@@ -2695,12 +2694,11 @@ gui_redraw_block(
     sattr_T	first_attr;
     int		idx, len;
     int		back, nback;
-    int		retval = FALSE;
     int		orig_col1, orig_col2;
 
     // Don't try to update when ScreenLines is not valid
     if (!screen_cleared || ScreenLines == NULL)
-	return retval;
+	return;
 
     // Don't try to draw outside the shell!
     // Check everything, strange values may be caused by a big border width
@@ -2762,8 +2760,6 @@ gui_redraw_block(
 	    if (ScreenAttrs[off - 1 - back] != ScreenAttrs[off]
 		    || ScreenLines[off - 1 - back] == ' ')
 		break;
-	retval = (col1 > 0 && ScreenAttrs[off - 1] != 0 && back == 0
-					      && ScreenLines[off - 1] != ' ');
 
 	// Break it up in strings of characters with the same attributes.
 	// Print UTF-8 characters individually.
@@ -2845,8 +2841,6 @@ gui_redraw_block(
     gui.row = old_row;
     gui.col = old_col;
     gui.highlight_mask = (int)old_hl_mask;
-
-    return retval;
 }
 
     static void
--- a/src/proto/gui.pro
+++ b/src/proto/gui.pro
@@ -27,7 +27,7 @@ void gui_enable_flush(void);
 void gui_may_flush(void);
 void gui_undraw_cursor(void);
 void gui_redraw(int x, int y, int w, int h);
-int gui_redraw_block(int row1, int col1, int row2, int col2, int flags);
+void gui_redraw_block(int row1, int col1, int row2, int col2, int flags);
 int gui_wait_for_chars(long wtime, int tb_change_cnt);
 int gui_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
 void gui_send_mouse_event(int button, int x, int y, int repeated_click, int_u modifiers);
--- a/src/screen.c
+++ b/src/screen.c
@@ -2788,11 +2788,10 @@ give_up:
 	    && ScreenLines != NULL
 	    && old_Rows != Rows)
     {
-	(void)gui_redraw_block(0, 0, (int)Rows - 1, (int)Columns - 1, 0);
-	/*
-	 * Adjust the position of the cursor, for when executing an external
-	 * command.
-	 */
+	gui_redraw_block(0, 0, (int)Rows - 1, (int)Columns - 1, 0);
+
+	// Adjust the position of the cursor, for when executing an external
+	// command.
 	if (msg_row >= Rows)		// Rows got smaller
 	    msg_row = Rows - 1;		// put cursor at last row
 	else if (Rows > old_Rows)	// Rows got bigger
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    468,
+/**/
     467,
 /**/
     466,