rename the project into madtty.
[apps/madtty.git] / inject_csi.c
index e7652aa..3942304 100644 (file)
@@ -23,20 +23,10 @@ Copyright (c) 2004 Bruno T. C. de Oliveira
 #include "roteprivate.h"
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 
 #define MAX_CSI_ES_PARAMS 32
    
-static inline void clamp_cursor_to_bounds(RoteTerm *rt) {
-   if (rt->crow < 0) rt->curpos_dirty = true, rt->crow = 0;
-   if (rt->ccol < 0) rt->curpos_dirty = true, rt->ccol = 0;
-
-   if (rt->crow >= rt->rows) 
-      rt->curpos_dirty = true, rt->crow = rt->rows - 1;
-
-   if (rt->ccol >= rt->cols)
-      rt->curpos_dirty = true, rt->ccol = rt->cols - 1;
-}
-
 /* interprets a 'set attribute' (SGR) CSI escape sequence */
 static void interpret_csi_SGR(RoteTerm *rt, int param[], int pcount) {
    int i;
@@ -75,14 +65,17 @@ static void interpret_csi_SGR(RoteTerm *rt, int param[], int pcount) {
          ROTE_ATTR_MOD_BOLD(rt->curattr,1);
       else if (param[i] == 5)  /* set blink */
          ROTE_ATTR_MOD_BLINK(rt->curattr,1);
-      else if (param[i] == 7) rt->curattr = 0x07;   /* reverse video */
+      else if (param[i] == 7 || param[i] == 27) { /* reverse video */
+       int fg = ROTE_ATTR_FG(rt->curattr);
+       int bg = ROTE_ATTR_BG(rt->curattr);
+       ROTE_ATTR_MOD_FG(rt->curattr, bg);
+       ROTE_ATTR_MOD_BG(rt->curattr, fg);
+      }
       else if (param[i] == 8) rt->curattr = 0x0;    /* invisible */
       else if (param[i] == 22 || param[i] == 24) /* bold off */
         ROTE_ATTR_MOD_BOLD(rt->curattr,0);
       else if (param[i] == 25) /* blink off */
         ROTE_ATTR_MOD_BLINK(rt->curattr,0);
-      else if (param[i] == 27) /* negative off */
-        rt->curattr = 0x70;
       else if (param[i] == 28) /* invisible off */
         rt->curattr = 0x70;
       else if (param[i] >= 30 && param[i] <= 37)    /* set fg */
@@ -325,6 +318,14 @@ void rote_es_interpret_csi(RoteTerm *rt) {
 
    /* delegate handling depending on command character (verb) */
    switch (verb) {
+      case 'h':
+         if (param_count == 1 && csiparam[0] == 4) /* insert mode */ 
+             rt->insert = true;
+         break;
+      case 'l':
+         if (param_count == 1 && csiparam[0] == 4) /* replace mode */
+              rt->insert = false;
+          break;
       case 'm': /* it's a 'set attribute' sequence */
          interpret_csi_SGR(rt, csiparam, param_count); break;
       case 'J': /* it's an 'erase display' sequence */
@@ -353,10 +354,12 @@ void rote_es_interpret_csi(RoteTerm *rt) {
          interpret_csi_SAVECUR(rt, csiparam, param_count); break;
       case 'u': /* restore cursor location */
          interpret_csi_RESTORECUR(rt, csiparam, param_count); break;
-      #ifdef DEBUG
       default:
-         fprintf(stderr, "Unrecogized CSI: <%s>\n", rt->pd->esbuf); break;
-      #endif
+        #ifdef DEBUG
+         fprintf(stderr, "Unrecogized CSI: verb=%c <%s>\n", 
+                verb, rt->pd->esbuf); 
+        #endif
+        break;
    }
 }