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:
26
src/gui.c
26
src/gui.c
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user