summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-05-19 23:11:00 +0200
committerBram Moolenaar <Bram@vim.org>2020-05-19 23:11:00 +0200
commiteaa3e0dae53acc9a345f430ef014d65c105192c3 (patch)
treecdb6bbc38a7438e5e7ad03de43fc01081750853d
parenta09195f29ee8cd88411152cf311f4e4ab2f3b4b3 (diff)
downloadvim-git-eaa3e0dae53acc9a345f430ef014d65c105192c3.tar.gz
patch 8.2.0801: terminal test fails on Macv8.2.0801
Problem: Terminal test fails on Mac. Solution: Concatenate OSC pieces.
-rw-r--r--src/terminal.c20
-rw-r--r--src/version.c2
2 files changed, 19 insertions, 3 deletions
diff --git a/src/terminal.c b/src/terminal.c
index 5774dba9a..1fdad2aee 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -162,6 +162,7 @@ struct terminal_S {
char_u *tl_cursor_color; // NULL or allocated
int tl_using_altscreen;
+ garray_T tl_osc_buf; // incomplete OSC string
};
#define TMODE_ONCE 1 // CTRL-\ CTRL-N used
@@ -445,6 +446,7 @@ term_start(
#endif
ga_init2(&term->tl_scrollback, sizeof(sb_line_T), 300);
ga_init2(&term->tl_scrollback_postponed, sizeof(sb_line_T), 300);
+ ga_init2(&term->tl_osc_buf, sizeof(char), 300);
CLEAR_FIELD(split_ea);
if (opt->jo_curwin)
@@ -1015,6 +1017,7 @@ free_unused_terminals()
terminals_to_free = term->tl_next;
free_scrollback(term);
+ ga_clear(&term->tl_osc_buf);
term_free_vterm(term);
vim_free(term->tl_api);
@@ -4202,14 +4205,25 @@ parse_osc(int command, VTermStringFragment frag, void *user)
typval_T tv;
channel_T *channel = term->tl_job == NULL ? NULL
: term->tl_job->jv_channel;
+ garray_T *gap = &term->tl_osc_buf;
// We recognize only OSC 5 1 ; {command}
if (command != 51)
return 0;
- reader.js_buf = vim_strnsave((char_u *)frag.str, (int)(frag.len));
- if (reader.js_buf == NULL)
+ // Concatenate what was received until the final piece is found.
+ if (ga_grow(gap, (int)frag.len + 1) == FAIL)
+ {
+ ga_clear(gap);
+ return 1;
+ }
+ mch_memmove((char *)gap->ga_data + gap->ga_len, frag.str, frag.len);
+ gap->ga_len += frag.len;
+ if (!frag.final)
return 1;
+
+ ((char *)gap->ga_data)[gap->ga_len] = 0;
+ reader.js_buf = gap->ga_data;
reader.js_fill = NULL;
reader.js_used = 0;
if (json_decode(&reader, &tv, 0) == OK
@@ -4243,7 +4257,7 @@ parse_osc(int command, VTermStringFragment frag, void *user)
else
ch_log(channel, "Invalid JSON received");
- vim_free(reader.js_buf);
+ ga_clear(gap);
clear_tv(&tv);
return 1;
}
diff --git a/src/version.c b/src/version.c
index ede8ad10b..68d1db90d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 801,
+/**/
800,
/**/
799,