Mercurial > vim
diff src/libvterm/src/state.c @ 20480:d0bf39eb2b07 v8.2.0794
patch 8.2.0794: libvterm code lags behind the upstream version
Commit: https://github.com/vim/vim/commit/d098b824c10cc20dc55e18c22c4991f61826006e
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon May 18 21:12:59 2020 +0200
patch 8.2.0794: libvterm code lags behind the upstream version
Problem: Libvterm code lags behind the upstream version.
Solution: Include revisions 743 - 747.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 18 May 2020 21:15:04 +0200 |
parents | c15dd3da4f47 |
children | dc88c690f19b |
line wrap: on
line diff
--- a/src/libvterm/src/state.c +++ b/src/libvterm/src/state.c @@ -73,13 +73,27 @@ static VTermState *vterm_state_new(VTerm state->bold_is_highbright = 0; + state->combine_chars_size = 16; + state->combine_chars = vterm_allocator_malloc(state->vt, state->combine_chars_size * sizeof(state->combine_chars[0])); + + state->tabstops = vterm_allocator_malloc(state->vt, (state->cols + 7) / 8); + + state->lineinfos[BUFIDX_PRIMARY] = vterm_allocator_malloc(state->vt, state->rows * sizeof(VTermLineInfo)); + state->lineinfo = state->lineinfos[BUFIDX_PRIMARY]; + + state->encoding_utf8.enc = vterm_lookup_encoding(ENC_UTF8, 'u'); + if(*state->encoding_utf8.enc->init) + (*state->encoding_utf8.enc->init)(state->encoding_utf8.enc, state->encoding_utf8.data); + return state; } INTERNAL void vterm_state_free(VTermState *state) { vterm_allocator_free(state->vt, state->tabstops); - vterm_allocator_free(state->vt, state->lineinfo); + vterm_allocator_free(state->vt, state->lineinfos[BUFIDX_PRIMARY]); + if(state->lineinfos[BUFIDX_ALTSCREEN]) + vterm_allocator_free(state->vt, state->lineinfos[BUFIDX_ALTSCREEN]); vterm_allocator_free(state->vt, state->combine_chars); vterm_allocator_free(state->vt, state); } @@ -106,15 +120,22 @@ static void scroll(VTermState *state, VT // Update lineinfo if full line if(rect.start_col == 0 && rect.end_col == state->cols && rightward == 0) { int height = rect.end_row - rect.start_row - abs(downward); + int row; - if(downward > 0) + if(downward > 0) { memmove(state->lineinfo + rect.start_row, state->lineinfo + rect.start_row + downward, height * sizeof(state->lineinfo[0])); - else + for(row = rect.end_row - downward; row < rect.end_row; row++) + state->lineinfo[row] = (VTermLineInfo){ 0 }; + } + else { memmove(state->lineinfo + rect.start_row - downward, state->lineinfo + rect.start_row, height * sizeof(state->lineinfo[0])); + for(row = rect.start_row; row < rect.start_row - downward; row++) + state->lineinfo[row] = (VTermLineInfo){ 0 }; + } } if(state->callbacks && state->callbacks->scrollrect) @@ -1701,7 +1722,7 @@ static int on_resize(int rows, int cols, { VTermState *state = user; VTermPos oldpos = state->pos; - VTermPos delta = { 0, 0 }; + VTermStateFields fields; if(cols != state->cols) { int col; @@ -1731,22 +1752,29 @@ static int on_resize(int rows, int cols, } if(rows != state->rows) { - int row; - VTermLineInfo *newlineinfo = vterm_allocator_malloc(state->vt, rows * sizeof(VTermLineInfo)); - if (newlineinfo == NULL) - return 0; + for(int bufidx = BUFIDX_PRIMARY; bufidx <= BUFIDX_ALTSCREEN; bufidx++) { + int row; + VTermLineInfo *oldlineinfo = state->lineinfos[bufidx]; + if(!oldlineinfo) + continue; + + VTermLineInfo *newlineinfo = vterm_allocator_malloc(state->vt, rows * sizeof(VTermLineInfo)); - for(row = 0; row < state->rows && row < rows; row++) { - newlineinfo[row] = state->lineinfo[row]; + for(row = 0; row < state->rows && row < rows; row++) { + newlineinfo[row] = oldlineinfo[row]; + } + + for( ; row < rows; row++) { + newlineinfo[row] = (VTermLineInfo){ + .doublewidth = 0, + }; + } + + vterm_allocator_free(state->vt, state->lineinfos[bufidx]); + state->lineinfos[bufidx] = newlineinfo; } - for( ; row < rows; row++) { - newlineinfo[row].doublewidth = 0; - newlineinfo[row].doubleheight = 0; - } - - vterm_allocator_free(state->vt, state->lineinfo); - state->lineinfo = newlineinfo; + state->lineinfo = state->lineinfos[state->mode.alt_screen ? BUFIDX_ALTSCREEN : BUFIDX_PRIMARY]; } state->rows = rows; @@ -1757,17 +1785,18 @@ static int on_resize(int rows, int cols, if(state->scrollregion_right > -1) UBOUND(state->scrollregion_right, state->cols); + fields.pos = state->pos; + if(state->callbacks && state->callbacks->resize) - (*state->callbacks->resize)(rows, cols, &delta, state->cbdata); + (*state->callbacks->resize)(rows, cols, &fields, state->cbdata); + + state->pos = fields.pos; if(state->at_phantom && state->pos.col < cols-1) { state->at_phantom = 0; state->pos.col++; } - state->pos.row += delta.row; - state->pos.col += delta.col; - if(state->pos.row >= rows) state->pos.row = rows - 1; if(state->pos.col >= cols) @@ -1803,17 +1832,6 @@ VTermState *vterm_obtain_state(VTerm *vt return NULL; vt->state = state; - state->combine_chars_size = 16; - state->combine_chars = vterm_allocator_malloc(state->vt, state->combine_chars_size * sizeof(state->combine_chars[0])); - - state->tabstops = vterm_allocator_malloc(state->vt, (state->cols + 7) / 8); - - state->lineinfo = vterm_allocator_malloc(state->vt, state->rows * sizeof(VTermLineInfo)); - - state->encoding_utf8.enc = vterm_lookup_encoding(ENC_UTF8, 'u'); - if(*state->encoding_utf8.enc->init != NULL) - (*state->encoding_utf8.enc->init)(state->encoding_utf8.enc, state->encoding_utf8.data); - vterm_parser_set_callbacks(vt, &parser_callbacks, state); return state; @@ -1976,6 +1994,9 @@ int vterm_state_set_termprop(VTermState return 1; case VTERM_PROP_ALTSCREEN: state->mode.alt_screen = val->boolean; + if(state->mode.alt_screen && !state->lineinfos[BUFIDX_ALTSCREEN]) + state->lineinfos[BUFIDX_ALTSCREEN] = vterm_allocator_malloc(state->vt, state->rows * sizeof(VTermLineInfo)); + state->lineinfo = state->lineinfos[state->mode.alt_screen ? BUFIDX_ALTSCREEN : BUFIDX_PRIMARY]; if(state->mode.alt_screen) { VTermRect rect = {0, 0, 0, 0}; rect.end_row = state->rows;