@@ -169,6 +169,54 @@ static VTermScreenCallbacks vterm_screen_callbacks = {
169
169
170
170
static Set (ptr_t ) invalidated_terminals = SET_INIT ;
171
171
172
+ static void emit_term_request (void * * argv )
173
+ {
174
+ char * payload = argv [0 ];
175
+ size_t payload_length = (size_t )argv [1 ];
176
+
177
+ String termrequest = { .data = payload , .size = payload_length };
178
+ Object data = STRING_OBJ (termrequest );
179
+ set_vim_var_string (VV_TERMREQUEST , payload , (ptrdiff_t )payload_length );
180
+ apply_autocmds_group (EVENT_TERMREQUEST , NULL , NULL , false, AUGROUP_ALL , curbuf , NULL , & data );
181
+ xfree (payload );
182
+ }
183
+
184
+ static int on_osc (int command , VTermStringFragment frag , void * user )
185
+ {
186
+ if (frag .str == NULL ) {
187
+ return 0 ;
188
+ }
189
+
190
+ StringBuilder request = KV_INITIAL_VALUE ;
191
+ kv_printf (request , "\x1b]%d;" , command );
192
+ kv_concat_len (request , frag .str , frag .len );
193
+ multiqueue_put (main_loop .events , emit_term_request , request .items , (void * )request .size );
194
+ return 1 ;
195
+ }
196
+
197
+ static int on_dcs (const char * command , size_t commandlen , VTermStringFragment frag , void * user )
198
+ {
199
+ if ((command == NULL ) || (frag .str == NULL )) {
200
+ return 0 ;
201
+ }
202
+
203
+ StringBuilder request = KV_INITIAL_VALUE ;
204
+ kv_printf (request , "\x1bP%*s" , (int )commandlen , command );
205
+ kv_concat_len (request , frag .str , frag .len );
206
+ multiqueue_put (main_loop .events , emit_term_request , request .items , (void * )request .size );
207
+ return 1 ;
208
+ }
209
+
210
+ static VTermStateFallbacks vterm_fallbacks = {
211
+ .control = NULL ,
212
+ .csi = NULL ,
213
+ .osc = on_osc ,
214
+ .dcs = on_dcs ,
215
+ .apc = NULL ,
216
+ .pm = NULL ,
217
+ .sos = NULL ,
218
+ };
219
+
172
220
void terminal_init (void )
173
221
{
174
222
time_watcher_init (& main_loop , & refresh_timer , NULL );
@@ -222,6 +270,7 @@ void terminal_open(Terminal **termpp, buf_T *buf, TerminalOptions opts)
222
270
vterm_screen_enable_reflow (rv -> vts , true);
223
271
// delete empty lines at the end of the buffer
224
272
vterm_screen_set_callbacks (rv -> vts , & vterm_screen_callbacks , rv );
273
+ vterm_screen_set_unrecognised_fallbacks (rv -> vts , & vterm_fallbacks , rv );
225
274
vterm_screen_set_damage_merge (rv -> vts , VTERM_DAMAGE_SCROLL );
226
275
vterm_screen_reset (rv -> vts , 1 );
227
276
vterm_output_set_callback (rv -> vt , term_output_callback , rv );
0 commit comments