login

<     >

2020-12-25 11:42:28 (UTC-03:00)

Marcel Rodrigues <marcelgmr@gmail.com>

Merge pull request #7 from rdebath/patch-upgrade2

Patch upgrade2 -- Colours

diff --git a/main.c b/main.c
index d6c4bc5..0ba53de 100644
--- a/main.c
+++ b/main.c
@@ -40,7 +40,6 @@ get_pair(Term *term, int row, int col)
     uint8_t fore, back;
     int inverse;
 
-    /* TODO: add support for A_INVISIBLE */
     inverse = term->mode & M_REVERSE;
     if (term->mode & M_CURSORVIS)
         inverse = term->row == row && term->col == col ? !inverse : inverse;
@@ -59,8 +58,9 @@ get_pair(Term *term, int row, int col)
         fore = 0x2;
     if (cell.attr & A_BOLD)
         fore |= 0x8;
-    if (cell.attr & A_BLINK)
+    if (cell.attr & A_BRIGHTBG)
         back |= 0x8;
+    if ((cell.attr & A_INVISIBLE) != 0) fore = back;
     return (fore << 4) | (back & 0xF);
 }
 

diff --git a/term.c b/term.c
index 8c3a5a5..a42dcca 100644
--- a/term.c
+++ b/term.c
@@ -452,77 +452,134 @@ modeswitch(Term *term, int private, int number, int value)
 }
 
 static void
