-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathneovim-libvterm-0-2-support.patch
94 lines (88 loc) · 3.31 KB
/
neovim-libvterm-0-2-support.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
From 7a1b90ed10e7626d061ee0ba7b0b321151c44c7d Mon Sep 17 00:00:00 2001
From: Andreas Schneider <[email protected]>
Date: Tue, 8 Feb 2022 18:58:36 +0100
Subject: [PATCH 1/2] refactor(term): use const for title and add len to
buf_set_term_title()
---
src/nvim/terminal.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Index: neovim-0.6.1/src/nvim/terminal.c
===================================================================
--- neovim-0.6.1.orig/src/nvim/terminal.c 2022-02-09 21:11:11.374493070 +0100
+++ neovim-0.6.1/src/nvim/terminal.c 2022-02-09 21:11:11.407493071 +0100
@@ -118,6 +118,10 @@ struct terminal {
// window height has increased) and must be deleted from the terminal buffer
int sb_pending;
+ char *title; // VTermStringFragment buffer
+ size_t title_len; // number of rows pushed to sb_buffer
+ size_t title_size; // sb_buffer size
+
// buf_T instance that acts as a "drawing surface" for libvterm
// we can't store a direct reference to the buffer because the
// refresh_timer_cb may be called after the buffer was freed, and there's
@@ -222,7 +226,7 @@ Terminal *terminal_open(buf_T *buf, Term
set_option_value("wrap", false, NULL, OPT_LOCAL);
set_option_value("list", false, NULL, OPT_LOCAL);
if (buf->b_ffname != NULL) {
- buf_set_term_title(buf, (char *)buf->b_ffname);
+ buf_set_term_title(buf, (char *)buf->b_ffname, strlen((char *)buf->b_ffname));
}
RESET_BINDING(curwin);
// Reset cursor in current window.
@@ -588,6 +592,7 @@ void terminal_destroy(Terminal *term)
xfree(term->sb_buffer[i]);
}
xfree(term->sb_buffer);
+ xfree(term->title);
vterm_free(term->vt);
xfree(term);
}
@@ -810,13 +815,13 @@ static int term_movecursor(VTermPos new,
return 1;
}
-static void buf_set_term_title(buf_T *buf, char *title)
+static void buf_set_term_title(buf_T *buf, const char *title, size_t len)
FUNC_ATTR_NONNULL_ALL
{
Error err = ERROR_INIT;
dict_set_var(buf->b_vars,
STATIC_CSTR_AS_STRING("term_title"),
- STRING_OBJ(cstr_as_string(title)),
+ STRING_OBJ(((String){ .data = (char *)title, .size = len })),
false,
false,
&err);
@@ -839,7 +844,34 @@ static int term_settermprop(VTermProp pr
case VTERM_PROP_TITLE: {
buf_T *buf = handle_get_buffer(term->buf_handle);
- buf_set_term_title(buf, val->string);
+#if VTERM_VERSION_MAJOR > 0 || (VTERM_VERSION_MAJOR == 0 && VTERM_VERSION_MINOR >= 2)
+ VTermStringFragment frag = val->string;
+
+ if (frag.initial && frag.final) {
+ buf_set_term_title(buf, frag.str, frag.len);
+ break;
+ }
+
+ if (frag.initial) {
+ term->title_len = 0;
+ term->title_size = MAX(frag.len, 1024);
+ term->title = xmalloc(sizeof(char *) * term->title_size);
+ } else if (term->title_len + frag.len > term->title_size) {
+ term->title_size *= 2;
+ term->title = xrealloc(term->title, sizeof(char *) * term->title_size);
+ }
+
+ memcpy(term->title + term->title_len, frag.str, frag.len);
+ term->title_len += frag.len;
+
+ if (frag.final) {
+ buf_set_term_title(buf, term->title, term->title_len);
+ xfree(term->title);
+ term->title = NULL;
+ }
+#else
+ buf_set_term_title(buf, val->string, strlen(val->string));
+#endif
break;
}