X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fvt102.c;h=35719cadc3e582540945776423b106658485c265;hb=9df8b9cc93fa29a848634af76e71fce6ddda67f0;hp=000ef7bfe52f6ce9f5999d7c99e37121f4000a5b;hpb=8095a5479e25be2d5948eadc59c49e92f0ab948f;p=sympathy.git diff --git a/src/vt102.c b/src/vt102.c index 000ef7b..35719ca 100644 --- a/src/vt102.c +++ b/src/vt102.c @@ -10,6 +10,27 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.18 2008/02/07 01:59:25 james + * *** empty log message *** + * + * Revision 1.17 2008/02/07 01:58:28 james + * *** empty log message *** + * + * Revision 1.16 2008/02/07 01:57:46 james + * *** empty log message *** + * + * Revision 1.15 2008/02/07 00:43:27 james + * *** empty log message *** + * + * Revision 1.14 2008/02/07 00:40:23 james + * *** empty log message *** + * + * Revision 1.13 2008/02/07 00:39:59 james + * *** empty log message *** + * + * Revision 1.12 2008/02/07 00:39:13 james + * *** empty log message *** + * * Revision 1.11 2008/02/06 20:26:58 james * *** empty log message *** * @@ -138,11 +159,6 @@ ESC)0 CTRL-O -ESC7 -ESC8 -ESCH -ESCM -ESC> */ @@ -161,11 +177,10 @@ csi_ender (int c) } static inline int -csi_starter (int c) +scs_starter (int c) { switch (c) { - case '[': case '(': case ')': return 1; @@ -173,6 +188,17 @@ csi_starter (int c) return 0; } +static inline int +csi_starter (int c) +{ + switch (c) + { + case '[': + return 1; + } + return 0; +} + static inline int in_margins (VT102 * v, CRT_Pos p) { @@ -463,6 +489,14 @@ vt102_change_mode (VT102 * v, int private, char *ns, int set) v->private_modes[m] = set; switch (m) { + case VT102_PRIVATE_MODE_CURSOR_MODE: + if (v->application_keypad_mode) + v->private_modes[m] = 0; +#if 0 + fprintf (stderr, "APPLICATION CURSOR MODE %d wanted %d\n", + v->private_modes[m],set); +#endif + break; case VT102_PRIVATE_MODE_ORIGIN_MODE: vt102_cursor_home (v); break; @@ -638,6 +672,11 @@ vt102_restore_state (VT102 * v) v->pending_wrap = 0; } +void vt102_scs(VT102 *c,int g,int s) +{ +/*Ignoring charsets*/ +} + void vt102_parse_esc (VT102 * v, int c) { @@ -674,10 +713,10 @@ vt102_parse_esc (VT102 * v, int c) vt102_restore_state (v); break; case '=': - v->application_keypad_mode=1; + v->application_keypad_mode = 1; break; case '>': - v->application_keypad_mode=0; + v->application_keypad_mode = 0; break; default: #if 0 @@ -905,6 +944,7 @@ vt102_parse_char (VT102 * v, int c) { VT102_parser *p = &v->parser; + #if 0 fprintf (stderr, "char %c pc %d %d %d %d %d\n", (c < 32) ? 32 : c, c, p->in_csi, p->in_escape, v->pos.x, v->pos.y); @@ -927,12 +967,20 @@ vt102_parse_char (VT102 * v, int c) p->in_csi++; p->in_escape = 0; } + else if (scs_starter(c)) { + p->in_scs=c; + p->in_escape = 0; + } else { p->in_escape = 0; vt102_parse_esc (v, c); } } + else if (p->in_scs) { + vt102_scs(v,p->in_scs,c); + p->in_scs=0; + } else { @@ -966,7 +1014,13 @@ vt102_parse_char (VT102 * v, int c) vt102_cursor_carriage_return (v); break; /*SO*/ case 14: + /*select G1*/ + /*Ignoring charsets*/ + break; /*SI*/ case 15: + /*select G0*/ + /*Ignoring charsets*/ + break; /*DLE*/ case 16: /*DC1 */ case 17: /*DC2 */ case 18: @@ -1013,10 +1067,10 @@ vt102_parse_char (VT102 * v, int c) vt102_status_line (v, "VT102 foo bar baz I'm the urban spaceman baby"); } -vt102_parse(VT102 *v,char *buf,int len) +vt102_parse (VT102 * v, char *buf, int len) { -while (len--) - vt102_parse_char(v,*(buf++)); + while (len--) + vt102_parse_char (v, *(buf++)); } @@ -1026,6 +1080,7 @@ vt102_parser_reset (VT102_parser * p) p->in_csi = 0; p->in_escape = 0; p->csi_ptr = 0; + p->in_scs=0; } @@ -1033,9 +1088,12 @@ void vt102_send (VT102 * v, uint8_t key) { uint8_t c; - if ((key > 31) || (key < 127)) +#if 0 + fprintf (stderr, "vts: %d(%c)\n", key, (key > 31) ? key : ' '); +#endif + if ((key > 31) && (key < 127)) { - tty_write (v->t, &key, 1); + tty_write (v->tty, &key, 1); return; } @@ -1054,14 +1112,14 @@ vt102_send (VT102 * v, uint8_t key) /*LF*/ case 10: /*VT*/ case 11: /*FF*/ case 12: - tty_write (v->t, &key, 1); + tty_write (v->tty, &key, 1); break; /*CR*/ case 13: - tty_write (v->t, &key, 1); + tty_write (v->tty, &key, 1); if (v->modes[VT102_MODE_NEWLINE_MODE]) { c = 10; - tty_write (v->t, &c, 1); + tty_write (v->tty, &c, 1); } break; /*SO*/ case 14: @@ -1077,7 +1135,7 @@ vt102_send (VT102 * v, uint8_t key) /*CAN*/ case 24: /*EM*/ case 25: /*SUB*/ case 26: - tty_write (v->t, &key, 1); + tty_write (v->tty, &key, 1); break; /*ESC*/ case 27: /*FS*/ case 28: @@ -1085,24 +1143,33 @@ vt102_send (VT102 * v, uint8_t key) /*RS*/ case 30: /*US*/ case 31: /*DEL*/ case 127: - tty_write (v->t, &key, 1); + tty_write (v->tty, &key, 1); break; case KEY_UP: case KEY_DOWN: case KEY_RIGHT: case KEY_LEFT: + case KEY_HOME: + case KEY_MIDDLE: + case KEY_END: + if (v->private_modes[VT102_PRIVATE_MODE_CURSOR_MODE]) { - uint8_t buf[] = { 033, '[', 'A' + (key - KEY_UP) }; - tty_write (v->t, &key, sizeof (buf)); + uint8_t buf[] = { 033, 'O', 'A' + (key - KEY_UP) }; + tty_write (v->tty, &buf, sizeof (buf)); } else { - uint8_t buf[] = { 033, '[', 'O' + (key - KEY_UP) }; - tty_write (v->t, &key, sizeof (buf)); + uint8_t buf[] = { 033, '[', 'A' + (key - KEY_UP) }; + tty_write (v->tty, &buf, sizeof (buf)); } break; + case KEY_STAR: + case KEY_PLUS: + case KEY_COMMA: + case KEY_PERIOD: + case KEY_DIVIDE: case KEY_0: case KEY_1: case KEY_2: @@ -1115,65 +1182,47 @@ vt102_send (VT102 * v, uint8_t key) case KEY_9: if (v->application_keypad_mode) { - uint8_t buf[] = { 033, 'O', 'p' + (key - KEY_0) }; - tty_write (v->t, &key, sizeof (buf)); - } - else - { - c = '0' + (key - KEY_0); - tty_write (v->t, &c, 1); - } - break; - case KEY_MINUS: - if (v->application_keypad_mode) - { - uint8_t buf[] = { 033, 'O', 'm' }; - tty_write (v->t, &key, sizeof (buf)); + uint8_t buf[] = { 033, 'O', 'a' + (key - KEY_154) }; + tty_write (v->tty, &buf, sizeof (buf)); } else { - c = '-'; - tty_write (v->t, &c, 1); - } - break; - case KEY_COMMA: - if (v->application_keypad_mode) - { - uint8_t buf[] = { 033, 'O', 'l' }; - tty_write (v->t, &key, sizeof (buf)); - } - else - { - c = ','; - tty_write (v->t, &c, 1); - } - break; - case KEY_PERIOD: - if (v->application_keypad_mode) - { - uint8_t buf[] = { 033, 'O', 'n' }; - tty_write (v->t, &key, sizeof (buf)); - } - else - { - c = '.'; - tty_write (v->t, &c, 1); + static char kpoff[KEY_NUM] = { + [KEY_STAR] = '*', + [KEY_PLUS] = '+', + [KEY_COMMA] = ',', + [KEY_MINUS] = '-', + [KEY_PERIOD] = '.', + [KEY_DIVIDE] = '/', + [KEY_0] = '0', + [KEY_1] = '1', + [KEY_2] = '2', + [KEY_3] = '3', + [KEY_4] = '4', + [KEY_5] = '5', + [KEY_6] = '6', + [KEY_7] = '7', + [KEY_8] = '8', + [KEY_9] = '9' + }; + + tty_write (v->tty, &kpoff[key], 1); } break; case KEY_ENTER: if (v->application_keypad_mode) { uint8_t buf[] = { 033, 'O', 'M' }; - tty_write (v->t, &key, sizeof (buf)); + tty_write (v->tty, &buf, sizeof (buf)); } else { c = 13; - tty_write (v->t, &c, 1); + tty_write (v->tty, &c, 1); if (v->modes[VT102_MODE_NEWLINE_MODE]) { c = 10; - tty_write (v->t, &c, 1); + tty_write (v->tty, &c, 1); } } break; @@ -1183,10 +1232,18 @@ vt102_send (VT102 * v, uint8_t key) case KEY_PF4: { uint8_t buf[] = { 033, 'O', 'P' + (key - KEY_PF1) }; - tty_write (v->t, &key, sizeof (buf)); + tty_write (v->tty, &buf, sizeof (buf)); + } + break; + case KEY_INSERT: + case KEY_DELETE: + case KEY_PGUP: + case KEY_PGDN: + { + uint8_t buf[] = { 033, '[', '0' + (key - KEY_180), '~' }; + tty_write (v->tty, &buf, sizeof (buf)); } break; - } } @@ -1200,7 +1257,7 @@ vt102_reset (VT102 * v) crt_cls (&v->crt); - v->application_keypad_mode=0; + v->application_keypad_mode = 0; v->current_line = v->pos; v->pending_wrap = 0; @@ -1231,34 +1288,41 @@ vt102_reset (VT102 * v) } -int vt102_dispatch(VT102 *v) +int +vt102_dispatch (VT102 * v) { -char buf[1024]; -int red; + char buf[1024]; + int red; -red=tty_read(v->t,buf,sizeof(buf)); -if (red<0) return -1; -if (!red) return 0; + red = tty_read (v->tty, buf, sizeof (buf)); -vt102_parse(v,buf,red); + if (red < 0) + return -1; + if (!red) + return 0; -return 0; + + vt102_parse (v, buf, red); + + return 0; } -VT102 *vt102_new(TTY *t) +VT102 * +vt102_new (TTY * t) { -VT102 *v; + VT102 *v; -v=(VT102 *) malloc(sizeof(VT102)); + v = (VT102 *) malloc (sizeof (VT102)); -vt102_reset(v); + vt102_reset (v); -v->tty=t; + v->tty = t; -return v; + return v; } -void vt102_free(VT102 *v) +void +vt102_free (VT102 * v) { -free(v); + free (v); }