/* * ESC [ ... was seen the last time. Process next character. */ static void state2(term_t *win, int c) { short x, y, attr, f; char temp[32]; /* See if a number follows */ if (c >= '0' && c <= '9') { win->state.escparms[win->state.ptr] = 10*win->state.escparms[win->state.ptr] + c - '0'; return; } /* Separation between numbers ? */ if (c == ';') { if (win->state.ptr < 15) win->state.ptr++; return; } /* ESC [ ? sequence */ if (win->state.escparms[0] == 0 && win->state.ptr == 0 && c == '?') { esc_s = 3; return; } /* Process functions with zero, one, two or more arguments */ switch (c) { case 'A': case 'B': case 'C': case 'D': /* Cursor motion */ if ((f = win->state.escparms[0]) == 0) f = 1; x = win->cursor_x; y = win->cursor_y; x += f * ((c == 'C') - (c == 'D')); if (x < 0) x = 0; if (x >= win->W) x = win->W - 1; if (c == 'B') { /* Down. */ y += f; if (y >= win->H) y = win->H - 1; if (y >= win->state.newy2 + 1) y = win->state.newy2; } if (c == 'A') { /* Up. */ y -= f; if (y < 0) y = 0; if (y <= win->state.newy1 - 1) y = win->state.newy1; } term_wlocate(win, x, y); break; case 'X': /* Character erasing (ECH) */ if ((f = win->state.escparms[0]) == 0) f = 1; term_wclrch(win, f); break; case 'K': /* Line erasing */ switch (win->state.escparms[0]) { case 0: term_wclreol(win); break; case 1: term_wclrbol(win); break; case 2: term_wclrel(win); break; } break; case 'J': /* Screen erasing */ x = win->color; y = win->attr; if (win->state.vt_type == ANSI) { term_wsetattr(win, XA_NORMAL); term_wsetfgcol(win, WHITE); term_wsetbgcol(win, BLACK); } switch (win->state.escparms[0]) { case 0: term_wclreos(win); break; case 1: term_wclrbos(win); break; case 2: term_winclr(win); break; } if (win->state.vt_type == ANSI) { win->color = x; win->attr = y; } break; case 'n': /* Requests / Reports */ switch(win->state.escparms[0]) { case 5: /* Status */ v_termout(win, "\033[0n", 0); break; case 6: /* Cursor Position */ snprintf(temp, 32, "\033[%d;%dR", win->cursor_y + 1, win->cursor_x + 1); v_termout(win, temp, 0); break; } break; case 'c': /* Identify Terminal Type */ if (win->state.vt_type == VT100) { v_termout(win, "\033[?1;2c", 0); break; } v_termout(win, "\033[?c", 0); break; case 'x': /* Request terminal parameters. */ /* Always answers 19200-8N1 no options. */ snprintf(temp, 32, "\033[%c;1;1;120;120;1;0x", win->state.escparms[0] == 1 ? '3' : '2'); v_termout(win, temp, 0); break; case 's': /* Save attributes and cursor position */ win->state.savex = win->cursor_x; win->state.savey = win->cursor_y; win->state.saveattr = win->attr; win->state.savecol = win->color; break; case 'u': /* Restore them */ term_wsetfgcol(win, win->state.savecol); term_wsetattr(win, win->state.saveattr); term_wlocate(win, win->state.savex, win->state.savey); break; case 'h': ansi_mode(win, 1); break; case 'l': ansi_mode(win, 0); break; case 'H': case 'f': /* Set cursor position */ if ((y = win->state.escparms[0]) == 0) y = 1; if ((x = win->state.escparms[1]) == 0) x = 1; if (win->state.vt_om) y += win->state.newy1; term_wlocate(win, x - 1, y - 1); break; case 'g': /* Clear tab stop(s) */ if (win->state.escparms[0] == 0) { x = win->cursor_x; if (x > 159) x = 159; win->state.vt_tabs[x / 32] &= ~(1 << x % 32); } if (win->state.escparms[0] == 3) for(x = 0; x < 5; x++) win->state.vt_tabs[x] = 0; break; case 'm': /* Set attributes */ attr = term_wgetattr((win)); for (f = 0; f <= win->state.ptr; f++) { if (win->state.escparms[f] >= 30 && win->state.escparms[f] <= 37) term_wsetfgcol(win, win->state.escparms[f] - 30); if (win->state.escparms[f] >= 40 && win->state.escparms[f] <= 47) term_wsetbgcol(win, win->state.escparms[f] - 40); switch (win->state.escparms[f]) { case 0: attr = XA_NORMAL; term_wsetfgcol(win, win->state.vt_fg); term_wsetbgcol(win, win->state.vt_bg); break; case 4: attr |= XA_UNDERLINE; break; case 7: attr |= XA_REVERSE; break; case 1: attr |= XA_BOLD; break; case 5: attr |= XA_BLINK; break; case 22: /* Bold off */ attr &= ~XA_BOLD; break; case 24: /* Not underlined */ attr &=~XA_UNDERLINE; break; case 25: /* Not blinking */ attr &= ~XA_BLINK; break; case 27: /* Not reverse */ attr &= ~XA_REVERSE; break; case 39: /* Default fg color */ term_wsetfgcol(win, win->state.vt_fg); break; case 49: /* Default bg color */ term_wsetbgcol(win, win->state.vt_bg); break; } } term_wsetattr(win, attr); break; case 'L': /* Insert lines */ if ((x = win->state.escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) term_winsline(win); break; case 'M': /* Delete lines */ if ((x = win->state.escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) term_wdelline(win); break; case 'P': /* Delete Characters */ if ((x = win->state.escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) term_wdelchar(win); break; case '@': /* Insert Characters */ if ((x = win->state.escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) term_winschar(win, ' ', 0); break; case 'r': /* Set scroll region */ if ((win->state.newy1 = win->state.escparms[0]) == 0) win->state.newy1 = 1; if ((win->state.newy2 = win->state.escparms[1]) == 0) win->state.newy2 = win->H; win->state.newy1-- ; win->state.newy2--; if (win->state.newy1 < 0) win->state.newy1 = 0; if (win->state.newy2 < 0) win->state.newy2 = 0; if (win->state.newy1 >= win->H) win->state.newy1 = win->H - 1; if (win->state.newy2 >= win->H) win->state.newy2 = win->H - 1; if (win->state.newy1 >= win->state.newy2) { win->state.newy1 = 0; win->state.newy2 = win->H - 1; } if(win->state.newy1 > win->state.newy2) term_wsetregion(win, win->state.newy2, win->state.newy1); else term_wsetregion(win, win->state.newy1, win->state.newy2); /// XXX xterm goes to 0,0 ? term_wlocate(win, 0, win->state.newy1); break; case 'i': /* Printing */ case 'y': /* Self test modes */ case 'Z': /* XXX:bt */ break; default: /* IGNORED */ break; } /* Ok, our escape sequence is all done */ esc_s = 0; win->state.ptr = 0; memset(win->state.escparms, 0, sizeof(win->state.escparms)); return; }
/* * ESC [ ... was seen the last time. Process next character. */ static void state2(int c) { short x, y, attr, f; char temp[32]; /* See if a number follows */ if (c >= '0' && c <= '9') { escparms[ptr] = 10*escparms[ptr] + c - '0'; return; } /* Separation between numbers ? */ if (c == ';') { if (ptr < 15) ptr++; return; } /* ESC [ ? sequence */ if (escparms[0] == 0 && ptr == 0 && c == '?') { esc_s = 3; return; } /* Process functions with zero, one, two or more arguments */ switch (c) { case 'A': case 'B': case 'C': case 'D': /* Cursor motion */ if ((f = escparms[0]) == 0) f = 1; x = vt_win->curx; y = vt_win->cury; x += f * ((c == 'C') - (c == 'D')); if (x < 0) x = 0; if (x >= vt_win->xs) x = vt_win->xs - 1; if (c == 'B') { /* Down. */ y += f; if (y >= vt_win->ys) y = vt_win->ys - 1; if (y >= newy2 + 1) y = newy2; } if (c == 'A') { /* Up. */ y -= f; if (y < 0) y = 0; if (y <= newy1 - 1) y = newy1; } mc_wlocate(vt_win, x, y); break; case 'X': /* Character erasing (ECH) */ if ((f = escparms[0]) == 0) f = 1; mc_wclrch(vt_win, f); break; case 'K': /* Line erasing */ switch (escparms[0]) { case 0: mc_wclreol(vt_win); break; case 1: mc_wclrbol(vt_win); break; case 2: mc_wclrel(vt_win); break; } break; case 'J': /* Screen erasing */ x = vt_win->color; y = vt_win->attr; if (vt_type == ANSI) { mc_wsetattr(vt_win, XA_NORMAL); mc_wsetfgcol(vt_win, WHITE); mc_wsetbgcol(vt_win, BLACK); } switch (escparms[0]) { case 0: mc_wclreos(vt_win); break; case 1: mc_wclrbos(vt_win); break; case 2: mc_winclr(vt_win); break; } if (vt_type == ANSI) { vt_win->color = x; vt_win->attr = y; } break; case 'n': /* Requests / Reports */ switch(escparms[0]) { case 5: /* Status */ v_termout("\033[0n", 0); break; case 6: /* Cursor Position */ sprintf(temp, "\033[%d;%dR", vt_win->cury + 1, vt_win->curx + 1); v_termout(temp, 0); break; } break; case 'c': /* Identify Terminal Type */ if (vt_type == VT100) { v_termout("\033[?1;2c", 0); break; } v_termout("\033[?c", 0); break; case 'x': /* Request terminal parameters. */ /* Always answers 19200-8N1 no options. */ sprintf(temp, "\033[%c;1;1;120;120;1;0x", escparms[0] == 1 ? '3' : '2'); v_termout(temp, 0); break; case 's': /* Save attributes and cursor position */ savex = vt_win->curx; savey = vt_win->cury; saveattr = vt_win->attr; savecol = vt_win->color; #if TRANSLATE savecharset = vt_charset; savetrans[0] = vt_trans[0]; savetrans[1] = vt_trans[1]; #endif break; case 'u': /* Restore them */ #if TRANSLATE vt_charset = savecharset; vt_trans[0] = savetrans[0]; vt_trans[1] = savetrans[1]; #endif vt_win->color = savecol; /* HACK should use mc_wsetfgcol etc */ mc_wsetattr(vt_win, saveattr); mc_wlocate(vt_win, savex, savey); break; case 'h': ansi_mode(1); break; case 'l': ansi_mode(0); break; case 'H': case 'f': /* Set cursor position */ if ((y = escparms[0]) == 0) y = 1; if ((x = escparms[1]) == 0) x = 1; if (vt_om) y += newy1; mc_wlocate(vt_win, x - 1, y - 1); break; case 'g': /* Clear tab stop(s) */ if (escparms[0] == 0) { x = vt_win->curx; if (x > 159) x = 159; vt_tabs[x / 32] &= ~(1 << x % 32); } if (escparms[0] == 3) for(x = 0; x < 5; x++) vt_tabs[x] = 0; break; case 'm': /* Set attributes */ attr = mc_wgetattr((vt_win)); for (f = 0; f <= ptr; f++) { if (escparms[f] >= 30 && escparms[f] <= 37) mc_wsetfgcol(vt_win, escparms[f] - 30); if (escparms[f] >= 40 && escparms[f] <= 47) mc_wsetbgcol(vt_win, escparms[f] - 40); switch (escparms[f]) { case 0: attr = XA_NORMAL; mc_wsetfgcol(vt_win, vt_fg); mc_wsetbgcol(vt_win, vt_bg); break; case 1: attr |= XA_BOLD; break; case 4: attr |= XA_UNDERLINE; break; case 5: attr |= XA_BLINK; break; case 7: attr |= XA_REVERSE; break; case 22: /* Bold off */ attr &= ~XA_BOLD; break; case 24: /* Not underlined */ attr &=~XA_UNDERLINE; break; case 25: /* Not blinking */ attr &= ~XA_BLINK; break; case 27: /* Not reverse */ attr &= ~XA_REVERSE; break; case 39: /* Default fg color */ mc_wsetfgcol(vt_win, vt_fg); break; case 49: /* Default bg color */ mc_wsetbgcol(vt_win, vt_bg); break; } } mc_wsetattr(vt_win, attr); break; case 'L': /* Insert lines */ if ((x = escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) mc_winsline(vt_win); break; case 'M': /* Delete lines */ if ((x = escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) mc_wdelline(vt_win); break; case 'P': /* Delete Characters */ if ((x = escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) mc_wdelchar(vt_win); break; case '@': /* Insert Characters */ if ((x = escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) mc_winschar(vt_win); break; case 'r': /* Set scroll region */ if ((newy1 = escparms[0]) == 0) newy1 = 1; if ((newy2 = escparms[1]) == 0) newy2 = vt_win->ys; newy1-- ; newy2--; if (newy1 < 0) newy1 = 0; if (newy2 < 0) newy2 = 0; if (newy1 >= vt_win->ys) newy1 = vt_win->ys - 1; if (newy2 >= vt_win->ys) newy2 = vt_win->ys - 1; if (newy1 >= newy2) { newy1 = 0; newy2 = vt_win->ys - 1; } mc_wsetregion(vt_win, newy1, newy2); mc_wlocate(vt_win, 0, newy1); break; case 'i': /* Printing */ case 'y': /* Self test modes */ default: /* IGNORED */ break; } /* Ok, our escape sequence is all done */ esc_s = 0; ptr = 0; memset(escparms, 0, sizeof(escparms)); return; }