multigrid: Put everything on default_grid if not ext_multigrid

This commit is contained in:
Utkarsh Maheshwari 2018-06-19 11:45:10 +05:30 committed by Björn Linse
parent d5754eae02
commit 0432e1586e
4 changed files with 82 additions and 31 deletions

View File

@ -257,9 +257,7 @@ void nvim_ui_try_resize_grid(uint64_t channel_id, Integer grid, Integer width,
return;
}
// TODO(utkarshme): Check if grid exists
ui_grid_resize((GridHandle)grid, (int)width, (int)height);
ui_grid_resize((GridHandle)grid, (int)width, (int)height, error);
}
/// Pushes data into UI.UIData, to be consumed later by remote_ui_flush().

View File

@ -164,6 +164,8 @@ EXTERN int screen_Columns INIT(= 0); /* actual size of ScreenLines[] */
EXTERN ScreenGrid default_grid INIT(= { 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0,
0, 0 });
#define DEFAULT_GRID_HANDLE 1 /* handle for the default_grid */
/*
* When vgetc() is called, it sets mod_mask to the set of modifiers that are
* held down based on the MOD_MASK_* symbols that are read first.

View File

@ -118,11 +118,11 @@
#define MB_FILLER_CHAR '<' /* character used when a double-width character
* doesn't fit. */
#define W_ENDCOL(wp) (wp->w_wincol + wp->w_width)
#define W_ENDROW(wp) (wp->w_winrow + wp->w_height)
#define W_ENDCOL(wp) (wp->w_width + wp->w_wincol)
#define W_ENDROW(wp) (wp->w_height + wp->w_winrow)
#define DEFAULT_GRID_HANDLE 1
// Get the offset for the current line buffer when redrawing a line for a grid
#define GRID_TMPLINE(grid) ((grid)->Rows * (grid)->Columns)
static match_T search_hl; /* used for 'hlsearch' highlight matching */
@ -1772,7 +1772,7 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
* 6. set highlighting for the Visual area an other text
*/
col = 0;
off = (int)(grid->Rows * grid->Columns);
off = (int)GRID_TMPLINE(grid);
/*
* 1. Add the cmdwin_type for the command-line window
@ -2674,7 +2674,7 @@ win_line (
cur = cur->next;
}
off = (unsigned)(grid->Rows * grid->Columns);
off = (unsigned)GRID_TMPLINE(grid);
int col = 0; // Visual column on screen.
if (wp->w_p_rl) {
// Rightleft window: process the text in the normal direction, but put
@ -4274,7 +4274,7 @@ win_line (
}
col = 0;
off = (unsigned)(grid->Rows * grid->Columns);
off = (unsigned)GRID_TMPLINE(grid);
if (wp->w_p_rl) {
col = grid->Columns - 1; /* col is not used if breaking! */
off += col;
@ -4366,7 +4366,20 @@ static void grid_move_line(ScreenGrid *grid, int row, int coloff, int endcol,
if (endcol > grid->Columns)
endcol = grid->Columns;
off_from = (unsigned)(grid->Rows * grid->Columns);
// If UI is not externalized, merge the contents of global and window grids
if (!ui_is_external(kUIMultigrid) && grid != &default_grid) {
row += grid->OffsetRow;
coloff += grid->OffsetColumn;
memcpy(default_grid.ScreenLines + GRID_TMPLINE(&default_grid),
grid->ScreenLines + GRID_TMPLINE(grid),
sizeof(schar_T) * grid->Columns);
memcpy(default_grid.ScreenAttrs + GRID_TMPLINE(&default_grid),
grid->ScreenAttrs + GRID_TMPLINE(grid),
sizeof(sattr_T) * grid->Columns);
grid = &default_grid;
}
off_from = (unsigned)GRID_TMPLINE(grid);
off_to = grid->LineOffset[row] + coloff;
max_off_from = off_from + grid->Columns;
max_off_to = grid->LineOffset[row] + grid->Columns;
@ -4460,21 +4473,22 @@ static void grid_move_line(ScreenGrid *grid, int row, int coloff, int endcol,
// blank out the rest of the line
// TODO(bfredl): we could cache winline widths
while (col < clear_width) {
if (grid->ScreenLines[off_to][0] != ' ' || grid->ScreenLines[off_to][1] != NUL
|| grid->ScreenAttrs[off_to] != bg_attr) {
grid->ScreenLines[off_to][0] = ' ';
grid->ScreenLines[off_to][1] = NUL;
grid->ScreenAttrs[off_to] = bg_attr;
if (start_dirty == -1) {
start_dirty = col;
end_dirty = col;
} else if (clear_end == -1) {
end_dirty = endcol;
}
clear_end = col+1;
if (grid->ScreenLines[off_to][0] != ' '
|| grid->ScreenLines[off_to][1] != NUL
|| grid->ScreenAttrs[off_to] != bg_attr) {
grid->ScreenLines[off_to][0] = ' ';
grid->ScreenLines[off_to][1] = NUL;
grid->ScreenAttrs[off_to] = bg_attr;
if (start_dirty == -1) {
start_dirty = col;
end_dirty = col;
} else if (clear_end == -1) {
end_dirty = endcol;
}
col++;
off_to++;
clear_end = col+1;
}
col++;
off_to++;
}
}
@ -5111,7 +5125,7 @@ win_redr_custom (
*wp->w_p_stl == NUL ? 0 : OPT_LOCAL);
}
col += wp->w_winrow;
col += wp->w_wincol;
}
if (maxwidth <= 0)
@ -5258,7 +5272,9 @@ void grid_getbytes(ScreenGrid *grid, int row, int col, char_u *bytes,
{
unsigned off;
if (grid == NULL) {
if (!ui_is_external(kUIMultigrid)) {
row += grid->OffsetRow;
col += grid->OffsetColumn;
grid = &default_grid;
}
@ -5321,6 +5337,13 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row,
grid = &default_grid;
}
// If UI is not externalized, keep working on the default grid
if (!ui_is_external(kUIMultigrid) && grid != &default_grid) {
row += grid->OffsetRow;
col += grid->OffsetColumn;
grid = &default_grid;
}
// safety check
if (grid->ScreenLines == NULL || row >= grid->Rows || col >= grid->Columns) {
return;
@ -5777,6 +5800,15 @@ void grid_fill(ScreenGrid *grid, int start_row, int end_row, int start_col,
grid = &default_grid;
}
// if grids are not externalized, keep working on the default_grid
if (!ui_is_external(kUIMultigrid) && grid != &default_grid) {
start_row += grid->OffsetRow;
end_row += grid->OffsetRow;
start_col += grid->OffsetColumn;
end_col += grid->OffsetColumn;
grid = &default_grid;
}
if (end_row > grid->Rows) // safety check
end_row = grid->Rows;
if (end_col > grid->Columns) // safety check
@ -6275,6 +6307,14 @@ int grid_ins_lines(ScreenGrid *grid, int row, int line_count, int end,
grid = &default_grid;
}
// If UI is not externalized, keep working on default grid
if (!ui_is_external(kUIMultigrid) && grid != &default_grid) {
row += grid->OffsetRow;
end += grid->OffsetRow;
col += grid->OffsetColumn;
grid = &default_grid;
}
if (!screen_valid(TRUE) || line_count <= 0) {
return FAIL;
}
@ -6326,6 +6366,14 @@ int grid_del_lines(ScreenGrid *grid, int row, int line_count, int end,
grid = &default_grid;
}
// If UI is not externalized, keep working on default grid
if (!ui_is_external(kUIMultigrid) && grid != &default_grid) {
row += grid->OffsetRow;
end += grid->OffsetRow;
col += grid->OffsetColumn;
grid = &default_grid;
}
if (!screen_valid(TRUE) || line_count <= 0) {
return FAIL;
}

View File

@ -440,13 +440,16 @@ Array ui_array(void)
return all_uis;
}
void ui_grid_resize(GridHandle grid_handle, int width, int height)
void ui_grid_resize(GridHandle grid_handle, int width, int height, Error *error)
{
win_T *wp = get_win_by_grid_handle(grid_handle);
if (grid_handle == DEFAULT_GRID_HANDLE) {
screen_resize(width, height);
return;
}
win_T *wp = get_win_by_grid_handle(grid_handle);
if (wp == NULL) {
//TODO(utkarshme): error out
abort();
api_set_error(error, kErrorTypeValidation, "No window with the given handle");
return;
}