aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/normal.c18
-rw-r--r--src/nvim/popupmnu.c4
-rw-r--r--src/nvim/screen.c30
3 files changed, 27 insertions, 25 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index f99e42e2e4..de8ff52fe1 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -3386,8 +3386,8 @@ bool add_to_showcmd(int c)
void add_to_showcmd_c(int c)
{
- if (!add_to_showcmd(c))
- setcursor();
+ add_to_showcmd(c);
+ setcursor();
}
/*
@@ -3448,18 +3448,18 @@ static void display_showcmd(void)
return;
}
+ int showcmd_row = (int)Rows - 1;
+ grid_puts_line_start(&default_grid, showcmd_row);
+
if (!showcmd_is_clear) {
- grid_puts(&default_grid, showcmd_buf, (int)Rows - 1, sc_col, 0);
+ grid_puts(&default_grid, showcmd_buf, showcmd_row, sc_col, 0);
}
- /*
- * clear the rest of an old message by outputting up to SHOWCMD_COLS
- * spaces
- */
- grid_puts(&default_grid, (char_u *)" " + len, (int)Rows - 1,
+ // clear the rest of an old message by outputting up to SHOWCMD_COLS spaces
+ grid_puts(&default_grid, (char_u *)" " + len, showcmd_row,
sc_col + len, 0);
- setcursor(); /* put cursor back where it belongs */
+ grid_puts_line_flush(false);
}
/*
diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c
index 58a0008e04..df751b0ca2 100644
--- a/src/nvim/popupmnu.c
+++ b/src/nvim/popupmnu.c
@@ -412,7 +412,7 @@ void pum_redraw(void)
idx = i + pum_first;
attr = (idx == pum_selected) ? attr_select : attr_norm;
- screen_puts_line_start(row);
+ grid_puts_line_start(&pum_grid, row);
// prepend a space if there is room
if (extra_space) {
@@ -564,7 +564,7 @@ void pum_redraw(void)
? attr_thumb : attr_scroll);
}
}
- grid_puts_line_flush(&pum_grid, false);
+ grid_puts_line_flush(false);
row++;
}
}
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 84c3f169ef..45c82d70d1 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -5141,7 +5141,7 @@ win_redr_custom (
/*
* Draw each snippet with the specified highlighting.
*/
- screen_puts_line_start(row);
+ grid_puts_line_start(&default_grid, row);
curattr = attr;
p = buf;
@@ -5164,7 +5164,7 @@ win_redr_custom (
grid_puts(&default_grid, p >= buf + len ? (char_u *)"" : p, row, col,
curattr);
- grid_puts_line_flush(&default_grid, false);
+ grid_puts_line_flush(false);
if (wp == NULL) {
// Fill the tab_page_click_defs array for clicking in the tab pages line.
@@ -5310,18 +5310,20 @@ void grid_puts(ScreenGrid *grid, char_u *text, int row, int col, int attr)
grid_puts_len(grid, text, -1, row, col, attr);
}
+static ScreenGrid *put_dirty_grid = NULL;
static int put_dirty_row = -1;
static int put_dirty_first = INT_MAX;
static int put_dirty_last = 0;
-/// Start a group of screen_puts_len calls that builds a single screen line.
+/// Start a group of grid_puts_len calls that builds a single grid line.
///
-/// Must be matched with a screen_puts_line_flush call before moving to
+/// Must be matched with a grid_puts_line_flush call before moving to
/// another line.
-void screen_puts_line_start(int row)
+void grid_puts_line_start(ScreenGrid *grid, int row)
{
assert(put_dirty_row == -1);
put_dirty_row = row;
+ put_dirty_grid = grid;
}
/// like grid_puts(), but output "text[len]". When "len" is -1 output up to
@@ -5353,10 +5355,10 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row,
}
if (put_dirty_row == -1) {
- screen_puts_line_start(row);
+ grid_puts_line_start(grid, row);
do_flush = true;
} else {
- if (row != put_dirty_row) {
+ if (grid != put_dirty_grid || row != put_dirty_row) {
abort();
}
}
@@ -5459,31 +5461,31 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row,
}
if (do_flush) {
- grid_puts_line_flush(grid, true);
+ grid_puts_line_flush(true);
}
}
-/// End a group of screen_puts_len calls and send the screen buffer to the UI
+/// End a group of grid_puts_len calls and send the screen buffer to the UI
/// layer.
///
-/// @param grid The grid which contains the buffer.
/// @param set_cursor Move the visible cursor to the end of the changed region.
/// This is a workaround for not yet refactored code paths
/// and shouldn't be used in new code.
-void grid_puts_line_flush(ScreenGrid *grid, bool set_cursor)
+void grid_puts_line_flush(bool set_cursor)
{
assert(put_dirty_row != -1);
if (put_dirty_first < put_dirty_last) {
if (set_cursor) {
- ui_grid_cursor_goto(grid->handle, put_dirty_row,
- MIN(put_dirty_last, grid->Columns-1));
+ ui_grid_cursor_goto(put_dirty_grid->handle, put_dirty_row,
+ MIN(put_dirty_last, put_dirty_grid->Columns-1));
}
- ui_line(grid, put_dirty_row, put_dirty_first, put_dirty_last,
+ ui_line(put_dirty_grid, put_dirty_row, put_dirty_first, put_dirty_last,
put_dirty_last, 0, false);
put_dirty_first = INT_MAX;
put_dirty_last = 0;
}
put_dirty_row = -1;
+ put_dirty_grid = NULL;
}
/*