-sgr(Term *term, int number)
+sgr(Term *term, int n, int *params)
 {
-    switch (number) {
-    case 0:
-        term->attr = def_attr;
-        term->pair = def_pair;
-        break;
-    case 1:
-        term->attr |= A_BOLD;
-        break;
-    case 2:
-        term->attr |= A_DIM;
-        break;
-    case 4:
-        term->attr |= A_UNDERLINE;
-        break;
-    case 5:
-        term->attr |= A_BLINK;
-        break;
-    case 7:
-        term->attr |= A_INVERSE;
-        break;
-    case 10:
-        /* TODO: reset toggle meta flag */
-        term->cs_array[term->cs_index = 0] = CS_BMP;
-        term->mode &= ~M_DISPCTRL;
-        break;
-    case 11:
-        /* TODO: reset toggle meta flag */
-        term->cs_array[term->cs_index] = CS_437;
-        term->mode |= M_DISPCTRL;
-        break;
-    case 12:
-        /* TODO: set toggle meta flag */
-        term->cs_array[term->cs_index] = CS_437;
-        term->mode |= M_DISPCTRL;
-        break;
-    case 21:
-        term->attr &= ~A_BOLD;
-        break;
-    case 22:
-        term->attr &= ~A_DIM;
-        break;
-    case 24:
-        term->attr &= ~A_UNDERLINE;
-        break;
-    case 25:
-        term->attr &= ~A_BLINK;
-        break;
-    case 27:
-        term->attr &= ~A_INVERSE;
-        break;
-    case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37:
-        term->pair = ((number - 30) << 4) | (term->pair & 0x0F);
-        break;
-    case 38:
-        term->attr |= A_UNDERLINE;
-        term->pair = (DEF_FORE << 4) | (term->pair & 0x0F);
-        break;
-    case 39:
-        term->attr &= ~A_UNDERLINE;
-        term->pair = (DEF_FORE << 4) | (term->pair & 0x0F);
-        break;
-    case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47:
-        term->pair = (term->pair & 0xF0) | (number - 40);
-        break;
-    case 49:
-        term->pair = (term->pair & 0xF0) | DEF_BACK;
-        break;
-    default:
-        logfmt("UNS: SGR %d\n", number);
+    int i, number;
+    for(i=0; i<n; i++) {
+        number = params[i];
+
+        switch (number) {
+        case 0:
+            term->attr = def_attr;
+            term->pair = def_pair;
+            break;
+        case 1:
+            term->attr |= A_BOLD;
+            break;
+        case 2:
+            term->attr |= A_DIM;
+            break;
+        case 4:
+            term->attr |= A_UNDERLINE;
+            break;
+        case 5:
+            term->attr |= A_BLINK;
+            break;
+        case 7:
+            term->attr |= A_INVERSE;
+            break;
+        case 8:
+            term->attr |= A_INVISIBLE;
+            break;
+        case 10:
+            /* TODO: reset toggle meta flag */
+            term->cs_array[term->cs_index = 0] = CS_BMP;
+            term->mode &= ~M_DISPCTRL;
+            break;
+        case 11:
+            /* TODO: reset toggle meta flag */
+            term->cs_array[term->cs_index] = CS_437;
+            term->mode |= M_DISPCTRL;
+            break;
+        case 12:
+            /* TODO: set toggle meta flag */
+            term->cs_array[term->cs_index] = CS_437;
+            term->mode |= M_DISPCTRL;
+            break;
+        case 21:
+            term->attr &= ~A_BOLD;
+            break;
+        case 22:
+            term->attr &= ~A_DIM;
+            break;
+        case 24:
+            term->attr &= ~A_UNDERLINE;
+            break;
+        case 25:
+            term->attr &= ~A_BLINK;
+            break;
+        case 27:
+            term->attr &= ~A_INVERSE;
+            break;
+        case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37:
+            term->pair = ((number - 30) << 4) | (term->pair & 0x0F);
+            break;
+#ifdef OLDLINUX
+        case 38:
+            term->attr |= A_UNDERLINE;
+            term->pair = (DEF_FORE << 4) | (term->pair & 0x0F);
+            break;
+        case 39:
+            term->attr &= ~A_UNDERLINE;
+            term->pair = (DEF_FORE << 4) | (term->pair & 0x0F);
+            break;
+#endif
+#ifndef OLDLINUX
+        case 38:
+            i++ ;
+            if (i>n) break;
+            if (params[i] == 5) {
+                i++; /* 256 colours */
+                term->pair = (DEF_FORE << 4) | (term->pair & 0x0F);
+                break;
+            } else if (params[i] == 2) {
+                i+=3;
+                /* 16M colours, note I'm using common form not strict ITU T.416 */
+                term->pair = (DEF_FORE << 4) | (term->pair & 0x0F);
+                break;
+            }
+            /* Could be CMYK; probably broken */
+            i = n;
+            break;
+        case 39:
+            term->pair = (DEF_FORE << 4) | (term->pair & 0x0F);
+            break;
+#endif
+        case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47:
+            term->pair = (term->pair & 0xF0) | (number - 40);
+            break;
+#ifndef OLDLINUX
+        case 48:
+            i++ ;
+            if (i>n) break;
+            if (params[i] == 5) {
+                i++; /* 256 colours */
+                term->pair = (term->pair & 0xF0) | DEF_BACK;
+                break;
+            } else if (params[i] == 2) {
+                i+=3;
+                /* 16M colours, note I'm using common form not strict ITU T.416 */
+                term->pair = (term->pair & 0xF0) | DEF_BACK;
+                break;
+            }
+            /* Could be CMYK; probably broken */
+            i = n;
+            break;
+#endif
+        case 49:
+            term->pair = (term->pair & 0xF0) | DEF_BACK;
+            break;
+        case 90: case 91: case 92: case 93: case 94: case 95: case 96: case 97:
+            term->pair = ((number - 90) << 4) | (term->pair & 0x0F);
+            term->attr |= A_BOLD;
+            break;
+        case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 107:
+            term->pair = (term->pair & 0xF0) | (number - 100);
+            term->attr |= A_BRIGHTBG;
+            break;
+        default:
+            logfmt("UNS: SGR %d\n", number);
+        }
     }
 }
 
@@ -705,8 +762,7 @@ ctrlseq(Term *term, uint8_t byte)
             modeswitch(term, private, params[i], 0);
         break;
     case 'm':
-        for (i = 0; i < n; i++)
-            sgr(term, params[i]);
+        sgr(term, n, params);
         break;
     case 'n':
         /* Device Status Report (DSR) */

diff --git a/term.h b/term.h
index 1a9125a..35ba164 100644
--- a/term.h
+++ b/term.h
@@ -7,6 +7,7 @@
 #define A_INVERSE   0x20
 #define A_INVISIBLE 0x40
 #define A_CROSSED   0x80
+#define A_BRIGHTBG  A_BLINK
 
 #define M_DISPCTRL  0x0001
 #define M_INSERT    0x0002