0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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)
This commit is contained in:
Bram Moolenaar
2020-03-28 20:44:41 +01:00
parent 33fa29cf74
commit 7c003aa314
4 changed files with 17 additions and 22 deletions

View File

@@ -2630,18 +2630,19 @@ gui_outstr_nowrap(
/* /*
* Un-draw the cursor. Actually this just redraws the character at the given * 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 void
gui_undraw_cursor(void) gui_undraw_cursor(void)
{ {
if (gui.cursor_is_valid) if (gui.cursor_is_valid)
{ {
if (gui_redraw_block(gui.cursor_row, gui.cursor_col, // Redraw the character just before too, if there is one, because with
gui.cursor_row, gui.cursor_col, GUI_MON_NOCLEAR) // some fonts and characters there can be a one pixel overlap.
&& gui.cursor_col > 0) gui_redraw_block(gui.cursor_row,
(void)gui_redraw_block(gui.cursor_row, gui.cursor_col - 1, gui.cursor_col > 0 ? gui.cursor_col - 1 : gui.cursor_col,
gui.cursor_row, gui.cursor_col - 1, GUI_MON_NOCLEAR); gui.cursor_row, gui.cursor_col, GUI_MON_NOCLEAR);
// Cursor_is_valid is reset when the cursor is undrawn, also reset it // Cursor_is_valid is reset when the cursor is undrawn, also reset it
// here in case it wasn't needed to undraw it. // here in case it wasn't needed to undraw it.
gui.cursor_is_valid = FALSE; gui.cursor_is_valid = FALSE;
@@ -2662,7 +2663,7 @@ gui_redraw(
row2 = Y_2_ROW(y + h - 1); row2 = Y_2_ROW(y + h - 1);
col2 = X_2_COL(x + w - 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 * 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 * Draw a rectangular block of characters, from row1 to row2 (inclusive) and
* from col1 to col2 (inclusive). * 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( gui_redraw_block(
int row1, int row1,
int col1, int col1,
@@ -2695,12 +2694,11 @@ gui_redraw_block(
sattr_T first_attr; sattr_T first_attr;
int idx, len; int idx, len;
int back, nback; int back, nback;
int retval = FALSE;
int orig_col1, orig_col2; int orig_col1, orig_col2;
// Don't try to update when ScreenLines is not valid // Don't try to update when ScreenLines is not valid
if (!screen_cleared || ScreenLines == NULL) if (!screen_cleared || ScreenLines == NULL)
return retval; return;
// Don't try to draw outside the shell! // Don't try to draw outside the shell!
// Check everything, strange values may be caused by a big border width // 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] if (ScreenAttrs[off - 1 - back] != ScreenAttrs[off]
|| ScreenLines[off - 1 - back] == ' ') || ScreenLines[off - 1 - back] == ' ')
break; break;
retval = (col1 > 0 && ScreenAttrs[off - 1] != 0 && back == 0
&& ScreenLines[off - 1] != ' ');
// Break it up in strings of characters with the same attributes. // Break it up in strings of characters with the same attributes.
// Print UTF-8 characters individually. // Print UTF-8 characters individually.
@@ -2845,8 +2841,6 @@ gui_redraw_block(
gui.row = old_row; gui.row = old_row;
gui.col = old_col; gui.col = old_col;
gui.highlight_mask = (int)old_hl_mask; gui.highlight_mask = (int)old_hl_mask;
return retval;
} }
static void static void

View File

@@ -27,7 +27,7 @@ void gui_enable_flush(void);
void gui_may_flush(void); void gui_may_flush(void);
void gui_undraw_cursor(void); void gui_undraw_cursor(void);
void gui_redraw(int x, int y, int w, int h); 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_wait_for_chars(long wtime, int tb_change_cnt);
int gui_inchar(char_u *buf, int maxlen, 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); void gui_send_mouse_event(int button, int x, int y, int repeated_click, int_u modifiers);

View File

@@ -2788,11 +2788,10 @@ give_up:
&& ScreenLines != NULL && ScreenLines != NULL
&& old_Rows != Rows) && old_Rows != Rows)
{ {
(void)gui_redraw_block(0, 0, (int)Rows - 1, (int)Columns - 1, 0); gui_redraw_block(0, 0, (int)Rows - 1, (int)Columns - 1, 0);
/*
* Adjust the position of the cursor, for when executing an external // Adjust the position of the cursor, for when executing an external
* command. // command.
*/
if (msg_row >= Rows) // Rows got smaller if (msg_row >= Rows) // Rows got smaller
msg_row = Rows - 1; // put cursor at last row msg_row = Rows - 1; // put cursor at last row
else if (Rows > old_Rows) // Rows got bigger else if (Rows > old_Rows) // Rows got bigger

View File

@@ -738,6 +738,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
468,
/**/ /**/
467, 467,
/**/ /**/