s390/tty3270: add support for VT100 graphics escape
authorSven Schnelle <svens@linux.ibm.com>
Thu, 17 Nov 2022 16:30:40 +0000 (17:30 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 9 Jan 2023 13:33:58 +0000 (14:33 +0100)
Add support for ESC(B and ESC(0 to switch between character charset
and graphics charset. Used in vt100 and later terminal generations.

Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Tested-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
drivers/s390/char/con3270.c

index 13e2b4cb74fc2fa45a35679ac59fcd87463f607c..9c816d1239ebc801b4dd27244d6f3ed9acb429c9 100644 (file)
@@ -1557,7 +1557,7 @@ static void tty3270_goto_xy(struct tty3270 *tp, int cx, int cy)
  */
 static void tty3270_escape_sequence(struct tty3270 *tp, char ch)
 {
-       enum { ESnormal, ESesc, ESsquare, ESgetpars };
+       enum { ESnormal, ESesc, ESsquare, ESparen, ESgetpars };
 
        if (tp->esc_state == ESnormal) {
                if (ch == 0x1b)
@@ -1571,6 +1571,9 @@ static void tty3270_escape_sequence(struct tty3270 *tp, char ch)
                case '[':
                        tp->esc_state = ESsquare;
                        break;
+               case '(':
+                       tp->esc_state = ESparen;
+                       break;
                case 'E':
                        tty3270_cr(tp);
                        tty3270_lf(tp);
@@ -1604,15 +1607,28 @@ static void tty3270_escape_sequence(struct tty3270 *tp, char ch)
                }
                return;
        }
-       if (tp->esc_state == ESsquare) {
+
+       switch (tp->esc_state) {
+       case ESparen:
+               tp->esc_state = ESnormal;
+               switch (ch) {
+               case 'B':
+                       tp->attributes.alternate_charset = 0;
+                       break;
+               case '0':
+                       tp->attributes.alternate_charset = 1;
+                       break;
+               }
+               return;
+       case ESsquare:
                tp->esc_state = ESgetpars;
                memset(tp->esc_par, 0, sizeof(tp->esc_par));
                tp->esc_npar = 0;
                tp->esc_ques = (ch == '?');
                if (tp->esc_ques)
                        return;
-       }
-       if (tp->esc_state == ESgetpars) {
+               fallthrough;
+       case ESgetpars:
                if (ch == ';' && tp->esc_npar < ESCAPE_NPAR - 1) {
                        tp->esc_npar++;
                        return;
@@ -1622,6 +1638,9 @@ static void tty3270_escape_sequence(struct tty3270 *tp, char ch)
                        tp->esc_par[tp->esc_npar] += ch - '0';
                        return;
                }
+               break;
+       default:
+               break;
        }
        tp->esc_state = ESnormal;
        if (ch == 'n' && !tp->esc_ques) {