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; return;
} }
// TODO(utkarshme): Check if grid exists ui_grid_resize((GridHandle)grid, (int)width, (int)height, error);
ui_grid_resize((GridHandle)grid, (int)width, (int)height);
} }
/// Pushes data into UI.UIData, to be consumed later by remote_ui_flush(). /// 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, EXTERN ScreenGrid default_grid INIT(= { 0, NULL, NULL, NULL, NULL, 0, 0, 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 * 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. * 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 #define MB_FILLER_CHAR '<' /* character used when a double-width character
* doesn't fit. */ * 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) // Get the offset for the current line buffer when redrawing a line for a grid
#define W_ENDROW(wp) (wp->w_height + wp->w_winrow) #define GRID_TMPLINE(grid) ((grid)->Rows * (grid)->Columns)
#define DEFAULT_GRID_HANDLE 1
static match_T search_hl; /* used for 'hlsearch' highlight matching */ 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 * 6. set highlighting for the Visual area an other text
*/ */
col = 0; col = 0;
off = (int)(grid->Rows * grid->Columns); off = (int)GRID_TMPLINE(grid);
/* /*
* 1. Add the cmdwin_type for the command-line window * 1. Add the cmdwin_type for the command-line window
@@ -2674,7 +2674,7 @@ win_line (
cur = cur->next; cur = cur->next;
} }
off = (unsigned)(grid->Rows * grid->Columns); off = (unsigned)GRID_TMPLINE(grid);
int col = 0; // Visual column on screen. int col = 0; // Visual column on screen.
if (wp->w_p_rl) { if (wp->w_p_rl) {
// Rightleft window: process the text in the normal direction, but put // Rightleft window: process the text in the normal direction, but put
@@ -4274,7 +4274,7 @@ win_line (
} }
col = 0; col = 0;
off = (unsigned)(grid->Rows * grid->Columns); off = (unsigned)GRID_TMPLINE(grid);
if (wp->w_p_rl) { if (wp->w_p_rl) {
col = grid->Columns - 1; /* col is not used if breaking! */ col = grid->Columns - 1; /* col is not used if breaking! */
off += col; off += col;
@@ -4366,7 +4366,20 @@ static void grid_move_line(ScreenGrid *grid, int row, int coloff, int endcol,
if (endcol > grid->Columns) if (endcol > grid->Columns)
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; off_to = grid->LineOffset[row] + coloff;
max_off_from = off_from + grid->Columns; max_off_from = off_from + grid->Columns;
max_off_to = grid->LineOffset[row] + grid->Columns; max_off_to = grid->LineOffset[row] + grid->Columns;
@@ -4460,7 +4473,8 @@ static void grid_move_line(ScreenGrid *grid, int row, int coloff, int endcol,
// blank out the rest of the line // blank out the rest of the line
// TODO(bfredl): we could cache winline widths // TODO(bfredl): we could cache winline widths
while (col < clear_width) { while (col < clear_width) {
if (grid->ScreenLines[off_to][0] != ' ' || grid->ScreenLines[off_to][1] != NUL if (grid->ScreenLines[off_to][0] != ' '
|| grid->ScreenLines[off_to][1] != NUL
|| grid->ScreenAttrs[off_to] != bg_attr) { || grid->ScreenAttrs[off_to] != bg_attr) {
grid->ScreenLines[off_to][0] = ' '; grid->ScreenLines[off_to][0] = ' ';
grid->ScreenLines[off_to][1] = NUL; grid->ScreenLines[off_to][1] = NUL;
@@ -5111,7 +5125,7 @@ win_redr_custom (
*wp->w_p_stl == NUL ? 0 : OPT_LOCAL); *wp->w_p_stl == NUL ? 0 : OPT_LOCAL);
} }
col += wp->w_winrow; col += wp->w_wincol;
} }
if (maxwidth <= 0) if (maxwidth <= 0)
@@ -5258,7 +5272,9 @@ void grid_getbytes(ScreenGrid *grid, int row, int col, char_u *bytes,
{ {
unsigned off; unsigned off;
if (grid == NULL) { if (!ui_is_external(kUIMultigrid)) {
row += grid->OffsetRow;
col += grid->OffsetColumn;
grid = &default_grid; grid = &default_grid;
} }
@@ -5321,6 +5337,13 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row,
grid = &default_grid; 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 // safety check
if (grid->ScreenLines == NULL || row >= grid->Rows || col >= grid->Columns) { if (grid->ScreenLines == NULL || row >= grid->Rows || col >= grid->Columns) {
return; return;
@@ -5777,6 +5800,15 @@ void grid_fill(ScreenGrid *grid, int start_row, int end_row, int start_col,
grid = &default_grid; 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 if (end_row > grid->Rows) // safety check
end_row = grid->Rows; end_row = grid->Rows;
if (end_col > grid->Columns) // safety check 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; 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) { if (!screen_valid(TRUE) || line_count <= 0) {
return FAIL; return FAIL;
} }
@@ -6326,6 +6366,14 @@ int grid_del_lines(ScreenGrid *grid, int row, int line_count, int end,
grid = &default_grid; 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) { if (!screen_valid(TRUE) || line_count <= 0) {
return FAIL; return FAIL;
} }

View File

@@ -440,13 +440,16 @@ Array ui_array(void)
return all_uis; 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) { if (wp == NULL) {
//TODO(utkarshme): error out api_set_error(error, kErrorTypeValidation, "No window with the given handle");
abort();
return; return;
} }