diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-03-28 20:44:41 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-03-28 20:44:41 +0100 |
commit | 7c003aa314337ce732e18c541fa93d71cafedf03 (patch) | |
tree | c7e2f687fd9daf56fdb2e42493a7dc6b8e00b3b5 | |
parent | 33fa29cf74ea314f89cfa58ec9ffc2d6781a59d4 (diff) |
patch 8.2.0468: GUI: pixel dust with some fonts and charactersv8.2.0468
Problem: GUI: pixel dust with some fonts and characters.
Solution: Always redraw the character before the cursor. (Nir Lichtman,
closes #5549, closes #5856)
-rw-r--r-- | src/gui.c | 26 | ||||
-rw-r--r-- | src/proto/gui.pro | 2 | ||||
-rw-r--r-- | src/screen.c | 9 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 17 insertions, 22 deletions
@@ -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 diff --git a/src/proto/gui.pro b/src/proto/gui.pro index 7f2ce90068..51bddf90eb 100644 --- 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); diff --git a/src/screen.c b/src/screen.c index 7133600397..ad548d241f 100644 --- 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 diff --git a/src/version.c b/src/version.c index 863f5eedc3..a4ffae0ab8 100644 --- 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, |