diff src/libvterm/src/state.c @ 20460:c15dd3da4f47 v8.2.0784

patch 8.2.0784: libvterm code lags behind the upstream version Commit: https://github.com/vim/vim/commit/94d729cbe8f0f788d9d7539f733cff395e73b228 Author: Bram Moolenaar <Bram@vim.org> Date: Sun May 17 21:50:16 2020 +0200 patch 8.2.0784: libvterm code lags behind the upstream version Problem: Libvterm code lags behind the upstream version. Solution: Include revisions 730 - 733.
author Bram Moolenaar <Bram@vim.org>
date Sun, 17 May 2020 22:00:04 +0200
parents 89fade12827d
children d0bf39eb2b07
line wrap: on
line diff
--- a/src/libvterm/src/state.c
+++ b/src/libvterm/src/state.c
@@ -1617,6 +1617,8 @@ static int on_osc(const char *command, s
 
 static void request_status_string(VTermState *state, const char *command, size_t cmdlen)
 {
+  VTerm *vt = state->vt;
+
   if(cmdlen == 1)
     switch(command[0]) {
       case 'm': // Query SGR
@@ -1624,22 +1626,37 @@ static void request_status_string(VTermS
           long args[20];
           int argc = vterm_state_getpen(state, args, sizeof(args)/sizeof(args[0]));
 	  int argi;
-          vterm_push_output_sprintf_ctrl(state->vt, C1_DCS, "1$r");
-          for(argi = 0; argi < argc; argi++)
-            vterm_push_output_sprintf(state->vt,
-                argi == argc - 1             ? "%d" :
-                CSI_ARG_HAS_MORE(args[argi]) ? "%d:" :
-                                               "%d;",
-                CSI_ARG(args[argi]));
-          vterm_push_output_sprintf(state->vt, "m");
-          vterm_push_output_sprintf_ctrl(state->vt, C1_ST, "");
+          size_t cur = 0;
+
+          cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur,
+              vt->mode.ctrl8bit ? "\x90" "1$r" : ESC_S "P" "1$r"); // DCS 1$r ...
+          if(cur >= vt->tmpbuffer_len)
+            return;
+
+          for(argi = 0; argi < argc; argi++) {
+            cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur,
+                argi == argc - 1             ? "%ld" :
+                CSI_ARG_HAS_MORE(args[argi]) ? "%ld:" :
+                                               "%ld;",
+                 CSI_ARG(args[argi]));
+
+            if(cur >= vt->tmpbuffer_len)
+              return;
+          }
+
+          cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur,
+              vt->mode.ctrl8bit ? "m" "\x9C" : "m" ESC_S "\\"); // ... m ST
+          if(cur >= vt->tmpbuffer_len)
+            return;
+
+          vterm_push_output_bytes(vt, vt->tmpbuffer, cur);
         }
         return;
       case 'r': // Query DECSTBM
-        vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%dr", state->scrollregion_top+1, SCROLLREGION_BOTTOM(state));
+        vterm_push_output_sprintf_dcs(vt, "1$r%d;%dr", state->scrollregion_top+1, SCROLLREGION_BOTTOM(state));
         return;
       case 's': // Query DECSLRM
-        vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%ds", SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state));
+        vterm_push_output_sprintf_dcs(vt, "1$r%d;%ds", SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state));
         return;
     }
 
@@ -1653,11 +1670,11 @@ static void request_status_string(VTermS
       }
       if(state->mode.cursor_blink)
         reply--;
-      vterm_push_output_sprintf_dcs(state->vt, "1$r%d q", reply);
+      vterm_push_output_sprintf_dcs(vt, "1$r%d q", reply);
       return;
     }
     else if(strneq(command, "\"q", 2)) {
-      vterm_push_output_sprintf_dcs(state->vt, "1$r%d\"q", state->protected_cell ? 1 : 2);
+      vterm_push_output_sprintf_dcs(vt, "1$r%d\"q", state->protected_cell ? 1 : 2);
       return;
     }
   }